- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
操作系统试验一指导手册提示此文档只包含一些基本的试验提示
操作系统实验一指导手册
提示:此文档只包含一些基本的实验提示,很多地方仍然需要自己去思考去实现。有能力的同学可以忽略此文档。
Fedora 7虚拟机镜像的初始登录用户名:seu,密码:seu,root用户密码:seu。
实验1:Linux内核代码分析
解压内核
桌面上的linux-2.6.21.tar.gz是linux-2.6.21的内核代码压缩包,解压:
$ cd Desktop
$ tar zxvf linux-2.6.21.tar.gz
$ cd linux-2.6.21
生成内核配置文件
将当前正在运行的内核对应的配置文件作为模板来生成.config文件,即将/boot目录下的已有的config文件复制到linux-2.6.21目录下
$ make mrproper
$ cp /boot/config-`uname -r` ./config
第一个命令make mrproper用来保证内核树是干净的,如果内核第一次编译则可以省略。其中的uname –r命令可查看当前环境下的内核版本号。
更新config文件:
$ make oldconfig
部分新配置项会提示用户选择,都选N或者缺省即可,完成后即可生成.config文件。
编译安装内核
在编译内核前,可以定义自己的内核版本号,在内核代码的根目录下有Makefile文件,例如将第4行改为:
EXTRAVERSION = -seu
这样新内核版本号就是2.6.21-seu
$ make all
$ su
# make modules_install
# make install
# make headers_install
Make all的执行过程可能比较长。
如果三个命令均成功执行,可以观察引导程序grub的配置文件/boot/grub/menu.lst的内容,在hiddenmenu之后可以看到刚刚编译安装的内核版本,将hiddenmenu那一行注释或删除,方便直接操作菜单:
#hiddenmenu或者hiddenmenu
然后重启系统:
# reboot
重启后可以看到grub菜单已经包含了新编译的内核。如果新内核启动失败,一般是由于配置或者内核代码修改的有问题,选择原先的内核启动,再进行修改、编译。
实验2:新增系统调用
在文件arch/i386/kernel/syscall_table.S的尾部加上要新增的系统调用函数的名称,如下图中添加了psta系统调用,注释中的320表示它的系统调用号
在include/linux目录下添加头文件psta.h,比如(千万别忘记struct {…} 结尾的分号):
修改include/linux目录下的Kbuild文件,把psta.h文件加进去。
header-y += x25.h
header-y += psta.h
unifdef-y += acct.h
在kernel目录下新建文件psta.c,在该文件中实现sys_psta函数:
宏asmlinkage定义在linux/linkage.h中,表示函数的参数通过栈传递,而不是寄存器,所有的系统调用都遵循这种参数传递方式。在上面的函数返回之前,可以插入打印一句话到内核日志,方便后面验证执行结果。
printk(Hello world\n);
注意顶上包含下面头文件,实现了printk。
#include linux/kernel.h。
修改文件kernel/Makefile,使得psta.c在编译时可见:
另外,第2步中psta的实现不一定要在一个新文件中,例如文件kernel/sys.c也许是添加这个系统调用的合适位置,这样的话第3步就不需要了。
在include/asm-i386/unistd.h里加上系统调用号的宏定义:
其中NR_syscalls表示的值应该是最大的系统调用号加一。
修改include/linux/syscalls.h,加上函数sys_psta的声明。先在头上加入结构体申明struct pinfo; 在该文件的头文件引用列表的末尾添加:
这算是pinfo结构体的实现。在函数申明列表的最后添加:
重新编译内核
在清理上次编译生成的中间文件之前,最好将配置好的.config文件备份至别的目录下以防删除,否则必须再执行实验1中的第2步配置.config文件。
$ make mrproper
在实验1中就已提到该命令,用于清理编译内核代码的中间文件,它也会删除.config文件。在清理执行完成后,将备份的.config文件复制回来。然后执行实验1中的第3步就可以编译安装新内核了。在这个过程里面可以换一个内核版本名称,以示区别,比如EXTRAVERSION = -seu2。安装好的内核必须reboot后才能生效。
以上6步成功执行后系统调用psta就
文档评论(0)