By: | 吴垠 |
Date: | 2007-07-05 |
Email: | lazy.fox.wu#gmail.com |
Homepage: | http://blog.youkuaiyun.com/wooin |
Copyright: | 该文章版权由吴垠所有。可在非商业目的下任意传播和复制。 对于商业目的下对本文的任何行为需经作者同意。 联系方式:lazy.fox.wu#gmail.com |
1. | 写在前面:
| ||||||||||
2. | 源代码包解压后进入misc-modules文件夹,其中的文件有:
“KERN_ALERT”,保存退出,这是为了可以在/var/log/messages 文件中看到调试信息。 | ||||||||||
3. | 编译: 直接在misc-modules目录下运行make命令就可以编译通过,如果编译有问题请看我的这篇文章 《在 Linux 2.6内核下编译可以加载的内核模块 》 编译成功后会生成很多文件,其中有一个sleepy.ko,就是我们要的内核模块,其部分源码在《Linux设备设备驱动程序(第三 版)》中第六章:高级字符设备驱动程序操作,第151页。 | ||||||||||
4. | 将设备添加到内核中去: 运行命令:
/proc/devices文件找到sleepy设备,并找到其主设备号,比如:
| ||||||||||
5. | 试试设备: 根据书中介绍,sleepy设备是用来演示简单休眠的:当读该设备的时候进程会进入休眠状态,直到有其他进程写该设备,读进程才会被唤醒,我们来读 sleepy设备:
“Aug 3 15:58:20 FOX kernel: process 13534 (dd) going to sleep” 这个是sleepy.c中函数sleepy_read()里的调试信息,告诉你进程已经sleep了 此时我们打开另一个终端运行下面的命令来写sleepy设备:
“Aug 3 16:05:22 FOX kernel: process 13583 (ls) awakening the readers...” 这个是sleepy.c中函数sleepy_write()里的调试信息,告诉你当前进程开始唤醒读进程了。 我们再回过头看看刚才挂起的读操作,发现“dd if=/dev/sleepy of=~/temp”命令已经返回了,并且在/var/log/messages文件中输出调试信息: Aug 3 16:05:22 FOX kernel: awoken 13534 (dd) 这个是sleepy.c中函数sleepy_read()里的调试信息,告诉你进程已经被唤醒了 | ||||||||||
6. | 相关代码: 跟踪一下printk打印出来信息的先后顺序,就可以大致了解整个“休眠”和“唤醒”的过程了。
| ||||||||||
7. | |||||||||||
8. | |||||||||||
9. | |||||||||||