版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
linux内核系统调用实验指导书第一页,共31页。基本知识2第二页,共31页。…xyz()…system_call:…sys_xyz()…ret_from_sys_call:…iretxyz(){…int0x80…}sys_xyz(){…}用户态 内核态在应用程序中使用系统调用glibc标准库中的封装例程(系统调用函数的具体实现)系统调用处理程序系统调用服务例程(内核函数)系统调用处理过程3第三页,共31页。为什么有系统调用?一般用户进程不能直接访问系统内核,不能直接使用或修改内核数据,以免干扰内核程序的执行,妨碍系统安全。系统调用是什么?用户进程要使用内核功能时,只能通过内核提供的接口——系统调用来实现,系统调用实际是操作系统内核提供的、功能较强的一系列函数。系统调用好比一个中间人,把用户进程的系统调用请求传达给内核,待内核把请求处理完毕后再将处理结果送回给用户空间。系统调用是用户空间访问内核的唯一手段。系统调用发生时会从用户态转到内核态,完成功能后又由内核态转回用户态。4第四页,共31页。使用系统调用的两种方式1、通过C库函数2、使用syscall函数
syscall函数原型为:
intsyscall(intnumber,…);通过指定系统调用号和一组函数来调用系统调用*2.6.19版前使用_syscall宏C库函数内核系统调用应用程序代码5第五页,共31页。C库函数系统调用例子用户程序中使用C库中的函数malloc函数free函数srccpy函数open函数brk系统调用open系统调用6第六页,共31页。系统如何响应调用的?
系统调用函数中的int$0x80汇编指令,会产生向量为128的异常。内核通过查中断向量表找到128号异常对应的处理程序——系统调用处理程system_call()如何找到对应的内核函数?
system_call()利用系统调用号查系统调用表sys_call_table,找到对应每个系统调用号的处理函数。7第七页,共31页。实验8第八页,共31页。一、实验目的学习如何产生一个系统调用往内核中添加一个新的函数实现对用户空间的读写理解、掌握Linux系统调用的实现框架、用户界面、参数传递、进入/返回过程。9第九页,共31页。二、主要实验环境Linux环境:CentOS6.0,linuxkernel2.6.32.71欲编译内核:linux-2.6.35.13命令uname–r10第十页,共31页。三、实验指导获得内核源代码,本次下载的内核版本为2.6.35.13将内核源码保存到/usr/src目录下cd/usr/srctar–xjvflinux-2.6.35.13.tar.bz2tarzxvflinux-2.6.35.13.tar.gz定义系统调用编号和修改系统调用表11第十一页,共31页。1)系统调用表
系统调用表sys_call_table存储了所有系统调用对应的服务例程的函数地址。对于X8632位体系结构的系统调用表位于arch/X86/kernel/syscall_table_32.S文件中定义。系统调用服务例程的名字均遵守一定的规则:系统调用名称前增加“sys_”前缀,比如open系统调用对应sys_open函数。可以使用man2syscalls浏览所有系统调用的添加历史12第十二页,共31页。系统调用表位置cd/usr/src/linux-2.6.35.13/arch/x86/kernelvisyscall_table_32.S第n个表项对应了系统调用号为n的服务例程的入口地址的指针修改系统调用表:将.longsys_my_new_call添加到arch/x86/kernel/syscall_table_32.S中最后一行13第十三页,共31页。2)系统调用号
/arch/x86/include/asm/unistd_32.h
每个系统调用号都是唯一的,依次对应sys_call_table中的一项,系统调用号写在unistd.h文件中,以“__NR_”开头。
内核通过系统调用号作为下标去获取sys_call_table中的服务例程函数地址。
系统调用号一旦分配就不能再有任何变更,系统运行中即使该系统调用被删除,它所拥有的系统调用号也不能被回收利用。14第十四页,共31页。对于32位x86架构系统调用号位于arch/x86/include/asm/unistd_32.h15第十五页,共31页。4.编译内核的方法makemrpropermakecleanmakeoldconfigmakeallmakemodules_installmakeinstall命令“makeall”用于生成期望的内核映像及模块;“makemodules_install”将安装模块到“默认目录/lib/module/<内核版本号>”下面;“makeinstall”最终将内核映像等几个文件复制到“/boot”目录,并修改引导程序的配置以启用该新内核。16第十六页,共31页。以上命令执行完毕后,会在当前目录下生成一个名为System.map的文件,会在/usr/src/linux-版本号/arch/i386/boot/下生成一个bzImage文件和vmlinuz文件。cd/boot(进入/boot目录)17第十七页,共31页。5.修改引导程序GRUBcd/boot/grubvimenu.lst
为了以后能直接操作菜单,可把menu.lst文件中hiddenmenu那一行注释掉(前加#)或删除,并且可以根据需要设置其中的default和timeout的值,分别表示默认启动项及等待时间。18第十八页,共31页。#hiddenmenudefault=0timeout=15splashimage=(hd0,0)/grub/splash.xpm.gztitlecentos(2.6.35.13)
root(hd0,0)
kernel/vmlinuz-2.6.35.13roroot=/dev/mapper/vg_wufeifei-lv_root
initrd/initramfs-2.6.35.13.imgtitlecentos(2.6.32-71.el6.i686)
root(hd0,0)
kernel/vmlinuz-2.6.32-71.el6.i686roroot=/dev/mapper/vg_wufeifei-lv_root19第十九页,共31页。reboot重启系统就可以看到GRUB菜单已经包含了新编译的内核选择新编译的内核启动系统。可用uname–r测试当前内核版本号。任务完成后也可修改/boot/grub/menu.1st文件中移去不需要的引导内核信息20第二十页,共31页。测试小例子:在现有的系统中添加一个传递数值参数的系统调用。这个系统调用的功能打印传入内核的参数。主要内容:在系统调用表中添加相应表项添加系统调用号sys_my_sys_call的实现编写用户态测试程序21第二十一页,共31页。在系统调用表中添加或修改相应表项
在2.6.35.13的内核下,只需要修改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*/22第二十二页,共31页。添加系统调用号
系统调用号在文件unistd_32.h里面定义这个文件在kernel2.6.35.13位于/arch/x86/include/asm/unistd_32.h。现在我们在unistd.h中添加我们的系统调用号:__NR_my_new_call,如下所示:#define__NR_rt_tgsigqueueinfo 335#define__NR_perf_event_open 336#define__NR_recvmmsg 337#define__NR_my_new_call338#define__NR_pedagogictime33923第二十三页,共31页。sys_my_new_call函数实现cd/usr/src/linux-2.6.35.13/kernel添加一个打印输入值的系统调用visys.c上面在系统调用表中指明了系统调用号_NR_my_new_call对应的系统调用服务例程是sys_my_new_call24第二十四页,共31页。重新编译内核。成功后,重启。此时,在启动项中有2.6.32和2.6.35两个选项,其中新的内核是2.6.35。选择它并进入系统。至此,我们已经成功添加了一个自己的系统调用。编译成功之后编写用户空间程序进行测试testcall.c
#include<linux/unistd.h>intmain(){syscall(338,50);/*338是新添加的系统调用号,50是参数*/return0;}终端编译
gcca–otestcall运行
./a查看结果:终端运行命令dmesg会看到在最后一行输出
callnumberis5025第二十五页,共31页。问题A设计并实现一个新的内核函数pedagogictime(),该函数通过使用一个引用参数的调用返回当前的系统时间。如果flag的参数为TRUE,内核就把当前的系统时间打印输出 intpedagogictime(intflag,structtimeval*tv) 新函数基本和gettimeofday()类似 cd/usr/src/linux2.6.35.13/kernel vitime.c添加实现代码26第二十六页,共31页。#include<linux/time.h>#include<linux/kernel.h>#include<linux/mm.h>asmlinkageintsys_pedagogictime(intflag,structtimeval*tv){ if(tv){ structtimevalktv; do_gettimeofday(&ktv); if(copy_to_user(tv,&ktv,sizeof(ktv)))return-EFAULT;
} if(flag==true) printk("tv.sec:%ld\n",(*tv).tv_sec); return0;}27第二十七页,共31页。问题B编写用户空间程序来测试pedagogictime()的执行情况#include<linux/time.h>#include<linux/unistd.h>intmain(){structtimevaltv;tv.tv_sec=10;syscall(339,1,&tv);printf(“userfirstgettv_sec\n”,tv.tv_sec);printf(“nowsleep10seconds\n”);sleep(10);printf(“userfirstgettv_sec\n”,tv.tv_sec);return0;}28第二十八页,共31页。shell下用dmesg命令观察内存打印信息最下面两行即为内核函数输出29第二十九页,共31页。心得、体会全部编译一次内核会很长,大约3个小时。编过一次内核后,由于
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2021年初等数论考研基础阶段练习题题库及答案
- 2021年金蝶实施顾问认证考试高频错题及答案解析
- 2026国企风控岗社招笔试押题卷含参考答案
- 2021液碱伤害急救安全知识试题及参考答案
- 2025PSCR考试核心考点考题+速记答案 不用死记硬背也能记牢
- 临床脾脏脉管源性肿瘤影像学诊断
- 大体积混凝土施工方案
- 解一元一次方程第2课时课件2025-2026学年华东师大版数学七年级下册
- 互联网平台加盟协议书
- 体育绩效管理
- 高中英语新外研版必修1单词总表
- 果园水果采摘升降平台的设计
- MT-T 1204-2023 煤矿在用产品安全检测检验规范 主排水系统
- GB/T 5762-2024建材用石灰石、生石灰和熟石灰化学分析方法
- 备考2024年中考数学专题突破(全国通用)专题1-3“12345”模型·选填压轴必备大招(共3种类型)(解析版)
- 第七章-淀粉制糖
- 高中阶段学校实际就读证明(格式)
- 部编版语文二年级下册第1单元核心素养教案
- 铁总建设201857号 中国铁路总公司 关于做好高速铁路开通达标评定工作的通知
- HEC-RAS初步教程课件
- 非物质文化遗产的分类
评论
0/150
提交评论