linux系统调用详解.pdf

linux系统调用详解.pdf

ID:51494898

大小:527.09 KB

页数:10页

时间:2020-03-25

linux系统调用详解.pdf_第1页
linux系统调用详解.pdf_第2页
linux系统调用详解.pdf_第3页
linux系统调用详解.pdf_第4页
linux系统调用详解.pdf_第5页
资源描述:

《linux系统调用详解.pdf》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、LINUX源码解读:系统调用的设计与实现5080309910张至先介绍系统调用是操作系统内核提供的,为了和用户空间上运行的进程进行交互的一组接口,通过该接口,应用程序可以访问硬件设备和其他操作系统资源。系统调用主要有三个作用:a.为用户空间提供一种硬件的抽象接口。b.保证了系统的稳定与安全。c.实现多任务和虚拟内存。对于用户空间的进程,在一般情况下是通过应用编程接口(API)而不是系统调用来进行编程,有些API往往直接封装了系统调用,但这并不意味着两者是一一对应的。当前最流行的API是基于POSIX标准的。原理本节通过对getpid()的跟踪,来由外向内的了解linux系统调用的原理

2、。库函数首先,用户进程调用glibc中的getpid()函数,这个函数在include/unistd.h中声明,其函数原型为:extern__pid_t__getpid(void);由于其实现是平台相关的,我们关注的实现在/glibc/nptl/sysdeps/unix/sysv/linux/getpid.c中。pid_t__getpid(void){#ifdefNOT_IN_libcINTERNAL_SYSCALL_DECL(err);pid_tresult=INTERNAL_SYSCALL(getpid,err,0);#elsepid_tresult=THREAD_GETMEM(

3、THREAD_SELF,pid);if(__builtin_expect(result<=0,0))result=really_getpid(result);#endifreturnresult;}其中引发系统调用的是INTERNAL_SYSCALL宏,定义在/glibc/nptl/sysdeps/unix/sysv/linux/i386/sysdep.h中。#defineINTERNAL_SYSCALL(name,err,nr,args...)({registerunsignedintresultvar;EXTRAVAR_##nrasmvolatile(LOADARGS_

4、##nr"movl%1,%%eaxt""int$0x80t"RESTOREARGS_##nr:"=a"(resultvar):"i"(__NR_##name)ASMFMT_##nr(args):"memory","cc");(int)resultvar;})这一段主要是通过汇编来完成的,高亮的两句为重点,前一句将系统调用号放入eax寄存器,后一句进行一个中断号为0x80的软中断,这里的中断处理程序正是系统调用处理程序。系统调用处理程序这个系统调用处理程序system_call定义在/arch/x86/kernel/entry_32.S中。首先给出一些宏的说明。

5、#defineCFI_STARTPROC.cfi_startproc//用在每个函数的开始,用于初始化一些内部数据结构#defineCFI_ENDPROC.cfi_endproc//在函数结束的时候使用与.cfi_startproc相配套使用#defineCFI_DEF_CFA.cfi_def_cfa//定义计算CFA的规则#defineCFI_DEF_CFA_REGISTER.cfi_def_cfa_register//xxreg,offsetreg中的值保存在offset中,offset是CFA的#defineCFI_DEF_CFA_OFFSET.cfi_def_cfa_offs

6、et//xxoffset修改计算CFA的规则,reg中的值不发生变化,之改变offset#defineCFI_ADJUST_CFA_OFFSET.cfi_adjust_cfa_offset//与上面相似但是修改前面一个offset#defineCFI_OFFSET.cfi_offset//xxreg,offsetreg中的值保存在offset中,offset是CFA的#defineCFI_REL_OFFSET.cfi_rel_offset#defineCFI_REGISTER.cfi_register#defineCFI_RESTORE.cfi_restore#defineCFI_R

7、EMEMBER_STATE.cfi_remember_state#defineCFI_RESTORE_STATE.cfi_restore_state#defineCFI_UNDEFINED.cfi_undefined系统调用例程:#systemcallhandlerstubENTRY(system_call)RING0_INT_FRAME.#can’tunwindintouserspaceanywaypushl%eax#saveorig_eax//保存原来

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。