![](https://csdnimg.cn/release/download_crawler_static/86750902/bg7.jpg)
处理器只能识别二进制的机器指令,每条指令对应一个二进制编码,每条指令表示要执行的一个动作,
如从内存取数据到运算器中的指定寄存器,将运算器指定寄存器中数据左移一位等。每条指令需要硬件逻
辑的支持,每种体系结构的处理器只能识别、执行固定的一批指令,这些指令称为指令集(ISA)。指令
集加上处理器中的控制逻辑的规范,中断处理的规范,处理器本身控制的一些规范等就组成了处理器体系
结构。体系结构可视为实现具体处理器的规范或标准,流行的处理器体系结构有 x84_64、ARM 等,本书
关注的是国产龙芯处理器采用的 MIPS 体系结架,详细内容读者可参考相关手册。
通常我们用 C、C++等高级语言编写应用程序,所有高级编程语言编写的程序代码都需要通过编译器
编译成处理器的汇编源程序,然后通过汇编器将汇编源程序转换成能被处理器识别的二进制指令程序,最
后通过链接器将各二进制指令程序合并成一个二进制可执行文件,以便加载到物理内存供处理器执行。在
链接过程中通常将所有的代码段链接在一起,所有的数据段链接在一起(上图中只是简单地示意了将两个
指令程序文件拼接),用户也可以在源代码中指定将代码或数据链接到某个指定的段。
1.1.2 运行多个程序
如果处理器只运行一个程序,那就不需要操作系统了。因为系统的所有资源都属于这个进程,不需要
进行管理。当有多个程序同时运行时,首先需要解决的是处理器在各程序之间的跳转问题。下图示意了系
统中同时运行两个程序时的情形:
运算器 控制器
IO映射
外设
进程1
处理器
读写数据
代码
数据
数据
内存
虚拟地址空间
进程2
代码
数据
数据
程序1
程序2
页表1
页表2
MMU
上图中程序 1 和程序 2 的代码和数据都加载到了内存中,分别位于内存中的不同位置。程序中使用的
是虚拟地址,程序 1 和程序 2 的虚拟地址是相同的。每个进程具有自已的页表,页表记录的是虚拟地址映
射的物理地址,MMU 将虚拟地址转换成物理地址。不同的页表转换的物理地址不同,从而实现进程相同
的虚拟地址映射到不同的物理地址。某一时刻,某个处理器核只能执行一个程序的代码(硬件超线程除
外),如上图中所示,处理器在执行进程 1 时使用页表 1 访问物理内存,在执行进程 2 时使用页表 2 访问
物理内存,以达到进程间地址的隔离。系统内需要保存页表 1 和页表 2 的信息,处理器在进程间切换时要
保存当前进程的上下文信息,主要是此时处理器运算器中寄存器的信息,页表信息等,以便下次再次执行
本进程时能够正确恢复前一次的状态。切换到下一个进程运行前,恢复下一个进程的上下文信息至处理器,
并切换使用下一个进程的页表,而后处理器就可以执行下一个进程了。
实现运行多个进程的一个简单方法是将多个程序加载到内存,并分别建立页表,在系统中设置一个定
时器,在定时器中断处理程序中保存当前进程的上下文信息,恢复下一个进程上下文信息至处理器,切换
下一个进程页表,中断返回。中断返回后执行的就是下一个进程了,也就是说由定时器中断来控制进程间
的切换。