第15章 Linux系统调用.pdf

上传人:qwe****56 文档编号:74644737 上传时间:2023-02-27 格式:PDF 页数:20 大小:365.12KB
返回 下载 相关 举报
第15章 Linux系统调用.pdf_第1页
第1页 / 共20页
第15章 Linux系统调用.pdf_第2页
第2页 / 共20页
点击查看更多>>
资源描述

《第15章 Linux系统调用.pdf》由会员分享,可在线阅读,更多相关《第15章 Linux系统调用.pdf(20页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、Linux操作系统精讲操作系统精讲大连理工大学软件学院大连理工大学软件学院邱铁邱铁综合楼综合楼413,Tel:0411-87571632E_mail:参考教材:参考教材:?Linux应用与开发典型实例精讲邱铁、于玉龙、徐子川编著应用与开发典型实例精讲邱铁、于玉龙、徐子川编著.清华大学出版社清华大学出版社.2010.5第第15章 系统调用章 系统调用学习本章要达到的目标:学习本章要达到的目标:?1.理解理解Linux系统调用机制的实现原理;系统调用机制的实现原理;?2.基于基于Linux最新内核最新内核2.6.30,分析,分析Linux操作系统系统调用的代码结构;操作系统系统调用的代码结构;?3

2、.掌握向掌握向Linux系统增加自己的系统调用的方法。系统增加自己的系统调用的方法。15.1系统调用原理系统调用原理?系统调用是操作系统内核提供的、功能相对较强的一系列函数。这些函数是在的内核码中实现的,并通过某种接口形式,将这些函数提供给用户来进行调用。系统调用是操作系统内核提供的、功能相对较强的一系列函数。这些函数是在的内核码中实现的,并通过某种接口形式,将这些函数提供给用户来进行调用。?为了保证操作系统为了保证操作系统内核的安全与系统的稳定内核的安全与系统的稳定,操作系统提供了系统调用。,操作系统提供了系统调用。?系统调用一般的过程是,进程使用寄存器中适当的值跳转到内核中事先定义好的只读

3、的代码段中执行。系统调用一般的过程是,进程使用寄存器中适当的值跳转到内核中事先定义好的只读的代码段中执行。?在在x86体系结构的计算机中,系统调用由软中断体系结构的计算机中,系统调用由软中断0 x80来实现来实现系统调用过程系统调用过程?Linux内核会进行中断服务的处理,并执行内核会进行中断服务的处理,并执行system_call 函数,进入系统调用入口的公共处理函数,在这个函数中会按照通过寄存器函数,进入系统调用入口的公共处理函数,在这个函数中会按照通过寄存器eax传递的内容来识别所对应处理所有的系统调用。传递的内容来识别所对应处理所有的系统调用。?在进入系统内核后后,使用在进入系统内核后

4、后,使用system_call_table和和eax中包含的索引来执行真正的系统调用。中包含的索引来执行真正的系统调用。?从系统调用中返回后,最终执行从系统调用中返回后,最终执行 syscall_exit,并调用,并调用 resume_userspace 返回用户空间。返回用户空间。152系统调用函数分析系统调用函数分析?Linux内核版本中有一个内核版本中有一个entry.S文件,但是新的版本中分为了文件,但是新的版本中分为了entry_32.S和和entry_64.S,表示支持不同位数的体系结构的计算机,并且在文件内部用了大量的宏代替了原来的处理器指令。,表示支持不同位数的体系结构的计算机

5、,并且在文件内部用了大量的宏代替了原来的处理器指令。15.2.1系统调用入口函数系统调用入口函数?entry_32.S文件在文件在Linux内核内核2.6.30中的中的/usr/src/linux-2.6.30/arch/x86/kernel目录下,目录下,具体分析参见教材第具体分析参见教材第247页页?当在程序代码中用到系统调用时,编译器会按照系统调用号将系统调用宏展开,展开后的代码实际上是将系统调用号放入当在程序代码中用到系统调用时,编译器会按照系统调用号将系统调用宏展开,展开后的代码实际上是将系统调用号放入eax,然后用软中断,然后用软中断int 0 x80使处理器转向系统调用入口,并进

6、行查找系统调用表,进而由内核调用真正的系统调用功能函数。使处理器转向系统调用入口,并进行查找系统调用表,进而由内核调用真正的系统调用功能函数。15.2.2 系统调用表系统调用表?对于对于x86 32位体系结构的系统调用表位于位体系结构的系统调用表位于/arch/x86/kernel/syscall_table_32.S文件中文件中?系统调用统一定义为系统调用统一定义为sys_xxxxx(其中,(其中,xxxxx系统调用函数名)系统调用函数名)syscall_table_32.S文件源码如下文件源码如下ENTRY(sys_call_table).long sys_restart_syscall/

7、*0 系统调用是为系统重新启动时设计的*/.long sys_exit .long sys_epoll_create1 .long sys_dup3 /*330*/.long sys_pipe2 .long sys_inotify_init1 .long sys_preadv .long sys_pwritev 15.3 添加系统调用实例训练添加系统调用实例训练?1.下载下载2.6.30内核,解压到内核,解压到/usr/src目录中。目录中。?2.添加系统调用表添加系统调用表将将.long sys_mysyscall添加到添加到arch/x86/kernel/syscall_table_32.

8、S中最后一行中最后一行?3.添加系统调用号添加系统调用号对于对于32位位x86架构请将系统调用号添加到架构请将系统调用号添加到arch/x86/include/asm/unistd_32.h中中对于对于64位位x86架构请将系统调用号添加到架构请将系统调用号添加到include/asm-x86/unistd_64.h中中?4.编写系统调用编写系统调用对于对于32位位x86处理器架构请将以上一段代码添加到处理器架构请将以上一段代码添加到arch/x86/kernel/sys_i386_32.c的最后一行,而对于的最后一行,而对于64位架构将其添加到位架构将其添加到arch/x86/kernel/

9、sys_x86_64.c中的最后一行。中的最后一行。asmlinkage int sys_mysyscall(char N)char i;int Nx=1;if(N=0)return Nx;for(i=1;i=N;i+)Nx=Nx*i;return Nx;?5.按照第按照第12章的步骤重新编译内核。章的步骤重新编译内核。?6.编译成功后,重启系统进入新编译的内核。编译成功后,重启系统进入新编译的内核。?7编写测试程序编写测试程序syscall_test.c,#include#include#define _NR_mysyscall 335 /自定义的系统调用编号int main()int Nu

10、mber,Factorial;printf(Please input a numbern);while(scanf(%d,&Number)=EOF);Factorial=syscall(_NR_mysyscall,Number);if(Factorial 1)printf(Error occurred in mysyscalln);printf(%d Factorial is%d n,Number,Factorial);return 0;测试程序输出结果测试程序输出结果思考与练习思考与练习?1、深入理解、深入理解Linux系统调用的原理与过程。系统调用的原理与过程。?2、下载当前最新版本的、下载当前最新版本的Linux内核,加入自己的系统调用后,重新编译内核并安装,再编写一个测试函数进行验证其正确性。内核,加入自己的系统调用后,重新编译内核并安装,再编写一个测试函数进行验证其正确性。?3、在、在32位体系结构下与位体系结构下与64位体系结构的计算机下添加自定义的位体系结构的计算机下添加自定义的Linux系统调用的流程是否相同?如果不同,请指出不同点有哪些。系统调用的流程是否相同?如果不同,请指出不同点有哪些。?4、可以考虑用模块的方法来为现有的、可以考虑用模块的方法来为现有的Linux系统添加一个系统调用。系统添加一个系统调用。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 其他杂项

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁