操作系统学习笔记(六):地址空间和地址生成

2023-05-16

从我们写的代码到最后在总线上出现的物理地址,有一个转换的过程,在学习具体的转换算法之前,我们需要学习地址生成的过程。生成过程中并不是所有地址都允许访问的,因此还需要对地址的合法性进行检查。

地址空间定义:

计算机地址空间有两种,物理地址空间和逻辑地址空间。物理地址空间就是硬件支持的真实地址空间,这是受硬件支持的,比如32位的系统,就是从0到4G-1的位置。逻辑地址空间就是在CPU中运行的进程看到的地址,这个地址是从物理地址空间中分配的一段或几段子空间。这两者之间的转换方法后面再讲。

地址生成及处理过程:

整体可以分为如下几个步骤,ALU需要逻辑地址中的内容(读或写),MMU对逻辑地址进行转换,转换为物理地址,CPU控制逻辑给总线发送物理地址请求。内存发送物理地址的内容给CPU或者将CPU给的数据存储到物理地址。操作系统做的是简历逻辑地址LA和物理地址PA之间的映射。

逻辑地址生成:

生成过程如下图。比如最开始是高级语言写了一段代码,其中有一个函数foo();首先要进行编译,编译为机器能够识别的汇编语言;之后进行汇编,将函数名从字符串变为地址75;而这个函数可能是某个函数库中的成员,而函数库的位置程序是不知道的,这就需要链接,将需要的文件拼接起来,此时可能在原先的代码前面插入了一段代码,比如地址偏移了100,此时函数地址变为了175;最后需要进行程序加载即重定位,因为这段程序不一定是从逻辑地址的0位开始的,比如是从1000开始的,那么函数地址成为1175。经历了这么多步骤之后,生成的1175才是我们需要的逻辑地址。

那么逻辑地址是在什么时间生成的呢:

1. 编译时。假定起始地址已知,也就是我知道我的程序要放在哪,那么编译时就可以生成逻辑地址。但是当起始地址改变时,比如修改了代码,必须重新编译。老旧的功能机买来之后不允许下载软件,这种情况下地址通常就是写死的。

2. 加载时。当你修改了代码或者安装了各种新的软件,写程序时是无法知道新的代码存储在什么地址的。也就是编译时起始位置未知时,编译器需生成可重定位的代码,等到加载时重定位,生成绝对地址。通常在可执行文件的前面有一个重定位表,加载的时候改成绝对地址,程序就可以跑了。

3. 执行时。执行到这条指令之前一直使用相对地址,当执行到这一条指令的时候,才可以去知道它确切访问的地址。这种情况出现在使用虚拟存储的系统里。优点就是在程序执行过程中就可以将代码移动,而前面两种生成时机都不可以。但是需要地址转化硬件支持,相对较麻烦。

地址检查:

CPU执行到某条指令,得到它的逻辑地址,首先根据逻辑地址判断所在它的偏移量是否在所在段(比如数据段)的长度之内,如果超出了段长度,认为是非法请求,否则认为是合法的。此时加上段基址得到物理地址,进行访问。在这个过程中操作系统要做的就是设置段起始地址和最大逻辑地址空间(段长度)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

操作系统学习笔记(六):地址空间和地址生成 的相关文章

  • Android 如何杀死Service

    方法很简单就是用ActivityManager private void killeService List lt RunningAppProcessInfo gt infos TODO 自动生成的方法存根 ActivityManager
  • [自动驾驶]Build a Traffic Sign Recognition Program

    看 准确率98 的深度学习交通标志识别是如何做到的 xff1f 这篇文章的时候 xff0c 发现了udacity的自动驾驶课程 可惜要收费 xff0c 不过课程project在github上有 xff0c 那直接做project就好了 xf
  • 教你快速学习PID控制原理

    教你快速学习PID控制原理 写在前面 在这篇文章中我会通过举例的方式来让大家了解什么是PID控制 xff0c 这篇博客是让大家更加容易的理解PID控制 xff0c 如果大家想要跟深入的了解的话最好是自己上手去做一个关于PID控制的实物 xf
  • opencv HSV找颜色,找轮廓用最小旋转矩形框出

    include lt opencv2 opencv hpp gt include lt iostream gt include lt string gt using namespace cv using namespace std 输入图像
  • FreeRTOS学习笔记——FreeRTOS 任务基础知识

    RTOS 系统的核心就是任务管理 xff0c FreeRTOS 也不例外 xff0c 而且大多数学习RTOS 系统的工程师或者学生主要就是为了使用RTOS 的多任务处理功能 xff0c 初步上手RTOS 系统首先必须掌握的也是任务的创建 删
  • linux c char * char[]相互转换

    1 char 转char 可以直接赋值 char pp 20 61 34 helloworld 34 char p 61 pp 2 char 转char 主要有两种方法可以将char 转换为char 类型 xff0c 分别是 xff1a s
  • GDB改变程序的执行

    1 修改变量值 xff1a set var var name 61 num 最佳 print var name 61 num 2 跳转执行 gdb提供了乱序执行的功能 jump linespec linespec可以是文件的行号 xff0c
  • Linux缓冲区

    所有的磁盘I O都要进过内核的快缓冲区 xff08 内核缓冲区高速缓冲 xff09 xff0c 既然read和write都要被内核缓冲 xff0c 那么 不带缓冲的IO 指的是在用户的进程中对这两个函数不会进行缓冲 xff0c 每次read
  • git忽略本地的已经push过的提交

    先使用如下命令 xff1a span class hljs comment git span span class hljs comment rm span span class hljs literal span span class h
  • 计算机启动过程

    BIOS BIOS做了底层的一些初始化的工作 BIOS的初始化过程 xff1a 在计算机电源刚打开的时候 xff0c 首先会 xff1a 1 硬件自检 2 检查系统中的内存和显卡等关键部件的存在和工作状态 3 查找并执行显卡等接口卡BIOS
  • 系统调用

    系统调用 xff1a 操作系统对上提供服务的接口 通过软中断触发中断 INT和IRET指令用于系统调用 xff0c 系统调用时 xff0c 堆栈切换和特权级的切换 开销 1 引导机制 2 建立内核堆栈 3 验证参数 4 内核态映射到用户态的
  • ERVER CONSOLE DEBUG: onBackendConnect: gdb-server session closed

    Waiting for gdb server to start 2022 08 24T07 08 56 126Z SERVER CONSOLE DEBUG onBackendConnect gdb server session connec
  • Linux离线安装telnet命令

    参考 xff1a https www hangge com blog cache detail 2935 html 一 离线包下载 xff08 1 xff09 首先下载 telnet client 或 telnet 客户端软件包 xff0c
  • 嵌入式开发--CAN总线与高速光耦6N137

    嵌入式开发 CAN总线与高速光耦6N137 6N137简介 CAN总线应用时 xff0c 有时候需要加光耦隔离电路 xff0c 以免在雷击或遇到高压干扰时 xff0c 保护设备安全 常用的有光耦隔离和专用芯片隔离 本文介绍使用高速光耦6N1
  • 处理机调度

    调度算法 第一类就绪队列怎么排 第二类是每一次执行时间的长短的控制 第三类关于多种算法如何综合到一起 先来先服务算法 按着到就绪队列里的先后顺序来排队的在找就绪进程的时候也是按照这个先后顺序来 按先来后到没有考虑到进程的特征 缺点 xff1
  • 死锁产生和预防

    死锁的产生 1 资源是互斥的 资源在同一时刻只有一个进程才能够使用和访问 2 持有并等待 一个进程持有一份资源阻塞等待其它进程释放资源 3 资源不可抢占 只有一个进程使用完资源之后其它进程才能够占有使用 4 循环等待 在等待资源的进程集合中
  • 第一次实验报告:使用Packet Tracer分析HTTP数据包

    姓名 xff1a 刘钰 学号 xff1a 201821121036 班级 xff1a 计算1812 1 实验目的 熟练使用Packet Tracer工具 分析抓到的HTTP数据包 xff0c 深入理解 xff1a HTTP协议 xff0c
  • 超详细|一篇搞定操作系统——用户接口

    文章目录 6 1 用户接口6 2 其他特殊操作系统6 2 1 嵌入式操作系统6 2 2 分布式操作系统 操作系统全家桶 xff1a 传送门 一 操作系统引述 xff1a https blog csdn net diviner s artic
  • mac搭建嵌入式编程环境--交叉编译工具链crosstool-ng

    1 第一个思路就是和ubuntu一样 xff0c 是否有apt get一样的管理软件包工具 查了一下有类似的macport和homebrew macport下载方法 xff1a https guide macports org instal
  • 用matlab处理px4日志的转换方法

    px4 v1 8 2的版本可以选择用sdlog2模块记录日志 xff0c 通过QGC地面站下载的日志格式为 ulg xff0c 将下载成功的 ulg扩展名改为 bin xff0c 然后用MP地面站 数据闪存日志 创建matlab文件 xff

随机推荐