* * * * 与普通函数类似,系统调用通常也需要输入/输出参数,这些参数可能是实际的值(例如数值),也可能是函数的地址及用户态进程地址空间的变量。因为system_call( )函数是Linux中所有系统调用唯一的人口点,因此每个系统调用至少有一个参数,即通过eax寄存器传递来的系统调用号。例如,如果一个应用程序调用fork( )封装例程,在执行int $0x80汇编指令之前就把eax寄存器置为5。因为这个寄存器的设置是由libc中的封装例程进行的,因此程序员通常并不需要关心系统调用号。 fork( )系统调用并不需要其他的参数。不过,很多系统调用确实需要由应用程序明确地传递另外的参数。例如,mmap( )系统调用可能需要多达6个参数(除了系统调用号)。 普通函数的参数传递是通过把参数值写进活动的程序栈(或者用户态栈或者内核态栈)。但是系统调用的参数通常是传递给系统调用处理程序在CPU中的寄存器,然后再拷贝到内核态堆栈。 为什么内核不直接把参数从用户态的栈拷贝到内核态的栈呢?首先,同时操作两个栈是比较复杂的;此外,寄存器的使用使得系统调用处理程序的结构与其他异常处理程序的结构类似。 然而,为了用寄存器传递参数,必须满足两个条件: (1)? 每个参数的长度不能超过寄存器的长度,即32位3。 (2)? 参数的个数不能超过6个(包括eax中传递的系统调用号),因
您可能关注的文档
最近下载
- 中考数学复习 考前突破06二次函数与几何综合题(4大必考题型)原卷版.pdf VIP
- 供电局安健环技术标准.doc VIP
- (二模)郑州市2026年高三高中毕业年高三级第二次质量预测化学试卷(含答案).pdf
- 五年级上学期家长会.ppt VIP
- 《中国痴呆与认知障碍诊治指南(2025年版)》.docx VIP
- 方菱数控切割控制系统操作手册(Ver5.0).pdf
- 汽车电动助力转向系统设计.docx
- 2026年河南工业职业技术学院单招职业适应性测试题库与答案详解.docx VIP
- 好莱坞电影剧本_沃依采克_影视剧本写作.doc VIP
- (二模)郑州市2026年高三高中毕业年高三级第二次质量预测英语试卷(含答案)+听力音频.docx
原创力文档

文档评论(0)