1.设备文件是OS对硬件设备的抽象,用户操作设备文件其实是内核调用驱动程序去操作实际硬件 ,实际的硬件设备通过驱动程序和内核交互
2.驱动程序跟内核和硬件交互,设备文件跟OS和用户交互,所以说驱动可以不用管设备文件的东西
3.模块初始化函数的任务就是为以后调用模块函数预先做准备
4.模块卸载前会调用模块的退出函数,退出函数必须撤销初始化函数所做的一切
5.内核函数头文件包含在usr/src/$(shell uname -r)/include/linux|asm那里,include的其他子目录保存有和特定内核子系统相关的头文件
6.一个驱动程序要执行两类任务:模块中的某些函数要作为系统调用的一部分而执行,而其他函数负责中断处理(系统调用+中断处理)
7.编写驱动模块时必须考虑的问题:(1)OS中通常正在运行多个并发进程,并且可能多个进程同时调用我们的驱动程序;(2)中断处理程序异步运行,驱动程序正试图处理其他任务时被调用;(3)其他程序也可以同时调用我们的驱动程序。所以我们在编写驱动时要非常注意并发问题
驱动可以通过current访问当前进程的信息
8.用户空间中的应用程序有一块很大的栈,用来保存函数调用和活动函数中的自动化变量;相反的内核的栈很小,可能只有4096KB那样的页大小,所以我们定义变量时要注意空间的节约
9.内核通常不支持浮点运算,如果要开浮点运算需要额外的开销
10.我们通常在内核API上看到的有两个下划线前缀(__)的函数名称,这些函数需要非常谨慎的使用
11.模块insmod进内核的过程:函数sys_init_module给模块分配内核内存(函数vmalloc负责内存分配)以便装载模块,然后该系统调用将模块正文复制到内存区域,并通过内核符号表解析模块中的内核引用,最后调用模块的初始化函数,over!
12.系统调用函数的名字前都带有sys_前缀
13.内核树中的一个文件vermagic.o,该目标文件包含了大量有关内核的信息,包括内核版本,编译器版本以及一些重要配置变量的设置,所以可以将我们的模块和vermagic.o链接,在insmod时会检查模块和当前正在运行的内核的兼容性,如果有问题还会打印出相应的出错信息
14./var/log/messages (用户系统日志文件)可以查看导致内核失败的具体原因
15.驱动程序应该针对某个目标平台的特性来达到最优性能,所以要会阅读芯片手册?
16.机制(应该提供什么功能)和策略(应该怎么利用这些功能)
17.模块层叠技术:新模块可以使用由我们自己的模块导出的符号,这样,我们可以在其他模块上层叠新的模块。这样就可以将一个模块划分为多个层,通过简化每个层可以缩短开发时间,使用modprobe是处理模块层叠的一个实用工具,它除了装入指定模块外还同时装入指定模块所依赖的其他模块
18.向其他模块导出符号时,使用宏,例如:EXPORT_SYMBOL(name)或者EXPORT_SYMBOL_GPL(name),该宏必须在模块文件的全局部分导出,不能在函数中导出,因为它必须被扩展成全局变量
19.驱动模块通过被内核注册函数调用可以注册到各种不同类型的设备中
20.初始化函数负责注册模块向应用程序所提供的功能
21./sys/module中包含当前已装载模块信息的目录;/proc/mudules 是单个文件,记录当前包含模块的名称,每个模块使用的内存总量和使用次数以及活动标识
22.cat /proc/devices 命令查看当前已经加载的设备驱动程序的主设备号
23.Linux内核有很多驱动模块,平时很多处于挂起状态,不占用内存和资源,需要的时候才唤醒
24.内核中每个字符设备都对应一个cdev结构;一个驱动程序可对应多个设备
25.主设备号标记一个设备文件属于哪种设备(对应一个驱动程序),次设备号是说明该设备属于主设备号下的哪个设备
26.对于驱动程序中任何不确定的或与策略相关的数值,可以在编译和加载阶段进行配置
27.SCSI(small computer system interface)小型计算机系统接口,一种用于计算机和智能设备之间(硬盘、软驱、光驱、打印机、扫描仪等)系统级接口的独立处理器标准。 SCSI是一种智能的通用接口标准
28.IDE是一种并行硬盘接口,性价比高但是速度缓慢,最快可达133M/S;SATA接口(serial ATA)是一种串行硬盘接口,速度可达到300M/S。SATA接口的头一般比IDE接口的小很多
29.M.2固态硬盘接口,最大的读取速度可以达到700MB/s,写入也能达到550MB/s