Systemprogrammierung und Gerätetreiberentwicklung unter Linux

Material zur Vorlesung Gerätetreiber an der Hochschule Niederrhein.

Jürgen Quade

Wed Feb 6 13:05:07 CET 2002

Dieses Werk ist urheberrechtlich geschützt.

Für Schäden, die durch Verwendung des vorliegenden Materials, auch bedingt durch Fehler oder Auslassungen entstehen, wird keine Haftung übernommen.

(c) 2000,2001 Copyright, Jürgen Quade.

     $Id: legalnotice.sgml,v 1.4 2001/10/22 09:28:35 quade Exp $
     $Id: literatur.sgml,v 1.5 2001/11/11 20:21:41 quade Exp $
     $Id: preface.sgml,v 1.8 2001/11/24 10:53:03 quade Exp $
     $Id: Treiber.sgml,v 1.94 2001/12/05 09:57:10 quade Exp $
     $Id: crash.sgml,v 1.11 2001/11/24 11:06:21 quade Exp $
     $Id: chardev.sgml,v 1.22 2001/11/25 13:54:27 quade Exp $
     $Id: prototypes.sgml,v 1.43 2001/12/12 20:30:28 quade Exp $
     $Id: wdm.sgml,v 1.3 2001/11/24 10:53:03 quade Exp $
     $Id: block.sgml,v 1.1 2001/02/12 16:56:50 quade Exp $
     $Id: design.sgml,v 1.10 2001/11/25 13:54:27 quade Exp $
     $Id: network.sgml,v 1.1 2001/02/12 16:56:50 quade Exp $
     $Id: integrated.sgml,v 1.8 2001/11/25 13:54:27 quade Exp $
     $Id: pci.sgml,v 1.24 2001/11/25 13:54:27 quade Exp $
     $Id: pluggable.sgml,v 1.7 2001/03/19 13:56:59 quade Exp $
     $Id: parport.sgml,v 1.2 2001/02/16 14:43:40 quade Exp $
     $Id: proc.sgml,v 1.6 2001/11/29 07:35:44 quade Exp $
     $Id: debugging.sgml,v 1.4 2001/11/24 10:53:03 quade Exp $
     $Id: kern.sgml,v 1.8 2001/11/24 10:53:03 quade Exp $
     $Id: api.sgml,v 1.8 2001/11/24 10:53:03 quade Exp $
     $Id: basics.sgml,v 1.19 2001/12/05 09:57:10 quade Exp $
     $Id: hardware.sgml,v 1.11 2001/11/25 13:54:27 quade Exp $
     $Id: ressourcen.sgml,v 1.11 2001/11/25 13:54:27 quade Exp $
     $Id: kthread.sgml,v 1.6 2001/11/29 07:35:44 quade Exp $
     $Id: classification.sgml,v 1.7 2001/11/24 10:53:03 quade Exp $
     $Id: integration.sgml,v 1.4 2001/11/25 13:54:27 quade Exp $
     $Id: taskqueue.sgml,v 1.4 2001/11/25 13:54:27 quade Exp $
     $Id: time.sgml,v 1.4 2001/12/12 20:30:28 quade Exp $
     $Id: ir2.sgml,v 1.4 2001/11/29 07:35:44 quade Exp $
     $Id: criticalsec.sgml,v 1.8 2001/11/29 07:35:44 quade Exp $
     $Id: devfs.sgml,v 1.1 2001/02/25 13:00:08 quade Exp $
     $Id: mem.sgml,v 1.7 2001/11/25 13:54:27 quade Exp $
     $Id: programming.sgml,v 1.6 2001/10/30 08:49:42 quade Exp $
     $Id: system.sgml,v 1.11 2001/11/24 10:53:03 quade Exp $
     $Id: generierung.sgml,v 1.2 2001/10/28 16:42:44 quade Exp $
     $Id: security.sgml,v 1.3 2001/11/24 10:53:03 quade Exp $
     $Id: systemcalls.sgml,v 1.6 2001/11/25 18:56:31 quade Exp $
     $Id: versions.sgml,v 1.3 2001/11/25 13:54:27 quade Exp $
     $Id: instanz.sgml,v 1.8 2001/12/18 09:21:58 quade Exp $
     $Id: begriffe.sgml,v 1.9 2001/11/25 13:54:27 quade Exp $
     $Id: ir.sgml,v 1.5 2001/11/25 14:14:23 quade Exp $
     $Id: socket.sgml,v 1.5 2001/11/24 10:53:03 quade Exp $


Inhaltsverzeichnis
Vorwort
1. Einführung in Linux
Grundstruktur des Betriebssystems
Betriebssystemkern
Gerätetreiber
Arbeiten mit Linux (Linux-Crash-Kurs)
Die Shell
Entwicklungsumgebung
Linux Kernel Generierung
Kernel-Debugging
Sophiticated Programming in C
2. Systemprogrammierung
Kontrollfluß
Die Applikationsschnittstelle für den Gerätezugriff
Programmbeispiele
Tasks und Threads
Tasks
Threads
Interprozeßkommunikation
Messages
Shared Memory
Sockets
Signal
Semaphore
Libraries
Sonstige Systemfunktionen
Syslog
Daemonen
3. Treiber-Basics
Aufbau eines Treibers
Treiber als Modul
Verwendung von Metainformationen
Stacked Driver
Parameterübergabe an Module
Mapping der Applikationsschnittstelle auf den Treiber
Logische Geräte
Major- und Minornumber
Treiberfunktionen
Datentransfer zwischen User- und Kernel-Space
Zugriffsmodi
Treiberinstanzen
IO-Control
Poll
Ressourcen-Management
Hardwareanbindung
Datentypen für den Hardwarezugriff
Hardwarezugriffe
PCI
4. Erweiterte Treiber-Funktionen
Task-Queues
Interruptbetrieb
Automatische Interrupterkennung
Kernel Threads
Proc-Device
Zeitverwaltung
Absolutzeiten
Timer-Funktionen
Zeitverzögerungen
Kritische Abschnitte
Datenstrukturen
Interrupt-Sperre
Semaphore und unteilbare Befehlssequenzen
Device Filesystem
Kerneltreiber
Allgemeines
Kernelgenerierung
Systemintegration
Bedingte Treibercompilierung
5. Blockorientierte Gerätetreiber
Partitionierung
6. Parallelport Treiber
Grundlagen
Hardwarezugriffe
7. Windowstreiber
Asynchrone Verarbeitung
Datenaustausch
Interrupt Request Level
Funktionen
Gerätenamen
Abläufe
Entwicklung
8. Netzwerktreiber
Grundlagen
Netzwerk-Statistik
Socket-Buffer
Senden
Empfang
9. Pluggable Devices
USB
Initialisierung eines USB-Treibers
Hardwarezugriffe über das USB-Coresystem
Zugriff durch die Applikation
Systemintegration eines USB-Treibers
PCMCIA und Cardbus
10. Treiberdesign
Qualitätsmerkmale
Designaspekte
Programmierung
A. Datenstrukturen und Prototypen für Linuxtreiber
Systemcalls
fork
execve
pthread_create
shmget
shmat
shmdt
shmctl
Treiberfunktionen
module_init
module_exit
init_module
cleanup_module
open
release
read
write
ioctl
poll
PCI Probe
PCI Remove
Betriebssystemfunktionen
remove_proc_entry
create_proc_entry
create_proc_read_entry
check_region
request_region
release_region
check_mem_region
request_mem_region
release_mem_region
register_chrdev
unregister_chrdev
register_blckdev
unregister_blkdev
copy_from_user
copy_to_user
poll_wait
sleep_on
interruptible_sleep_on
wait_event_interruptible
wake_up
wake_up_interruptible
schedule
kernel_thread
daemonize
udelay
do_gettimeofday
ether_setup
register_netdevice
unregister_netdevice
netif_start_queue
netif_queue_stopped
netif_wake_queue
netif_rx
alloc_skb
kfree_skb
skb_put
add_timer
del_timer
init_timer
request_irq
free_irq
request_dma
free_dma
kmalloc
kfree
schedule_task
usb_deregister
usb_register
pci_register_driver
pci_unregister_driver
pci_module_init
pci_enable_device
pci_resource_start
pci_resource_end
pci_resource_len
pci_resource_flags
pci_read_config_word
pci_read_config_dword
pci_read_config_byte
register_pccard_driver
unregister_pccard_driver
in[bwl]
out[bwl]
in[bwl]_p
out[bwl]_p
ins[bwl]
outs[bwl]
read[bwl]
write[bwl]
memset_io
memcpy_fromio
memcpy_toio
memcpy
memset
sema_init
up
down
inter_module_register
inter_module_unregister
inter_module_put
inter_module_get
inter_module_request
schedule_timeout
sleep_on_timeout
set_current_state
parport_register_driver
parport_unregister_driver
parport_register_device
parport_unregister_device
parport_claim
parport_claim_and_block
parport_release
Datenstrukturen
struct inode * Inode
struct file * File
struct file_operations *Fops
struct proc_dir_entry *ProcDirEntry
struct request *current_request
struct net_device_stats
struct net_device
struct proc_dir_entry *ProcDirEntry
struct pci_device_id
Globale Variablen
jiffies
current
Literatur
Tabellenverzeichnis
3-1. Datentypen von Modulparametern
Abbildungsverzeichnis
1-1. Betriebssystem-Architektur
1-2. Codebeispiel Systemcall
1-3. Codebeispiel Library-Call
1-4. Task-Kontrollblock
1-5. Task-Zustände
1-6. Task-Zustände in Linux
1-7. Interruptebenen und deren Übergänge
1-8. Verschiedene Bibliotheksarten
1-9. Dynamisches Laden von Funktionen während der Laufzeit
1-10. Task-Datenstruktur des Linux-Kernels
1-11. Treiberstruktur
1-12. Datenflüsse in der Shell (stark vereinfacht)
1-13. Printk-Debugging
1-14. Gültigkeit von Variablen
1-15. Pointer
1-16. Pointer
1-17. Verkettete Liste
2-1. Blockorientierter File-Zugriff
2-2. Implementierung des Systemcalls fork
2-3. Basisstruktur einer Socket-Serverapplikation
2-4. Socket-Serverprogramm
2-5. Basisstruktur einer Socket-Clientapplikation
2-6. Socket-Clientprogramm
3-1. Applikationsfunktionen triggern Treiberfunktionen
3-2. Struktur eines Treibers
3-3. Aufbau eines Treibers
3-4. Einbindung des Gerätetreibers in das System
3-5. PCI Konfigurationsspeicher
4-1. Datenfluß im System beim Aufruf von fread
4-2. Beispiel einer Race-Condition
4-3. Konfiguration und Generierung des Linux Kernels
5-1. Zugriff auf blockorientierte Geräte über den Buffercache
5-2. Funktionsaufrufe beim Zugriff auf blockorientierte Geräte
6-1. Das Parallelport Subsystem
7-1. Stacked Driver
7-2. Systemebenen unter Windows
7-3. Treiberabläufe innerhalb des WDM (vereinfachte Darstellung)
8-1. Struktur eines Netzwerktreibers
8-2. Datenmanagement im Socket-Buffer
9-1. Abläufe beim Anstecken eines Pluggable Devices
9-2. Datentransfer zwischen USB-Controller und Geräten
Beispiele
1-1. Simple-Makefile
1-2. Definition und Deklaration von Variablen
1-3. Funktionspointer
1-4. Verkettete Liste mit und ohne objekorientierter Datenhaltung
2-1. Codebeispiel eines blockierenden Aufrufes
2-2. Codebeispiel eines nicht-blockierenden Aufrufes
2-3. Zugriff auf die Partitionstabelle
2-4. Zugriff auf die parallele Schnittstelle
2-5. Anwendung des Systemcalls fork
2-6. Anwendung des Systemcalls execve
2-7. Erzeugen eines Threads
2-8. Anlegen eines Shared Memory Bereiches
2-9. Löschen eines Shared Memory Bereiches
2-10. Nutzen eines Shared Memories (I)
2-11. Nutzen eines Shared Memories (II)
2-12. Abfangen eines Signals
2-13. Verwendung des systemeigenen Logmechanismus
3-1. Treibergerüst
3-2. Datentransfer zwischen Kernel- und Userspace
4-1. Proc-Device