您的位置:首页 > 编程语言

2010-3-6 代码阅读(续)编译内核 学习

2010-03-06 16:48 363 查看
昨晚,赵猛学长给我演示了一下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,不知道这样科不科学。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: