系统调用
一、实验目的
1、掌握系统调用的基本过程,建立对系统调用接口的深入认识,能够按要求增加系统调用并完成测试。
2、能够通过自主学习解决系统调用设计与实现中遇到的问题。
- 实验结果

- 问题及解决方法
gcc 的 “-Wall” 参数是给出所有的编译警告信息,“-o” 参数指定生成的执行文件名是 iam。

出现报错,原因是:
之前修改的unistd.h没有加载到linux-0.11中,需要打开挂载后,进入hdc/usr/include中去修改unistd.h。
再用gcc编译,若无提示信息, 则编译成功

- 实验思考
1. Linux 0.11 系统调用参数限制
在 Linux 0.11 中,系统调用最多能传递6个参数。这是因为在 `include/unistd.h` 中,系统调用的声明是通过宏定义的形式,参数的个数是固定的,这限制了系统调用的参数数量。
要扩大这个限制,可以考虑以下几种方法:
使用结构体: 将参数打包成一个结构体,然后将结构体的指针传递给系统调用。这样就可以通过结构体来传递更多的信息。
使用全局变量:在系统调用中使用全局变量,通过全局变量传递额外的参数。
寄存器传递:尝试使用寄存器传递参数,而不是通过栈传递。这需要修改相关的汇编代码和系统调用的接口。
2. 向 Linux 0.11 添加系统调用 foo() 的步骤
要向 Linux 0.11 添加一个系统调用 `foo()`,需要进行以下步骤:
1. 修改系统调用表: 在 `kernel/system_call.s` 文件中,找到系统调用表,添加一个新的入口以处理 `foo()`。这包括分配一个新的系统调用号和在表中添加相应的处理函数入口。
2. 定义系统调用号: 在 `include/unistd.h` 中,为 `foo()` 分配一个唯一的系统调用号。
3. 实现系统调用函数:在合适的文件中实现 `foo()` 的功能,可能是在 `kernel/system_call.s` 中的一个新的处理函数。
4. 更新系统调用数量:在 `kernel/Makefile` 中更新系统调用的数量,确保它包括新添加的 `foo()`。
5. 更新用户库:如果需要,更新用户空间的 C 库,以便用户程序能够调用 `foo()`。这包括在用户程序中引入新的系统调用号并提供相应的接口。
6. 重新编译内核和用户程序:编译内核以包括新的系统调用,同时重新编译用户程序以使用新的库。
3. 将系统调用接口放到库里
将系统调用接口放到库中以便用户程序像其他系统调用一样使用可以按以下步骤进行:
1. 创建库文件:编写包含新系统调用接口的库文件,例如 `l