赵炯;《Linux 内核完全注释 0.11 修正版 V3.0》 Chapter 8
文章目录
- 增加系统调用功能
- 在汇编程序中直接使用系统调用
增加系统调用功能
若要为自己的内核实现一个新的系统调用功能,那么我们首先应该决定它的确切用途是什么。Linux 系统不提倡一个系统调用用来实现多种用途。另外,我们还需要确定新的系统调用的参数、返回值和错误码。系统调用的接口应该尽量简洁,因此参数应该尽可能地少,在设计时也应该考虑到系统调用的通用性和可移植性。
1. 编写系统调用处理函数
kernel/sys.c
void sys_sayhi()
{
...
}
2. 新增系统调用功能号和原型定义
include/unistd.h
// 新系统调用功能号
// 新系统调用函数原型
void sayhi();
3. 外部函数声明以及 sys_call_table 末端插入新系统调用处理函数的名称
include/linux/sys.h
extern void sayhi();
// 函数指针数组
fn_ptr sys_call_table[] = {xxx,xxx,xxx,sys_sayhi};
4. nr_system_calls 增加 1
system_call.s
5. 重新编译内核
系统调用设置完成,具体使用系统调用的方式是借用 lib 库,参照 lib/ 目录下库函数的实现方法在 libc 库中增加新的系统调用库函数 sayhi()。
在汇编程序中直接使用系统调用
使用汇编语言编制出一个独立的程序,不使用起时代码模块(crt0.o)和库文件中的函数。
系统调用1:sys_write(int fd, char* buf, int len)
1. eax(系统调用号) 4
2. ebx(文件描述符) 1 —— stdout
3. ecx(缓冲区指针) message
4. edx(写数据长度值)
系统调用2:sys_exit()
1. eax(系统调用号) 1