《Linux内核设计与实现》学习笔记3——系统调用

来源:互联网 发布:淘宝被骗2万报警有用吗 编辑:程序博客网 时间:2024/06/07 21:45

系统调用:内核提供的用户程序与内核进行交互的一组接口。

 

1. 与内核通信

主要作用:

1.1 对于应用程序:提供了访问应将的接口,提供了创建进程和进程间通信的机制,提供了申请操作心痛其他资源的能力。

1.2 对于操作系统:保证了系统的安全、稳定。


2. API、POSIX和C库

2.1 API(应用编程接口):定义了一组应用程序使用的编程接口。

API与系统调用没有直接对应关系。

2.2 POSIX::Unix世界中,最流行的API标准。

2.3 C库:C库实现了Unix系统的主要API,提供了POSIX的绝大数API


3. 系统调用

3.1 一般包括:输入的参数,可能产生的副作用和一种明确的操作。

3.2 系统调用号:用来指明到底要执行哪个系统调用。

         系统调用号独一无二,不可变更,即使系统调用删除,系统调用号也不会回收。

         sys_call_table:记录了所有已经注册过的系统调用的列表

 

4. 系统调用处理函数:system_call()

系统调用对应的软中断的异常处理函数:

应用程序通过软中断通知内核自己要执行一个系统调用,内核可以代表应用程序在内核空间执行。

4.1 指定恰当的系统调用

通过寄存器,把系统调用号一并传给内核。

4.2 参数传递

参数和返回值一般通过寄存器传递,参数太多的情况下,可以用一个单独的寄存器存放参数的用户空间的地址

 

5.系统调用的实现

5.1 实现系统调用

用途:不提倡多用途的系统调用。

参数:很多系统调用通过标志参数确保向前兼容

5.2 参数验证:

(1)用户传入指针的检查:内存区属于用户空间,在进程的地址空间,内存权限标记。

(2)内核无论何时都不能轻率的接受来自用户空空间的指针,copy_to_user和copy_from_user必须其中一个被使用。

5.3 是否有合法权限。

 

6 系统调用上下文

 6.1 绑定一个系统调用的最后步骤

(1)在系统调用表(sys_call_table)的最后加入一个表项

(2)定义系统调用号<asm/unistd.h>

(3)系统调用必须被编译到内核映像

6.2 从用户空间访问系统调用:

可以通过宏syscalln()直接对系统调用访问:

#define __NR_foo 283

__syscall0(long, foo)

直接就可以调用声明好的foo()来调用系统调用foo()

阅读全文
0 0