linux内核设计与实现学习笔记
系统调用笔记定义
系统调用的设计是为了更好的管理用户对系统硬件资源的使用,采用统一的接口有利于系统的稳定和安全。
API是编程接口,他可以是一个或者由多个系统调用来实现。
C库封装了许多系统编程接口,按照posix标准来编写。
系统调用的过程应用程序调用fopen -> C库中的fopen [通过软中断进入内核的中断处理程序,即系统调用的对应的中断程序为int 128] -> system_call() [system_call根据预先设定好的系统调用号来调用对应的系统调用]-> sys_open
系统空间与用户空间的参数传递:
Copy_to_user()
Copu_from_user()
系统调用的绑定
1. Entry.s中添加系统调用的表项
ENTRY(sys_call_table)
.long sys_restart_syscall /*0*/
.long sys_exit
.long sys_fork
...
.long sys_mq_timedreceive /*280*/
.long sys_mq_notify
.long sys_mq_getsetattr
.long sys_my_call /*自定义,表项号为283*/
2. Asm/unistd.h 中添加系统调用号的宏定义
#define _NR_restart_syscall 0
#define _NR_restart_exit1
#define _NR_fork2
...
#define _NR_my_call283
3. 系统调用函数的实现,系统调用的函数要编译到和兴的内核映像中去,所以要将源码添加于内核中的kernel文件夹下,可为kernel/sys.c或者kernel/sched.c
Asmlinkage long sys_my_call(void)
{
...
Return 0;
}
其中asmlinkage限定词高数编译器仅从栈中提取该函数的参数。
4. 系统调用的使用,由于还没有写入C库中,所以gcc无法识别我们自定义的系统调用,如果我们要在我们自己的代码使用我们自定义的系统调用,那就要用到宏:_syscalln(),用于直接对系统调用进行访问。
例如:
#define _NR_my_call 283
_syscall0(long,my_call)
Int main()
{
My_call();
Return 0;
}