目录
前言:
Linux驱动程序员,要熟悉Linux的硬件驱动,必须关注两个大的框架:一、Linux内含的六大分离的思想与主要的驱动程序框架;二、驱动程序六大工作机制。只有掌握了这两大机制,才算真正的掌握了Linux的内核驱动程序。
第1章 内存与IO访问机制
1.1 用户空间与内核空间
备注:要实现用户空间与内核空间的拷贝。
1.2 虚拟地址与物理地址
备注:用户空间和内核空间,共享相同的物理内存。
物理内存包括:RAM和硬件设备、CPU内部寄存器等。
(1)用户空间程序可以直接访问0-3G的逻辑内存地址,然后经过内存管理单元MMU,映射到物理地址。
(2)用户空间程序可以通过系统调用,进入内核空间的3G-4G逻辑内存地址,然后经过内存管理单元MMU,映射到物理地址。
(3)用户空间程序可以通过MMAP,把物理地址映射到逻辑地址,然后通过逻辑地址访问物理地址。
(4)内核驱动程序直接访问3G-4G的逻辑内存地址,然后经过内存管理单元MMU,映射到物理地址。
1.3 用户空间虚拟地址申请malloc
1.4 insert ko
1.5 内核虚拟地址空间申请:vmalloc
1.6 内核物理地址空间申请
1.7 IO设备内存映射
1.8 DMA映射![](https://i-blog.csdnimg.cn/blog_migrate/4e9b909e5c270ffd489d5f93178d1758.png)
第2章 中断机制
2.1 什么是中断
中断的优先级,由高到底如下:
(1)顶半部:中断服务程序,属于硬中断的上下文,如关闭中断等。
(2)底半部:通过软中断处理中断事件,属于软中断的上下文,如数据的接收。
(3)内核空间的软中断。
(4)内核空间定时器的中断。
(5)内核空间signal信号的中断(内核进程上下文)。
(6)用户定义的定时中断(内核进程上下文)。
软中断:
软中断,顾名思义,就是有软件产生的“中断”,它能够中断内核线程的执行,转而让CPU执行软中断号对应的中断服务程序。软中断的优先级没有硬件终端的优先级高,因此,它无法打断硬件中断服务程序的执行,但软中断服务程序的执行可以被硬件中断服务程序打断。
软中断的一种典型应用就是所谓的"下半部"(bottom half),它的得名来自于将硬件中断处理分离成"上半部"和"下半部"两个阶段的机制:上半部在屏蔽中断的上下文中运行,用于完成关键性的处理动作;而下半部则相对来说并不是非常紧急的,通常还是比较耗时的,因此由系统自行安排运行时机,不在中断服务上下文中执行。bottom half的应用也是激励内核发展出的软中断机制的原因。
软中断是利用硬件中断的概念,用软件方式进行模拟,实现宏观上的异步执行效果。很多情况下,软中断和"信号"有些类似,同时,软中断又是和硬中断相对应的,"硬中断是外部设备对CPU的中断","软中断通常是硬中断服务程序对内核的中断","信号则是由内核(或其他进程)对某个进程的中断"。一般来说,软中断是由内核机制的触发事件引起的。
2.2 多核ARM CPU的中断架构
(1)每个CPU core有自己独立的中断号:0~31
(2)所有CPU core共享的中断向量号:32~1019
2.3 Linux的中断机制
(1)中断向量表:存放中断号与中断服务程序之间的映射关系的表格
(2)中断服务程序=顶半部分:中断发生后,需要紧急处理的逻辑,如数据的接收,属于硬中断上下文。
(3)底半部:中断发生后,不需要紧急处理,但需要在内核空间处理的逻辑,如数据处理,属于软中断上下文。是否需要添加后处理,以及添加什么样的后处理函数,由中断服务程序实现。
2.4 底半部机制
对于底半部:内核提供了多种机制来处理中断的底半部机制,来实现数据的后半部处理。不同的机制,后半部的处理能够打断其他程序的优先级是不同的,同时被其他程序打断的优先级也不相同。
所有的底半部都有相应的队列机制。
(1)软中断:Tasklet机制,是所有底半部机制中优先级最高的机制。
(2)软中断:softirq机制。
(3)内核进程上下文:work工作队列机制。
(4)内核进程上下文:中断线程机制,属于内核线程,执行的优先级比普通的内核线程的优先级要高。
备注:
(1)open_softirq(sw_irq,xxx_bh_handler):挂接软中断的服务程序。
(2)raise_softirq(sw_irq):产生一个软中断,触发软中断服务程序的执行。
2.5 中断的共享机制:线与
(1)多个中断共享相同的中断服务程序
(2)通过状态寄存器区分不同的中断
(3)大部分硬件设备都是采用的这种机制