L5 系统调用的实现.pdf

上传人:奉*** 文档编号:4060097 上传时间:2021-01-13 格式:PDF 页数:11 大小:331.84KB
返回 下载 相关 举报
L5 系统调用的实现.pdf_第1页
第1页 / 共11页
L5 系统调用的实现.pdf_第2页
第2页 / 共11页
点击查看更多>>
资源描述

《L5 系统调用的实现.pdf》由会员分享,可在线阅读,更多相关《L5 系统调用的实现.pdf(11页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、操操作作系系统统Operating Systems L5. 系系统统调调用用的的实实现现 System Call? - 2 -Operating System 系系统统调调用用的的直直观观实实现现 n实实现现一一个个whoami系系统统调调用用 用用户户程程序序调调用用whoami, 一一个个字字符符串串“lizhijun”放放在在操操作作系系统统中中(系系统统引引导导 时时载载入入),取取出出来来打打印印 “lizhijun”100: 都都在在内内存存中中,这这内内存存不不都都是是我我买买的的吗吗 不不能能随随意意的的调调用用数数据据, 不不能能随随意意的的jmp。 可可以以看看到到root

2、密密码码, 可可以以修修改改它它 可可以以通通过过显显存存看看到到别别 人人word里里的的内内容容 问问题题+直直观观想想法法 whoami() printf(100, 8); main() whoami(); 用用户户程程序序 - 3 -Operating System 内内核核态态可可以以访访问问任任何何 数数据据,用用户户态态不不能能访访 问问内内核核数数据据 对对于于指指令令跳跳转转也也一一样样 实实现现了了隔隔离离 内内核核(用用户户)态态,内内核核(用用户户)段段 n将将内内核核程程序序和和用用户户程程序序隔隔离离! 区区分分内内核核态态和和用用户户态态:一一种种处处理理器器“硬

3、硬件件设设计计” 系系统统调调用用 处处理理器器保保护护环环 0 1 2 3 核核心心态态 OS服服务务 用用户户态态 CPL(CS) RPL(DS) DPL 检检查查 DPL CPL DPL RPL 当当前前程程序序执执行行在在什什么么态态(哪哪层层环环)?由由于于CS:IP是是当当前前指指令令, 所所以以用用CS的的最最低低两两位位来来表表示示: 0是是内内核核态态,3是是用用户户态态 访访问问的的数数 据据段段DS的的 最最低低两两位位 - 4 -Operating System 硬硬件件提提供供了了“主主动动进进入入内内核核的的方方法法” n对对于于Intel x86,那那就就是是中中

4、断断指指令令int int指指令令将将使使CS中中的的CPL改改成成0,“进进入入内内核核” 这这是是用用户户程程序序发发起起的的调调用用内内核核代代码码的的唯唯一一方方式式 此此时时,CPL=3而而 DPL=0 系系统统调调用用的的核核心心: (1) 用用户户程程序序中中包包含含一一段段包包含含int指指令令的的代代码码 (2) 操操作作系系统统写写中中断断处处理理,获获取取想想调调程程序序的的编编号号 (3) 操操作作系系统统根根据据编编号号执执行行相相应应代代码码 由由谁谁做做? 库库函函数数! - 5 -Operating System 系系统统调调用用的的实实现现 调调用用print

5、f() 应应用用程程序序 库库函函数数printf() C函函数数库库 库库函函数数write() 系系统统调调用用write() OS内内核核 #include _syscall3(int, write, int, fd, const char *buf, off_t, count) #define _syscall3(type, name, .) type name(.) _asm_ (“int 0 x80” :”=a”(_res). 最最终终展展开开成成包包含含int指指令令的的代代码码 在在linux/lib/write.c中中 在在linux/include/unistd.h中中 -

6、 6 -Operating System Linux系系统统调调用用的的实实现现细细节节! - 7 -Operating System 将将关关于于write的的故故事事完完整整的的讲讲完完 在在linux/include/unistd.h中中 #define _syscall3(type,name,atype,a,btype,b,ctype,c) type name(atype a, btype b, ctype c) long _res; _asm_ volatile(“int 0 x80”:”=a”(_res):”(_NR_#name), ”b”(long)(a),”c”(long)(b

7、),“d”(long)(c); if(_res=0) return (type)_res; errno=-_res; return -1; 显显然然,_NR_write是是系系统统调调用用号号,放放在在eax中中 在在linux/include/unistd.h中中 #define _NR_write 4 /一一堆堆连连续续正正整整数数(数数组组下下标标, 函函数数表表索索引引) 同同时时eax也也存存放放返返回回值值,ebx,ecx,edx存存放放3个个参参数数 _syscall3表表示示有有3个个参参数数 - 8 -Operating System int 0 x80中中断断的的处处理理

8、void sched_init(void) set_system_gate(0 x80, 显显然然,set_system_gate用用来来设设置置0 x80的的中中断断处处理理 在在linux/include/asm/system.h中中 #define set_system_gate(n, addr) _set_gate( /idt是是中中断断向向量量表表基基址址 #define _set_gate(gate_addr, type, dpl, addr) _asm_(“movw %dx,%axnt” “movw %0,%dxnt” “movl %eax,%1nt” “movl %edx,%2

9、”: :”i”(short)(0 x8000+(dpl13)+type8),“o”(*( char*)(gate_addr),”o”(*(4+(char*)(gate_addr), “d”(char*)(addr),”a”(0 x00080000) 段段选选择择符符处处理理函函数数入入口口点点偏偏移移 0 4 处处理理函函数数入入口口点点偏偏移移 P DPL 01110 - 9 -Operating System 中中断断处处理理程程序序: system_call _sys_call_table+4*%eax就就是是相相应应系系统统调调用用处处理理函函数数入入口口 在在linux/kernel

10、/system_call.s中中 nr_system_calls=72 .globl _system_call _system_call: cmpl $nr_system_calls-1,%eax ja bad_sys_call push %ds push %es push %fs pushl %edx pushl %ecx pushl %ebx /调调用用的的参参数数 movl $0 x10,%edx mov %dx,%ds mov %dx,%es /内内核核数数据据 movl $0 x17,%edx mov %dx,%fs /fs可可以以找找到到用用户户数数据据 call _sys_cal

11、l_table(,%eax,4) /a(,%eax,4)=a+4*eax pushl %eax /返返回回值值压压栈栈,留留着着ret_from_sys_call时时用用 . /其其他他代代码码 ret_from_sys_call: popl %eax, 其其他他pop, iret eax中中存存放放的的是是系系统统调调用用号号 _asm_ volatile(“int 0 x80”:”=a”(_res) - 10 -Operating System 在在include/linux/sched.h中中 typedef int (fn_ptr*)(); _sys_call_table call _

12、sys_call_table(,%eax,4)就就是是call sys_write 在在include/linux/sys.h中中 fn_ptr sys_call_table= sys_setup, sys_exit, sys_fork, sys_read, sys_write, .; sys_call_table是是一一个个全全局局函函数数数数组组 sys_write对对应应的的数数组组下下标标为为4,_NR_write=4 eax=4,函函数数入入口口地地址址长长度度也也为为4 用用 户户 调调 用用 printf printf 展展 成成 int 0 x80 中中 断断 处处 理理 system_call 查查 表表 sys_ call_table _NR_write =4 调调 用用 sys_write 故故事事结结束束! 用用户户态态内内核核态态 - 11 -Operating System “lizhijun”100: sys_whoami() printk(100, 8); main() eax = 72; int 0 x80; “lizhijun”100: whoami() printf(100, 8); main() whoami(); _system_call: call sys_whoami /sys_call_table + eax*4

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 大学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com