文档详情

操作系统实验一向Linux内核增加一个系统调用.doc

发布:2018-02-06约2.89千字共5页下载文档
文本预览下载声明
操作系统实验一: 向Linux 内核增加一个系统调用 xx 711103xx 2012年3月18日 一、实验目的 通过实验,熟悉Linux 操作系统的使用,掌握构建与启动Linux 内核的方法;掌握用户程序如何利用系统调用与操作系统内核实现通信的方法,加深对系统调用机制的理解;进一步掌握如何向操作系统内核增加新的系统调用的方法,以扩展操作系统的功能。 二、实验内容 1. Linux 环境下的C 或C++编译和调试工具的使用 2. 向Linux 内核增加新的系统调用,系统调用名称和功能自行定义 3. Linux 新内核的编译、安装和配置 4. 编写应用程序以测试新的系统调用并输出测试结果 三、实验步骤 1、安装VirtualBox-4.0.8 并在虚拟机上安装 ubuntu11.10。(电脑上本有ubuntu11.10 64位系统,但在编译内核完成后发现参考教程为32位系统,因64位系统与32位系统增加系统调用步骤差别较大,身为初学者的我选择安装虚拟机,并重新编译……) 2、安装编译源环境sudo apt-get install build-essential、sudo apt-get install gcc、sudo apt-get install g++ 编写一个c++或c程序,并使用gcc –o xxx 或 g++ -o xxx 进行编译并运行。 3、用sudo apt-get update更新软件源,并用 apt-get install linux-source 命令下载适合自己的内核。(当使用过老版本内核时,采用默认的内核配置make oldconfig 时,将会造成错误,自己也因此重做一遍)。 4、增加系统调用: 第一步:解压文件 # cp linux-source-3.0.0.tar.bz2 /usr/src 拷贝至/usr/src目录 # tar xvf linux-source-3.0.0.tar.bz2 解压文件 第二步:修改源程序,增加系统调用实现 # gedit /usr/src/ linux-source-3.0.0 /kernel/sys.c asmlinkage int sys_mycall(int number) { printk(hello, my new kernel, xw~!); return number; } 第三步:修改头文件,增加系统调用声名 #gedit/usr/src/linux-source-3.0.0/arch/x86/kernel/syscall_table_32.S 将223行.long sys_ni_syscall改为.long sys_mycall(不要放在其他地方,否侧可能出现错误) 第四步:修改系统调用表,注册系统调用。 #gedit /usr/src/ linux-source-3.0.0/arch/x86/include/asm/unistd_32.h 增加一行,对应上面的223 5、编译安装内核 第一步:make mrproper 清除内核中不稳定的目标文件,附属文件及内核配置文件 第二步:make clean 清除以前生成的目标文件和其他文件 第三步:make oldconfig 采用默认的内核配置 第四步:make bzImage 编译内核 第五步:make modules 编译模块 第六步:make modules_install 安装模块 cp /usr/src/linux-source-3.0.0/arch/i386/boot/bzImage /boot/vmlinuz-3.0.20 mkinitramfs -o initrd.img-linux-3.0.20 3.0.20 cp /usr/src/linux-source-3.0.0/initrd.img -3.0.20 /boot/initrd.img-3.0.20 6、修改启动配置文件: update-grub2 # reboot 重启电脑 #includestdio.h int main() { syscall(223,1);//223是第五步中宏定义的入口参数,1为函数的参数,整型变量number return 0; } # gcc test.c –o test # ./test # dmesg –c 四、主要数据结构及其说明 略 五、程序运行时的初值和运行结果 初值:增加 printk(hello, my new kernel, xw~!); 结果 如上图 六、实验体会 1、首先,保证用来编译内核的系统是32位的, 这样才能够照着指导书来进行实验(我的是64位的,然后,然后悲剧了
显示全部
相似文档