2017-2018-1 20179203 《Linux内核原理与分析》第五周作业
攥写人:李鹏举 学号:20179203
( 原创作品转载请注明出处)
( 学习课程:《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 )
一、实验要求:
1.选择一个系统调用(13号系统调用time除外),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3.18.6/arch/x86/syscalls/syscall_32.tbl
2.参考视频中的方式使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用,推荐在实验楼Linux虚拟机环境下完成实验。
二、实验过程:
首先,选择使用的系统调用:我选择的是64号 getppid。网上找到关于该函数的使用与说明:getppid(取得父进程的进程识别码)
表头文件 #include<unistd.h>
定义函数 pid_t getppid(void);
函数说明 getppid()用来取得目前进程的父进程识别码。
返回值 目前进程的父进程识别码。
确定好函数后,写下相关的代码:

编译后执行结果如下:

接着将函数调用的部分改为嵌入式汇编语句:

最后执行嵌入式汇编文件,查看执行结果:

三、实验结果分析
首先附上完整的代码:
c语言代码:
#include<unistd.h>
void main()
{
printf("My parent pid =%d\n",getppid());
}
嵌入式汇编代码:
include <unistd.h>
int main()
{
int a=0;
asm volatile(
"mov $0,%%ebx\n\t"
"mov $0x40,%%eax\n\t"
"int $0x80\n\t"
"mov %%eax,%0\n\t"
:"=m"(a)
);
// a = getppid();
printf("the number of pid is:%d\n",a);
}
分析一下这段汇编代码,首先将ebx置零,汇编调用时的初始化做法,然后把相应函数的终端号写入eax寄存器。可能有人会怀疑,上文中写到了getppid()函数的中断号是64,为何在这里写的是40,这是因为这里写出的是16进制的64,由于寄存器的大小而决定的需要写16进制的数字。两个16进制的数字刚好一字节。接着的int $0x80 为AT&T语法的中断指令,通过中断的调用,将把调用号装入eax寄存器实现,然后实现相应的值的个改变的过程。将数值由EAX给到a中。这是整个汇编语句执行的过程。
可能会有同学怀疑我的实验是不是做的有问题,为什么汇编的结果和C语言出来的结果完全不同。这就涉及到这个函数的功能问题了。getppid()是用来取得目前进程的父进程识别码,每个程序在执行的时候分配的进程是不同的,所以其父进程自然也不同,所以输出两个不同的数字是十分正常的。
结合书中所学和本周的视频和实验,我在这里简单说说我对中断的理解。中断是操作系统当中很重要的一个工作方式,首先所有程序和硬件设备都需要占用CPU,而且有的程序需要占用大量的CPU时间,但是CPU该如何分配工作呢,举一个简单的例子,比如我现在打字用的键盘,这个硬件设备在不使用时是不需要占用CPU的,但是当我敲击键盘的时候我就需要我打的字能够马上出现,因此它不可能一直占有CPU,而是在我打字的时候向CPU发送中断,这时CPU会响应它的请求,在我们看来键盘打字马上就会有反应就会认为CPU一直在等着键盘,有东西就输出,但其实CPU很忙的,它不会等你给它东西,它会忙自己的事,当你准备好的时候,向它发送一个中断,它响应你的要求而已。不过这个过程很快我们根本察觉不到。
那么一个中断来临时究竟经过怎样的工作呢?当一个中断来临时应该先设置断点,保存当前的中断现场,然后按照中断表去找到相应的中断程序进行执行,然后再执行完当前的中断程序之后返回之前的断点,回复中断现场继续执行程序,这是一个完整的中断执行的过程。那么当执行中断程序的时候会不会还能进行中断呢,答案是可以的,但是并不是一定会打断当前的程序,中断也是有等级的,低级的中断自然无法打断高级的中断程序。但是当比其中断等级高的程序来到时自然还是要响应中断的,这就是中断嵌套。但是操作系统并不会由于中断过多而导致出现问题,只要在每次中断来临时保存断点,然后执行中断后进行恢复就好了,这里的记录断点和恢复断点的工作当然就是通过压栈和弹栈来实现的。这就是我对中断的简单理解。
2017-2018-1 20179203 《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语言程序并分析其汇编指令执行过程 因 ...
随机推荐
- centos7.0 关闭防火墙
1.关闭firewall:systemctl stop firewalld.service #停止firewallsystemctl disable firewalld.service #禁止fire ...
- 使用Socket通信实现FTP客户端程序
FTP 客户端如 FlashFXP,File Zilla 被广泛应用,原理上都是用底层的 Socket 来实现.FTP 客户端与服务器端进行数据交换必须建立两个套接字,一个作为命令通道,一个作为数据通 ...
- 更改eclipse(myeclipse) author的默认名字(注释的作者)
在eclipse/myeclipse中,当添加注释的作者选项时,@author 后边一般都会默认填充的你登录计算机的用户名.如何去修改呢:第一种方法:修改计算机登录的用户名(一般不实用)第二种方法:修 ...
- SQL SERVER 2008递归
tab1 表结构: create tab1 ( id int primary key identity(1,1), parentid int not null, name varchar(25) ) ...
- 【python】-- 内置函数、软件目录开发规范(代码编码风格)
内置函数 一.内置函数表格 二.内置函数演示 1.abs(x) 功能:取数的绝对值 >>> abs(-1) #取-1的绝对值 1 ########################## ...
- Linux安装Nginx使用负载均衡
1.实验准备准备三台计算机 nginx1 192.168.13.121 作为nginx负载均衡器nginx2 192.168.13.24 web服务,提供一个页面 nginx3 192 ...
- Bootstrap学习1--响应式导航栏
备注:最新Bootstrap手册:http://www.jqhtml.com/bootstraps-syntaxhigh/index.html <nav class="navbar n ...
- 目标检测--之RCNN
目标检测--之RCNN 前言,最近接触到的一个项目要用到目标检测,还有我的科研方向caption,都用到这个,最近电脑在windows下下载数据集,估计要一两天,也不能切换到ubuntu下撸代码~.所 ...
- static_class
<?php class MyObject { public static $myStaticVar = 0; function myMethod() { self::$myStaticVar + ...
- Data Structure Linked List: Function to check if a singly linked list is palindrome
http://www.geeksforgeeks.org/function-to-check-if-a-singly-linked-list-is-palindrome/ 这里的reverse可以re ...