physio and vmapbuf

son goku ryu.planka at gmail.com
Wed Mar 10 12:11:53 UTC 2010


Hi hackers,
I have some experience with other UNIX kernels but none with FreeBSD.
FreeBSD interests me for a potential project I might be involved in , and
therefore I started researching it.
Browsing through the I/O layer code, I stumbled upon something that looked
strange, and perhaps you guys can help me with it.
Mainly, when reading the physio path, when the I/O buffer is from user-mode,
physio calls vmapbuf. The comments says that vmapbuf actually maps the
user-buffer into kernel address space. From my experience, such mapping is
needed only for very old devices that use PIO. Newer device just use DMA for
data copy, and therefore don't need the mapping, instead they just need to
pin the memory. Checking out vmapbuf only confused me further, I couldn't
find where such kernel mapping was taken place, nevertheless I did saw that
the buf->b_data was updated according to buf->b_saveaddr in some weird
offset calculation.
Adding to this confusion, there is a buf field called b_kvabase which
supposedly stores the kernel virtual address which wasn't touched at all!!

Any help with understanding the flow and the usage of those fields/variables
will be greatly appreciated!!


More information about the freebsd-hackers mailing list