就分页分段内存而言的程序寿命

2024-06-18

我对 x86 Linux 机器中的分段和分页过程有一个令人困惑的概念。如果有人能澄清从开始到结束所涉及的所有步骤,我们将很高兴。

x86 使用分页分段内存技术进行内存管理。

任何人都可以解释一下从可执行的 .elf 格式文件从硬盘加载到主内存到它死掉的那一刻发生了什么。编译时,可执行文件中有不同的部分(文本、数据、堆栈、堆、bss)。这将如何加载?它们将如何在分页分段内存技术下设置。

想知道如何为加载的程序设置页表?想知道 GDT 表是如何设置的。寄存器是如何加载的?为什么说32位机器的逻辑地址(MMU的分段单元处理的地址是48位(16位段选择器+32位偏移量))。其他16位如何存储?从 RAM 访问的任何内容都必须是 32 位或 4 个字节,如何访问其余 16 位(加载到段寄存器中)?

提前致谢。这个问题可以有很多内容。但想澄清可执行文件的整个生命周期。如果能得到一些答案并引发对此的讨论,我们将很高兴。


Unix 传统上通过分页实现保护。 286+提供分段,386+提供分页。每个人都使用分页,但很少有人真正使用分段。

在 x86 中,每个内存操作数都有一个隐式段(因此地址实际上是 16 位选择器 + 32 位偏移量),具体取决于所使用的寄存器。所以如果你访问[ESP + 8]隐含的段寄存器是SS,如果您访问[ESI]隐含的段寄存器是DS,如果您访问[EDI+4]隐含的段寄存器是ES,...您可以通过段前缀覆盖来覆盖它。

Linux 和几乎所有现代 x86 操作系统都使用平面内存模型(或类似的模型)。在扁平内存模型下,每个段都提供对整个内存的访问,基数为 0,限制为 4Gb,因此您不必担心分段带来的复杂性。基本上有 4 个段:内核空间代码(RX)、内核空间数据(RW)、用户空间代码(RX)、用户空间数据(RW)。

ELF 文件由一些表示“程序段”和“节”的标头组成。部分用于链接。程序段用于加载。程序段通过以下方式映射到内存中mmap(),这会设置具有适当权限的页表条目。

现在,较旧的 x86 CPU 的分页机制仅提供 RW 访问控制(读取权限意味着执行权限),而分段则提供 RWX 访问控制。结束权限同时考虑分段和分页(例如:RW(数据段)+ R(只读页)= R(只读),而 RX(代码段)+ R(只读页)= RX(读和读)执行))。

因此,有一些补丁可以通过分段提供执行预防:例如OpenWall 通过缩小代码段(具有执行权限的代码段)提供了一个不可执行的堆栈,并在页面错误处理程序中对需要从高内存地址执行的任何内容进行特殊模拟(例如:GCC 蹦床、创建的自修改代码)在堆栈上有效地实现嵌套函数)。

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

就分页分段内存而言的程序寿命 的相关文章

随机推荐

  • Matlab dec2bin 给出错误的值

    我正在使用 Matlab 的 dec2bin 将十进制数转换为二进制字符串 但是 我得到了错误的结果 例如 gt gt dec2bin 13339262925365424727 ans 101110010001111010010100111
  • 在 C++ 中检查文件是否存在的最佳方法是什么? (跨平台)

    我已阅读以下答案检查 C 中文件是否存在的最佳方法是什么 跨平台 https stackoverflow com questions 230062 whats the best way to check if a file exists i
  • JavaScript 中的巨大字符串替换?

    我有一个小型 JavaScript 应用程序 可以解析用户放入浏览器中的文件 最近我发现一些非英语字符的问题 此处放置的文件类型使用 Windows 1252 字符集 因此诸如 实际上是通过 我必须将它们全部转换为正确的字符 例如 我得到S
  • 为什么全局变量“名称”更改为字符串? [复制]

    这个问题在这里已经有答案了 当我将数组对象命名为 name 时 类型自动更改为 String 而不是 Array 为什么
  • 颤动:所选值不显示在下拉列表中

    我正在从 SQLite 数据库填充城市名称并尝试显示为下拉列表 我通过遵循教程使其工作 但遇到了一个小问题 所选值不会显示在下拉列表中 它继续显示默认提示值 但是 我能够分配和检索正确的选定值 这是我的代码 cities dart clas
  • 如何延迟 onClick 操作

    我正在尝试在 java 应用程序 android 中做一些事情 并且我需要一些东西来延迟 等待循环的秒数 我怎样才能延迟android功能 我尝试过使用 Thread sleep TimeUnit sleep 但它只会执行几秒钟的不负责任的
  • 将 Visual Studio 在线 Git 存储库集成到 Android Studio 1.0.2

    我正在使用 Visual Studio Online 进行开发过程 我想将我的 Android Studio 1 0 2 代码集成到其中 但是 据我所知 Android Studio 没有 TFS 插件 这就是为什么我想使用 Git 进行源
  • 常见的 Windows 编译器上有哪些 std::locale 名称可用?

    该标准对于什么构成有效的语言环境名称几乎没有提及 只有传递无效的区域设置名称才会导致std runtime error 哪些语言环境名称可用于常见的 Windows 编译器 例如 MSVC MinGW 和 ICC 好吧 C 和 C 语言环境
  • java.lang.RuntimeException:将结果 ResultInfo{who=null, request=1888, result=0, data=null} 传递给活动失败

    我的应用程序允许用户按下按钮 打开相机 他们可以拍照 照片会显示在ImageView 如果用户在相机打开时按后退或取消 我会强制关闭 无法将结果 ResultInfo who null request 1888 result 0 data
  • scipy.interpolate.griddata:剪切 z 值并获取其中的区域

    Regarding to this analogy to scipy interpolate griddata https stackoverflow com questions 18496783 analogy to scipy inte
  • 使用“Openxml writer”合并 Excel 中的单元格

    我想合并单元格是excel 通过使用 DOM 方法 我可以轻松做到这一点 但由于我的 Excel 文件太大 当我尝试获取工作表时 它会抛出内存不足异常 所以我必须使用SAX方法来读取excel文件 但我不知道如何用这种方法合并单元格 查了很
  • 删除字符串中的转义符,或者“我怎样才能让 \ 不碍事?”

    转义字符在 R 中会带来很多麻烦 前面的问题证明了这一点 更改列中的值 https stackoverflow com questions 10046357 change the values in a column 10046412 10
  • 给图像着色[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在尝试着色System Windows Controls Image 该图像包含透明区域 我只是想用颜色给非透明区域着色 例如 图
  • 自定义 zsh 在显示上一个命令退出代码时的提示

    Zsh 能够通过使用以下命令在提示中显示上一个命令的返回代码 退出代码 转义序列 不过我想得到以下提示 user host 当退出代码不为 0 且 user host 当退出代码为 0 时 如果我使用 单独它总是显示 即使 是 0 另外我想
  • 面试题:三个数组,O(N*N)

    假设我们有three长度数组N其中包含任意数量的类型long 然后我们得到一个数字M 相同类型 我们的任务是选择三个数字A B and C每个数组中的一个 换句话说A should从第一个数组中选取 B从第二个开始和C从第三个 所以总和A
  • 如何在 jquery.datatables 中显示复选框?

    我正在使用数据表 并且有以下代码来生成表 我想显示读取 写入 执行和管理值的复选框 如果该值等于 1 我希望选中该复选框 如果 0 个复选框未选中 JavaScript
  • 表达式的大 O 表示法

    如果我有一个需要 4n 2 7n 步才能完成的算法 它的 O 是多少 O 4n 2 O n 2 我知道 7n 被截断 但我不知道是否应该保留 n 2 系数 Thanks 您应该删除任何系数 因为问题实际上是在 按顺序 询问 它试图将其描述为
  • 在 SELECT IN 中使用 Oracle 参数时出现问题

    我在将一串数字插入sql查询时遇到问题 SELECT FROM tablename a WHERE a flokkurid IN 3857 3858 3863 3285 ORDER BY sjodategund rodun or SELEC
  • 如何减少 geom_text 重叠

    我的数据集包含超过 500 个对各个运动员在不同地点进行的比赛活动的观察结果 并在足球比赛期间进行记录 下面是我的数据集的示例 其中每个符号都指一个匹配活动 例如 KE踢有效 在 1 分钟时记录Defense Example data df
  • 就分页分段内存而言的程序寿命

    我对 x86 Linux 机器中的分段和分页过程有一个令人困惑的概念 如果有人能澄清从开始到结束所涉及的所有步骤 我们将很高兴 x86 使用分页分段内存技术进行内存管理 任何人都可以解释一下从可执行的 elf 格式文件从硬盘加载到主内存到它