美文网首页
【平坦模型:分段与分页】

【平坦模型:分段与分页】

作者: 月下蓑衣江湖夜雨 | 来源:发表于2020-12-01 21:06 被阅读0次

程序分段CPU内存分段是不同的概念;
现代操作系统一般都是在平坦模型下工作(整个4GB空间为一个段),编译器也是按照平坦模型为程序布局,程序中的代码和数据都在同一个段中整齐排列。《操作系统真象还原》

什么叫一个段?

段基址:段长度一样,是否就可以叫一个段?

Linux的做法

Linux怎么绕过分段机制不是很理解。有文章说,它把代码段和数据段的段基地址都设为0,段长度都为4GB。这样,两者的线性地址完全重叠。那么,两者使用地址空间不会起冲突吗?

「一个进程里的各个段都有各自对应的线性地址空间」,这是错的,一个进程只有一个用户虚拟地址空间。我们平时说的代码段,是指 readelf -S /bin/ls 输出的那些 section,而不是 x86 处理器实现的分段机制里的段。

ld.so 把 /bin/ls 中的 section 载入内存执行时,就称为 segment,你可以执行 readelf -l /bin/ls 查看 section 和 segment 的映射关系,可以看到,多个 section 可以映射为内存中的同一个 segment。

代码段中的「段」,根据上下文,可以指 section 或 segment,但不可能指 x86 处理器实现的分段机制里的段。

Linux 在实现时,完全无视分段机制,做法是:「各种段的段基地址都设为 0」。你在读文章时,凡是看到 x86 处理器分段机制里的段,直接无视即可。

为什么代码段和数据段基地址可以同时设置为0?因为分段机制已经过时了。
在Linux内核中,把代码段和数据段的段基址都设置为0,使段偏移地址等于虚拟地址(也就是线性地址),完全通过分页功能实现多进程运行。

如何保护“代码段”只读,不可写呢?

???
编译器检查,页写保护?

冯诺依曼的体系结构中必须有:代码段、数据段、堆栈段

Linux怎么绕过分段机制不是很理解。有文章说,它把代码段和数据段的段基地址都设为0,段长度都为4GB。

分段是必须的,分页是可选的,但分段又是过时的!

到了x86 64时期,cpu寄存器位数为64bit, 进入了long mode时代,intel完全弃用了分段功能,因为分页机制即有保护模式的功能,又能灵活的实现多任务。

我们选了ELF格式,选了gcc,就要尊重Linux的内存模型!!!

https://www.zhihu.com/question/420128789

相关文章

  • 【平坦模型:分段与分页】

    程序分段和CPU内存分段是不同的概念;现代操作系统一般都是在平坦模型下工作(整个4GB空间为一个段),编译器也是按...

  • 内存分页不就够了?为什么还要分段?还有段页式?

    关于内存访问你可能听过分段,分页,还有段页式。 但是为什么要分段?又为什么要分页? 有了分页为什么还要分段? 这就...

  • 内存分页不就够了?为什么还要分段?还有段页式?

    你好,我是 yes。 关于内存访问你可能听过分段,分页,还有段页式。 但是为什么要分段?又为什么要分页? 有了分页...

  • Linux内存寻址——分页与分段

    物理地址与虚拟地址 物理地址,也叫实地址、二进制地址,它是在地址总线上,以电子形式存在的,使得数据总线可以访问主存...

  • 操作系统-分页与分段

    背景:连续分配方式会形成许多“碎片”,虽然可通过“紧凑”方法将许多碎片拼接成可用的大块空间,但须为之付出很大的开销...

  • 三阶段day18-flask

    flask模型 模型定义 模型迁移及增删改 模型查看 模型分页

  • day8 内核内存管理之分页

    分段已经了解清楚了,但linux不仅使用了分段还是用了分页,分段的好处在于因为是逻辑地址,可以远大于实际使用的内存...

  • 5.分段分页

    1.介绍 目前操作系统已经写到分段,并且在分段条件下,在定时中断下能够自动切换任务。现在需要实现分段分页操作,故需...

  • 内存管理——分页、分段

    参考 怎样通俗的理解操作系统中内存管理分页和分段?计算机操作系统 - 内存管理

  • 简记

    jvm 模型 以及类加载机制 mybatis 分页原理,resulttype与resultmap区别 责任链模式...

网友评论

      本文标题:【平坦模型:分段与分页】

      本文链接:https://www.haomeiwen.com/subject/mqcewktx.html