基于Linux0.11内核分析:实模式和保护模式
Intel系列微处理器发展
第一部分:
1971.11.15:世界上第一块个人微处理器4004
1972:8008
1974:8080
1978:8086-8088
1982:80286(Intel最后一代16位处理器)
1985:80386(Intel第一代32位处理器)
1989:80486(Intel最后一款以数字为编号的处理器)
第二部分:
1994.3.10:Intel Pentium(也称为586,奔腾系列的开始)
1997-1998:Pentium II(Pentium II celeron,赛扬300A)
1999:Intel Pentium III
第三部分:
2000:Intel Pentium 4
2002-2004:超线程P4
2005-2006:双核处理器
2006:酷睿双核处理器
第四部分:
2011:
i3(主打低端市场,双核)
i5(主打主流市场,四核)
i7(主打高端市场,四核八线程、六核十二线程)
直到目前的Intel处理器,覆盖高中低端产品线。
好了,回归正题。
实模式与保护模式的由来
早期的8086CPU只有一种工作方式:实模式。数据总线16位,地址总线20位,所有寄存器为16位。从286开始就有了保护模式,从386开始CPU数据总线和地址总线和寄存器均为32位。但是386以及现在的奔腾、酷睿等为了向前兼容都保留了实模式,现在操作系统的加电启动先运行在实模式下,然后切换到保护模式下运行。
逻辑地址:实模式下:段基地址+段内偏移,保护模式下:段选择符+段内偏移
线性地址:逻辑地址经分段机制后就是线性地址,如果不启用分页,线性地址=物理地址
物理地址:线性地址经分页转换就是物理地址
实模式(Real Mode)
- 访问空间不足
实模式的20位内存地址访问空间=1M,虽然可以访问1M空间,但由于BIOS的映射作用(BIOS占用了部分空间地址资源),所以真正能使用的物理内存空间在640k–924k之间。
实模式的内存空间访问:物理地址(20位)=段地址(16位)左移4位+偏移地址(16位)。
20位+16位,可能会产生溢出,最大为0x10FFEF(0xFFFF0+0xFFFF),20根地址线找不到1M以上的内存区,因此当超出1M地址时,逻辑上正常,系统不会认为其访问越界而产生异常,而会自动从0开始计算,也就是系统计算实际地址是按照对1M求模的方式进行的,这种技术被称为wrap-around。
到了286,IBM使用键盘控制器上剩余的一些输出线来管理第21根地址线(也称为A20 Gate):
如果A20 Gate被打开,程序员使用100000H-10FFEFH之间的地址,系统将真正访问这块内存区域。
如果A20 Gate被禁止,程序员使用100000H-10FFEFH之间的地址,系统仍然使用8086/8088的取模方式。 - 安全性不足
用户程序可通过地址直接访问BIOS程序和外围硬件,程序之间可以随意访问互相的地址空间,用户也可以访问系统的内存地址空间,所以一不小心就会给系统造成破坏,导致系统崩溃,所以整体很不稳定,很不安全。 - 没有多道任务模式
比如微软早期的DOS系列操作系统(例如MS-DOS、 DR-DOS)工作在实模式下,是一个批处理操作系统,同一时刻只能跑一个程序,由于限制条件,没有多道程序机制,
保护模式(Protected Mode)
保护模式的设计:提高系统的多道任务、系统的稳定性。例如(内存保护、分页机制、硬件虚拟存储的支持)。
为了兼容性,除了嵌入式处理之外,都是系统启动工作在实模式下,然后启动保护模式。
CPU加电启动后,从实模式切换到保护模式,无法从保护模式切换回实模式。
但是提供了一种虚拟模式(V86模式):虚拟8086模式是运行在保护模式下的实模式。段式寻址与实模式一样,支持多任务和内存分页,该模式主要是为了兼容实模式的应用,例如:在现在的windows下开启DOS系统,就是切换到虚拟8086模式下运行。
- 实现保护模式的寄存器变化和扩增
- 保护模式下的内存管理
- 分段机制和分页机制
- 内存属性保护
总结
保护模式与实模式的根本区别是进程内存是否受保护。模式的变化,使进程有了严格的边界,进程之间不存在互相访问地址空间,并且在自己的虚拟地址范围也不能随意访问,因为有一些虚拟区域是公共系统运行库,如果该区域被修改,SIGSEGV(linux段错误),非法内存访问(Windows对话框)。
- linux-0.11中保护模式建立过程的分析[1]
- <<Linux内核完全剖析 --基于0.12内核>>学习笔记 第4章 80x86保护模式及其编程 4.7 任务管理
- linux-0.11中保护模式建立过程的分析[2]
- linux-0.11中保护模式建立过程的分析[3]
- linux-0.11中保护模式建立过程的分析[4]
- <<Linux内核完全剖析 --基于0.12内核>> 学习笔记 第4章 80x86保护模式及其编程 4.1 80x86系统寄存器和系统指令
- <<Linux内核完全剖析 --基于0.12内核>>学习笔记 第4章 80x86保护模式及其编程 4.8 保护模式编程初始化
- 基于Linux0.11内核分析:分页和分段机制
- <<Linux内核完全剖析 --基于0.12内核>>学习笔记 第4章 80x86保护模式及其编程 4.6 中断和异常处理
- 基于Linux0.11内核分析:中断与异常处理
- 基于Linux0.11内核分析:内核体系结构
- 基于Linux0.11内核分析:系统调用
- 基于Linux0.11内核分析:系统时间和定时
- <<Linux内核完全剖析 --基于0.12内核>>学习笔记 第4章 80x86保护模式及其编程 4.5 保护
- 基于Linux0.11内核分析:任务管理
- Linux0.11内核--32位保护模式GDT(全局描述符表)
- 基于Linux0.11内核分析:进程管理
- Linux0.11内核--32位保护模式GDT(全局描述符表)
- <<Linux内核完全剖析 --基于0.12内核>>学习笔记 第4章 80x86保护模式及其编程 4.4 分页机制
- <<Linux内核完全剖析 --基于0.12内核>>学习笔记 第4章 80x86保护模式及其编程 4.3 分段机制