受保护的:ta

六月 12, 2007 at 9:30 下午 (单身日记)

这是一篇受密码保护的文章。您需要提供访问密码:


固定链接 查看留言请输入密码

silent

六月 12, 2007 at 8:20 下午 (单身日记)

keep silent,never say a word again no matter what happens

固定链接 Leave a Comment

lkmpg介绍

六月 3, 2007 at 7:36 下午 (linux)

寒假看了lkmpg(The Linux Kernel Module Programing Guide),短小精悍的一本书,很有意思,对内核模块以及相关的一些系统知识都有介绍.

第一章提纲挈领,介绍了什么是module,module的加载以及编译自己的module之前需要注意的一些问题.

第二章以实例开始讲模块的编写语法,编译方法等.这本书里面实例很多,基本以实例为主线,其中有一些很有趣.为了避免使用makefile带来的代码重复,难以维护等问题,内核采用一种叫kbuild的方法,具体内容可以看linux/Documentation/kbuild/modules.txt,我在wiki里摘抄了主要内容.详细的内核makefile编写可以参考linux/Documentation/kbuild/makefiles.txt,wiki上也有摘要.第五节讲了内核模块文档的发布,可以利用linux/module.h中定义的宏来提供module的相关信息.最后介绍了在内核版本不兼容的情况下如何强行加载模块。内核模块的输出在内核缓冲区,在stdout中看不到,可以用demesg查看,/var/log/messages中也有相关信息。

第三章对比了普通程序和模块,对理解内核工作机制有很大帮助.还有内核空间,用户空间介绍等,大家应该已经很了解了.

之后两章讲了模块相关的字符设备和/proc的内容,如何在/dev下注册一个设备,注销设备,有一个注册字符设备的例子,模块能显示设备被读取的次数.上一章的最后讲了设备文件的一些知识./proc在模块编程中比较重要,它是内核向外输出信息的方便途径.第五章介绍使用/proc的方法,/proc中文件建立在内存中,和设备文件不同,它有自己专用的一些函数。
http://bbs.chinaunix.net/viewthread.php?tid=746017 这篇文章里有/proc专用函数的详细介绍
http://www.pcdog.com/edu/ren/2005/08/d017014.html 这篇文章有/proc具体内容的介绍

前面说的是从内核获得输出的两种方法,第六章是关于用/proc作为输入的方法.用linux中标准的注册文件方法,用包含结构体 struct inode_operations指针的结构体struct file_operations.

第七章是模块和与设备文件的对话,就一个例子,没怎么看明白:(,有谁读完了写一下吧。

第八章比较有意思,关于系统调用的,加一点自己的代码,然后由内核调用原函数,来改变系统调用(也可以直接写一个自己的函数,然后改变sys_call_table,使其指针指向我们自己的函数,不过有很大风险,欲知详情请看本章九.十段…).
它给了一个例子,改了open()
original_call = sys_call_table[__NR_open];
sys_call_table[__NR_open] = our_sys_open;
trick: 要查看某个程序用了哪些系统调用,strace ./yourprogram

后面基本都是一些有趣的例子。第九章进程阻塞,实例创建/proc/sleep 只能同时被一个程序打开。第十章替换printk,来实现向终端输出信息,用了一个结构current->tty->drive,先获得当前任务使用的tty,然后输出;让键盘灯闪起来,使用的一些函数在
/usr/src/linux/drivers/char/keyboard.c, function setledstate().

十一章任务调度,有关模块与进程通信的,十二章是模块与硬件的通信,一个与键盘通信的例子.
十三章smp,随便提了一下.

附录中简介2.0到2.2的变化和一些进阶资源.

关于模块编程,网上似乎文章不多,有一篇台湾人写的流传甚广, http://bbs.chinaunix.net/viewthread.php?tid=612535 很经典.

——————————————————————————–

hechunxiao
2007-03-07

固定链接 Leave a Comment