linux内核系统调用实验指导书.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
* of 31 shell下用dmesg命令观察内存打印信息 最下面两行即为内核函数输出 * of 31 心得、体会 全部编译一次内核会很长,大约3个小时。编过一次内核后,由于.o文件都在存在,所以第二次编译时间非常快。 添加一个系统调用类似于MFC中添加一个自定义的消息,首先要注册这个消息,以便系统知道有这么个消息,然后用户在程序中才能使用它。 在2.6.35中,有unistd.h,unistd_32.h,unistd_64.h,其实unistd.h中的内容主要是用来判断要使用unistd_32.h还是unistd_64.h。 不同的版本编译方法差别很大,本文只针对2.6版,2.4与2.2需另外搜集资料,但原理是相同的。 * of 31 谢谢大家! * of 31 ——内核出口 系统调用 * of 31 基本知识 * of 31 … xyz() … system_call: … sys_xyz() … ret_from_sys_call: … iret xyz(){ … int 0x80 … } sys_xyz(){ … } 用户态 内核态 在应用程序中使用系统调用 glibc标准库中的 封装例程 (系统调用函数 的具体实现) 系统调用 处理程序 系统调用 服务例程 (内核函数) 系统调用处理过程 * of 31 为什么有系统调用? 一般用户进程不能直接访问系统内核,不能直接使用或修改内核数据,以免干扰内核程序的执行,妨碍系统安全。 系统调用是什么? 用户进程要使用内核功能时,只能通过内核提供的接口——系统调用来实现,系统调用实际是操作系统内核提供的、功能较强的一系列函数。 系统调用好比一个中间人,把用户进程的系统调用请求传达给内核,待内核把请求处理完毕后再将处理结果送回给用户空间。 系统调用是用户空间访问内核的唯一手段。系统调用发生时会从用户态转到内核态,完成功能后又由内核态转回用户态。 * of 31 使用系统调用的两种方式 1、通过C库函数 2、使用syscall函数 syscall函数原型为: int syscall(int number,…); 通过指定系统调用号和一组函数来调用系统调用 * 2.6.19版前使用_syscall宏 C库函数 内核 系统调用 应用程序代码 * of 31 C库函数系统调用例子 用户程序中使用C库中的函数 malloc 函数 free 函数 srccpy 函数 open 函数 brk 系统调用 open 系统调用 * of 31 系统如何响应调用的? 系统调用函数中的int$0x80汇编指令,会产生向量为128的异常。内核通过查中断向量表找到128号异常对应的处理程序——系统调用处理程system_call() 如何找到对应的内核函数? system_call()利用系统调用号查系统调用表sys_call_table,找到对应每个系统调用号的处理函数。 * of 31 实验 * of 31 一、实验目的 学习如何产生一个系统调用 往内核中 添加一个新的函数实现对用户空间的读写 理解、掌握Linux系统调用的实现框架、用户界面、参数传递、进入/返回过程。 * of 31 二、主要实验环境 Linux环境:CentOS 6.0,linux kernel 1 欲编译内核:linux-3 命令uname –r * of 31 三、实验指导 获得内核源代码,本次下载的内核版本为3 将内核源码保存到/usr/src目录下 cd /usr/src tar –xjvf linux-3.tar.bz2 tar zxvf linux-3.tar.gz 定义系统调用编号和修改系统调用表 * of 31 1)系统调用表 系统调用表sys_call_table存储了所有系统调用对应的服务例程的函数地址。 对于X86 32位体系结构的系统调用表位于arch/X86/kernel/syscall_table_32.S文件中定义。 系统调用服务例程的名字均遵守一定的规则:系统调用名称前增加“sys_”前缀,比如open系统调用对应sys_open函数。 可以使用man 2 syscalls浏览所有系统调用的添加历史 * of 31 系统调用表位置 cd /usr/src/linux-3/arch/x86/kernel vi syscall_table_32.S 第n个表项对应了系统调用号为n的服务例程的入口地址的指针 修改系统调用表:将.long sys_my

文档评论(0)

celkhn0303 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档