Linux内核之系统调用
2011-12-14 18:26
190 查看
1. 应用程序通过API而不是直接调用系统调用来编程;
2. getpid()系统调用示例:
asmlinkage long sys_getpid(void)
{
return current->tgid;
}
asmlinkage 编译器仅从栈中提取参数
系统调用的命名规则:sys_syscallname()
3. 每个系统调用都对应一个唯一的系统调用号,如果系统调用被删除,但它占用的系统调用号不回收。
4. 系统调用通过软中断实现(int $0x80),通过引发一个异常陷入懂啊内核态去执行异常处理程序system_call。最近的x86处理器已经支持了sysenter指令。
5. 参数和返回值通过寄存器来传递。
6. 指针参数的合法性验证:
(1)指针指向的内存区属于用户空间;
(2)指针指向的内存区在进程的地址空间里;
(3)指针指向的内存区必须被标记为可读(读)/可写(写)。
系统提供了两个方法来完成内核空间与用户空间的数据拷贝:copy_to_user()和copy_from_user()。
7. 内核执行系统调用的时候处于内核上下文,此时内核可以休眠并可以被抢占。
8. 系统调用必须编译进内核映像,不能编译成模块。
9. 通常通过C库来使用系统调用(包含头文件并链接相应的库),但也可以通过宏来直接访问系统调用,如open()的调用:
先通过下面的宏将系统调用扩展为内嵌汇编的C函数:
#define_NR_open 5
_syscall3(long, open, const char*, filename, int, flags, int, mode)
这样,应用程序就可以直接使用open()了。
转自<http://www.cnblogs.com/feisky/archive/2011/12/11/2284060.html>
2. getpid()系统调用示例:
asmlinkage long sys_getpid(void)
{
return current->tgid;
}
asmlinkage 编译器仅从栈中提取参数
系统调用的命名规则:sys_syscallname()
3. 每个系统调用都对应一个唯一的系统调用号,如果系统调用被删除,但它占用的系统调用号不回收。
4. 系统调用通过软中断实现(int $0x80),通过引发一个异常陷入懂啊内核态去执行异常处理程序system_call。最近的x86处理器已经支持了sysenter指令。
5. 参数和返回值通过寄存器来传递。
6. 指针参数的合法性验证:
(1)指针指向的内存区属于用户空间;
(2)指针指向的内存区在进程的地址空间里;
(3)指针指向的内存区必须被标记为可读(读)/可写(写)。
系统提供了两个方法来完成内核空间与用户空间的数据拷贝:copy_to_user()和copy_from_user()。
7. 内核执行系统调用的时候处于内核上下文,此时内核可以休眠并可以被抢占。
8. 系统调用必须编译进内核映像,不能编译成模块。
9. 通常通过C库来使用系统调用(包含头文件并链接相应的库),但也可以通过宏来直接访问系统调用,如open()的调用:
先通过下面的宏将系统调用扩展为内嵌汇编的C函数:
#define_NR_open 5
_syscall3(long, open, const char*, filename, int, flags, int, mode)
这样,应用程序就可以直接使用open()了。
转自<http://www.cnblogs.com/feisky/archive/2011/12/11/2284060.html>
相关文章推荐
- Linux内核分析(六)----字符设备控制方法实现|揭秘系统调用本质
- [网易云课堂]Linux内核分析(四)—— 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
- 20135239 益西拉姆 linux内核分析 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
- LINUX内核设计第五周——扒开系统调用的三层皮(下)
- linux内核增加系统调用--Beginner's guide
- Linux内核监控模块-3-系统调用的截获
- linux内核文件IO的系统调用实现分析
- linux内核分析第四周-使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
- linux内核分析 第四周 扒开系统调用的三层皮(上)
- linux内核分析---系统调用实现代码分析
- Linux内核中的dup系统调用
- 向linux内核中添加三个系统调用(Ubuntu9.10)
- Linux内核-系统调用
- 如何在Linux内核里增加一个系统调用
- linux内核介绍之系统调用过程
- Linux内核设计第四周学习总结 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】Linux系统调用的实现机制分析
- 向linux内核添加系统调用新老内核比较
- Linux内核分析课程--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
- 向linux内核添加系统调用新老内核比较