linux实验报告(编译内核)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
湖北大学
学生实验报告
实验课程网络实用技术
开课学院计算机与信息工程学院
任课教师徐婕
学生姓名骆婧
学生学号************** 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
在末尾加入函数
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
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命令,我试了一下,发现这其实是把要修改的文件的信息显示在终端上,但是这样修改显然不直观不方便,因为在终端上想要换行,写入