asmlinkage int sys_mycall(int number);
{;
return number
}
作为一个最简单的例子,我们新加的系统调用仅仅返回一个整型值 。
(2) 连接新的系统调用
添加新的系统调用后,下一个任务是使Linux内核的其余部分知道该程序的存在 。为了从已有的内核程序中增加到新的函数的连接,需要编辑两个文件 。
在我们所用的Linux内核版本(RedHat 6.0,内核为2.2.5-15)中,第一个要修改的文件是:
/usr/src/linux/include/asm-i386/unistd.h
该文件中包含了系统调用清单,用来给每个系统调用分配一个唯一的号码 。文件中每一行的格式如下:
#define __NR_name NNN
其中,name用系统调用名称代替,而NNN则是该系统调用对应的号码 。应该将新的系统调用名称加到清单的最后,并给它分配号码序列中下一个可用的系统调用号 。我们的系统调用如下:
#define __NR_mycall 191
系统调用号为191,之所以系统调用号是191,是因为Linux-2.2内核自身的系统调用号码已经用到190 。
第二个要修改的文件是:
/usr/src/linux/arch/i386/kernel/entry.S
该文件中有类似如下的清单:
.long SYMBOL_NAME()
该清单用来对sys_call_table[]数组进行初始化 。该数组包含指向内核中每个系统调用的指针 。这样就在数组中增加了新的内核函数的指针 。我们在清单最后添加一行:
.long SYMBOL_NAME(sys_mycall)
(3) 重建新的Linux内核
为使新的系统调用生效,需要重建Linux的内核 。这需要以超级用户身份登录 。
#pwd;
/usr/src/linux;
#
超级用户在当前工作目录(/usr/src/linux)下,才可以重建内核 。
#make config;
#make dep;
#make clearn;
#make bzImage
编译完毕后,系统生成一可用于安装的、压缩的内核映象文件:
/usr/src/linux/arch/i386/boot/bzImage
(4) 用新的内核启动系统
要使用新的系统调用,需要用重建的新内核重新引导系统 。为此,需要修改/etc/lilo.conf文件,在我们的系统中,该文件内容如下:
boot=/dev/hda;
map=/boot/map;
install=/boot/boot.b;
prompt;
timeout=50;
image=/boot/vmlinuz-2.2.5-15;
label=linux;
root=/dev/hdb1;
read-only;
other=/dev/hda1;
label=dos;
table=/dev/had
首先编辑该文件,添加新的引导内核:
image=/boot/bzImage-new;
label=linux-new;
root=/dev/hdb1;
read-only
添加完毕,该文件内容如下所示:
boot=/dev/hda;
map=/boot/map;
install=/boot/boot.b;
prompt;
timeout=50;
image=/boot/bzImage-new;
label=linux-new;
root=/dev/hdb1;
read-only;
image=/boot/vmlinuz-2.2.5-15;
label=linux;
root=/dev/hdb1;
read-only;
other=/dev/hda1;
label=dos;
table=/dev/hda
这样,新的内核映象bzImage-new成为缺省的引导内核 。为了使用新的lilo.conf配置文件,还应执行下面的命令:
#cp /usr/src/linux/arch/i386/boot/zImage /boot/bzImage-new
其次配置lilo:
# /sbin/lilo
现在,当重新引导系统时,在boot:提示符后面有三种选择:linux-new 、linux、dos,新内核成为缺省的引导内核 。
至此,新的Linux内核已经建立,新添加的系统调用已成为操作系统的一部分,重新启动Linux,用户就可以在应用程序中使用该系统调用了 。
(5)使用新的系统调用
在应用程序中使用新添加的系统调用mycall 。同样为实验目的,我们写了一个简单的例子xtdy.c 。
/* xtdy.c */;
#include;
_syscall1(int,mycall,int,ret);
main();
{;
printf("%d n",mycall(100))
}
编译该程序:
推荐阅读
- Linux操作系统笔记本电池使用技巧
- 如何在Linux系统下用DMA方式传输数据
- 社保换单位怎么转
- 如何求值域 到底如何求值域
- 如何在百度贴吧评论发言占一楼
- Linux操作系统下文件系统的比较和选择
- word如何直接删掉一页
- 刹车脚踏板一跳一跳什么原因
- 如何取消小红书会员
- Linux操作系统下的网络邻居软件大全
