20169210《Linux内核原理与分析》第七周作业
第一部分:实验
首先还是网易云课堂的实验内容,扒开系统调用的三层皮(下),分为两部分:
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内核原理与分析》第七周作业的更多相关文章
- 20169210《Linux内核原理与分析》第二周作业
<Linux内核原理与分析>第二周作业 本周作业分为两部分:第一部分为观看学习视频并完成实验楼实验一:第二部分为看<Linux内核设计与实现>1.2.18章并安装配置内核. 第 ...
- 20169212《Linux内核原理与分析》第二周作业
<Linux内核原理与分析>第二周作业 这一周学习了MOOCLinux内核分析的第一讲,计算机是如何工作的?由于本科对相关知识的不熟悉,所以感觉有的知识理解起来了有一定的难度,不过多查查资 ...
- 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语言程序并分析其汇编指令执行过程 因 ...
随机推荐
- 用Eclipse 开发Dynamic Web Project应用程序 【转】
简介:本文仅简单介绍基于Eclipse开发Dynamic Web Project应用下的JSP,Servlet及TOMCAT数据源的配置和开发. 软件环境: Eclipse Java EE IDE f ...
- [转]iOS之浅谈纯代码控制UIViewController视图控制器跳转界面的几种方法
参考:http://www.mamicode.com/info-detail-469709.html 一.最普通的视图控制器UIViewContoller 一个普通的视图控制器一般只有模态跳转的功能( ...
- POJ 1836 Alignment 水DP
题目: http://poj.org/problem?id=1836 没读懂题,以为身高不能有相同的,没想到排中间的两个身高是可以相同的.. #include <stdio.h> #inc ...
- Java多线程初学者指南(11):使用Synchronized块同步方法
synchronized关键字有两种用法.第一种就是在<使用Synchronized关键字同步类方法>一文中所介绍的直接用在方法的定义中.另外一种就是synchronized块.我们不仅可 ...
- python manage.py shell之后的一些错误:
1. 在执行python manage.py shell之后的一些错误: wyl@wyl:~/myobject$ python manage.py shell /usr/lib/python2.7/d ...
- 开源网站管理工具—Altman
0×00前言 之前用过几款webshell工具,有B/C的也有C/S的,有的只能用于php或者aspx,当然个人用得最多.觉得用得舒服的也只有菜刀了. 但是毕竟菜刀是好几年之前的产物了,而且也已经停止 ...
- nginx日志配置
nginx日志配置 http://www.ttlsa.com/linux/the-nginx-log-configuration/ 日志对于统计排错来说非常有利的.本文总结了nginx日志相关的配置如 ...
- HDU 1394 Minimum Inversion Number(线段树的单点更新)
点我看题目 题意 :给你一个数列,a1,a2,a3,a4.......an,然后可以求出逆序数,再把a1放到an后,可以得到一个新的逆序数,再把a2放到a1后边,,,,,,,依次下去,输出最小的那个逆 ...
- windows笔记-一个简单的windows GUI应用程序
#include<windows.h> // 编写Windows程序必须包含的头文件 LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); ...
- 剖析Qt的事件机制原理
版权声明 请尊重原创作品.转载请保持文章完整性,并以超链接形式注明原始作者“tingsking18”和主站点地址,方便其他朋友提问和指正. QT源码解析(一) QT创建窗口程序.消息循环和WinMai ...