基于linux0.11的从零开始学操作系统-system_call

关于system call 的调用过程本文不在此赘述,笔者只想在此说明如何在linux0.11内核的基础上添加系统调用。
要增加系统调用,分别需要在这7个地方进行改动,分别是内核代码中的:

1. include/unistd.h 中添加系统调用号
2. 在lib中增加用户接口源文件
3. include/linux/sys.h 中添加系统调用函数定义
4. kernel/system_call.s 修改系统调用总数
5. kernel中增加系统调用的具体实现
6. 修改Makefile 文件

以及usr/include/下的用户接口文件unistd.h
下面以增加一个系统调用hello()为例进行说明:

1. 添加内核系统调用号

打开源文件include/unistd.h,在132行处添加

#define __NR_hello      72

2. 增加用户接口源文件

进入lib目录,新建源文件hello.c

#define __LIBRARY__
#include<unistd.h>
_syscall0(int,hello)

3. 添加系统调用函数的定义

打开include/linux/sys.h,分别在73行和sys_call_table[]数组中添加

extern int sys_hello();
sys_hello

4. 修改系统调用总数

打开kernel/system_call.s ,将61行改为

nr_system_calls = 73

5.增加系统调用的具体实现

进入kernel目录,新建源文件sys_hello.c

int sys_hello()
{
        printk("Hello From kernel\n");
}

6.修改Makefile文件

进入kernel目录,打开Makefile,在OBJS 那一项后面添加

sys_hello.o

在最后一行添加

sys_hello.s sys_hello.o : sys_hello.c ../include/linux/kernel.h ../include/unistd.h

然后返回源文件根目录,make 编译内核。

7.添加编译器系统调用号

进入系统后,在/usr/include/unistd.h文件132行添加(与第一步不同)

#define __NR_hello      72

系统调用即添加完毕,新建hello.c文件进行测试:

#define __LIBRARY__
#include <unistd.h>
#include<stdio.h>
int errno;
_syscall0(int,hello)
int main()
{
    hello();
    return 0;
}

使用gcc 编译并运行,显示输出:

Hello From kernel
感谢稀稀拉拉的赞赏