已阅读5页,还剩26页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1of31,内核出口,系统调用,2of31,基本知识,3of31,xyz(),system_call:sys_xyz()ret_from_sys_call:iret,xyz()int0 x80,sys_xyz(),用户态内核态,在应用程序中使用系统调用,glibc标准库中的封装例程(系统调用函数的具体实现),系统调用处理程序,系统调用服务例程(内核函数),系统调用处理过程,4of31,为什么有系统调用?一般用户进程不能直接访问系统内核,不能直接使用或修改内核数据,以免干扰内核程序的执行,妨碍系统安全。系统调用是什么?用户进程要使用内核功能时,只能通过内核提供的接口系统调用来实现,系统调用实际是操作系统内核提供的、功能较强的一系列函数。系统调用好比一个中间人,把用户进程的系统调用请求传达给内核,待内核把请求处理完毕后再将处理结果送回给用户空间。系统调用是用户空间访问内核的唯一手段。系统调用发生时会从用户态转到内核态,完成功能后又由内核态转回用户态。,5of31,使用系统调用的两种方式1、通过C库函数2、使用syscall函数syscall函数原型为:intsyscall(intnumber,);通过指定系统调用号和一组函数来调用系统调用*2.6.19版前使用_syscall宏,6of31,C库函数系统调用例子,7of31,系统如何响应调用的?系统调用函数中的int$0 x80汇编指令,会产生向量为128的异常。内核通过查中断向量表找到128号异常对应的处理程序系统调用处理程system_call()如何找到对应的内核函数?system_call()利用系统调用号查系统调用表sys_call_table,找到对应每个系统调用号的处理函数。,8of31,实验,9of31,一、实验目的,学习如何产生一个系统调用往内核中添加一个新的函数实现对用户空间的读写理解、掌握Linux系统调用的实现框架、用户界面、参数传递、进入/返回过程。,10of31,二、主要实验环境,Linux环境:CentOS6.0,linuxkernel1欲编译内核:linux-3命令unamer,11of31,三、实验指导,获得内核源代码,本次下载的内核版本为3将内核源码保存到/usr/src目录下cd/usr/srctarxjvflinux-3.tar.bz2tarzxvflinux-3.tar.gz定义系统调用编号和修改系统调用表,12of31,1)系统调用表系统调用表sys_call_table存储了所有系统调用对应的服务例程的函数地址。对于X8632位体系结构的系统调用表位于arch/X86/kernel/syscall_table_32.S文件中定义。系统调用服务例程的名字均遵守一定的规则:系统调用名称前增加“sys_”前缀,比如open系统调用对应sys_open函数。可以使用man2syscalls浏览所有系统调用的添加历史,13of31,系统调用表位置cd/usr/src/linux-3/arch/x86/kernelvisyscall_table_32.S第n个表项对应了系统调用号为n的服务例程的入口地址的指针修改系统调用表:将.longsys_my_new_call添加到arch/x86/kernel/syscall_table_32.S中最后一行,14of31,2)系统调用号/arch/x86/include/asm/unistd_32.h每个系统调用号都是唯一的,依次对应sys_call_table中的一项,系统调用号写在unistd.h文件中,以“_NR_”开头。内核通过系统调用号作为下标去获取sys_call_table中的服务例程函数地址。系统调用号一旦分配就不能再有任何变更,系统运行中即使该系统调用被删除,它所拥有的系统调用号也不能被回收利用。,15of31,对于32位x86架构系统调用号位于arch/x86/include/asm/unistd_32.h,16of31,4.编译内核的方法,makemrpropermakecleanmakeoldconfigmakeallmakemodules_installmakeinstall命令“makeall”用于生成期望的内核映像及模块;“makemodules_install”将安装模块到“默认目录/lib/module/”下面;“makeinstall”最终将内核映像等几个文件复制到“/boot”目录,并修改引导程序的配置以启用该新内核。,17of31,以上命令执行完毕后,会在当前目录下生成一个名为System.map的文件,会在/usr/src/linux-版本号/arch/i386/boot/下生成一个bzImage文件和vmlinuz文件。cd/boot(进入/boot目录),18of31,5.修改引导程序GRUB,cd/boot/grubvimenu.lst为了以后能直接操作菜单,可把menu.lst文件中hiddenmenu那一行注释掉(前加#)或删除,并且可以根据需要设置其中的default和timeout的值,分别表示默认启动项及等待时间。,19of31,#hiddenmenudefault=0timeout=15splashimage=(hd0,0)/grub/splash.xpm.gztitlecentos(3)root(hd0,0)kernel/vmlinuz-3roroot=/dev/mapper/vg_wufeifei-lv_rootinitrd/initramfs-3.imgtitlecentos(2.6.32-71.el6.i686)root(hd0,0)kernel/vmlinuz-2.6.32-71.el6.i686roroot=/dev/mapper/vg_wufeifei-lv_root,20of31,reboot重启系统就可以看到GRUB菜单已经包含了新编译的内核,选择新编译的内核启动系统。可用unamer测试当前内核版本号。任务完成后也可修改/boot/grub/menu.1st文件中移去不需要的引导内核信息,21of31,测试小例子:在现有的系统中添加一个传递数值参数的系统调用。这个系统调用的功能打印传入内核的参数。,主要内容:在系统调用表中添加相应表项添加系统调用号sys_my_sys_call的实现编写用户态测试程序,22of31,在系统调用表中添加或修改相应表项,在3的内核下,只需要修改arch/x86/kernel/syscall_table_32.S.longsys_rt_tgsigqueueinfo/*335*/.longsys_perf_event_open.longsys_recvmmsg.longsys_my_new_call/*338*/.longsys_pedagogictime/*339*/,23of31,添加系统调用号,系统调用号在文件unistd_32.h里面定义这个文件在kernel3位于/arch/x86/include/asm/unistd_32.h。现在我们在unistd.h中添加我们的系统调用号:_NR_my_new_call,如下所示:#define_NR_rt_tgsigqueueinfo335#define_NR_perf_event_open336#define_NR_recvmmsg337#define_NR_my_new_call338#define_NR_pedagogictime339,24of31,sys_my_new_call函数实现,cd/usr/src/linux-3/kernel添加一个打印输入值的系统调用visys.c,上面在系统调用表中指明了系统调用号_NR_my_new_call对应的系统调用服务例程是sys_my_new_call,25of31,重新编译内核。成功后,重启。此时,在启动项中有2.6.32和2.6.35两个选项,其中新的内核是2.6.35。选择它并进入系统。至此,我们已经成功添加了一个自己的系统调用。编译成功之后编写用户空间程序进行测试testcall.c#includeintmain()syscall(338,50);/*338是新添加的系统调用号,50是参数*/return0;终端编译gccaotestcall运行./a查看结果:终端运行命令dmesg会看到在最后一行输出callnumberis50,26of31,问题A,设计并实现一个新的内核函数pedagogictime(),该函数通过使用一个引用参数的调用返回当前的系统时间。如果flag的参数为TRUE,内核就把当前的系统时间打印输出intpedagogictime(intflag,structtimeval*tv)新函数基本和gettimeofday()类似cd/usr/src/linux3/kernelvitime.c添加实现代码,27of31,#include#include#includeasmlinkageintsys_pedagogictime(intflag,structtimeval*tv)if(tv)structtimevalktv;do_gettimeofday(,28of31,问题B,编写用户空间程序来测试pedagogictime()的执行情况#include#includeintmain()structtimevaltv;tv.tv_sec=10;syscall(339,1,29of31,shell下用dmesg命令观察内存打印信息最下面两行即为内核函数输出,30of31,心得、体会,全部编译一次内核会很长,大约3个小时。编过一次内核后,由于.o文件都在存在,所以第二次编译时间非常
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 山西消防抽考题库及答案
- 楼房购买合同协议书
- 施工师徒培养协议书
- 2026-2031年中国生态修复市场深度调查与产业竞争格局报告
- 智能电网原理及应用考试题及答案
- 文化墙装修合同范本
- 森叶煤气开户协议书
- 2026-2031全球及中国宠物用品行业发展现状调研及投资前景分析报告(版)
- 基于权重分析表的模糊逻辑算法赋能中央空调系统的深度研究
- 银行社会考试题库及答案
- 远景风机培训课件
- 中国糖尿病防治指南(2024版)解读课件
- 《性别平等探讨》课件
- 八年级上学期期中语文试题(含答案)-1
- 医疗管理制度 - 浙江大学医学院附属第一医院·浙江省第一医院
- 警察校园一年级安全讲座
- 美国签证需要用到的个人简历模板(中英文)
- 《电动汽车充电设施布局规划导则》
- 达州市2025届高三第一次诊断性测试(一诊)语文试卷(含答案)
- 2024年共青团入团考试题库及答案
- 悬雍垂腭咽成形术手术配合
评论
0/150
提交评论