Rozhrani pro tridy devices. Problemy s kopirovanim dat na rozhranich.
User interface, blokující funkce, funkce s asynchronní signalizací. Problémy asynchronní signalizace při chybách, signalizace chyb (indikace result kódem, indikace globální proměnnou, asynchronní indikace á la DOS, chytřejší asynchronní indikace).
Block devices, přenos dat po blocích, velikost bloků dána vlastnostmi zařízení. Bloky jsou adresovatelné, přímý přístup k datům. Mají cache, mají fronty a obslužné strategie.
Character devices, přenos dat po jednotlivých bajtech, sekvenční přístup. Nemají cache, mají read a write rutiny.
Výše uvedené rozdělení na character a block devices má kořeny v dobách, kdy se pro I/O operace používaly tzv. kanálové procesory. Ty podporovaly právě dva režimy přenosu dat z periferních zařízení a to buď po jednotlivých bajtech nebo po blocích.
V současné době není toto členení příliš opodstatněné a rozhodujícím činitelem je spíše sekvenční či náhodný přístup k datům. Příkladem toho budiž zařízení pro digitalizaci videa, ke kterému se přistupuje jako ke znakovému zařízení, které však poskytuje data s granularitou celých frames, nikoliv jednotlivých bajtů. Ovladač zařízení podporuje mapování do paměti, což aplikaci umožňuje snadný přístup k jednotlivým bajtům jednoho frame, není však možné žádat zařízení o předchozí frames.
V UNIXu říká major device number typ ovladače, minor device number pořadové číslo zařízení (zhruba).
The driver model facilitates access to common features of busses with devices and to drivers with classes and interfaces. The structure maintained by the driver model is accessible via the sysfs filesystem.
Common features of busses include listing devices connected to the bus and drivers associated with the bus, matching drivers to devices, hotplugging devices, suspending and resuming devices.
> ls -R /sys/bus /sys/bus: pci pci_express pcmcia scsi usb /sys/bus/pci: devices drivers /sys/bus/pci/devices: 0000:00:00.0 0000:00:1a.7 0000:00:1c.3 0000:00:1d.7 0000:00:1f.3 0000:00:01.0 0000:00:1b.0 0000:00:1c.4 0000:00:1e.0 0000:01:00.0 /sys/bus/pci/drivers: agpgart-intel ata_piix ehci_hcd ohci_hcd uhci_hcd ahci e1000 HDA Intel ...
Common features of devices include listing interfaces provided by the device and linking to the class and the driver associated with the device. The driver provides additional features specific to the class or the interfaces or the device.
> ls -R /sys/devices /sys/devices: pci0000:00 /sys/devices/pci0000:00: 0000:00:19.0 /sys/devices/pci0000:00/0000:00:19.0: class config device driver irq net power vendor /sys/devices/pci0000:00/0000:00:19.0/net: eth0 /sys/devices/pci0000:00/0000:00:19.0/net/eth0: address broadcast carrier device features flags mtu power statistics ...
To be done.
Network devices include/linux/netdevice.h struct net_device.
Block devices include/linux/blkdev.h struct request_queue.
Character devices include/linux/cdev.h struct cdev.
IOCTL with strace
When a new device is connected to a bus, the driver of the bus notifies the udevd daemon, providing information on the identity of the device. The daemon uses this information to locate the appropriate driver in the driver database, constructed from information provided by the modules during module installation. When the appropriate driver is loaded, it is associated with the device, which thus becomes ready to use. The notifications can be observed using the udevmonitor command.
> udevmonitor --env UEVENT[12345.67890] add /devices/pci0000:00/0000:00:1a.7/usb1/1-3/1-3:1.0 (usb) ACTION=add DEVPATH=/devices/pci0000:00/0000:00:1a.7/usb1/1-3/1-3:1.0 SUBSYSTEM=usb DEVTYPE=usb_interface DEVICE=/proc/bus/usb/001/006 PRODUCT=457/151/100 INTERFACE=8/6/80 MODALIAS=usb:v0457p0151d0100dc00dsc00dp00ic08isc06ip50
[ This information is current for kernel 2.6.23. ]
References.
Patrick Mochel: The Linux Kernel Device Model.