版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、进程号可运行进程队列指针父进程任务结构体指针 子进程任务结构体指针 兄进程任务结构体指针 弟进程任务结构体指针进程启动命令名linux的宏for_each_task定义了一个通用程序结构,它从双向链表的首节点 逐一遍历链表中的每个任务结构体。#define for_each_task(p)骤。3、测试结果pid = 1 parent_pid = 0 child_ pid = 1540 尔。uid = 0gid = 0paren t_uid = 0child_uid = 0parent_gid = 0酽锕极額閉镇桧猪訣锥顧荭。child gid = 0彈贸摄尔霁毙攬砖卤庑诒一、课程设计任务1.
2、下载较新版本的Linux内核源代码,在你的Linux系统中解压缩,观察内核源码的组成结构。编译内核,尝试用编译后的内核重新引导系统。2. 添加一个新的系统调用,实现一项新的功能,如查找系统中所有进程的名称和族亲关系信息,或文件复制,重新编译和运行内核,使新的系统调用可用。矚慫润厲钐瘗睞枥庑赖賃軔。3. 编写用户态测试程序,测试增加的系统调用可以工作。二、设计过程1、设计思路 观察Linux内核源码的组织结构(见附录A )。 配置及及编译linux内核(见附录B) 理解linux调用系统调用的过程(见附录D) 添加新的系统调用(见附录C)。编写用户态测试程序。2、数据结构task_struct的
3、主要成员有:int pid;sstruct task_struct *n ext_r un,*prev_run;struct task_struct *p_pp tr; struct task_struct *p_c ptr; struct task_struct *p_osptr; struct task_struct *p_ys ptr; exec_doma in-n ame;init_task 开始, for_each_taskr定义如下:聞創沟燴鐺險爱氇谴净祸測。for(p=&in it_task;( p=p-n ext_task)!=&in it_task;)残骛楼諍锩瀨濟溆塹籟婭7
4、 / 7no brother no ?pid = 2 parent_pid = 1 no child no brother right pid = 3uid = 0gid = 0paren t_uid = 0right_uid = 0 right_gid = 0parent gid = 0謀荞抟箧飆鐸怼类蒋薔點鉍。三、问题和体会 问题再添加,编译就可以了。源码如果编译了多次,有时会出错。重新解压源码, 体会觉得有点难。现在看起来好简单啊。但是我 厦礴恳蹒骈時盡继價骚卺癩。和/usr/include/linux 两个目录; 茕桢广鳓鯡选块网刚开始看到 增加linux系统调用”这个设计题。 编译内
5、核花了很多时间,编译了好几次才成功。 编写内核需要注意的一些问题: 标准C库内核头文件,主要是/usr/i nclude/asm羈泪镀齐。另一个是内核代码头文件,主要是/usr/src/li nux/in clude/asm 和/usr/src/i nclude/li nux 两个目录。鹅娅尽損鹤惨歷茏鴛賴縈诘。这两个头文件是不同的。标准C库内核头文件是用于编写用户态程序时使用的,它与系统 中的标准C库对应。如果编写的代码运行在内核空间,那用户态的标准C库就不能使用。也就是说,不能使用printf, malloc等。籟丛妈羥为贍债蛏练淨槠挞。通过这次课程设计,对系统调用的原理有初步的了解。感谢
6、徐钦桂老师的对我提出的问题进行详细的解答。也感谢叶华鑫同学,虽然我们不是同 一组,但他还是很乐意跟我一起讨论学习。在讨论中,很多问题迎刃而解。預頌圣鉉儐歲龈讶骅籴買闥。附录A:LinuxLinux arch 目录。内核源码的组织结构系统的源码放置在/usr/src/linux目录下目录:该目录存放具体依赖体系结构的代码。不同体系结构所移植的版本都有三个子以i386为例,有kernel,lib和mm三个目录。Kernel子目录包含依赖体系结构实现的一般内核功能,例如信号处理、时钟处理等。Lib子目录包含库函数的本地实现。Mm子目录包含存储管理实现的代码。渗釤呛俨匀谔鱉调硯錦鋇絨。drivers目
7、录:所有驱动程序源码均位于该目录之下。fs目录:存放所有系统支持的文件系统的代码。include目录:重要的头文件。ipc目录:处理进程间通信的代码。init目录:系统初始化代码。如main.c。还包含许多核心代码,如实现fork()代码。lib目录:放置内核其他部分经常所需要的代码。如解压标准压缩算法。kernel目录:许多最常用的内核函数放在该目录下。如fork()和timer.c, printk.c。铙誅卧泻噦圣骋贶頂廡缝勵。mm目录:包含实现虚拟内存管理的源码。 net目录:提供网络支持的代码。附录B:un ame -rhttp: /擁締凤袜备訊顎轮烂蔷報赢
8、。1、编译之前先查看内核版本:2、下载更新的内核版本升级: 配置及编译linux内核#cp linu x-2.4.22test8.tar.gz /usr/src#cd /usr/src #tar -xzvf linux-2422test8.tar.gz#mv lin ux lin ux-2.4.22test8#ln -s linux-2.4.22test8 linux #cd /usr/src/li nux #make mrproper#cd /usr/ in clude#rm -f asm linux scsi#ln -s /usr/src/linux/include/asm-i386 as
9、m#ln -s/usr/src/linux/include/linux linux #ln -s/usr/src/linux/include/scsi scsi配置#make xconfig这种模式则是使用X-Window为主要环境的设定模式!这里为默认配置#make dep建立相依的属性关系!#make clean将旧的资料去除掉!#make bzImage开始编译核心!#make modules开始编译模块!#make modules_ in stall#depmod -a更换内核#cd /boot#rm System.ma p vmli nuz#cp /usr/src/li nu x/S
10、ystem.ma p System.ma p#cp /usr/src/li nu x/arch/i386/boot/bzlmage vmli nuz修改 /boot/grub/memu.lst 文件附录C:修改内核增加系统调用只修改 kernel/sys.c , /usr/src/linux-2422/include/asm-i386/unistd.h 和 arch/i386/kernel/entry.S,这里把增加的系统调用代码也加入这个文件中。贓熱俣阃歲匱阊邺镓騷鯛汉。1.修改kernel/sys.c文件。添加如下代码: asmli nkage int sys_mysyscall(void
11、) struct task_struct *p addr;for_each_task (p addr)”,p addr- pid); ”,p addr-uid);prin tk( pid = %d prin tk(uid = %dprin tk(gid = %d n, paddr-gid); if(p addr-p_ pptr != NULL)”,p addr- p_pptr-pi d);”,p addr- p_pp tr-uid);prin tk( parent_pid = %dprin tk( paren t_uid = %d prin tk( paren t_gid = %d n “,
12、paddr- p_pp tr-gid);prin tk( no parentn); else if(p addr-p_cptr != NULL)”,p addr- p_cptr-pi d);”,p addr- p_cp tr-uid);prin tk(child_pid = %dprin tk(child_uid = %dprin tk(child_gid = %d n, paddr-p_cptr-gid);elseprin tk( no childn);if(p addr-p_os ptr != NULL)prin tk(brother_ pid = %dprin tk(brother_ui
13、d = %d”,p addr- p_osptr-p id);”,p addr- p_osp tr-uid);prin tk(brother_gid = %d n ”, paddr- p_osp tr-gid); elseprin tk( no brothern);if(p addr-p_ys ptr != NULL)prin tk(right_ pid = %dprin tk(right_uid = %d”,p addr- p_ysptr-p id);”,p addr- p_ysp tr-uid);prin tk(right_gid = %d nn ”, paddr-p_ys ptr-gid)
14、;elseprin tk( no ?nn);return 0;2.然后把 sys_mysyscalll(void)的入口地址添加到arch/i386/kernel/entry.S 的 sys_call_table 表中。该表依次存储所有系统调用的入口地址。修改前为:坛搏乡囂忏蒌鍥铃氈淚跻馱。.long SYMBOL_NAME(sys_ ni_syscall) 變黲癟報伥铉锚鈰赘籜葦。/* sys_set_tid_address这是第258个系统调用* /蜡.rept NR_syscalls-(.-sys_call_table)/4.long SYMBOL_NAME(sys_ ni_syscal
15、l)修改后:.long SYMBOL_NAME(sys_ ni_syscall) 闫撷凄届嬌。/* sys_set_tid_address *.long SYMBOL_NAME(sys_mysyscall) 踪韦辚糴飙铳。/*这是增加的第 259个系统调用*/綾镝鯛駕櫬鹕.rept NR_syscalls-(.-sys_call_table)/4-1.long SYMBOL_NAME(sys_ ni_syscall)3.把增加的 sys_call_table表项所对应的向量,在include/asm-i386/unistd.h中进行必要申明, 以供用户进程和其他系统进程查询或调用/*这里重复次
16、数减少1*/驅踬髏彦浃绥譎饴憂锦諑琼。:猫虿驢绘燈鮒诛髅貺庑献鵬。#defi ne _NR_exit_gro up#define _NR_mysyscall252259/*这是增加的第259个系统调用*/锹籁饗迳琐筆襖鸥娅薔嗚訝。编译内核。并用生成的新内核启动系统。4.测试程序(mysyscall.c)如下#in elude int errno;_syscall0(i nt,mysyscall)*/*这里告诉编译器,把 _syscall0(int,mysyscall)作为一个系统调用来编译,而不是普通函数 構氽頑黉碩饨荠龈话骛門戲。main ()mysyscall();gcc mysyscal
17、l mysyscall.c#./mysyscall#dmesgdmesg命令查看内核的系统日志。附录C:下面解释调用系统调用的过程测试程序 mysyscall.c中的_syscall0是定义在include/asm-i386/unistd.h中的宏:輒峄陽檉簖疖網 儂號泶蛴镧。#defi ne _syscallO(t ype,n ame) type n ame(void) long _res; _asm_ volatile (i nt $0x80 :=a (_res) :0 (_NR_# name); _syscall_return(type,_res); 所以 mysyscall.c 中_s
18、yscall0(int,mysyscall)展开后: int mysyscall(void)long _res;“ int $0x80”=a ” (_res)0” (_NR_mysyscall);_asm_ volatile(do if (un sig ned long)_res) = (un sig ned Ion g)(-125) 尧侧閆繭絳闕绚勵蜆贅瀝纰。errno = - _res);_res = -1;return (int) (_res); while (0)通过软中断int $0x80 ,其中系统调用号为eax中的_NR_#name ,这里 也就是 _NR_mysyscall,在
19、(附录 C)的步骤 3 中有 #define _NR_mysyscall 259,即 259 号系统调 用。识饒鎂錕缢灩筧嚌俨淒侬减。IDT中第0x80个门(其类型为15,即陷阱门)为系统启动(init/main.c中start_kernel调用 i386/kernel/traps.c 中 trap_init)时设置的,trap_init 中 set_system_gate(0x80,&system_call);故 int $0x80指令通过该系统门后转到内核的system_call处执行。凍鈹鋨劳臘错痫婦胫籴铍賄。system_call 定义在 arch/i386/kernel/entry.
20、S 中:ENTRY(system_call)/ 转到此处执行pu shl %eax# save orig_eaxSAVE_ALL/把寄存器压入堆栈# P T_TRACESYSGET_CURRENT(%ebx) testb $0x02,tsk_ptrace(%ebx) jne tracesys cmpi $(NR_syscalls),%eax jae badsysII此时 eax=系统调用号call *SYMBOL_NAME(sys_call_table)(,%eax,4) =NR_mysyscall=259恥諤銪灭萦欢煬鞏鹜錦聰櫻。movl %eax,EAX(%esp)# save the return value 鯊腎鑰诎漣鉀沩懼統庫摇饬。ENTRY(ret_from_sys_call)/ 从系统调用返回cli# need_resched and signals atomic testcmpI $0, need_resched(%ebx)硕癘鄴颃诌攆檸攜驤蔹鸶胶。jne reschedu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年大学(经济学)财政学阶段测试题及答案
- 2025年高职电子商务技术(电商平台技术)试题及答案
- 2025年高职汽车检测与维修技术(汽车售后服务管理)试题及答案
- 2025年大学大四(康复治疗学)运动康复技术综合试题及答案
- 2025年中职化学工艺(化工流程基础)试题及答案
- 2025年高职市场营销(渠道拓展方案)试题及答案
- 2025年大学大四(口腔医学)口腔修复学基础试题及答案
- 2025年中职(机电设备安装与维修)机电设备安装试题及答案
- 2025年大学服装与服饰设计(时尚设计)模拟试题
- 2025年大学(神经病学)神经病学实验阶段测试题及解析
- 2025岚图汽车社会招聘参考题库及答案解析(夺冠)
- 2025河南周口临港开发区事业单位招才引智4人考试重点题库及答案解析
- 2025年无人机资格证考试题库+答案
- 南京工装合同范本
- 登高作业监理实施细则
- DB42-T 2462-2025 悬索桥索夹螺杆紧固力超声拉拔法检测技术规程
- 大学生择业观和创业观
- 车载光通信技术发展及无源网络应用前景
- 工程伦理-形考任务四(权重20%)-国开(SX)-参考资料
- 初中书香阅读社团教案
- 酒店年终总结汇报
评论
0/150
提交评论