2-4小时突击操作系统(3)
本节内容:地址转换、分段、空闲空间管理
地址转换
受限直接访问LDE:让程序运行的大部分指令直接访问硬件,只在一些关键点(如进程发起系统调用或发生时钟中断)由操作系统介入,来保持对硬件的控制。
地址转换:硬件对每次内存访问进行处理(即指令获取、数据读取或写入),将指令中的虚拟地址转换为数据实际存储的物理地址。
动态重定位:每个cpu需要两个硬件寄存器:基址base寄存器和界限bound寄存器,这组基址和界限寄存器,让我们能够将地址空间放在物理内存的任何位置,同时又能确保进程只能访问自己的地址空间。统称为内存管理单元MMU
128: movl 0x0(%ebx), %eax
程序计数器(PC)首先被设置为128。当硬件需要获取这条指令时,它先将这个值加上基址寄存器的32KB(32768),得到实际的物理地址32896,然后硬件从这个物理地址获取指令。
界限寄存器提供了访问保护,在上面的例子中,界限寄存器被置为16KB。如果进程需要访问超过这个界限或者为负数的虚拟地址,CPU将出发异常。
虚拟地址 |
|
物理地址 |
0 |
→ |
16KB |
1KB |
→ |
17KB |
3000 |
→ |
19384 |
4000 |
→ |
错误(越界) |
操作系统问题:
第一,在进程创建时,操作系统必须采取行动,为进程的地址空间找到内存空间。
第二,在进程终止时(正常退出,或因行为不端被强制终止),操作系统也必须做一些工作,回收它的所有内存,给其他进程或者操作系统使用。
第三,在切换进程时,操作系统必须保存和恢复基址寄存器和界限寄存器。
第四,操作系统必须提供异常处理程序,或要一些调用的函数。
操作系统@启动 |
硬件 |
|
初始化陷阱表 |
|
|
|
记住一下地址: 系统调用处理程序 时钟处理程序 非法内存处理程序 非常指令处理程序 |
|
开始中断时钟 |
|
|
|
开始时钟,x ms后中断 |
|
初始化进程表 初始化空闲列表 |
|
|
操作系统@运行 |
硬件 |
程序(用户模式) |
为了启动进程A: 在进程表中分配条目 为进程分配内存 设置基址/界限寄存器 从陷阱中返回(进入A) |
|
|
|
恢复A的寄存器 转向用户模式 跳到A(最初)的程序计数器 |
|
|
|
进程A运行 获取指令 |
|
转换虚拟地址并执行获取 |
|
|
|
执行指令 |
|
如果显示加载/保存 确保地址不越界 转换虚拟地址并执行 加载/保存 |
|
|
|
…… |
|
时钟中断 转向内核模式 跳到中断处理程序 |
|
处理陷阱 调用switch例程 将寄存器A保存到进程结构A(包括基址/界限) 从进程结构B恢复寄存器B(包括基址/界限) 从陷阱返回(进入B) |
|
|
|
恢复B的寄存器 转向用户模式 跳到B的程序计数器 |
|
|
|
进程B运行 执行错误的加载 |
|
加载越界 转向内核模式 跳到陷阱处理程序 |
|
处理本期报告 决定终止进程B 回收B的内存 移除B在进程表中的条目 |
|
|
分段
分段:在MMU中引入不止一个基址和界限寄存器对,而是给地址空间内的每个逻辑段一对。在典型的地址空间里有3个逻辑不同的段:代码、栈和堆,因此
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本专栏主要是介绍嵌入式软件开发岗位的相关知识和学习攻略,为大家提供一份笔试与面试手册。包括有嵌入式软件开发岗位介绍与学习攻略;校园招聘和offer疑惑问题的介绍;在笔试方面,如何刷题为笔试作准备,提供往年笔试真题;在面试方面,提供相关知识的复习重点,提供面试真题。包括有:华为、蔚来、文远、大疆、三一、深信服、亚马逊、Intel、百度、科大讯飞、OPPO、京东、中兴、比特大陆|算能、美团等等