linux系统调用学习笔记

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;

}


你可能感兴趣的:(linux系统调用学习笔记)