分段寄存器的使用

2024-02-27

我试图了解内存管理如何在低水平上进行,并有几个问题。

1) Kip R. Irvine 写的一本关于汇编语言的书说,在实模式下,程序启动时前三个段寄存器会加载代码、数据和堆栈段的基地址。这对我来说有点模棱两可。这些值是手动指定的还是汇编器生成指令将这些值写入寄存器?如果它自动发生,它如何找出这些段的大小?

2)我知道Linux使用平面线性模型,即以非常有限的方式使用分段。另外,根据 Daniel P. Bovet 和 Marco Cesati 所著的《Understanding the Linux Kernel》,GDT 中有四个主要部分:用户数据、用户代码、内核数据和内核代码。所有四个段都具有相同的大小和基地址。我不明白为什么需要其中四个,如果它们仅在类型和访问权限上不同(它们都产生相同的线性地址,对吧?)。为什么不只使用其中之一并将其描述符写入所有段寄存器?

3)不使用分段的操作系统如何将程序划分为逻辑段?例如,他们如何区分堆栈和没有段描述符的代码。我读到分页可以用来处理这样的事情,但不明白如何做。


  1. 你一定读过一些非常老的书,因为没有人为实模式不再;-) 在实模式,您可以使用以下命令获取内存访问的物理地址physical address = segment register * 0x10 + offset,偏移量是通用寄存器之一内的值。因为这些寄存器是 16 位宽,所以一个段的长度为 64kb,并且您无法对其大小进行任何操作,因为没有属性!随着* 0x10乘法,1MB 内存变为可用,但是根据您放入的内容,存在重叠组合段寄存器地址寄存器。我还没有编译任何代码实模式,但我认为这取决于操作系统来设置段寄存器在二进制加载期间,就像加载器在加载 ELF 二进制文件时会分配一些页面一样。然而,我确实编译了裸机内核代码,并且我必须自己设置这些寄存器。

  2. 由于架构限制,扁平模型中必须有四个部分。在保护模式 the 段寄存器不再包含段基地址,而是包含段选择器这基本上是 GDT 的偏移量。取决于值段选择器,CPU将处于给定的特权级别,这就是CPL(当前特权级别)。这段选择器指向一个段描述符它有一个 DPL(描述符特权级别),如果段寄存器充满了这个选择器(至少对于代码段选择器来说是这样)。因此你至少需要一双段选择器以区分内核和用户区。此外,段要么是代码段,要么是数据段,所以最终会得到四个段描述符在 GDT 中。

  3. 我没有任何使用分段的严肃操作系统的示例,只是因为分段仍然存在以实现向后兼容。使用平面模型方法只不过是摆脱它的一种手段。不管怎样,你是对的,分页更加高效和通用,并且几乎可以在所有架构上使用(至少在概念上)。我无法在这里解释分页内部结构,但是您需要了解的所有信息都在优秀的 Intel man 中:英特尔® 64 和 IA-32 架构 软件开发人员手册 第 3A 卷: 系统编程指南,第 1 部分 http://download.intel.com/products/processor/manual/253668.pdf

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

分段寄存器的使用 的相关文章

随机推荐

  • 我无法列出 Raspberry Pi 附近的 BLE 设备(python、btmgmt)

    我想通过使用 cron 脚本调用的 python 脚本来扫描 Raspberry 环境中的 ble 设备 但是当我在 cron 中执行此操作时 我的意思是我添加到 sudo crontab e 我总是得到一个空列表 当我以 pi 用户身份登
  • GDB:列出崩溃进程的所有映射内存区域

    我从 x86 Linux 机器 内核 2 6 35 22 如果重要的话 上的死进程中获得了全堆核心转储 我正在尝试在 GDB 中对其进行调试 是否有一个我可以使用的 GDB 命令 意思是 显示该进程分配的所有内存地址区域的列表 换句话说 我
  • 在 Golang 中构建动态(条件)WHERE SQL 查询

    我正在使用 golang go reform PostgreSQL 我想做的是一个 REST 搜索实用程序 一切都很顺利 直到我遇到条件搜索查询 这里的 条件 意味着我在表中有 10 列要搜索 并且可能有大量的组合 所以我无法单独处理它们
  • 使用联合类型进行类型推断 - 不存在最佳通用类型

    所以 我正在使用 TypeScript 进行类型推断 我将提供两个示例 它们在调用时会产生相同的结果 但是在其中一个示例中 由于 没有最佳常见类型 TypeScript 无法推断类型 三元运算符的示例 function foo a bool
  • Symfony 2:如何在控制器外部或服务中渲染模板?

    如何在控制器外部或服务中渲染模板 我一直在关注 Symfony2 的文档 Doc http symfony com doc current book service container html core symfony and third
  • 为什么 json_encode 之后的 JSON.parse 不起作用?

    为什么这对我不起作用 我收到此错误 SyntaxError JSON parse unexpected non whitespace character after JSON data PHP s json encode生成一个字符串 但它
  • Phantomjs 加载页面缓慢

    我是 phantomjs 的新手 正在标准的 centOS 服务器上尝试它 安装了 httpd 等 但除了名称服务器设置为 8 8 8 8 和 8 8 4 4 之外 没有修改设置 我正在使用默认的 loadspeed js 文件 已重命名
  • Azure DevOps Pipeline - dotnet 恢复包内容哈希验证失败

    我在 Azure DevOps 中为我的 Function App 设置了一个构建管道 它利用了 nuget 缓存 从而利用了 package lock json 文件 但是 我不断遇到包验证哈希问题 例如 Package content
  • WCF 位于公共反向代理后面,用于流量加密

    我有一个连接到 WCF 服务的 Silverlight 应用程序 在我习惯的基本配置下 将该应用程序连接到其相应的WCF服务没有问题 然而 最近 我的一位客户开始使用 Apache 反向代理 该代理是公共服务器 仅用于通过 SSL HTTP
  • 自定义 DataGridViewCheckBoxCell 视觉更新在编辑模式下不起作用

    我有以下内容DataGridViewCheckBoxCell 问题是视觉更新不会在编辑模式下立即发生 只有当我退出时才会发生 public class CustomDataGridViewCell DataGridViewCheckBoxC
  • 如何级联软删除?

    检查这些SO文章后 实体框架中的级联删除 https stackoverflow com questions 27293576 cascade delete in entity framework ef6 1 软删除与级联删除 https
  • flutter 中出现错误:widget_test.dart 无法检测到 MyApp()

    作为一个完全的初学者 我正在尝试各种 flutter 功能 但由于 widget test dart 文件中的错误 我陷入了运行 main dart 的困境 如果错误是由于其他原因造成的 请指出 main dart import packa
  • Fontawesome 5 与 VuetifyJs 1.0.0

    我想将 Fontawesome 5 Icons 与 VuetifyJs 一起使用 那可能吗 我应该使用哪个 npm 包来实现 fontawesome 因为没有人为我工作 作为一个没有经验的 VuetifyJs 开发人员 使用它确实让我感到困
  • 合并来自 Raphael svg 的图像

    尝试创造步骤 1 让用户通过 Ajax Raphael 和 Raphael freetransform 上传图像 步骤 2 单击 按钮显示合并上传图像中的一张图像 问题 我发现了关于转换 Raphael svg 的类似帖子1 https s
  • 出现导入错误:安装 auto-sklearn 时没有名为“sklearn”的模块

    为什么我得到ImportError No module named sklearn 安装时auto sklearn通过点 virtualenv p python3 automl cd automl source bin activate p
  • 如何从 C 读取 python pickle 数据库/文件?

    我正在努力与几个音乐播放器集成 目前我最喜欢的是 exexile 在新版本中 他们将数据库格式从 SQLite3 迁移到内部 Pickle 格式 我想知道是否有一种方法可以访问 pickle 格式文件 而无需手动对格式进行逆向工程 我知道有
  • 如何在 Blazor 中实现拖放?

    我知道 Blazor 是一项新技术 当前版本为 v0 5 1 不过 我目前正在为一个新的 Web 应用程序实现 PoC 我们希望在应用程序中具有拖放功能 我尝试以 Blazor 方式实现它 但它不起作用 我的放置目标 div class c
  • 将 YAML 反序列化为自定义类型

    我目前正在尝试将 YAML 文档反序列化为标准 NET 对象 例如string对于标量值和Dictionary
  • 在 CURL 中使用 cookie jar 时如何注入 cookie?

    我正在使用 php curl 并使用 cookie jar 进行多步抓取 我需要从服务器动态生成的cookie 但在某一步骤中 一些 cookie 是使用 JavaScript 生成的 由于curl不运行javascript 因此我需要在此
  • 分段寄存器的使用

    我试图了解内存管理如何在低水平上进行 并有几个问题 1 Kip R Irvine 写的一本关于汇编语言的书说 在实模式下 程序启动时前三个段寄存器会加载代码 数据和堆栈段的基地址 这对我来说有点模棱两可 这些值是手动指定的还是汇编器生成指令