2019-2020-1 20199304《Linux内核原理与分析》第三周作业
1.操作系统是如何工作的?
计算机三个法宝(3个关键性的方法机制):
存储程序计算机、函数调用堆栈、中断机制。
1.1堆栈:
在计算机领域,堆栈是一个不容忽视的概念,堆栈是一种数据结构。堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。

1.1.1堆栈作用
 -记录函数调用框架
 -传递函数参数
 -保存返回值的地址
 -提供函数内部局部变量的存储空间
1.1.2堆栈的特性:
最后一个放入堆栈中的物体总是被最先拿出来, 这个特性通常称为后进先出(LIFO)队列。 堆栈中定义了一些操作。 两个最重要的是PUSH和POP。 PUSH操作在堆栈的顶部加入一 个元素。POP操作相反, 在堆栈顶部移去一个元素, 并将堆栈的大小减一。
1.2中断
中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。
1.2.1中断分类
 -硬件中断(Hardware Interrupt)
    -可屏蔽中断(maskable interrupt)。硬件中断的一类,可通过在中断屏蔽寄存器中设定位掩码来关闭。
    -非可屏蔽中断(non-maskable interrupt,NMI)。硬件中断的一类,无法通过在中断屏蔽寄存器中设定位掩码来关闭。典型例子是时钟中断(一个硬件时钟以恒定频率—如50Hz—发出的中断)。
    -处理器间中断(interprocessor interrupt)。一种特殊的硬件中断。由处理器发出,被其它处理器接收。仅见于多处理器系统,以便于处理器间通信或同步。
    -伪中断(spurious interrupt)。一类不希望被产生的硬件中断。发生的原因有很多种,如中断线路上电气信号异常,或是中断请求设备本身有问题。
 -软件中断(Software Interrupt)
    -软件中断。是一条CPU指令,用以自陷一个中断。由于软中断指令通常要运行一个切换CPU至内核态(Kernel Mode/Ring 0)的子例程,它常被用作实现系统调用(System call)。
1.2.2中断作用
 -提高计算机系统效率。计算机系统中处理机的工作速度远高于外围设备的工作速度。通过中断可以协调它们之间的工作。当外围设备需要与处理机交换信息时,由外围设备向处理机发出中断请求,处理机及时响应并作相应处理。不交换信息时,处理机和外围设备处于各自独立的并行工作状态。
 -维持系统可靠正常工作。现代计算机中,程序员不能直接干预和操纵机器,必须通过中断系统向操作系统发出请求,由操作系统来实现人为干预。主存储器中往往有多道程序和各自的存储空间。在程序运行过程中,如出现越界访问,有可能引起程序混乱或相互破坏信息。为避免这类事件的发生,由存储管理部件进行监测,一旦发生越界访问,向处理机发出中断请求,处理机立即采取保护措施。
 -满足实时处理要求。在实时系统中,各种监测和控制装置随机地向处理机发出中断请求,处理机随时响应并进行处理。
 -提供故障现场处理手段。处理机中设有各种故障检测和错误诊断的部件,一旦发现故障或错误,立即发出中断请求,进行故障现场记录和隔离,为进一步处理提供必要的依据。
2.实验
2.1实验内容:
完成一个简单的时间片轮转多道程序内核代码
-根据老师指导按照实验步骤,在实验楼环境下打开shell:
cd LinuxKernel/linux-3.9.4
rm -rf mykernel
patch -p1 < ../mykernel_for_linux3.9.4sc.patch
make allnoconfig

make

qemu -kernel arch/x86/boot/bzImage

然后 cd mykernel
看到mymain.c和myinterrupt.c.
mymain.c代码如下:


myinterrupt.c代码如下:


下面是一个简单的时间片轮转多道程序内核代码。
mypcb.h
define MAX_TASK_NUM 4
define KERNEL_STACK_SIZE 1024*8
/* CPU-specific state of this task */
struct Thread {
unsigned long ip;
unsigned long sp;
};
typedef struct PCB{
int pid;
volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */
char stack[KERNEL_STACK_SIZE];
/* CPU-specific state of this task */
struct Thread thread;
unsigned long task_entry;
struct PCB *next;
}tPCB;
void my_schedule(void);
定义一个进程控制块pcb结构体
task_entry:进程入口函数
thread:保存eip和esp
state:进程状态,用于判断是否调度
其中的内嵌汇编代码为核心:
"pushl %%ebp\n\t" /* save ebp */
"movl %%esp,%0\n\t" /* save esp */
"movl %2,%%esp\n\t" /* restore esp */
"movl %2,%%ebp\n\t" /* restore ebp */
"movl $1f,%1\n\t" /* save eip */
"pushl %3\n\t"
- "ret\n\t" /* restore eip */
 - 
"=m" (prev->thread.sp),"=m" (prev->thread.ip)
 - 
"m" (next->thread.sp),"m" (next->thread.ip)
 
"pushl %%ebp\n\t" /* save ebp */
"movl %%esp,%0\n\t" /* save esp */
"movl %2,%%esp\n\t" /* restore esp */
"movl %2,%%ebp\n\t" /* restore ebp */
"movl $1f,%1\n\t" /* save eip */
- "pushl %3\n\t" "ret\n\t" /* restore eip */
 - 
"=m" (prev->thread.sp),"=m" (prev->thread.ip)
 - 
"m" (next->thread.sp),"m" (next->thread.ip)
 
3.对操作系统是如何工作的学习理解。
    Linux将内核程序和基于之上的用户程序分开处理,分别运行在用户态和内核态。当一个程序在用户态执行时,它不能直接访问内核数据结构或内核的程序。然而,当应用程序在内核态下运行时,这些限制就不再有效。在一个程序执行时,大部分时间都处在用户态下,只有需要内核所提供的服务时才切换到内核态。当内核满足了用户程序的请求后,它让程序又回到用户台下。
   进程是动态的实体,内核是进程的管理者。在单处理系统中,任何时候只有一个进程在运行,它要么处于用户态,要么处于内核态。稍后我们会分析用户态与内核态之间的转换。
   然而在linux内核是可重入的,这意味着若干个进程可以同时在内核态下执行。当然,在单处理系统上只有一个进程在真正运行,但是有许多进程可能在等待CPU或某一I/O操作完成时在内核态下被阻塞。例如,当内核代表某一进程发出一个读磁盘请求后,就让磁盘控制器处理这个请求并且恢复执行其它进程。当设备满足了读请求时,有一个中断就会通知内核,从而恢复以前的进程继续执行。												
											2019-2020-1 20199304《Linux内核原理与分析》第三周作业的更多相关文章
- 2019-2020-1 20199329《Linux内核原理与分析》第九周作业
		
<Linux内核原理与分析>第九周作业 一.本周内容概述: 阐释linux操作系统的整体构架 理解linux系统的一般执行过程和进程调度的时机 理解linux系统的中断和进程上下文切换 二 ...
 - 2019-2020-1 20199329《Linux内核原理与分析》第二周作业
		
<Linux内核原理与分析>第二周作业 一.上周问题总结: 未能及时整理笔记 Linux还需要多用 markdown格式不熟练 发布博客时间超过规定期限 二.本周学习内容: <庖丁解 ...
 - 20169212《Linux内核原理与分析》第二周作业
		
<Linux内核原理与分析>第二周作业 这一周学习了MOOCLinux内核分析的第一讲,计算机是如何工作的?由于本科对相关知识的不熟悉,所以感觉有的知识理解起来了有一定的难度,不过多查查资 ...
 - 20169210《Linux内核原理与分析》第二周作业
		
<Linux内核原理与分析>第二周作业 本周作业分为两部分:第一部分为观看学习视频并完成实验楼实验一:第二部分为看<Linux内核设计与实现>1.2.18章并安装配置内核. 第 ...
 - 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 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语言程序并分析其汇编指令执行过程 因 ...
 
随机推荐
- MIT线性代数:1.方程组的几何解析
 - [考试反思]0718 NOIP模拟测试5
			
最后一个是我...rank#11 rank#1和rank#2被外校大佬包揽了. 啊...考的太烂说话底气不足... 我考场上在干些什么啊!!! 20分钟“切”掉T2,又27分钟“切”掉T1 切什么切, ...
 - IM里“附近的人”功能实现原理是什么?如何高效率地实现它?
			
1.引言 基本上以陌生人社交为主的IM产品里,都会增加“附近的人”.“附近的xxx”这种以LBS(地理位置)为导向的产品特色(微信这个熟人社交产品里为啥也有“附近的人”?这当然是历史原因了,微信当初还 ...
 - JDBC报错:The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone
			
报错原因:查阅资料发现这都是因为安装mysql的时候时区设置的不正确 mysql默认的是美国的时区,而我们中国大陆要比他们迟8小时,采用+8:00格式 解决方法: 1.修改MySQL的配置文件,MyS ...
 - acm经验(转)
			
先简单介绍一下自己: 高中在OI打过一段时间酱油,大一后暑假进入ACM集训队,到大三寒假,总共一年半的ACM生涯. 总共参加了四场比赛:区域赛一银(2013长春)一铜(2013杭州)一铁(2012金华 ...
 - jquey写进度条问题
			
jquey写进度条问题可以直接按照 总时间和进度条宽度之比来做 不管他是不是y=kx 反正时间到0 进度肯定是0了
 - spark安装配置
			
一.下载解压 二.配置 (假设已经配置了Java.Hadoop) 1.环境变量 2.spark配置 进入spark安装目录,复制文件 编辑spark-env.sh文件,在文件中添加如下信息(括号中路径 ...
 - poj 1679 The Unique MST (次小生成树(sec_mst)【kruskal】)
			
The Unique MST Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 35999 Accepted: 13145 ...
 - hdu 1285 确定比赛名次 (topsort)
			
确定比赛名次Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
 - selenium针对浏览器滚动条的操作
			
我们在实际自动化测试过程中,肯定会遇到当前页面显示不到我们定位的元素.这就需要下拉滚动条才能显示出我们的元素: 而滚动条的按钮又是我们定位不到的,所以需要使用js脚本来完成: 1.先来说我们的下拉滚动 ...