第四章和第五章的笔记。这两章分别是:
-
Debugging Techniques
-
Concurrency and Race Conditions
第四章里全是Debug的方法,实际开发时这是必须掌握的,包括:
- 内核中实现的某些检查机制
内核中提供的检查机制需要在menuconfig时enable,可以检查出很多书中介绍的常见错误,例如Spinlock未初始化、sleeping with a Spinlock、堆栈溢出、定义为__init的函数在被卸掉以后又被调用等。比较有用! - 使用printk()打印状态信息
打印状态信息,这个上学的时候就知道了!Just for completeness吧! - 使用proc文件系统
这个用处应该也比较广的。原理已经掌握了,就是先在/proc文件系统下注册一个文件,然后提供当有人读这个文件时,用于提供文件内容的方法。作者推荐使用seq_file的方式,也就是start、next、show、stop四个函数。相对于原来的方式,seq_file的方式处理大量信息的时候比较容易。 - 使用strace工具
strace工具可以显示一个程序执行过程中的各个系统调用的参数和返回值。比较厉害! - 如何理解Oops信息
Oops信息是内核中出现比较严重的错误,但是Linux没有被hung up时,显示的信息。其内容主要是:IP指针、所在的函数名、CPU寄存器信息、堆栈中的内容、Call trace。比较牛B! - gdb、kdb、kgdb的介绍
这部分可能是最有用的了吧,尤其是使用gdb调试内核。但是我目前没有那么复杂的项目可做,所以暂时不想学。
现在可以说掌握了的只有使用printk()、读Oops信息和实现/proc文件系统三个。其他方法等到用到的时候再回过头来查吧。
第五章讲了进程并发有关的内容,包括怎么控制race。作者把控制方法分成几类:
-
Semaphore
操作系统课里叫“信号量”(奇怪的翻译方法),提供P、V两种操作的那个。 -
Completion
不知道咋译,也没仔细看。 -
Spinlock
译为“自旋锁”,也没仔细看呢。 -
Atomic Variable
应该是译为“原子变量”,在其上的操作很简单,但都是atomic的。
Completion和Spinlock都是由Semaphore变形而来的,所以没仔细看。Semaphore和Atomic Variable两部分了解了,但是还没实际用它们写过代码。
这章里有一个地方郁闷了很久:Semaphore的一系列P操作函数中,有个down_interruptible()。这个家伙在进入asleep状态等待semaphore被释放的时候,有可能被Signal唤醒。所以使用这个函数时,要判断它的返回值,看它是因为啥醒的。如果返回值为零,则说明是取得了semaphore而返回,相当于“自然醒”;不然则是被某个Signal给唤醒了,那么驱动程序需要返回-ERESTARTSYS(意思是告诉上一层的函数“重新尝试这个系统调用”)。这段得看了第六章的“IO Blocking”和“Asynchronouns Notification”两部分,还得了解Linux进程管理中的信号机制(Signal),才能明白。可折腾死我了。
总结这章,其实也挺简单。就是一句话:你正在操作的数据随时可能被别的进程强奸,所以不要对数据报有任何假设,除非你hold了她的semaphore。





