操作系统实验一向Linux内核增加一个系统调用.doc
文本预览下载声明
操作系统实验一:
向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位的,然后,然后悲剧了
显示全部