
关键词:Linux驱动,内核
Linux设备驱动是Linux内核的一部分。它可以以两种方式编译和加载:
- 直接编译进Linux内核,在Linux启动时加载。
- 编译成可加载和删除的模块。
驱动程序向内核添加了一些函数,如Open()、Release()、Read()、Write()等。这些函数由内核在适当的时候调用,用于完成硬件访问等操作。驱动程序占据了内核源代码的超过50%。
内核中的printk()函数设计目的并不是与用户交流,而是一种日志机制,用于记录日志信息或给出警告提示。如果syslogd和klogd守护进程正在运行,则无论是否向控制台输出,消息都会被追加到/var/log/messages文件中。klogd只处理内核消息,syslogd处理其他系统消息,如应用程序。
设备驱动的并发控制可以使用自旋锁和信号量。自旋锁不会导致调用者睡眠,而是循环查看自旋锁是否被其他执行单元持有。自旋锁适用于保持时间非常短的情况,并可在任何上下文中使用。信号量会导致调用者睡眠,将进程从运行队列中移出,直到获得锁。信号量适用于保持时间较长的情况,并且只能在进程上下文中使用。如果被保护的共享资源需要在中断上下文访问(包括底半部即中断处理句柄和顶半部即软中断),则必须使用自旋锁。
设备驱动中的内存和IO访问是通过将内核虚拟内存映射到连续的物理内存来实现的。CPU通常没有为已知的外设I/O内存资源预定义虚拟地址范围,因此驱动程序不能直接通过物理地址访问I/O内存资源。相反,它们必须将这些资源映射到核心虚拟地址空间内,然后通过访内指令来访问这些I/O内存资源。Linux的io.h头文件声明了ioremap()函数,用于将I/O内存资源的物理地址映射到核心虚拟地址空间(3GB-4GB)。驱动程序中使用的地址是虚拟地址,而外设的IO地址需要映射到虚拟地址。
参考资料:
- 《Linux设备驱动开发详解(第2版)》
- 《Linux设备驱动调试、移植》
- 内核 Linux内核
量子哈希













