首页 > 技术文章 > 操作系统基础

zpfbuaa 2016-09-12 21:49 原文

C语言的内存分布

代码区 (text 静态分配)

数据区(data,全局静态变量,BBS)

堆(heap,使用new、delete 或者malloc,free,低地址到高地址)动态分配

栈(stack,生长方向:高地址到低地址,程序运行时存在的空间)自动分配

stack

heap

BBS

Static data

text

描述空间、内存寻址单位:字节Byte

内存—>CPU

操作系统的复杂来源于函数各种各样的跳转:

函数调用函数、Jump的区别

参数入栈、局部变量入栈、返回地址

病毒:大量存在跳转!

代码数据区:编译器自动分配大小,在运行前已经知道大小。

至于堆栈的大小在运行时进行分配

clip_image001

clip_image002

clip_image003

让操作系统找到代码和数据的存储位置

e_ident 说明类型

e_entry 指明运行地址

Abstract Machines 抽象机器

Machine Models (data、control)

Char、int、float、double、struct、array、pointer

loops、conditionals、switch、proc.call、proc.return

Assembly

Byte、contiguous byte allocation、address of iniaial byte、call、ret

运行的下一条指令,也就是跳转! 控制指令流寄存器,改变了寄存器,控制CPU状态的寄存器(状态寄存器)

系统通过寄存器来了解程序运行是否正常。命令寄存器、数据寄存器、状态寄存器

操作系统让其他的程序能够正常的运行,当发生异常时能够及时清理,除此之外,在多个程序同时运行时,操 作系统要协调程序之间的运行,因此各种寄存器十分的重要!

跳转是理解操作系统的核心部分之一。

程序的运行结构——硬件结构和可执行文件

clip_image004

clip_image005

clip_image006

clip_image007

CPU控制外设设备

方式一:不断地查看外设设备的寄存器状态

方式二:以中断进行CPU和设备的交互

CPU给DMA指令,DMA使外设信息写入内存中

Interrupt Controller 中断控制器

外设给中断控制器一个信号,然后通过中断控制器给CPU一个信号。外部设备联接在中断控制器上面。当外设做完工作如何才能告诉CPU该设备的工作已经完成。此时应当由外设产生一个中断,但是CPU只有一个引脚,无法判断出是哪一个设备发出的中断。因此添加上中断控制器,外设产生一个中断,接受方不是CPU而是中断控制器,孔段控制器记录下外部设备的编号,用以区分不同的外设。然后通过中断控制器给CPU一个中断信号并且可以指出此时的中断是哪一个设备产生的(使用中断控制器记录下来的外设编号)。也可以说没有中断控制器就没有操作系统!

clip_image008

先看一下CPU的样子:

clip_image009

看一下它伸出来的引脚:

clip_image010

注意用红圈标注的两个引脚,这两个就是80386处理器为中断留出的两个引脚。其中INTR是可屏蔽中断输入口,NMI是不可屏蔽中断输入口。

那么中断是如何输入给处理器的呢?那么多外部设备,而这只有一个引脚(暂时只考虑可屏蔽中断),这里就需要为CPU配备一个管理中断的秘书——可编程中断控制器PIC。这个秘书需要干哪些活呢?外部设备的中断都从它来进入中央处理器,所以它负责从外设接收中断信号,并根据优先级向CPU发起中断请求。最开始的这个PIC角色是一个代号为8259A的芯片在进行扮演,这货长这样:

clip_image011

clip_image012

其中IR0-IR7共8个引脚负责连接外部设备, 8259A PIC的每个IR口都连接着一条IRQ线,用于接收外设的中断信号。INT负责连接CPU的INTR引脚,用于向CPU发起中断请求。通常情况下,使用两片8259A芯片进行级联,一片连接CPU,称为主片,另一片连接到主PIC的IR2引脚,称为从片,这样总共就可以连接8+7=15个外设了。如下图所示:

clip_image013

在8259A中,默认情况下的优先级是主片IR0的中断请求优先级最高,主片IR7最低,从片IR0-7所有中断请求优先级都相当于IR2。所以IRQ线的优先级由高到低次序为IRQ0,IRQ1,IRQ8-15,IRQ3-7。这是默认情况,可以通过编程改变。

在8259a芯片内部有几个重要的寄存器:

中断请求寄存器: IRR,8bit,对应IR0-IR7,当对应引脚产生中断信号时,该bit位置1。

中断服务寄存器: ISR,8bit,对应IR0-IR7,当对应引脚的中断正在被CPU处理时,该bit位置1。

中断屏蔽寄存器: IMR,8bit,对应IR0-IR7,当对应位为1时,表示屏蔽该引脚产生的中断信号。

还有一个中断优先级判决器: PR,当中断引脚有信号时,结合这次产生中断的IRQ号和ISR中记录的当前正在处理的中断信息,根据优先级来决定是否把这个新的中断信号报告给CPU,以此来产生中断嵌套。

下面是这15条IRQ线分别连接的外设:

clip_image014

现在我们来看看这个秘书是如何和CPU之间进行协调工作的。

现在假设我们敲击了一个键盘按键,键盘有中断事件产生,这一事件通过IRQ1这根线告知了主PIC,主PIC经过内部一些判断处理后通过INT发送电信号到CPU侧的INTR。CPU在执行完当前的指令后,检查到INTR有信号,说明有中断请求来了,再检查eflags中的IF不为零,表示当前允许中断,则发送信号给PIC的-INTA,告诉它把本次中断的向量号发送过来。主PIC收到-INTA管脚上的信号后,通过D0-D7引脚,输出此次中断的中断向量号到数据总线(这里简化了交互过程,实际上有两次INTA信号的发送)。CPU拿到这个号后,就可以从IDT中寻找中断服务例程(ISR)进行处理了,后面的事大家都知道了。

那PIC中的中断向量号是怎么来的呢?各个IRQ是如何对应到IDT中的各个项呢?这里就利用了中断控制器的可编程性来决定的了。

PIC全称为可编程中断控制器,那么它的可编程体现在哪些方面呢?参考资料2《i8259A中断控制器分析一》一文有比较详细的描述,大体包括编程指定主从片的IRQ线对应的中断在IDT表中的中断向量号、8259a中断控制器的中断方式、优先级方式、中断嵌套方式,中断屏蔽方式、中断结束方式等等,这些都可以由操作系统编程指定。

clip_image015

转载博客地址 http://www.cnblogs.com/xuanyuan/p/5506508.html

下图是Unix家谱图:

clip_image016

μCos操作系统

桌面系统:交互

Real-time systems实时系统

硬实时和软实时

确定的固定时间限制

clip_image017 作业是用户提交任务的单位,操作系统进行处理

推荐阅读