ImageVerifierCode 换一换
格式:PPT , 页数:31 ,大小:695KB ,
资源ID:13965734      下载积分:10 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/13965734.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(linux内核系统调用实验指导书.ppt)为本站上传会员【s4****5z】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

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

1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,of 31,1,of 31,内核出口,系统调用,2,of 31,基本知识,3,of 31,xyz(),system_call:,sys_xyz(),ret_from_sys_call:,iret,xyz(),int 0 x80,sys_xyz(),用户态 内核态,在应用程序中使用系统调用,glibc,标准库中的,封装例程,(系统调用函数,的具体实现),系统调用,处理程序,系统调用,服务例程,(内核函数),系统调用处理过程,4,of 31,为什么有系统调用?,一般用户进程不能直接访问系统内核,不能直接使

2、用或修改内核数据,以免干扰内核程序的执行,妨碍系统安全。,系统调用是什么?,用户进程要使用内核功能时,只能通过内核提供的接口,系统调用来实现,系统调用实际是操作系统内核提供的、功能较强的一系列函数。,系统调用好比一个中间人,把用户进程的系统调用请求传达给内核,待内核把请求处理完毕后再将处理结果送回给用户空间。,系统调用是用户空间访问内核的唯一手段。系统调用发生时会从用户态转到内核态,完成功能后又由内核态转回用户态。,5,of 31,使用系统调用的两种方式,1,、通过,C,库函数,2,、使用,syscall,函数,syscall,函数原型为:,int syscall(int number,);,

3、通过指定系统调用号和一组函数来调用系统调用,*,2.6.19,版前使用,_syscall,宏,C,库函数,内核,系统调用,应用程序代码,6,of 31,C,库函数系统调用例子,用户程序中使用,C,库中的函数,malloc,函数,free,函数,srccpy,函数,open,函数,brk,系统调用,open,系统调用,7,of 31,系统如何响应调用的?,系统调用函数中的,int$0 x80,汇编指令,会产生向量为,128,的异常。内核通过查中断向量表找到,128,号异常对应的处理程序,系统调用处理程,system_call(),如何找到对应的内核函数?,system_call(),利用系统调用

4、号查系统调用表,sys_call_table,,找到对应每个系统调用号的处理函数。,8,of 31,实验,9,of 31,一、实验目的,学习如何产生一个系统调用,往内核中 添加一个新的函数实现对用户空间的读写,理解、掌握,Linux,系统调用的实现框架、用户界面、参数传递、进入,/,返回过程。,10,of 31,二、主要实验环境,Linux,环境:,CentOS 6.0,linux kernel 2.6.32.71,欲编译内核:,linux-2.6.35.13,命令,uname r,11,of 31,三、实验指导,获得内核源代码,www.kernel.org,本次下载的内核版本为,2.6.35

5、13,将内核源码保存到,/usr/src,目录下,cd/usr/src,tar xjvf linux-2.6.35.13.tar.bz2,tar zxvf linux-2.6.35.13.tar.gz,定义系统调用编号和修改系统调用表,12,of 31,1,)系统调用表,系统调用表,sys_call_table,存储了所有系统调用对应的服务例程的函数地址。,对于,X86 32,位体系结构的系统调用表位于,arch/X86/kernel/syscall_table_32.S,文件中定义。,系统调用服务例程的名字均遵守一定的规则:系统调用名称前增加“,sys_”,前缀,比如,open,系统调用对

6、应,sys_open,函数。,可以使用,man 2 syscalls,浏览所有系统调用的添加历史,13,of 31,系统调用表位置,cd /usr/src/linux-2.6.35.13/arch/x86/kernel,vi syscall_table_32.S,第,n,个表项对应了系统调用号为,n,的服务例程的入口地址的指针,修改系统调用表:将,.long sys_my_new_call,添加,到,arch/x86/kernel/syscall_table_32.S,中最后一行,14,of 31,2,)系统调用号,/,arch/x86/include/asm/unistd_32.h,每个系统

7、调用号都是唯一的,依次对应,sys_call_table,中的一项,系统调用号写在,unistd.h,文件中,以“,_NR_”,开头。内核通过系统调用号作为下标去获取,sys_call_table,中的服务例程函数地址。系统调用号一旦分配就不能再有任何变更,系统运行中即使该系统调用被删除,它所拥有的系统调用号也不能被回收利用。,15,of 31,对于,32,位,x86,架构系统调用号位于,arch/x86/include/asm/unistd_32.h,16,of 31,4.,编译内核的方法,make mrproper,make clean,make oldconfig,make all,ma

8、ke modules_install,make install,命 令,“,make all”,用于生成期望的内核映像及模块;,“make modules_install”,将安装模块到,“,默认目录,/lib/module/”,下面;,“make install”,最终将内核映像等几个文件复制到,“,/boot”,目录,并,修改引导程序的配置以启用该新内核。,17,of 31,以上命令执行完毕后,会在当前目录下生成一个名为,System.map,的文件,会在,/usr/src/linux-,版本号,/arch/i386/boot/,下生成一个,bzImage,文件和,vmlinuz,文件。,

9、cd/boot,(进入,/boot,目录),18,of 31,5.,修改引导程序,GRUB,cd/boot/grub,vi menu.lst,为了以后能直接操作菜单,可把,menu.lst,文件中,hiddenmenu,那一行注释掉(前加,#,)或删除,并且可以根据需要设置其中的,default,和,timeout,的值,分别表示默认启动项及等待时间。,19,of 31,#hiddenmenu,default=0,timeout=15,splashimage=(hd0,0)/grub/splash.xpm.gz,title centos(2.6.35.13),root(hd0,0),kerne

10、l/vmlinuz-2.6.35.13 ro root=/dev/mapper/vg_wufeifei-lv_root,initrd/initramfs-2.6.35.13.img,title centos(2.6.32-71.el6.i686),root(hd0,0),kernel/vmlinuz-2.6.32-71.el6.i686 ro root=/dev/mapper/vg_wufeifei-lv_root,20,of 31,reboot,重启系统就可以看到,GRUB,菜单已经包含了新编译的内核,选择新编译的内核启动系统。可用,uname r,测试当前内核版本号。任务完成后也可修改,/

11、boot/grub/menu.1st,文件中移去不需要的引导内核信息,21,of 31,测试小例子:,在现有的系统中添加一个传递数值参数的系统调用。这个系统调用的功能打印传入内核的参数。,主要内容:,在系统调用表中添加相应表项,添加系统调用号,sys_my_sys_call,的实现,编写用户态测试程序,22,of 31,在系统调用表中添加或修改相应表项,在,2.6.35.13,的内核下,只需要修改,arch/x86/kernel/syscall_table_32.S,.long sys_rt_tgsigqueueinfo/*335*/,.long sys_perf_event_open,.lo

12、ng sys_recvmmsg,.long sys_my_new_call /*338*/,.long sys_pedagogictime /*339*/,23,of 31,添加系统调用号,系统调用号在文件,unistd_32.h,里面定义,这个文件在,kernel2.6.35.13,位于,/,arch/x86/include/asm/unistd_32.h,。,现在我们在,unistd.h,中添加我们的系统调用号:,_,NR_,my_new_call,,,如下所示:,#define _NR_rt_tgsigqueueinfo335,#define _NR_perf_event_open336

13、define _NR_recvmmsg337,#define _NR_my_new_call 338,#define _NR_pedagogictime 339,24,of 31,sys_my_new_call,函数实现,cd/usr/src/linux-2.6.35.13/kernel,添加一个打印输入值的系统调用,vi sys.c,上面在系统调用表中指明了系统调用号,_NR_my_new_call,对应的系统调用服务例程是,sys_my_new_call,25,of 31,重新编译内核。成功后,重启。此时,在启动项中有,2.6.32,和,2.6.35,两个选项,其中新的内核是,2.6.

14、35,。选择它并进入系统。至此,我们已经成功添加了一个自己的系统调用。编译成功之后编写用户空间程序进行测试,testcall.c,#include,int main(),syscall(338,50);/*338,是新添加的系统调用号,,50,是参数,*,/,return 0;,终端编译,gcc a o testcall,运行,./a,查看结果:终端运行命令,dmesg,会看到在最后一行输出,call number is 50,26,of 31,问题,A,设计并实现一个新的内核函数,pedagogictime(),,该函数通过使用一个引用参数的调用返回当前的系统时间。如果,flag,的参数为,

15、TRUE,,内核就把当前的系统时间打印输出,int pedagogictime(int flag,struct timeval*tv),新函数基本和,gettimeofday(),类似,cd/usr/src/linux2.6.35.13/kernel,vi time.c,添加实现代码,27,of 31,#include,#include,#include,asmlinkage int sys_pedagogictime(int flag,struct timeval*tv),if(tv),struct timeval ktv;,do_gettimeofday(,if(copy_to_user(

16、tv,if(flag=true),printk(tv.sec:%ldn,(*tv).tv_sec);,return 0;,28,of 31,问题,B,编写用户空间程序来测试,pedagogictime(),的执行情况,#include,#include,int main(),struct timeval tv;,tv.tv_sec=10;,syscall(339,1,printf(“user first get tv_secn”,tv.tv_sec);,printf(“now sleep 10 secondsn”);,sleep(10);,printf(“user first get tv_s

17、ecn”,tv.tv_sec);,return 0;,29,of 31,shell,下用,dmesg,命令观察内存打印信息,最下面两行即为内核函数输出,30,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,需另外搜集资料,但原理是相同的。,31,of 31,谢谢大家!,

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服