给linux添加系统调用
实验编号1题目系统调用实验目的加深对系统函数库、操作系统提供的系统调用的共同点和差异的认识,通过认识、了解Linux系统调用的实现方式,强化操作系统为用户提供接口方式的理性认识。实验内容为Linux内核增加一个系统调用,并编写用户进程的程序来测试。要求该系统调用能够完成以下功能:1. 该系统调用有1个整型参数。
实验编号 | 1 | 题目 | 系统调用 | |
实验目的 | 加深对系统函数库、操作系统提供的系统调用的共同点和差异的认识,通过认识、了解Linux系统调用的实现方式,强化操作系统为用户提供接口方式的理性认识。 | |||
实验内容 | 为Linux内核增加一个系统调用,并编写用户进程的程序来测试。 要求该系统调用能够完成以下功能: 1. 该系统调用有1个整型参数。 2. 若参数大于0,则返回自己学号的最后一位。如您的学号为248,则返回8。 3. 若参数小于或等于0,则返回自己的学号。如您的学号为248,则返回248。 | |||
报告内容要求 | (1) 程序实现方法和思路 (2) 测试及结果 | |||
报 告 正 文 | ||||
一、实现思路: 给linux添加一个系统调用,也就是为linux增加一个api函数。这样需要修改linux的内核,然后通过编译就会形成一个新内核,在新内核里即可调用自己添加的api函数。
二、实验步骤: (1)cd /usr/src/linux/kernel (2)vi sys.c 并添加如下一个函数: asmlinkage int sys_mycall(int num) { if(num > 0) { return 2; } else { return 13061032; } } (3)cd /usr/src/linux/arch/i386/kernel (4)vi entry.S 并添加如下代码 .long SYMBOL_NAME(sys_mycall) (5)在头文件中增加申明: cd /usr/include/asm vi unistd.h 添加: #define __NR_mycall 191 (6)编译内核: #make mrproper /* clean old config info */ #make clean /* clean old object file */ #make menuconfig /* do nothing,just exit and save config,all use default */ #make dep /* binding the configuration info */ #make bzImage /* it should work. */ (7)编译完成后,将新内核文件和新的系统符号表拷贝到/boot目录,如下: #cp arch/i386/boot/bzimage /boot/bzimage_00 #mkinitrd /boot/bzImage_00.img 2.2.14 -15mdk (8)修改系统配置文件(/etc/lilo.conf): 在lilo.conf文件末尾添加如下代码: image = /boot/bzImage_00 label = linux-oyz root = /dev/sda5 initrd = /boot/bzImage_00.img append = “” read-only (9)使用超级用户运行:/sbin/lilo,然后重新启动:reboot (10)在启动的boot页面,Tab选择linux-oyz启动。 (11)测试执行,编写如下测试函数: #include <linux/unistd.h> _syscall1(int,mycall,int,ret);
int main()
{
printf("My name is oyz,and my number is %d./n",mycall(0));
printf("The last of my number is %d./n",mycall(1));
return 0;
}
三、测试结果: 略。
|
更多推荐
所有评论(0)