Linux内核之系统调用

简介:

Linux内核之系统调用

 

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()了。


本文转自feisky博客园博客,原文链接:http://www.cnblogs.com/feisky/archive/2011/12/11/2284060.html,如需转载请自行联系原作者


相关文章
|
1天前
|
Linux 开发工具 C语言
【操作系统】实验四 增加Linux系统调用
【操作系统】实验四 增加Linux系统调用
7 1
|
1天前
|
NoSQL Ubuntu Linux
【操作系统】实验三 编译 Linux 内核
【操作系统】实验三 编译 Linux 内核
3 1
|
3天前
|
Linux Windows 编译器
|
4天前
|
存储 算法 Linux
【Linux】线程的内核级理解&&详谈页表以及虚拟地址到物理地址之间的转化
【Linux】线程的内核级理解&&详谈页表以及虚拟地址到物理地址之间的转化
|
4天前
|
安全 Linux
【Linux】详解用户态和内核态&&内核中信号被处理的时机&&sigaction信号自定义处理方法
【Linux】详解用户态和内核态&&内核中信号被处理的时机&&sigaction信号自定义处理方法
|
4天前
|
存储 Linux
【Linux】对信号产生的内核级理解
【Linux】对信号产生的内核级理解
|
4天前
|
消息中间件 算法 Linux
【Linux】对system V本地通信的内核级理解
【Linux】对system V本地通信的内核级理解
|
5天前
|
Linux 编译器 调度
xenomai内核解析--双核系统调用(二)--应用如何区分xenomai/linux系统调用或服务
本文介绍了如何将POSIX应用程序编译为在Xenomai实时内核上运行的程序。
23 1
xenomai内核解析--双核系统调用(二)--应用如何区分xenomai/linux系统调用或服务
|
5天前
|
算法 Linux 调度
xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(一)--实时端socket创建流程
xenomai与普通linux进程之间通讯XDDP(一)--实时端socket创建流程
10 1
xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(一)--实时端socket创建流程
|
5天前
|
Linux 调度 数据库