第一部分:实验

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

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. 浅谈JavaScript词法分析步骤

    JavaScript代码运行前有一个类似编译的过程即词法分析,词法分析主要有三个步骤: 分析参数 再分析变量的声明 分析函数声明 具体步骤如下: 函数在运行的瞬间,生成一个活动对象(Active Ob ...

  2. Things About 'extern'

    Note: All Learned From Here C和Objective-C的function前面都有个隐含的extern,对于function来说,有没有extern都无所谓,但变量不一样. ...

  3. microsoft office visio基本使用方法

    以下是画流程图.程序内存分配等等框图用到的点滴使用方法,记录在这里以备偶尔只需. 1.画大括号“{}” 在Visio操作界面下,依次点击“文件(File)”—“形状(Shapes)”--“其他Visi ...

  4. Error Code: 1064 – You have an error in your SQL syntax解决几个方法

    本文转自 http://www.anyiwa.com/?p=1066 Error Code: 1064 – You have an error in your SQL syntax解决几个方法 十一月 ...

  5. the request doesn't contain a multipart/form-data or multipart/form-data stream, content type header

    the request doesn't contain a multipart/form-data or multipart/form-data stream, content type header ...

  6. Spring+SpringMVC+Mybatis 利用AOP自定义注解实现可配置日志快照记录

    http://my.oschina.net/ydsakyclguozi/blog/413822

  7. PYTHON--CLASS

    class Robot: population = 0 def __init__(self, name): self.name = name print("(Initializing {0} ...

  8. EasyUI 树形菜单tree 定义图标

    { "id":1, "text":"Folder1", "iconCls":"icon-save", ...

  9. Android ViewDragHelper源码解析

    在自定义ViewGroup的过程中,如果涉及到View的拖动滑动,ViewDragHelper的使用应该是少不了的,它提供了一系列用于用户拖动子View的辅助方法和相关的状态记录,像Navigatio ...

  10. [LeetCode] 315. Count of Smaller Numbers After Self (Hard)

    315. Count of Smaller Numbers After Self class Solution { public: vector<int> countSmaller(vec ...