第一部分:实验

首先还是网易云课堂的实验内容,扒开系统调用的三层皮(下),分为两部分:

1.给MenuOS增加time和time-asm命令

2.系统调用在内核代码中的处理过程

给MenuOS增加time和time-asm命令:
  • 更新menu代码到最新版
  • 在main函数中增加MenuConfig
  • 增加对应的Time函数和TimeAsm函数
  • make rootfs

结果如图所示。

接下来是用gdb设断点,如图所示,





我自己写的系统调用是getpid,加到test.c的函数如下所示。

 #include<sys/types.h>
#include<unistd.h> int Getpid()
{
int p=getpid();
printf("pid:%d/n",p);
return 0;
}
int GetpidAsm()
{
int p;
asm volatile(
"mov $0,%%ebx\n\t"
"mov $0x14,%%eax\n\t"
"int $0x80\n\t"
"mov %%eax,%0\n\t"
:"=m"(p)
);
printf("pid:%d/n",p);
return 0;
} MenuConfig("getpid","Show System pid",Getpid);
MenuConfig("getpid-asm","Show System pid(asm)",GetpidAsm);
system_call到iret:
1.
system_call->SAVE_ALL(保存现场)->syscall_call(call *sys_call_table(,%eax,4)调用了系统调用处理函数,这里是实际的系统调用的服务程序)->syscall_exit_work->Yes or No?
2.
yes->work_pending->work_notfysig(处理信号的)->work_resched->call_schedule(调用schedule,决定进程调用的代码都在这里)->restore_all(恢复现场)->irg_return->end
3.
no->restore_all(恢复现场)->irq_return->end

SAVE_ALL保存的一帧现场所有的寄存器,与该过程所要传递的pt_regs结构中的成员一致。pt_regs描述了在执行系统调用时,用户态下的CPU寄存器在核心态的栈中的保存情况。

问题:

在实验楼中克隆不下来,有两个解决办法,第一个是在自己虚拟机上克隆的,可以执行,结果如图所示



在安装git时遇到问题,安装源不对,更改了安装源还是不对,然后第二天进行尝试就可以了,如下图所示





安装内核时遇到了虚拟机连不上网络的问题,经过上网查资料,加上自己尝试,最终通过配置虚拟机ip解决。

第二个方法就是不克隆,直接在实验楼上更改test.c。

第二部分:教材

1.临界区和竞争条件

所谓临界区就是访问和操作共享数据的代码段。两个执行线程处于同一个临界区中同时执行是竞争条件。避免并发和防止竞争条件称为同步。

2.加锁

锁可以确保一次有且仅有一个线程对数据结构进行操作,或者当另一个线程对临界区进行标记时,就禁止(或者说锁定)其他访问。

3.死锁

要有一个或多个执行线程和一个或多个资源,每个线程都在等待其中的一个资源,但所有的资源已经被占用了。所有的线程都在相互等待,但他们永远不会释放已经占有的资源。于是任何线程都无法继续,这便意味着死锁的发生。

4.争用和扩展性

锁的争用是指当锁正在被占用时,有其他线程试图获得该锁。扩展性是对系统可扩展程度的一个量度。

5.原子操作

原子操作可以保证指令以原子的方式执行—执行过程不被打断。内核提供了两组原子操作接口—一组针对整数进行操作,另一组针对单独的位进行操作。

6.自旋锁

自旋锁最多只能被一个可执行线程持有。在任意时间,自旋锁都可以防止多于一个的执行线程同时进入临界区。大原则:针对代码加锁会使得程序难以理解,并且容易引发竞争条件,正确的做法应该是对数据而不是代码加锁。

7.读-写自旋锁

读/写代码锁有时叫做共享/排斥锁,写操作要求完全互斥,只要没有写操作,多个并发的读操作都是安全的。

8.信号量

如果加锁时间不长,并且代码不会睡眠,利用自旋锁是最佳选择。如果加锁时间可能很长或者代码在持有锁时有可能睡眠,那么最好使用信号量来完成加锁功能。

9.读-写信号量

读-写信号量都是互斥信号量。除非读和写可以明白无误的分割开来,否则最好不使用它。

10.互斥体

互斥体是任何可以睡眠的强制互斥锁,互斥体是一种互斥信号。mutex的使用计数永远是1.

11.完成变量

如果在内核中一个任务需要发出信号通知另一个任务发生了某个特定事件,利用完成变量是使两个任务得以同步的简单方法。

12.BLK:大内核锁

BKL是一个全局自旋锁,使用它主要是为了方便实现从Linux最初的SMP过渡到细粒度加锁机制。BKL更像是保护代码而不是保护数据。

13.顺序锁

顺序锁用于读写共享数据,依靠的是序列计数器,seq对写者更有利。

14.禁止抢占

内核抢占代码使用自旋锁作为非抢占区域的标记,如果一个自旋锁被持有,内核便不能进行抢占。

15.顺序和屏障

当处理多处理器之间或硬件设备之间的同步问题时,有时需要在你的程序代码中以指定的顺序发出读内存和写内存的指令,这些确保顺序的指令称作屏障。

20169210《Linux内核原理与分析》第七周作业的更多相关文章

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

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

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

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

  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. 转载的在DOS下操作mysql

    转载原文地址:http://www.server110.com/mysql/201309/1070.html 一.连接MYSQL. 格式: mysql -h主机地址 -u用户名 -p用户密码 1.例1 ...

  2. Mysql 与 php动态网站开发 入门教程

    这个系列的教程由表单开始写,因为表单可以把数据库和web 之间的交互表现得很明显.提交表单 ,数据库记录注册信息. 本教程属于基础教程.大神请略过.        对于php和mysql之间的稳固性很 ...

  3. php自学笔记1

    PHP(Personal Home Page的缩写,现已更名Hypertext Preprocessor“超文本预处理器”)静态web开发:html,内容一成不变动态web开发: php(Zend). ...

  4. 什么是xsi:type ???

    http://www.w3.org/2001/XMLSchema-instance http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.ecli ...

  5. A simple test

        博士生课程报告       视觉信息检索技术                 博 士 生:施 智 平 指导老师:史忠植 研究员       中国科学院计算技术研究所   2005年1月   目 ...

  6. visual studio 2010 出现问题,不能设置断点调试了,一运行就未响应,然后程序退出

    经网络查找原因,怀疑是插件问题: 解决方案: 1.工具->扩展管理 2.禁用或卸载VS2010的插件(扩展程序)

  7. 21个很棒的jQuery分页插件下载

    分页是指将一个大内容划分为各种不同的页面,因此网站的分页是一个很重要的部分,必须让内容有组织性和易于访问.分页有各两种不同的方式,手动跟自动.最受欢迎简单和广泛的方法是jQuery插件.下面我们收集了 ...

  8. mytbatis配置多数据源

    http://blog.zous-windows.com/archives/207.html http://www.oschina.net/question/144055_141255?sort=ti ...

  9. Hibernate 注解 动态插入( DynamicInsert) 动态更新(DynamicUpdate)

    @DynamicUpdate(value = true)@DynamicInsert(value = true) 这两个注解默认是false,经试验,如果使用了这两个注解,在一定程度上是可以提高插入和 ...

  10. 心愿:做一个精简版MFC

    我觉得自己有能力看懂MFC的C++代码和总体流程,但是由于MFC混杂了太多的东西,比如OLE等等不必要的东西,又做了无数的ASSERT判断,影响整体流程的理解.因此我要做一个精简版的MFC,而且能用它 ...