2017-2018-1 20179209《Linux内核原理与分析》第五周作业
一.实验:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
环境说明
实验环境为 Ubuntu16.10 和 实验楼环境。
选择39号系统调用实验。39号系统调用为mkdir系统调用。
实验步骤
有关mkdir系统调用的具体介绍见 linux api 函数——mkdir
1.用库函数实现mkdir系统调用
代码很简单:
#include <sys/stat.h>
#include <sys/types.h>
void main(){
char *p = "./testdir"; //定义char类型指针,说明要创建的目录名称。“./”指在当前目录,其实可以不写
mkdir(p,S_IRWXU); //调用mkdir的api函数,第二个参数为所建目录的权限
代码很糙,由于主要目的是实现mkdir系统调用,所以一些跟判断有关的代码我就省略了,直奔主题。

编译运行,实验结果如下:

成功!
2.用嵌入式汇编的C代码实现mkdir系统调用
代码如下:
#include <sys/stat.h>
#include <sys/types.h>
void main(){
// char *p = "./testdir";
int intr;
mode_t mode = S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH; //定义mode
asm volatile(
"int $0x80;\n\t" //执行80号中断,换成intel下汇编类似于 int 80h;
: "=a" (intr) //因为mkdir有一个int类型的返回值,所以必须定义一个int来接收
: "a" (39),"b" ("testdir"),"c" (mode) //eax值为39;ebx值为“testdir”;ecx值为mode;这里的三个寄存器的值都是用来传递参数的,eax传递系统调用号,ebx传递mkdir函数的第一个参数,ecx传递mkdir函数的第二个参数。
: "memory"
);
}

编译:

从上图中大家可以看出,这个程序其实我是调试了很多遍之后才编译成功的,主要问题就是集中在嵌入式汇编asm和volatile标题处的问题,这里“_”个数要求非常严格,而且对程序的编译有很大的影响。起初调试时报错是格式问题,在确定格式正确后我只能把问题归结与开头,在我删除volatile时果然又报了不同的错,但程序还是没有编译通过,所以我上网查阅了资料。发现asm和volatile前后各两个下划线,除此外还可以都不加下划线。
运行:

我们可以看到,运行后程序没报错,而且也没有生成我们想要的testdir这个文件夹,很显然失败了。。。起初我怕是因为权限问题,专门用系统权限执行后还是没有成功。不过我并没有放弃,把代码拷到实验楼环境下编译运行:


成功了!
相同的代码,编译运行后却得到不同的结果,那只可能跟实验环境有关了。
对比两个实验环境:

猜测可能是我的Ubuntu版本有些旧吧。知道原因的人也可以留言交流。
结果分析
对于上述实验结果的分析,我觉得一张图足以说明它们之间的调用过程与关系。

这种汇编相当简单,直接把所需要的参数写进输入参数,不用mov指令赋值,所以汇编代码看起来非常简单。一般来说,需要传入的参数不会多于6个,因为通用寄存器共6个,一旦参数个数超过6个就需要申请一块内存地址专门存放参数。
二.中断
定义:
中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。
分类:
- 硬中断
- 可屏蔽中断:这类中断可以通过中断屏蔽寄存器中设定位掩码来关闭。
- 不可屏蔽中断:无法通过中断处理程序来关闭或推迟的中断,如时钟中断。
- 软中断
它是一条CPU指令,用以自陷一个中断。由于软中断指令通常要运行一个切换CPU至内核态的子例程,它常被用作实现系统调用。
中断与异常:
中断与异常有所区别,异常在产生时必须考虑与处理时钟同步,因为异常只能在一条指令执行结束后发生,不可能执行一半发生异常,由于与时钟同步,所以异常被称为同步中断。而中断却不是,它可以在任何时候发生。
异常往往是操作系统不期望发生的事情;相反,操作系统因为有中断的存在,执行效率和正确性方面都有很大的提升。
上半部与下半部:
刚看到这个概念时很陌生,最起码在中断这一块,这样的叫法是第一次看到。
中断服务程序一般都是在中断请求关闭的条件下执行的,以避免嵌套而使中断控制复杂化。但是,中断是一个随机事件,它随时会到来,如果关中断的时间太长,CPU就不能及时响应其他的中断请求,从而造成中断的丢失。因此,Linux内核的目标就是尽可能快的处理完中断请求,尽其所能把更多的处理向后推迟。
从上半部与下半部产生的原因我们可以总结如下:
- 上半部必须以最短的时间来执行,因为执行上半部时是关中断状态,无法响应其他中断;
- 下半部运行时处于开中断状态,所以一些耗时的任务需要放在下半部执行。
下半部机制:
所有用于实现将工作推后执行的内核机制都被称作“下半部机制”。目前流行的有如下三种:
- 软中断
- tasklet
- 工作队列
具体详见中断下半部机制
总结
系统调用是为了让用户程序安全地访问底层资源,它是用户空间访问内核的唯一手段;
系统调用由操作系统内核提供,运行于内核态。
Linux的系统调用通过int 0x80实现,用系统调用号来区分入口函数。
系统调用中的中断,一般是指软中断。
如果进程上下文和一个下半部共享数据,在访问这些数据之前,需要进制下半部的处理并取得锁的使用权。这里的锁指对共享数据的加锁。
如梭中断上下文和一个下半部共享数据,在访问共享数据之前,需要进制中断并得到锁的使用权。
2017-2018-1 20179209《Linux内核原理与分析》第五周作业的更多相关文章
- 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 20199329《Linux内核原理与分析》第九周作业
<Linux内核原理与分析>第九周作业 一.本周内容概述: 阐释linux操作系统的整体构架 理解linux系统的一般执行过程和进程调度的时机 理解linux系统的中断和进程上下文切换 二 ...
- 2019-2020-1 20199329《Linux内核原理与分析》第二周作业
<Linux内核原理与分析>第二周作业 一.上周问题总结: 未能及时整理笔记 Linux还需要多用 markdown格式不熟练 发布博客时间超过规定期限 二.本周学习内容: <庖丁解 ...
- 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语言程序并分析其汇编指令执行过程 因 ...
随机推荐
- 无法获得VMCI 驱动程序的版本: 句柄无效。
写在前面 最近在电脑上安装了VMware虚拟机,在安装系统的使用,总提示错误“无法获得VMCI 驱动程序的版本: 句柄无效.”.最近刚买的电脑,也不会是系统的问题吧,为了装个虚机,总不能重装系统吧,没 ...
- 【spring boot】10.spring boot下的单元测试
spring boot下的单元测试,思前想后还是需要单独用一章篇幅来看看. 然后在看了介绍和使用时候,我感觉并不想多去看了. 但是还是给后来人留下参考的路径: 官网说明:https://spring. ...
- hdu254 DFS+BFS
这个题目需要注意以下几点: 1)注意界线问题,箱子和人不可以越界. 2)需要判断人是否可以到达人推箱子的指定位置. 3)不可以用箱子作为标记,因为箱子可以走原来走过的地方,我们用箱子和人推箱子的方向来 ...
- todo提纲
deep&wide为啥work,如何优化特征:详述attention,attention在ctr预估中如何使用,din为啥work?详述transformer,如何应用于ctr预估;item2 ...
- DevExpress控件之LookupEdit,ComboBoxEdit
ComboBoxEdit 1. ComBoxEdit没有DisplayMember 和 ValueMember 属性,只能获取显示的值2.当前选定值comboBoxEdit1.Propertie ...
- Android内存泄露调试
Android 内存泄漏调试 一.概述 如果我们编写的代码当中有太多的对内存使用不当的地方,难免会使得我们的设备运行缓慢,甚至是死机.为了能够使得 Android 应用程序安全且快速的运行, Andr ...
- HDU 3591 The trouble of Xiaoqian(多重背包+全然背包)
HDU 3591 The trouble of Xiaoqian(多重背包+全然背包) pid=3591">http://acm.hdu.edu.cn/showproblem.php? ...
- HDU 4927 大数
题意非常easy: 对于长度为n的数.做n-1遍.生成的新数列: b1=a2-a1 b2=a3-a2 b3=a4-a3 c1=b2-b1 c2=b3-b2 ans=c2-c1 最后推出公式: ...
- zepto jquery和zepto的区别?
jQuery 由于强大的生命力基本上是一个事实标准,所以大部分工具 lib 在 DOM 操作.动画等功能上或多或少都会是 jQuery-like 的. Zepto 的 API 就是完全兼容 jQuer ...
- React学习之受控和非受控组件
受控组件是通过事件完成对元素value的控制,反之就是非受控组件. 1.受控组件的value通过onChange事件来改变,非受控不需要通过事件来改变value. 2.受控组件通过事件通过setSta ...