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语言程序并分析其汇编指令执行过程 因 ...
随机推荐
- CodeForces - 779D String Game 常规二分
题意:给你两个串,S2是S1 的一个子串(可以不连续).给你一个s1字符下标的一个排列,按照这个数列删数,问你最多删到第几个时S2仍是S1 的一个子串. 题解:二分删掉的数.判定函数很好写和单调性也可 ...
- ios-Objective-C中的各种遍历(迭代)方式(转载)
iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式 说明: 1)该文简短介绍在iOS开发中遍历字典.数组和集合的几种常见方式. 2)该文对应的代码可以在下面的地址获得:https:// ...
- PL/SQL类的应用
类的定义 直接声明字段类型‘VARCHAR2或NUMBER等’ declare type kingsql_tp1 is record(empno number,ename varchar2(100)) ...
- [python-opencv]超大图像二值化方法
*分块 *全局阈值 VS 局部阈值 import cv2 as cv import numpy as np def big_image_binary(image): print(image.shape ...
- 正则验证ip
用python爬获取这样一条数据: <td class="ip" id="ip"><p style="display: none;& ...
- idea 连接数据库
1:如果没有数据库连接插件,下载database插件 settings>plugin>Database Navigator 下载. 2:重启 3:进入 view>tool windo ...
- jpress-配合nginx与tomcat安装
目录 1. 前言 2. yum安装tomcat 2. yum安装MySQL 3. 下载JPress并安装 4. 配置tomcat使其可以部署多个网站 5. 安装nginx并配置 6. 将已经安装好的j ...
- 【转】 Oracle 用户权限管理方法
sys;//系统管理员,拥有最高权限 system;//本地管理员,次高权限 scott;//普通用户,密码默认为tiger,默认未解锁 sys;//系统管理员,拥有最高权限 system;//本地管 ...
- [LeetCode] 605. Can Place Flowers_Easy
Suppose you have a long flowerbed in which some of the plots are planted and some are not. However, ...
- npm的.npmrc文件在哪里?缓存及全局包文件在什么位置?
npm的.npmrc文件在哪里?缓存及全局包文件在什么位置? npm作为node开发过程中的必备工具,长期使用之后,您可能会想:这些全局安装的node包都放在硬盘里面的哪个地方?配置文件.npmr ...