Linux2.6 --系统调用处理程序
2013-08-07 18:57
246 查看
用户空间的程序无法直接执行内核代码。它们不能直接调用内核空间中的函数,因为内核驻留在受保护的地址空间上。如果进程可以直接在内核的地址空间上读写的话,系统的安全性和稳定性将不复存在。
所以,应用程序应该以某种方式通知系统,告诉内核自己需要执行一个系统调用,希望系统切换到内核态,这样内核就可以代表应用程序在内核空间执行系统调用。
通知内核的机制是靠软中断实现的:通过引发一个异常来促使系统切换到内核态去执行异常处理程序。此时的异常处理程序实际上就是系统调用处理程序。在X86系统上预定义的软中断是中断号128,通过 int $%0x80 指令触发该中断。这条指令会触发一个异常导致系统切换到内核态并执行第128号异常处理程序,而该程序正是系统调用处理程序。这个异常处理程序名字起得很贴切,叫 system_call() .它与硬件体系结构密切相关。
不管系统调用处理程序被如何调用,用户空间引起异常或陷入内核就是一个重要的概念。
下面我们以 read()系统调用说明陷入内核的过程,如图所示:
我们可以看到,在用户空间使用 read函数,接着在C库中进行封装,接下来就触发异常,陷入内核,首先调用的是 system_call 函数,在该函数中进行非常重要的任务,如参数检查合法性,权限合法性检查等,最后,通过了检查之后,正式调用 sys_read() ,这就是 read 在内核中的实现。
由于Linux内核中系统调用的过程都是相似的,所以,执行过程类似于 read 系统函数的调用。
所以,应用程序应该以某种方式通知系统,告诉内核自己需要执行一个系统调用,希望系统切换到内核态,这样内核就可以代表应用程序在内核空间执行系统调用。
通知内核的机制是靠软中断实现的:通过引发一个异常来促使系统切换到内核态去执行异常处理程序。此时的异常处理程序实际上就是系统调用处理程序。在X86系统上预定义的软中断是中断号128,通过 int $%0x80 指令触发该中断。这条指令会触发一个异常导致系统切换到内核态并执行第128号异常处理程序,而该程序正是系统调用处理程序。这个异常处理程序名字起得很贴切,叫 system_call() .它与硬件体系结构密切相关。
不管系统调用处理程序被如何调用,用户空间引起异常或陷入内核就是一个重要的概念。
下面我们以 read()系统调用说明陷入内核的过程,如图所示:
我们可以看到,在用户空间使用 read函数,接着在C库中进行封装,接下来就触发异常,陷入内核,首先调用的是 system_call 函数,在该函数中进行非常重要的任务,如参数检查合法性,权限合法性检查等,最后,通过了检查之后,正式调用 sys_read() ,这就是 read 在内核中的实现。
由于Linux内核中系统调用的过程都是相似的,所以,执行过程类似于 read 系统函数的调用。
相关文章推荐
- Linux2.6 --系统调用处理程序
- 奇数幻方 程序实现 C++,linux系统下的codeblocks写的,估计里面的清屏函数windows下不能被调用
- Linux 2.6 劫持系统调用 隐藏进程
- Linux0.11内核--系统中断处理程序int 0x80实现原理
- 系统调用处理程序 系统调用服务例程 关系 区别
- Linux 2.6 劫持系统调用 隐藏进程
- linux系统下,c++程序,调用system命令失败,分析过程
- 通过分析exevc系统调用处理过程来理解Linux内核如何装载和启动一个可执行程序
- 在i386平台Linux 2.6 上实现一个系统调用
- 在i386平台Linux 2.6 上实现一个系统调用
- linux 系统下python程序中出现中文的处理方法
- linux 64位系统兼容32bit程序 ioctl调用cmd匹配问题解决
- 关于linux系统一启动就调用某个程序
- linux2.6内核系统调用的增加方法
- Linux 2.6 对新型 CPU 快速系统调用的支持
- Linux系统调用程序分析
- 系统调用和中断处理的异同(以Linux MIPS为例)
- Linux中断处理之系统调用
- Linux0.11内核--系统中断处理程序int 0x80实现原理
- Linux 2.6 劫持系统调用 隐藏进程