如何读到这本书的
今年做了一个ZNSSSD的项目,而且主要验证测试都是基于dnvme驱动的。考虑到跟顾客的环境可能有误差,另外dnvme不适宜用来测试储存软件栈,须要在nvme驱动上面实现这个指令集。我作为多年纸上谈兵的linux爱好者,主动抗了这个任务。临阵磨刀找书看:《LinuxDeviceDrivers》虽然精典,而且早已许久没有更新了。有人推荐了这本书,索性就看呗。
看法
见到作者的序言中对本书的定位时深入linux设备驱动程序内核机制,有点想换书了:这本书不是手把手教你写驱动的,而是教给你驱动为何要写成那种样子,内核提供的各类机制应当如何抉择。这如同是在policyvsmechanism中,本书重点放到了解释mechanism。转念一想,把机制看懂了,也不枉磨刀不误砍柴工了。索性就把书看完了。
印象最深的是,本书开篇便用的大篇幅讲module是如何被加载进内核的:ko文件的结构是哪些,内核怎样读这个文件,各个分段都加载到哪些地方,符号表是如何解析的,导入的符号是如何在内核中处理的,这么等等。对比下大多数驱动的书中对加载module的描述,仅仅是说“modprobe比insmod好用,由于它会帮你解决依赖”。本书“不晓得要高到那里去了”。
可能有人要问了,你读了这大几百页书,不还是modprobe吗?没错。并且linux防火墙设置,假定某三天你须要写一个比modprobe还好用的工具深入linux设备驱动程序内核机制,这几百页书不就没白读吗?万一真有这三天呢o( ̄︶ ̄)o
说点沮丧的地方:这本书对block层的讲解上面,尽管覆盖了大量的代码,但是对核心构架的描述有些模糊。其实有可能是我的重点关注在block层上redflag linux,而本书篇幅所限吧。
备忘
GCC别称:__attribute__((alias(#fn_name)))
用nm查看模块的符号表
structfile中的private_data拿来保存和传递驱动自定义的数据。诸如在nvme上面可以存namespace结构。
RCU
读者加锁,在临界区中引用数据
写者用自己的新数据去覆盖老数据。并且须要等到老数据没有reference后,所以这儿要设置一个callback。
irq_thread机制:将中断处理工作放在一个kthread中来做。
kobject_uevent:这个函数实现了将内核中发生的风波通知到用户空间。
__must_check:这个qualifier很有用啊,强制caller来检测返回值。
vm_area_struct:这个结构代表了一段连续的虚拟显存空间,相当于《TheDesignoftheUNIXOperatingSystem》中的region。
SetPageReserved:用这个函数来把数学页面pin住。
访问硬件的地址时,可以用读写屏障来保证次序。
GDB:
finish命令:跑完当前函数,并复印退栈信息。
@操作符:可用于查看显存addr@len
WARN_ON():不触发panic,只是复印栈信息。