2018-2019-1 20189206 《Linux内核原理与分析》第六周作业
linux内核分析学习笔记 ——第五章 系统调用的三层机制
学习重点——深入理解系统调用的过程
给MenuOS添加命令
添加命令的方式较为简单,在LinuxKernel/menu/test.c目录下,打开test.c,main函数中的MenuConfig就是对应的系统调用的功能增加,之后在上面给出具体实现即可。之后就可以在MenuOS中使用该系统调用函数。

使用gdb跟踪内核函数sys_getuid
上面在MenuOS中添加了功能,我这里改成了getuid获得当前用户的id号,调试步骤和实验三基本一样

qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s
冻结内核运行,然后利用gdb调试工具,加载内核,连接端口1234
file linux-3.18.5/vmlinux
target remote:1234

之后在系统调用sys_getuid处设置断点,当启动MenuOS调用功能Getuid后 一旦调用系统函数,程序暂停。可以看到程序停在了sys_getuid处,但该系统调用是利用宏函数实现的,经过预编译处理后是sys_getuid的形式。

在system_call位置设置断点并不能停下,还是会停在sys_getuid这里,因为system_call并不是一个正常的函数,只是一段汇编代码的起点,内部没有严格的函数调用堆栈机制,所以gdb不能完成跟踪任务
系统调用的处理过程

在用户态中有一个c语言提供的APIxyz(),在用户看来这就是系统调用,而xyz()中调用了SYSCALL来触发系统调用。
即中断向量0x80对应system_call中断服务程序入口。

start_kernel函数执行内核启动的初始化工作,其中会调用trap_init函数,在上图所示目录中可以看到以下代码。

当接受到int 0x80 中断请求后,通过set_sysytem_trap_gate函数将中断向量和入口函数绑定,将直接进入中断,也就是跳转到system_call的位置。

这里将trap_init中绑定中断向量和入口函数的代码中的宏定义实现,可以看到系统调用对应的中断向量就是0x80
system_call函数的理解

`system_call`是一段中断服务程序入口的汇编代码,就是系统调用的处理过程,是系统调用用户态和系统调用内核态想转换的过程。
中断过程都会有现场保护和恢复现场代码一开始的SAVE_ALL和restore_all就是实现了中断上下文过程。

sys_call_table是一个系统调用表,EAX寄存器保存了传递的系统调用号,来调用相应的系统调用,调用结束,EAX寄存器还要保存系统调用的返回值。

syscall_exit中判断当前的任务是否需要进程调度,如果需要进程调度进入syscall_exit_work,执行进程调度,结束后恢复现场返回用户态。
系统调用函数

上图所示是系统调用system_call的流程图
- SAVE ALL 是中断发生后保存现场的宏
cmpl $(nr_syscalls),%eax判断检查系统调用号的合法性如果系统调用号大于nr_syscalls 那么出现异常,跳入异常处理syscall_badsys
-call *sys_call_table(,%eax,4)通过系统调用号在系统调用表中找到相应的系统调用内核处理函数,就是将函数API和系统调用联系起来。movl %eax,PT_EAX(%esp)作用是将系统调用返回值入栈syscall exit检查是否有任务要处理,如果发生进程调度需要进入syscall_exit_work- 进程间通信会有信号发生,所以进入进程调度后会有
work_pending、work_notifysig信号处理、和work_resched等处理work_resched中的schedule存着进程调度的代码,也就是进程调度的时机点
- 进程间通信会有信号发生,所以进入进程调度后会有
restore_all和iret用于恢复现场和返回用户态。
Linux内核编译实践中遇到的问题
- 在为函数添加系统调用号时的路径问题
sudo gedit /usr/src/linux-3.14.40/arch/x86/syscall/syscall_32.tbl。
根据文档我在这个路径下并没有找到syscall文件夹,也就无法修改 syscall_32.tbl

最后参考了一篇博客,我想问题应该是内核版本更新,目录有了一定的修改,最后找到了路径

- 使用
make bzImage时出现错误

根据错误提示,我考虑问题出在了内核调用时添加的系统调用格式出现了问题对比之后,我对代码进行更改,结果编译成功



内核编译时间非常久,编译好了之后无法启动,错误问题如下

后来发现是虚拟机的内存不足的原因,重新设置了虚拟机的内存之后成功进入虚拟机,利用命令可以看到该内核版本已经是刚刚编译的4.18.18

写一个程序调用我们刚刚创建的系统调用,返回值得到的是我们当时设定的返回值

参考这篇博客给我提供了解决问题的很多灵感:
Linux4.18.9添加系统调用传递参数示例
2018-2019-1 20189206 《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语言程序并分析其汇编指令执行过程 因 ...
随机推荐
- Hybrid设计--Hybrid中Native能力的设计
稍微成熟的团队,header一定是不利于业务的UI组件,这个组件会封装在view层,方便前端使用.对业务前端开发来说,不用关注header是如何实现的,只用框架层释放的API.(一个前端有一个自己的U ...
- JAVA编程思想学习笔记3-chap7-9-斗之气3段
1.子类构造器会自动调用基类的默认构造器,如果为有参数构造器,则需要手动调用 ①this(args):调用本类中的其它构造器(只能调用一次) ②super(args):调用基类带参数的构造器 2.组合 ...
- .net core 路由处理请求流程图
- mysql的in和not in的用法(特别注意not in结果集中不能有null)
1. not in的结果集中出现null则查询结果为null; 例如下面sql中,含有list中null值,无法正确查询结果: SELECT COUNT(name) FROM CVE WHERE na ...
- mysql数据库表设计小数类型
float:浮点型,含字节数为4,32bit,数值范围为-3.4E38~3.4E38(7个有效位)double:双精度实型,含字节数为8,64bit数值范围-1.7E308~1.7E308(15个有效 ...
- Linux常用网络工具:Http压力测试之ab
ab的全称是Apache Bench,是Apache自带的网络压力测试工具,相比于LR.JMeter,是我所知道的 Http 压力测试工具中最简单.最通用的. ab命令对发出负载的计算机要求很低,不会 ...
- Day7 错误和异常
一.异常 1.异常基础 1.为了让我们的代码在出现异常的时候,整个项目依然是可以正常运行的,所以我们引入了异常处理机制! 2.在编程过程中为了增加友好性,在程序出现bug时一般不会将错误信息显示给用户 ...
- hdu5067
题意 给了一个n*m的网格 然后一台挖掘机从(0,0) 这个位置出发,收集完全部的石头回到(0,0)挖掘机可以有无限的载重 用旅行商处理 dp[k][i] 表示在这个集合中最后到达i的最小距离,用集合 ...
- [转] LoadRunner 获取接口请求响应信息
Action() { int nHttpRetCode; // 默认最大长度为256,get请求需注意缓存问题,需要根据content-length进行修改 web_set_max_html_para ...
- codeforces 979C Kuro and Walking Route
题意: 给出一棵树,其中有两个点,x和y,限制走了x之后的路径上不能有y,问可以走的路径(u,v)有多少条,(u,v)和(v,u)考虑为两条不同的路径. 思路: 简单树形dp,dfs统计在x到y路径( ...