昨晚,赵猛学长给我演示了一下cscope的使用,我才知道在进入vi后还可以继续使用cscope,于是今天上午我就弄了下这个,在vi中输入:cs出现了以下的提示:
cscope commands:
add : Add a new database (Usage: add file|dir [pre-path] [flags])
find : Query for a pattern (Usage: find c|d|e|f|g|i|s|t name)
c: Find functions calling this function
d: Find functions called by this function
e: Find this egrep pattern
f: Find this file
g: Find this definition
i: Find files #including this file
s: Find this C symbol
t: Find assignments to
help : Show this message (Usage: help)
kill : Kill a connection (Usage: kill #)
reset: Reinit all connections (Usage: reset)
show : Show connections (Usage: show)
于是,我知道了在vi中通过cs f X XXX 可以继续寻找(Usage: find c|d|e|f|g|i|s|t name):
c:寻找调用该函数的函数
d:寻找该函数调用的函数
e:使用egrep的方式(正则式)进行查找
f:寻找某文件
g:查找某定义
i:查找包含了(#include)该文件的文件
s:查找c语言符号,即函数名、宏、枚举等
t:查找字符串
此外,reset可以重新导入数据库(索引文件)
下午,我开始编译内核,因为在《linux内核设计与实现》中读到过把模块代码放在内核源码树中进行编译的方法,于是把scull的代码(不是ldd中原本的,自己写的一个简单的)加了进去。
在内核源码树中添加模块:
1、在drivers/char 目录中创建scull目录,将scull的代码放进去;
2、编译drivers/char 目录中的Makefile文件,在其中添加 obj-m += scull
3、在scull目录中创建Makefile文件,写入 obj-m += scull.o
编译内核
1、make menuconfig,之后没做什么修改,只是在版本里面加入了“yangp”,然后保存退出了
2、make -j4 >/dev/null , 这条命令还是参考的《linux内核设计与实现》
3、make modules
4、make moudles_install
5、make install
今天下午大部分时间都是在编译内核,主要是两个问题:
1、initrd.……的生成 一开始,我没有使用make install命令自动安装,而是手动修改menu.lst和生成initrd文件,但是mkinitrd程序总是出错,因为我记得initrd文件只是 系统在真正启动前的一个临时启动文件,所以直接使用一个其他内核编译而成的initrd文件应该也是可以的(我在ubuntu系统中试过,但是是可以 的),但是这次失败了。对于mkinitrd命令,在网上找了好久都没有找到解决方法。后来使用了make install命令后居然在无意中发现了inird-2.6.18yangp.img文件,之后发现menu.lst也被修改了,centos居然自动搞 定了这些(ubuntn貌似不这样),于是总算从这里解脱了。
2、之后我重启机器,发现用xshell登陆不了,但是自动安装都搞定了,那么就不应该有什么问题了啊。于是通过网页登陆了虚拟机,发现 机器已经起来了,但是网络使用不了,于是在vm player中对scull进行了简单的测试,结果正常。(很奇怪,我的ie进不了虚拟服务器了,这些是在别人的电脑上弄的,所以暂时没有处理这些问题, 估计是配置内核时出了问题吧)。
晚上,我使用Source Insight工具,结合ldd把sbull的代码基本上看懂了,并加入了一点注释。但是,我发现我对请求对列、请求完成函数等几个词的区别不是很清楚, 然后在处理单个bio时涉及到了与内存映射有关的内容方面也不够了解,因为ldd的十五章还没有看。 因为,我是把sbull的代码放入内核源码树中看的,因此就很容易找到每个函数的定义,我在想我有没有必要看系统提供的函数的原型呢? 此外,我知道了我上次把end_that_requst_last注释掉是不对的,之所以没有产生问题,应该是sbull当时是RM_SIMPLE模式用 不到end_that_requset_last函数,这次我看了一下end_that_requst_last的原型,貌似第二个参数uptodate 只是用来设置errno(uptodate<=0时),所以我直接在调用的地方填了个1,不知道这样科不科学。