I386系统的基本概念 令代码的运行 令堆栈的概念 令内核态与用户态 令中断异常系统调用 ◆虚拟内存 1958 嵌入式系统实验室 EMBEDDED SYSTEM LAB口RAT口RY SU:MDU INTHUTE OR AOVANCLD STUOY D USTt
I386系统的基本概念 ❖代码的运行 ❖堆栈的概念 ❖内核态与用户态 ❖中断/异常/系统调用 ❖虚拟内存
用户态和内核态的概念 ☆Why? 令假定不区分 >用户直接修改操作系统的数据 用户直接调用操作系统的内部函数 >用户直接操作外设58 >用户任意读写物理内存 嵌入式系统实验室 EMBEDDED SYSTEM LAB口RAT口RY SU:MDU INTHUTE OR AOVANCLD STUOY D USTt
用户态和内核态的概念 ❖Why? ❖假定不区分 ➢用户直接修改操作系统的数据 ➢用户直接调用操作系统的内部函数 ➢用户直接操作外设 ➢用户任意读/写物理内存
令因此,要区分用户态和内核态 禁止用户程序和底层硬件直接打交道 (最简单的例子,如果用户程序往硬件控制寄存器写 入不恰当的值,可能导致硬件无法正常工作) 禁止用户程序访问任意的物理内存 (否则可能会破坏其他程序的正常执行,如果对核心 内核所在的地址空间写入数据的话,会导致系统崩溃 嵌入式系统实验室 EMBEDDED SYSTEM LAB口RAT口RY SU:MDU INTHUTE OR AOVANCLD STUOY D USTt
❖因此,要区分用户态和内核态: ➢禁止用户程序和底层硬件直接打交道 (最简单的例子,如果用户程序往硬件控制寄存器写 入不恰当的值,可能导致硬件无法正常工作) ➢禁止用户程序访问任意的物理内存 (否则可能会破坏其他程序的正常执行,如果对核心 内核所在的地址空间写入数据的话,会导致系统崩溃 )
◆什么是用户态和内核态? 一般现代CPU都有几种不同的指令执行级别 在高执行级别下,代码可以执行特权指令,访问任意 的物理地址,这种CPU执行级别就对应着内核态 而在相应的低级别执行状态下,代码的掌控范围会受 到限制。只能在对应级别允许的范围内活动 >举例 intel86CPU有四种不同的执行级别0-3, Linux只使 用了其中的0级和3级分别来表示内核态和用户态 嵌入式系统实验室 EMBEDDED SYSTEM LAB口RAT口RY SU:MDU INTHUTE OR AOVANCLD STUOY D USTt
❖什么是用户态和内核态? ➢一般现代CPU都有几种不同的指令执行级别 ➢在高执行级别下,代码可以执行特权指令,访问任意 的物理地址,这种CPU执行级别就对应着内核态 ➢而在相应的低级别执行状态下,代码的掌控范围会受 到限制。只能在对应级别允许的范围内活动 ➢举例: intel x86 CPU有四种不同的执行级别0-3,Linux只使 用了其中的0级和3级分别来表示内核态和用户态
令如何区分一段代码是核心态还是用户态 >cs寄存器的最低两位表明了当前代码的特权级 >CPU每条指令的读取都是通过 Ics eip这两个寄存器 其中cs是代码段投选择寄存器,ep是偏移量寄存器。 令上述判断由硬件完成 令一般来说在Linⅸ中,地址空间是一个显著的标志: 0xc00000C的地址空间只能在内核态下访问, 0x0000000×bf地址空间在两种状态下都可以 访问 注意这里所说的地址空间是逻辑地址而不是物理地址 嵌入式系统实验室 EMBEDDED SYSTEM LAB口RAT口RY SU:MDU INTHUTE OR AOVANCLD STUOY D USTt
❖ 如何区分一段代码是核心态还是用户态 ➢ cs寄存器的最低两位表明了当前代码的特权级 ➢ CPU每条指令的读取都是通过cs:eip这两个寄存器: 其中cs是代码段选择寄存器,eip是偏移量寄存器。 ❖ 上述判断由硬件完成 ❖ 一般来说在Linux中,地址空间是一个显著的标志: 0xc0000000以上的地址空间只能在内核态下访问, 0x00000000-0xbfffffff的地址空间在两种状态下都可以 访问 注意:这里所说的地址空间是逻辑地址而不是物理地址