1、现代的计算机体系结构中的两个主要部分是CPU和内存。内存中保存数据和指令,CPU从内存中取指令执行。有些指令让CPU做运算,有些指令让CPU读写内存中的数据。这一部分要详细了解的话就要对汇编语言比较清楚。
2、每个内存(memory)单元有一个地址。每个内存单元的大小为1Byte。内存地址是从0开始编号的整数。
3、CPU只做两件事:1. 从内存中取指令 2. 解释执行这条指令。 这两件事情周而复始的执行。
4、CPU内部包括:寄存器(Regester)、程序计数器(PC, Program Counter)、指令译码器(Instruction Decoder)、算术逻辑单元(ALU)、地址和数据总线(Bus)。
- 寄存器把内存的东西拿到CPU内部存储起来,更快更方便。
- PC是一个特殊的寄存器,通常表示为eip。里面存放一个地址,CPU到这个地址所指示的地方取指令。
- CPU从内存中取来的指令需要经过翻译之后CPU才知道是什么意思,这个任务就由指令译码器来完成。
- 如果指令译码器把一条指令翻译为运算指令,比如加减乘除、位运算、逻辑运算,ALU就执行这些运算。
- 在32位处理器上,地址总线和数据总线都是32条。这样的CPU中寄存器的位数(?)(每个寄存器的容量取决于CPU的字长,在32位系统上一个word是32位的)也是32位的,一次传输32bit的数据。还有控制总线,用来控制传输。
详细的CPU解释可以参看http://learn.akae.cn/media/ch17s02.html
5、从CPU的角度来看,访问设备只有内存映射I/O和端口I/O两种,要么像内存一样访问,要么用一种专用的指令访问。
在x86平台上,硬盘是挂在IDE、SATA或SCSI总线上的设备
6、内存只是保存数据而不会产生新的数据,如果CPU不去读它,它也不需要主动提供数据给CPU,所以内存总是被动地等待被读或者被写。
7、设备往往会自己产生数据,并且需要主动通知CPU来读这些数据,例如敲键盘产生一个输入字符,用户希望计算机马上响应自己的输入,这就要求键盘设备主动通知CPU来读这个字符并做相应处理,给用户响应。这是由中断(Interrupt)机制实现的,每个设备都有一条中断线,通过中断控制器连接到CPU,当设备需要主动通知CPU时就引发一个中断信号,CPU正在执行的指令将被打断,程序计数器会指向某个固定的地址(这个地址由体系结构定义),于是CPU从这个地址开始取指令(或者说跳转到这个地址),执行中断服务程序(ISR,Interrupt Service Routine),完成中断处理之后再返回先前被打断的地方执行后续指令。比如某种体系结构规定发生中断时跳转到地址0x00000010执行,那么就要事先把一段ISR程序加载到这个地址,ISR程序是内核代码的一部分,在这段代码中首先判断是哪个设备引发了中断,然后调用该设备的中断处理函数做进一步处理。
详细的设备解释可以参看:http://learn.akae.cn/media/ch17s03.html
8、如果是32位处理器,则内地址总线是32位的,与CPU执行单元相连,而经过MMU(MMU位于CPU核中)转换之后的外地址总线则不一定是32位的。也就是说,虚拟地址空间和物理地址空间是独立的,32位处理器的虚拟地址空间是4GB,而物理地址空间既可以大于也可以小于4GB。
9、我们在程序中使用的变量和函数都有各自的地址,程序被编译后,这些地址就成了指令中的地址,指令中的地址被CPU解释执行,就成了CPU执行单元发出的内存地址,所以在启用MMU的情况下,程序中使用的地址都是虚拟地址,都会引发MMU做查表和地址转换操作。
10、MMU除了做地址转换之外,还提供内存保护机制。各种体系结构都有用户模式(User Mode)和特权模式(Privileged Mode)之分,操作系统可以在页表中设置每个内存页面的访问权限,有些页面不允许访问,有些页面只有在CPU处于特权模式时才允许访问,有些页面在用户模式和特权模式都可以访问,访问权限又分为可读、可写和可执行三种。这样设定好之后,当CPU要访问一个VA时,MMU会检查CPU当前处于用户模式还是特权模式,访问内存的目的是读数据、写数据还是取指令,如果和操作系统设定的页面权限相符,就允许访问,把它转换成PA,否则不允许访问,产生一个异常(Exception)。异常的处理过程和中断类似,不同的是中断由外部设备产生而异常由CPU内部产生,中断产生的原因和CPU当前执行的指令无关,而异常的产生就是由于CPU当前执行的指令出了问题,例如访问内存的指令被MMU检查出权限错误,除法指令的除数为0等都会产生异常。
11、在正常情况下处理器在用户模式执行用户程序,在中断或异常情况下处理器切换到特权模式执行内核程序,处理完中断或异常之后再返回用户模式继续执行用户程序。
12、段错误我们已经遇到过很多次了,它是这样产生的:
-
用户程序要访问的一个VA(Virtual Address),经MMU(Memory Management Unit)检查无权访问。
-
MMU产生一个异常,CPU从用户模式切换到特权模式,跳转到内核代码中执行异常服务程序。
-
内核把这个异常解释为段错误,把引发异常的进程终止掉。
关于MMU的内容可以参看:http://learn.akae.cn/media/ch17s04.html
13、一级缓存是用VA寻址的,二级缓存是用PA寻址的,这是它们的区别。Cache所做的工作是由硬件自动完成的,而不是像寄存器一样由指令决定先做什么后做什么。
14、硬盘位于设备总线上,并不直接和CPU相连,CPU通过设备总线的控制器访问硬盘。——由驱动程序操作设备总线控制器去访问硬盘。
15、除了访问寄存器由程序指令直接控制之外,访问其它存储器都不是由指令直接控制的,有些是硬件自动完成的,有些是操作系统配合硬件完成的。
关于Memory Hierachy的内容可以参看:http://learn.akae.cn/media/ch17s05.html
这一部分的内容摘自“计算机体系结构基础”,网页为:http://learn.akae.cn/media/ch17.html。非常感谢作者的奉献精神。