You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Eventual goal is to be able to run Linux driver in userspace. Device IO memory is mapped to driver address space and driver communicates with NTOS Executive Server via IO request packets (IRPs).
Tasks:
Project structure
Add ELF loading to NT Executive.
Build the smallest possible Linux as a library project (https://github.com/lkl/linux) and produce an ELF file vmlinuz.xdrv
Basic character device (/dev/null, /dev/zero)
Basic PCI device (pvpanic-pci)
Module loading
PCI ethernet driver --- goal is being able to send/recv ethernet frames. Done. Tested on e1000e (QEMU).
For networking to work we need io_uring-like async IO for NT #23 to multiplex the single instance of the Linux networking core. Basically afd.sys will link to the Linux networking core and instead of a real struct net_device, we have a proxy net_device which sends the packet via the IO ring between the networking core and the individual NIC driver (say e1000), which is in another driver process. This is also how we will implement communication (ie. sending URBs) between the USB host controller driver and individual USB device drivers. In other words, this is basically virtio, but more integrated with the rest of the system.
USB Host controller driver. EHCI (USB2.0) and xHCI (USB3.0) are main goals. We don't support UHCI(USB1.0) or OHCI (USB1.1), because we only support MSI/MSI-X interrupts for PCI devices. The idea is that for each USB device attached to the host controller, the HCI driver exposes a pair of IO rings, like in the networking case, for the USB device driver to submit URBs to the host controller.
Eventual goal is to be able to run Linux driver in userspace. Device IO memory is mapped to driver address space and driver communicates with NTOS Executive Server via IO request packets (IRPs).
Tasks:
vmlinuz.xdrvstruct net_device, we have a proxynet_devicewhich sends the packet via the IO ring between the networking core and the individual NIC driver (say e1000), which is in another driver process. This is also how we will implement communication (ie. sending URBs) between the USB host controller driver and individual USB device drivers. In other words, this is basically virtio, but more integrated with the rest of the system.