LDD3读书笔记.Chapter4-5

Posted by Sah in Sah写的 | Tagged | Leave a comment

第四章和第五章的笔记。这两章分别是:

  • 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。

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>