您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 操作系统原理实验01
《操作系统原理》实验一、系统调用重庆大学软件学院洪明坚2017年2月目录•熟悉开发环境–实验环境–编译、运行与调试•编写系统调用•FAQ•附录–A:C与C++语法区别–B:调试内核实验环境•安装–Windows:下载expenv.7z–Debian/Ubuntu:安装方法–MacOSX:安装方法•包括–编译器、链接器、调试器•GCC、LD、GDB–PC模拟器(虚拟机)•Qemu实验内容•进入实验环境–Windows:双击expenv/setvars.bat–其他操作系统:打开终端•检出(checkout)EPOS的源代码–svncheckout•编译及运行–cdepos–makerun•清除所有的临时文件–makecleanepos/kernel•该目录包括–内核源文件•entry.S–汇编语言文件–内核的入口,不能改为entry.s!•等等–链接器脚本•kernel.ld.in–项目管理文件•Makefileepos/userapp•该目录包括–应用程序源文件•lib/crt0.S–应用程序的入口,调用main•lib/syscall-wrapper.S–系统调用的C语言包裹•main.c–主函数main•等等–项目管理文件•Makefile目录•熟悉开发环境–实验环境–编译、运行与调试•编写系统调用•FAQ•附录–A:C与C++语法区别–B:调试内核系统调用的流程•例子:putchar(inta)–参数a的值入栈–userapp/lib/syscall-wrapper.S:_putchar•movl$SYSCALL_putchar,%eax//系统调用号码入eax•int$0x82–entry.S:_int0x82_syscall–machdep.c:syscall(structcontext*ctx)»函数syscall根据保存在ctx-eax中的系统调用号码做分发»caseSYSCALL_putchar:»从用户栈上读取参数a的值»调用系统调用的实现函数sys_putchar(a)–entry.S:_ret_from_syscallUserspaceKernelspace系统调用的分发voidsyscall(structcontext*ctx){switch(ctx-eax){caseSYSCALL_putchar:ctx-eax=sys_putchar((*((uint32_t*)(ctx-esp+4)))&0xff);break;}}系统调用号码用户栈的栈顶指针系统调用的返回值+4:第一个参数+8:第二个参数以此类推系统调用的实现函数只保留字符实验内容•编写系统调用“time_ttime(time_t*loc)”–功能描述•返回从格林尼治时间1970年1月1日午夜起所经过的秒数。如果指针loc非NULL,则返回值也被填到loc所指向的内存位置–数据类型time_t其实就是long•typedeflongtime_t;实验步骤•Kernelspace–K1、在kernel/machdep.c中,编写系统调用的实现函数“time_tsys_time()”,计算用户需要的秒数。需要用到•变量g_startup_time,它记录了EPOS启动时,距离格林尼治时间1970年1月1日午夜的秒数•变量g_timer_ticks–g_timer_ticks记录了EPOS启动以来定时器中断的总次数•宏定义HZ–HZ是定时器每秒钟中断的次数,即定时器中断的频率–K2、在kernel/kernel.h的后面,加入声明•time_tsys_time();实验步骤•Kernelspace–K3、在include/syscall-nr.h中,定义系统调用的号码•#defineSYSCALL_time2016–K4、在kernel/machdep.c的函数syscall中,增加“caseSYSCALL_time”分支•读取参数的值–time_t*loc=*(time_t**)(ctx-esp+4);•调用系统调用的实现函数sys_time–ctx-eax=sys_time();–if(loc!=NULL)»*loc=ctx-eax;实验步骤•Userspace–U1、在userapp/lib/syscall-wrapper.S末尾,加入汇编语言接口“WRAPPER(time)”–U2、在userapp/include/syscall.h中,加入C语言声明“time_ttime(time_t*loc);”–U3、在userapp/main.c中调用该系统调用,并打印出结果•要测试loc分别为NULL和非NULL两种情况调试系统调用•调试方法–见附录B•调试内容–在machdep.c中函数voidsyscall(structcontext*ctx)的“caseSYSCALL_time”位置设置断点•如何设置?–breakmachdep.c:n»n是“caseSYSCALL_time”的行号•运行到断点位置,查看此时CPU寄存器、函数参数ctx、callstack等等信息目录•熟悉开发环境–实验环境–编译、运行与调试•编写系统调用•FAQ•附录–A:C与C++语法区别–B:调试内核FAQ•Q1:能解释一下系统调用的命名规则吗?–A1:如果系统调用的用户接口名字是foo,那么该系统调用的号码用SYSCALL_foo表示,在内核里面的实现函数是sys_foo。•Q2:time的返回值就够了,为什么还要loc参数呢?–A2:看这里。•Q3:为什么系统调用的用户接口是“time_ttime(time_t*loc)”,而系统调用的实现函数是“time_tsys_time()”呢?–A3:sys_time只要能实现系统调用的功能即可,形式不一定与用户接口相同。•Q4:g_startup_time、g_timer_ticks和HZ要自己定义吗?–A4:不要,直接用即可目录•熟悉开发环境–实验环境–编译、运行与调试•编写系统调用•FAQ•附录–A:C与C++语法区别–B:调试内核附录A:C和C++语法区别A1、变量的定义C语言的变量定义必须语句块的最前面,而C++无此限制。比如for(inti=0;i100;i++)s+=i;在C++中是正确的,但是在C语言中是错误的。又比如switch(i){switch(i)case1:case1:{intj;intj;j++;j++;break;}}break;}左边在C++中是正确的,而在C中是错误的;右边在C和C++中都是正确的。A2、布尔类型C++中有bool类型和true/false值,C中则没有。在C中,非零即为真,零就是假。A3、函数参数默认值C语言中的函数不能有参数默认值,在C++中可以有。附录A:C和C++语法区别A4、结构体(struct)/枚举型(enum)/联合体型(union)的定义用struct定义变量structmystruct{inti;floatx;}在C中声明变量要这么写:structmystructa;而在C++中不用写struct,即mystructa;一种兼容的用法是:typedefstruct_mystruct{inti;floatx;}mystruct;然后在C中可以用“mystructa;”声明变量。附录A:C和C++语法区别A5、类型强制转换C语言必须将类型括起来,C++可以将变量括起来。例如,int(a)在C++中是正确的,但是在C语言中是错误的,必须写为(int)a,或者(int)(a)A6、赋值C语言中的赋值只有一种,即=C++中除了使用=外,还可以使用()。例如,intx(5);//等价于:intx=5;附录B:调试内核•makecleandebug在函数entry处设置断点继续运行连接到QEMU反汇编函数entry单条指令(进入函数)单条指令(跳过函数)显示源代码单条语句(进入函数)单条语句(跳过函数)打印变量的值,还可以用表达式哦查看已设置的断点删除断点1,多个断点用空格分隔查看CPU寄存器可以直接引用寄存器哦查看栈顶的16个字节反汇编从EIP开始的4条指令获取帮助退出调试命令x的格式说明常用的GDB命令解释breaklocationSetabreakpointatalocation,linenumber,orfile(e.g.main,5,orhello.c:23)watchvarBreakwhenavariableiswrittentorwatchvarBreakwhenavariableisreadfromawatchvarBreakwhenavariableiswrittentoorreadfromfinishRununtiltheendofthecurrentfunctiondisplayexpressionDisplaythevalueofanexpressioneverystepoftheprogram—theexpressionmustmakesenseinthecurrentscopeinfodisplayShowalistofexpressionscurrentlybeingdisplayedundisplaynumStopshowinganexpressionidentifiedbyitsnumberprintffmtexpressionsDosomeformattedoutputwithprintf()e.g.printfi=%d,p=%s\n,i,psetvariableexpressionSetavariabletovalue,e.g.setvariablex=20backtraceShowthecallstackinfoall-registersDumpallregisterstoscreenThat’sallEnjoyhacking
本文标题:操作系统原理实验01
链接地址:https://www.777doc.com/doc-3361976 .html