当前位置:文档之家› linux实验报告(编译内核)

linux实验报告(编译内核)

湖北大学
学生实验报告
实验课程网络实用技术
开课学院计算机与信息工程学院
任课教师徐婕
学生姓名骆婧
学生学号************** 70
专业班级计科一班
学生年级2011级
2013-2014 学年第二学期
一.实验目的
通过实验,熟悉Linux操作系统的使用,掌握构建与启动Linux内核的方法;掌握用户程序如何利用系统调用与操作系统内核实现通信的方法,加深对系统调用机制的理解;进一步掌握如何向操作系统内核增加新的系统调用的方法,以扩展操作系统的功能。

二.实验内容
1.Linux环境下的C或者C++编译和调试工具的使用
2.向Linux内核增加新的系统调用,系统调用的功能为打印出自己的学号和
姓名信息。

3.Linux新内核的编译、安装和配置。

4.编写应用程序以测试新的系统调用并输出测试结果。

三、实验步骤
第一步:解压文件
1.下载linux-3.13.3.tar.xz压缩包。

2.在Ubantu系统下,解压该文件,解压之后得到linux-
3.13.3文件包
# tar –xf linux-3.13.3.tar.xz
3.将解压后的文件包复制到/usr/src
# cp linux3.13.3 /usr/src
第二步:修改源程序,增加系统调用
1.gedit /usr/src/linux-3-13.3/kernel/sys.c (增加系统调用,使用面向内核的
打印函数printk打印姓名学号)
使用gedit命令,可以直接在文档编辑器中直接修改。

修改好后按保存关闭文档编辑器。

在开头加入头文件:
#include<linuxlinkage.h>
在末尾加入函数
asmlinkage int sys_mycall(void)
{
printk(KERN_ALERT "My name is XXXX!My studentid is XXXXXXX\n");
return 1;
}
2.gedit /usr/src/linux-3-1
3.3/arch/x86/include/asm/syscalls.h
在倒数第二行后插入
asmlinkage int sys_mycall(void);
3.gedit /usr/src/linux-3-13.3/arch/x86/syscalls/syscall_32.tbl
最后一行添加一个系统调用的ID
351 i386 mycall sys_mycall
第三步:编译安装内核
首先进到/usr/src/linux-3.13.3文件夹下
# cd /usr/src/linux-3.13.3
1.make mrproper(清除内核中不稳定的目标文件,附属文件及内核配置文件)
2.# make menuconfig
保存设置Save并退出Exit
3.# make bzImage (编译内核,大概需要20分钟,最后会出现提示:bzImage
is ready。


4.#make modules(编译模块,大概需要一个多小时)
5.#make modules_install(安装模块)
6.#make install
7 #sudo update-grub(修改启动配置文件)
8.#reboot(重启系统)
重启进入系统后查看当前内核版本
#uname –r
会显示已经编译成功的内核版本号
第四步:编写测试程序并测试
1.新建一个空白文档,并重新命名为test.c,写入以下函数,并保存#include<stdio.h>
int main()
{
syscall(354);
return 0;
}
2测试用gcc命令编译测试文件
# gcc -o test test.c
#./test
#dmesg(将信息打印在日志文件)
三.实验体会
在没有编译内核系统调用之前,我感觉老师布置的这个题目是什么意思都木有搞清楚,总感觉无从下手,也怕自己弄不好造成最后系统永不了的悲剧。

但是我还是选择硬着头皮去做,通过在网上查找很多资料和教程,才对这个任务要怎么去完成才有了比较清晰的概念。

当然实现的过程中也遇到了不少麻烦。

1.版本选择问题
首先我担心在3.13.3的版本上直接改动的话如果最后系统调用不成功,会检查不出是内核没有编译好还是测试文件有问题,所以我在网上下了好几个2.6的版本进行试验。

可是最后发现每个内核版本里面的那几个需要修改的文件并不在同样的目录下面,依据版本而定。

有点版本解压后甚至缺失很多子文件夹,这就让我非常零乱,但是最后通过仔询问其他同学找到了文件包完整的版本。

最后的最后决定用3.13.3的版本直接做。

2修改源文件问题
在2.6的版本里面应该要更改kernel下的entry.S,结果改成了其他的地方的entry.S。

最后导致在编译内核的过程中,在make bzImage 的时候,系统报错。

类似这样的问题犯了好几次,都是文件木有找对位置就匆忙地进行修改。

导致最后每次到make bzImage的时候就会报错。

在3.13的版本修改源文件是也因为不仔细,把sys_mycall写成了sys_mycalls 等等,最后编译过程中出现了函数没有定义等问题。

3.命令选择问题
这其中涉及到权限问题,当把文件包移动到/usr/src之后是不能直接进到子目录里面去修改.网上给的方法是使用vim命令或者vi命令,我试了一下,发现这其实是把要修改的文件的信息显示在终端上,但是这样修改显然不直观不方便,因为在终端上想要换行,写入
都不好操作,退出、保存等还需要专门的命令,后来又在网上看到了gedit命令,再试一次,发现它是把文件在文本编辑器中打开来的,这样方便好操作。

改完后也能及时检查是否有误。

4测试程序编写问题
测试程序里面开始包含的头文件不正确,int main()里面的参数传递没有和自己在源文件里面的相互对应,syscall又写成了sysmycall,导致测试函数不能进行测试。

后来对照自己写的系统调用函数和系统调用号,检查出来错误。

通过这次实验,让我收获了不少东西,首先接到一个任务,不要怕麻烦,不要老想这任务有多纠结,只要多查资料,仔细理解一定会感觉越来越清晰明了,遇到问题的时候更不能泄气,而是应该努力寻求解决办法,很重要的一点就是多尝试,在尝试中你才能找到最好办法,就比如linux下的很多命名,不会的就百度谷歌,理解了命名的功能后就会越用越熟练,越用越有趣。

成功之后再回过头来看发现其实是一个很简单的任务。

相关主题