0
点赞
收藏
分享

微信扫一扫

【Bochs】增加系统调用功能、在汇编程序中直接使用系统调用

赵炯;《Linux 内核完全注释 0.11 修正版 V3.0》 Chapter 8


文章目录

  • ​​增加系统调用功能​​
  • ​​在汇编程序中直接使用系统调用​​

增加系统调用功能

若要为自己的内核实现一个新的系统调用功能,那么我们首先应该决定它的确切用途是什么。Linux 系统不提倡一个系统调用用来实现多种用途。另外,我们还需要确定新的系统调用的参数、返回值和错误码。系统调用的接口应该尽量简洁,因此参数应该尽可能地少,在设计时也应该考虑到系统调用的通用性和可移植性。

1. 编写系统调用处理函数

kernel/sys.c

void sys_sayhi()
{
...
}

2. 新增系统调用功能号和原型定义

include/unistd.h

// 新系统调用功能号
#define __NR_sayhi xx
// 新系统调用函数原型
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

【Bochs】增加系统调用功能、在汇编程序中直接使用系统调用_linux


举报

相关推荐

0 条评论