Table of Contents
Piotr Jaroszyński: Usermode debugging under Linux
Week 7 [ Jul 5 - Jul 11 2010 ]
drivers in userspace
After a lot of reading and trial and error I have managed to come up with a working, but awfully hacky proof of concept:
# ./pcnet32.linuxlibc gPXE initialising devices... gPXE 1.0.1+ -- Open Source Boot Firmware -- http://etherboot.org Features: HTTP DNS TFTP DHCP (net0 52:54:00:12:34:58).... ok http://root.piotrj.org/files/gpxe/1mb. ok
PIO
To make the pci_(read|write)_config_*()
work I picked PCIAPI_DIRECT
in config/ioapi.h
and made all I/O ports available to userspace with iopl(3)
.
That also had a side-effect of making rest of the PIO
used by drivers work. The question remains how portable PCIAPI_DIRECT
is.
Answering that requries more reading. Other approaches are possible here as the PCI config interface is exposed in /sys/
and there is even a lib in pciutils
for accessing it.
MMIO
Haven't looked at that yet. A kernel module might be required to mark the pages mmaped to hardware as non-cacheable and non-prefetchable.
DMA
And to make DMA work core/malloc.c
uses a mmaped arbitrary (I just tried several ranges until it worked) chunk of /dev/mem
. This is ridiculously bad as it can end up corrupting kernel structures, but that's what kvm is for :)
Obviously this has to be changed. Stefan suggested that it might be possible to mlock()
the heap
(so that it's not swapped away) from core/malloc.c
and figure out its physical address via /proc/pagemap
.
That doesn't guarantee for it to be physically contiguous, but at least we can verify that.
Doing it properly seems to require a kernel module. MMIO might too and I was supposed to look at UIO anyway, so that's on the radar now.