2018-2019-1 20189218《Linux内核原理与分析》第六周作业
向menuOS中增加命令
修改menu目录下的test.c文件,增加自己的函数定义,并在修改main()
函数,按照前面的menuconfig
的写法写好自己的menuconfig。
我选择的是access系统调用,对于封装好的access()函数,接受两个参数,第一个为mode,接受四个默认值——X_OK
,R_OK
,W_OK
,F_OK
,分别表示是否可执行、是否可读、是否可写、文件是否存在;第二个参数是文件名。我添加的命令如下所示:
命令运行结果如下所示:
调试系统调用
按照课本第三章讲的步骤,在sys_access
处设置断点,可以追踪调试该系统调用,这里不再赘述如何才能对其进行调试,而是专注于调试本身的过程。
如图所示,内核停在sys_access
处
接下来我连续执行s(step),比较奇怪的是前三次调试器中代码位置没有变化。我们可以看到这三次调用的函数依次是SYSC_accsee,SyS_faccessat和SYSC_faccessat。是否可以理解为每一个系统调用SyS_*
都对应着另一层封装SYSC_*
呢?调试器中代码位置没有变化是为什么呢?如果SyS_access
会调用SYSC_access
,又是写在哪里的呢?如果是函数的话调试器应该会跳转过去,推测可能是用宏实现的。
另外查阅SYSC_access的相关资料,得知该函数确实由SyS_access
调用,功能是返回sys_faccessat
的值。
通过命令s
一步一步往下执行,进入不能引起我注意的函数就finish
,直到遇到了schedule
函数,这时候系统调用已经执行完了,但还没有返回用户态,我做出这个判断的依据是menu窗口还有没打印程序执行的结果:
schedule
函数结束后返回用户态,在menu窗口打印程序执行的结果,这和我们在上一章了解的内容也保持一致,即在执行完sys_access后会执行ret_from_sys_call,此时仍处于内核态,是进程调度最常见的时机,如果没有进程调度或者进程调度结束后才会执行iret返回用户态。
我的内核中没有发生进程调度,返回用户态并在menu窗口打印结果:
从图中可以发现,从schedule
返回用户态时不能通过n
或者s
命令,会出现
cannot find bounds of current function
同样不是很明白为什么,大概是用户态和内核态的交界比较特殊。
system_call流程图
system_call
位于kernel/entry_32.S中,是一段特殊的汇编代码,通过课本上简化代码可以很容易的理解他的工作流程:
问题
调试器不显示代码问题
前面已经提到过了,按照我的理解,以及调试器中显示的信息也确实应该是这样,sys_access会调用SYSC_access,SYSC_access会调用sys_faccessat,sys_faccessat会调用SYSC_faccessat。但在调试器中并由没相关代码出现,所以我对这个理解还有些怀疑。再来一遍SYSC_access的相关资料。
可能要修改menu配置
在通过s
指令进入的一些函数中不能通过s
或n
来进行下一步,会出现
如下问题:
因为没有对我追踪系统调用造成影响,所以我选择通过finish跳出该函数,后来搜索该问题发现可能要修改menu的配置,相关资料。
添加自己的系统调用
原内核版本4.15.0-39-generic,选用4.13.13版本内核做该实验,但是在进入新编译的内核后,不论是通过汇编的方式还是syscall的方式都无法成功执行自己的系统调用,通过syscall方式调用,errno返回错误值38,经搜索是unimplemented function,如果通过内嵌汇编调用,%eax中的返回值为-9,errno不会记录错误值。
我比较疑惑的是,为什么自己新加的系统调用不和内核原来的系统调用写在一起呢?经过这次实验也知道内核中会有总共系统调用数的信息,但实验中并没有步骤修改那个值。同时在unistd.h中发现系统调用的数量并不很多,但我们修改的.tbl文件中却有400多个系统调用,这些都会被编译到内核中吗?是不是在make oldconfig时有一些选项要注意一下?
后来将自己写的系统调用传递参数类型由string改成int,运行成功,为什么string类型做参数就不可以呢?编译中也没有提示错误信息。
调试system_call
gdb并不支持直接对system_call进行调试,我们可以通过UML将内核当成一个进程启动,或者利用虚拟机的优点,在宿主机通过vmware调试内核,具体参照用KGdb和VMware调试Linux内核,System Call
2018-2019-1 20189218《Linux内核原理与分析》第六周作业的更多相关文章
- 2019-2020-1 20199329《Linux内核原理与分析》第九周作业
<Linux内核原理与分析>第九周作业 一.本周内容概述: 阐释linux操作系统的整体构架 理解linux系统的一般执行过程和进程调度的时机 理解linux系统的中断和进程上下文切换 二 ...
- 2019-2020-1 20199329《Linux内核原理与分析》第二周作业
<Linux内核原理与分析>第二周作业 一.上周问题总结: 未能及时整理笔记 Linux还需要多用 markdown格式不熟练 发布博客时间超过规定期限 二.本周学习内容: <庖丁解 ...
- 20169212《Linux内核原理与分析》第二周作业
<Linux内核原理与分析>第二周作业 这一周学习了MOOCLinux内核分析的第一讲,计算机是如何工作的?由于本科对相关知识的不熟悉,所以感觉有的知识理解起来了有一定的难度,不过多查查资 ...
- 20169210《Linux内核原理与分析》第二周作业
<Linux内核原理与分析>第二周作业 本周作业分为两部分:第一部分为观看学习视频并完成实验楼实验一:第二部分为看<Linux内核设计与实现>1.2.18章并安装配置内核. 第 ...
- 2018-2019-1 20189221 《Linux内核原理与分析》第九周作业
2018-2019-1 20189221 <Linux内核原理与分析>第九周作业 实验八 理理解进程调度时机跟踪分析进程调度与进程切换的过程 进程调度 进度调度时机: 1.中断处理过程(包 ...
- 2017-2018-1 20179215《Linux内核原理与分析》第二周作业
20179215<Linux内核原理与分析>第二周作业 这一周主要了解了计算机是如何工作的,包括现在存储程序计算机的工作模型.X86汇编指令包括几种内存地址的寻址方式和push.pop.c ...
- 2019-2020-1 20209313《Linux内核原理与分析》第二周作业
2019-2020-1 20209313<Linux内核原理与分析>第二周作业 零.总结 阐明自己对"计算机是如何工作的"理解. 一.myod 步骤 复习c文件处理内容 ...
- 2018-2019-1 20189221《Linux内核原理与分析》第一周作业
Linux内核原理与分析 - 第一周作业 实验1 Linux系统简介 Linux历史 1991 年 10 月,Linus Torvalds想在自己的电脑上运行UNIX,可是 UNIX 的商业版本非常昂 ...
- 《Linux内核原理与分析》第一周作业 20189210
实验一 Linux系统简介 这一节主要学习了Linux的历史,Linux有关的重要人物以及学习Linux的方法,Linux和Windows的区别.其中学到了LInux中的应用程序大都为开源自由的软件, ...
- 2018-2019-1 20189221《Linux内核原理与分析》第二周作业
读书报告 <庖丁解牛Linux内核分析> 第 1 章 计算工作原理 1.1 存储程序计算机工作模型 1.2 x86-32汇编基础 1.3汇编一个简单的C语言程序并分析其汇编指令执行过程 因 ...
随机推荐
- Linux free命令详解
前段时间有个项目的用C写的,性能测试时发现内存泄露问题.关于怎么观察内存使用问题,free是很好用的一个命令. 参数讲解 bash-3.00$ freetotal used f ...
- int float 的具体的取值范围取决于具体的机器 整数除法舍位 整形(int)也可以用于存储字符型数据
int 通常为16位 存储单元 float 通常为32位 取决于具体的机器 #include main() { int fathr,celsius; int lower,upper,step; ...
- Alpine Linux
Alpine Linux Docker镜像基于Alpine Linux操作系统,后者是一个面向安全的轻型Linux发行版.不同于通常Linux发行版,Alpine Linux采用了musl libc和 ...
- sql两列相除,保留n位小数
), ) from tablename 以上代码意思两列相处,然后保留4位小数.
- Spark与mysql整合
一.需求:把最终结果存储在mysql中 1.UrlGroupCount1类 import java.net.URL import java.sql.DriverManager import org.a ...
- Python描述器引导(转)
原文:http://pyzh.readthedocs.io/en/latest/Descriptor-HOW-TO-Guide.html 1. Python描述器引导(翻译) 作者: Raymond ...
- windows平台mysql密码破解设置
windows平台下,5.7版本mysql,破解密码的两种方式: #1 关闭mysql服务net stop mysql 启动mysql服务 跳过权限 #2 在cmd中执行:mysqld --skip- ...
- 重读《Java编程思想》
相关最新代码已上传至我的GitHub了(https://github.com/WenyangSun/ThinkingInJava),后续例子没有在博客上更新. 1.在类的内部,变量定义的先后顺序决定了 ...
- iOS开发--底部按钮和应用图标显示未读消息
我们要实现的效果如下: 我们使用系统自带的,实际上,代码量很少,在我们要显示的按钮上,打上下面一句代码即可: self.tabBarItem.badgeValue = @"1"; ...
- iOS 界面启动时,功能新特征显示
APP新启动的时候,都会有几张新的图片滑动,才能到主的界面.现在,我们新建一个控制器,专门来处理新特性,直接上代码. 第一步:新建一个NewfeatureController // // HWNewf ...