分类: LINUX
2010-04-01 23:43:05
一. 指令
任何都只有两类指令
1.顺序指令:当前指令正确执行的结果不影响下一条指令读取地址,CPU据当前指令宽度递增下一条指令读取地址
2.分支指令:当前指令正确执行的结果影响下一条指令读取地址,CPU据当前指令执行结果产生下一条指令读取地址
二. 硬跳转(中断和异常)规则
1.通常情况下,CPU的指令读取和执行都是按照上述一的规则进行的。
定义:硬跳转是CPU正常执行指令的过程被硬件设备的中断或CPU内部异常打断而自动跳转到内存的其他位置读取下一条指令。
2.硬跳转产生的原因
外设中断:外部设备主动请求CPU服务而使CPU硬件中断引脚产生一个电信号变化
CPU异常:当前指令执行错误(除零、当前指令码不存在、执行权限不够等)、内存访问错误(取指和取数的内存地址物理上不存在)
三. 寄存器规则
1.通用寄存器
用于存放指令执行的参数和指令执行的结果等等
2.控制寄存器
用于控制CPU的运行状态和指令执行权限。如特权级切换、内存保护单元的打开和关闭等等
3.状态寄存器
用于标示CPU当前的状态等等
四. 资源保护规则
1. CPU运行的模式分级
CPU运行的模式分级是为了更好的保护软硬件系统资源, 一般都把CPU运行模式分为两级, 用户级和系统级, 当CPU运行于用户级模式时, 很多指令是不允许执行的, 如果在用户级CPU读取到系统级的指令, 执行时CPU内部就会产生异常, 并产生硬跳转。
a.用户级如何切换到系统级
目前通用的CPU(如i386,arm, powerpc, mips)特权级在硬跳转发生时一般都会切换到系统级,就是说,如果当前CPU运行模式是用户级,一旦产生中断或异常,CPU自动把当前CPU的运行模式切换到系统级。
当CPU运行于用户级模式时是不允许通过指令直接改变CPU控制寄存器的某个位切换到系统模式的,用户级主动要求进入系统级模式,必须通过特殊的指令(系统调用),如i386体系的int $80,在用户级执行完这条指令后,CPU主动进入系统级模式。
硬跳转是用户级被动进入系统级,而系统调用(软中断)是用户级主动进入系统级。
b.系统级如何切换回用户级
因为系统级可以执行CPU的所有指令和访问所有资源,只要通过指令设置CPU控制寄存器的某个位就可以切换回用户模式。
2. 物理内存保护和访问地址的转换
CPU存取内存(取指令操作和执行需要读写内存单元的指令等)时所给出的内存地址不是真实的物理地址(PA),我们称之为虚拟地址(VA)。
如果CPU给出的VA和某个PA有映射,则CPU就可以成功的存取到该PA单元的内容。
如果CPU给出的VA没有映射到任何PA,则CPU就会产生内存访问异常并产生硬跳转
这样就可以把真实的物理内存保护起来,只是根据需要把部分物理地址映射到虚拟地址空间,不需要的物理空间对CPU访问不可见(保护了)。
这个机制可以通过设置CPU控制寄存器的某个位打开和关闭,当然这个动作需要CPU当前运行模式在上述四.1中的系统级
五. CPU体系规则的总结
上述的一、二和三是现代CPU的最基本的规则,四属于扩展规则。多数单片机的CPU核都只有一二三规则。几乎所有的通用CPU(如i386,arm, powerpc, mips)都包含了上述四条规则,功能大同小异,但实现形式上有很大差异。
六. 如何各类CPU体系结构
1.英文版的datasheet,可以从各个CPU制造商的官方网站上下载到
2.根据上述一二三四的规则分类去了解和熟悉各类CPU的datasheet中描述的实现细节,比如对每条指令的格式和功能的熟悉,对每个寄存器功能和控制寄存器及状态寄存器每一位代表的含义的熟悉等等
3.对比学习不同CPU体系对相同功能的实现细节将使你很容易掌握更多内容
七. CPU体系结构和内核源代码的学习
如果你对各类CPU体系结构的上述一二三四规则的细节都很熟悉了,Linux内核源代码的arch目录下所有的内容都可以很容易看懂. 再去研究Linux内核源代码其他与arch无关的部分就很容易了。