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语言程序并分析其汇编指令执行过程 因 ...
随机推荐
- TensorFlow 实现分类操作的函数学习
函数:tf.nn.sigmoid_cross_entropy_with_logits(logits, targets, name=None) 说明:此函数是计算logits经过sigmod函数后的交叉 ...
- java重载和重载的区别
重载 public class A{ public void test(){} public void test(int num){} public void test(Str ...
- Oracle体系结构之oracle密码文件管理
密码文件 密码文件作用: 密码文件用于dba用户的登录认证. dba用户:具备sysdba和sysoper权限的用户,即oracle的sys和system用户. 本地登录: 1)操作系统认证: [or ...
- Effective Objective-C 笔记之熟悉OC
1.在一个类的头文件中尽量少引用其他头文件 如果Person.h 引入了EmployeePerson.h,而后续又有其他类如Human.h又引入了Person.h, 那么EmployeePerson. ...
- spring中的BeanFactory与ApplicationContext的作用和区别
BeanFactory 和ApplicationContext Bean 工厂(com.springframework.beans.factory.BeanFactory)是Spring 框架最核心的 ...
- sublime安装install package
通过 https://sublime.wbond.net/Package%20Control.sublime-package 下载packageControl文件 下载完成后,打开sublime te ...
- HTTP 协议详解(转载)
原文: http://kb.cnblogs.com/page/130970/#httpmeessagestructe HTTP协议详解 当今web程序的开发技术真是百家争鸣,ASP.NET, PHP, ...
- Shell初学(一)hello world
精简: 1.创建:可以使用 vi/vim 命令来创建文件如: test.sh ,扩展名并不影响脚本执行,写什么都可以. 2.hello_world: #!/bin/bash ...
- 给JSON中put的value=null时,这对key=value会被隐藏掉。
当我们在JSON里像这样json.put("key",null);put值进去的话,这个键值对就会被隐藏掉例如下面的例子: <pre name="code" ...
- spring boot读取配置文件
一.springboot配置文件 核心配置文件和自定义配置文件.核心配置文件是指在resources根目录下的application.properties或application.yml配置文 ...