攥写人:李鹏举 学号: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内核原理与分析》第五周作业的更多相关文章

  1. 20169212《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 这一周学习了MOOCLinux内核分析的第一讲,计算机是如何工作的?由于本科对相关知识的不熟悉,所以感觉有的知识理解起来了有一定的难度,不过多查查资 ...

  2. 20169210《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 本周作业分为两部分:第一部分为观看学习视频并完成实验楼实验一:第二部分为看<Linux内核设计与实现>1.2.18章并安装配置内核. 第 ...

  3. 2018-2019-1 20189221 《Linux内核原理与分析》第九周作业

    2018-2019-1 20189221 <Linux内核原理与分析>第九周作业 实验八 理理解进程调度时机跟踪分析进程调度与进程切换的过程 进程调度 进度调度时机: 1.中断处理过程(包 ...

  4. 2017-2018-1 20179215《Linux内核原理与分析》第二周作业

    20179215<Linux内核原理与分析>第二周作业 这一周主要了解了计算机是如何工作的,包括现在存储程序计算机的工作模型.X86汇编指令包括几种内存地址的寻址方式和push.pop.c ...

  5. 2019-2020-1 20199329《Linux内核原理与分析》第九周作业

    <Linux内核原理与分析>第九周作业 一.本周内容概述: 阐释linux操作系统的整体构架 理解linux系统的一般执行过程和进程调度的时机 理解linux系统的中断和进程上下文切换 二 ...

  6. 2019-2020-1 20199329《Linux内核原理与分析》第二周作业

    <Linux内核原理与分析>第二周作业 一.上周问题总结: 未能及时整理笔记 Linux还需要多用 markdown格式不熟练 发布博客时间超过规定期限 二.本周学习内容: <庖丁解 ...

  7. 2019-2020-1 20209313《Linux内核原理与分析》第二周作业

    2019-2020-1 20209313<Linux内核原理与分析>第二周作业 零.总结 阐明自己对"计算机是如何工作的"理解. 一.myod 步骤 复习c文件处理内容 ...

  8. 2018-2019-1 20189221《Linux内核原理与分析》第一周作业

    Linux内核原理与分析 - 第一周作业 实验1 Linux系统简介 Linux历史 1991 年 10 月,Linus Torvalds想在自己的电脑上运行UNIX,可是 UNIX 的商业版本非常昂 ...

  9. 《Linux内核原理与分析》第一周作业 20189210

    实验一 Linux系统简介 这一节主要学习了Linux的历史,Linux有关的重要人物以及学习Linux的方法,Linux和Windows的区别.其中学到了LInux中的应用程序大都为开源自由的软件, ...

  10. 2018-2019-1 20189221《Linux内核原理与分析》第二周作业

    读书报告 <庖丁解牛Linux内核分析> 第 1 章 计算工作原理 1.1 存储程序计算机工作模型 1.2 x86-32汇编基础 1.3汇编一个简单的C语言程序并分析其汇编指令执行过程 因 ...

随机推荐

  1. ASIHTTP

    本文转载至 http://www.th7.cn/Program/IOS/201303/128223.shtml     向服务器端上传数据 ASIFormDataRequest ,模拟 Form表单提 ...

  2. spring 事务传播行为类型

    事务传播行为种类 Spring在TransactionDefinition接口中规定了7种类型的事务传播行为, 它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播: 事务传播行为类型 说明 P ...

  3. 线段覆盖 2(序列DP)

    Code vs 3027 线段覆盖 2   题目描述 Description 数轴上有n条线段,线段的两端都是整数坐标,坐标范围在0~1000000,每条线段有一个价值,请从n条线段中挑出若干条线段, ...

  4. [原创]webpack动态设置css路径

    在程序入口的最上方添加 __webpack_public_path__ = path; //your path //your app start here

  5. Modeling of Indoor Positioning Systems Based on Location Fingerprinting

    Kamol Kaemarungsi and Prashant Krishnamurthy Telecommunications Program School of Information Scienc ...

  6. thinkphp5, 省略index.php

    Apache:1. httpd.conf配置文件中加载了mod_rewrite.so模块2. AllowOverride None 将None改为 All3. 把下面的内容保存为.htaccess文件 ...

  7. python基础-第五篇-5.1冒泡排序

    几个月过去了,小白逐渐对公司的后端服务熟悉了,不过这天小白又接到一封神秘邮件,是景女神发来的:公司急需一批对语言算法有些了解的优秀员工,鉴于你在公司的表现很不错,现在给到你一个培训机会,请速到开发部报 ...

  8. Django之restframework2视图三部曲

    视图三部曲 下面我来来看restframework是如何将冗余的代码一步步的进行封装. 这里主要用到的是多继承 第一步mixin类编写视图 AuthorModelSerializer: class A ...

  9. css position: relative,absolute具体解释

    关于CSS中 position在布局中非常重要,查了非常多资料都说的非常难理解.以下说说个人的理解: 语法: position: relative | absolute relative: 对象遵循常 ...

  10. Linux通过Shell对文件自动进行远程拷贝备份

    在执行计划任务拷贝文件的时候,用scp命令需要输入密码,这里用公共密钥的方式实现密码的自动输入. 具体操作: 要求:把192.168.0.2机上的test.tar拷贝到192.168.0.3机器的上 ...