攥写人:李鹏举 学号: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. 大华NVR设备接分别入宇视摄像机Onvif和RTSP主子码流的方案说明

    需求提要 1.各个内网现场有多种网络摄像机IPC和网络硬盘录像机NVR设备: 2.需要将这些设备统一接入到云端中心平台,进行统一的视频直播和录像回放管理: 3.由于目前IPC设备都属于高清设备,主码流 ...

  2. 打包合并多个dll

    复杂项目中会引用大量的第三方dll文件,为了便于管理会尝试把相关打包合并成一个dll文件. 推荐使用ILMerge,如需使用网上自行下载. 使用方法: cd 安装目录 ILmerge /target: ...

  3. Java防止XSS攻击

    方法一:转义存储:添加XssFilter 1.在web.xml添加过滤器: <!-- 解决xss漏洞 --> <filter> <filter-name>xssFi ...

  4. json-lib-2.5-jdk.jar 需要依赖的jar包

    commons-lang3-3.1.jar commons-lang-2.5.jar ezmorph-1.0.6.jar commons-collections-3.2.1.jar commons-b ...

  5. js函数的caller属性

    funcName.caller : 返回一个对函数的引用, 该函数调用了当前函数 function test() { if (test.caller) { var a = test.caller.to ...

  6. table表格用tbody新属性获取DOM元素

    // alert(oTab.getElementsByTagName("tbody")[0] // .getElementsByTagName('tr')[1] // .getEl ...

  7. python3的时间日期处理

    1.python3日期和时间 Python 程序能用很多方式处理日期和时间,转换日期格式是一个常见的功能. Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间. 时 ...

  8. php 验证邮箱的方法

    在开发 web系统时,经常在注册或者登陆或者邮箱保护的时候会需要验证邮箱,现在我来分享邮箱验证的一些小tips.(多说一句,现在基本用手机号注册登录是趋势了,匹配手机号我后面再讲了). 1.最开始也是 ...

  9. SM30维护视图创建【转】

           在SAP中,经常需要自定义数据库表.而且可能需要人工维护数据库表中的数据,可以通过SM30进行维护数据:但是SM30事务的权限太大,不适宜将SM30直接分配:因此,可以通过给维护表分配事 ...

  10. linux 如何查找命令的路径

    linux 下,我们常使用 cd ,grep,vi 等命令,有时候我们要查到这些命令所在的位置,如何做呢? linux下有2个命令可完成该功能:which ,whereis which 用来查看当 前 ...