4.1.2. Synchronous Requests

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).

4.1.2.1. Example: Unix Driver Model

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).

4.1.2.2. Example: Linux Driver Model

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. 

  1. Patrick Mochel: The Linux Kernel Device Model.