
新增系统调用实验报告.doc
8页学 号姓 名专业、班电商1202实验地点指导教师万少华时间2014.4.9电商1202操作系统原理实验报告实验序号:02实验项目名称:Linux新增系统调用一、 实验目的与要求v 加深对系统调用的理解,掌握增加与调用系统调用的方法v 掌握核编译方法二、实验设备〔环境〕与要求1.windows操作系统2.vmW虚拟机3.linux- 2.6.28,linux-3.1-rc4.tar.gz三、 实验容与步骤准备工作:下载linux-2.6.28的核在虚拟机设置与本机的共享文件夹,实验相关的都放到这里面将新的核拷贝到/home/cw/〔因为如果直接拷贝到/usr/src/,后续系统调用时的文件修改无法进展〕实验过程:(1) 首先获得root权限,方便后面的一系列操作,输入su,接着输入密码跳转到/home/cw/目录输入ls查看文件,看到了linux- 2.6.28.tar.bz2,解压之,得到linux- 2.6.28这个文件夹获得Root权限解压解压过程〔其它乱七八糟的均为前几次实验的失败产物-3-〕(2) 接着在文件夹中找到kernel/sys.c,arch/x86/kernel/syscall_table_32.S和/usr/src/linux-2.6.29.1/arch/x86/include/asm/unistd_32.h,拷贝到/home/cw/〔因为解压后的linux-2.6.28文件夹有权限限制不能直接修改〕。
在sys.c最后添加调用函数,在syscall_table_32.S后加系统调用号,在unistd_32.h添加声明〔3〕将修改好的复制进/home/cw/linux-2.6.28/,再将整个文件夹复制到/usr/src/中复制文件这里是在删除前几次失败实验的东西防止看花了眼3) 输入make mrproper去除以前编译的东西接着输入make oldconfig.使用已有的配置在make oldconfig时出错了!Unable to find the ncurses libraries于是在网上找到如下的解决方法:CentOS:yum install -y ncurses-develUbuntu:sudo apt-get insatll ncurses-dev编译新内核配置成功又出错了!度娘了一下,原来是32位和64位在编译上的问题,我的centOS是64位的 而核的版本太早了所以结论是再下一个新的核重新做由于前面的步骤根本上都一样,所以没有截图64位在修改的文件上有一点不同:1)2) linux-3.1-rc4/arch/x86/include/asm/unistd_64.h可以看到原有的最后一个系统调用为: #define __NR_syncfs 344在后面添加自己的系统调用: #define __NR_mycall 345同时,修改总的系统调用数: #define NR_syscalls 346 3)linux-3.1-rc4/include/linux/syscalls.h添加增加的系统调用的声明:asmlinkage long sys_mycall(int num);4) linux-3.1-rc4/kernel/sys.c添加系统调用函数: SYSCALL_DEFINE1(mycall, int, num) { printk("This is my syscall from kernel.\n"); printk("current pid is: %d.\n", current->pid); return (long)num; }(4) 接着输入make编译核,等了十多分钟。
输入命令:make modules_install,又等了很久很久5) 输入命令mkinitramfs -o initrd.img-2.6.29.1 2.6.29.1在目录/usr/src/linux-2.6.29.1下生成一个压缩包一样的东西:initrd.img -2.6.29.1,拷贝到/boot 目录下然后重启6) 我在win7系统中写了一个测试的小程序,拷贝到虚拟机的/home/cw/7) 使用GCC编译并执行结果四、 分析与讨论实验一遇到的问题与解决过程:a) 看完实验要求之后是一头雾水,无从下手试着装了虚拟机,然后又发现还要装linux系统,下好之后跟着网上的教程一步步的配置,一边弄一边感慨为什么我的电脑和网上的不一样!总之在安装和配置纠结了很久b) 然后是在vi上编辑shell脚本,当时连VI怎么开都不知道,后来查到是ctrl+alt+F2,然后跟着教程做,结果在运行脚本的时候出错了,错误大概的意思是“找不到复制目录〞于是重新建了文件夹和文件,再次运行,还是同样的错误-3-于是重头开场再做一遍,保存脚本的时候又出错了,错误大概意思是“该文件已经存在〞把该删的都删了,又重头开场做。
终于,第三次成功了c) 最后是在GCC上编译C程序,由于有了上一个问题的折磨对VI熟悉了不少,这次顺利的一次性完成实验二遇到的问题与解决过程:a) 由于一开场很多东西都不懂,随便下了个核,结果找不到要修改的文件,只好重新下,又遇到编译的问题再次重新做才成功〔这就是我的/usr/src/目录为什么会有这么多乱七八糟的东西〕b) 权限问题是导致这次实验的步骤变得如此繁琐的罪魁祸首开场不懂root权限,仅仅是为了将文件拷贝进/usr/src/目录就用了一个晚上而这最简单的一步,在我所看到的资料里都直接忽略了这个问题,以至于我纠结许久c) 在实验过程中还出现了各种各样教程上没有出现的问题,比方说make menuconfig的时候没有进到目录,导致一直出错、没有装ncurses-dev、拷贝的时候漏了一个“/〞导致整个根目录都拷进了src文件夹……诸如此类不胜枚举d) 最大的心得:我真是太水了!一个大学课堂所能接触到的真的只是知识的冰山一角,越实践越发现自己思维的盲点与知识的巨大空缺总之就是:革命尚未成功,同志仍需努力ヾ(≧へ≦)〃六、教师评语签名: 日期:成绩 / 。
