RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1377323
Accepted
n 1 k z z z
n 1 k z z z
Asked:2022-07-01 18:17:25 +0000 UTC2022-07-01 18:17:25 +0000 UTC 2022-07-01 18:17:25 +0000 UTC

平面内存模型

  • 772

消息来源说модель плоской памяти - парадигма, в которой память представляется программе как единое непрерывное адресное пространство. ЦП может напрямую (и линейно) адресовать все доступные без необходимости прибегать к каким-либо видам схемы сегментации памяти или подкачки。听说现在到处都在使用这样的内存模型,但是程序内存怎么还分成代码段、数据段等等,还有页呢?如果程序是分段的,那是不是意味着我正在使用 分段内存模型?还有平面内存模型与虚拟内存有什么关系,难道不是一回事吗?或者,例如,一个是另一个的实现?

память
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. gbg
    2022-07-01T19:49:05Z2022-07-01T19:49:05Z

    相同的词被用来解释不同的现象。

    一个 16 位处理器可以用它的一个寄存器寻址 64 公斤的内存。64 公斤 - 一段。要寻址更多内存,您需要使用两个寄存器 - 一个用于段,另一个用于该段中的偏移量。

    还有这样的内存扩展卡,可以通过 64 KB 的窗口进行通信,以及Commodore 机器中的银行切换。

    以上都是记忆的分段组织。

    事实上,ELF 和 EXE 格式的作者提出了这样的想法,即在他们放置常量、程序代码和堆的地方命名内存片段,也只是在历史上将一个与另一个连接起来 - 因为在旧粘土时代,一对 SS:SP 寄存器指向堆栈并被称为“段堆栈”,而 CS 寄存器例如指向一个代码段(即 .code)。

    现在没有人使用几个寄存器(和段寻址),但是将内存划分为段仍然存在,并且从那时起这些术语一直在拖延。

    • 4
  2. Best Answer
    PRODIGY
    2022-07-02T00:37:22Z2022-07-02T00:37:22Z
    1. 在扁平的“Flat”内存模型中,您可以忘记段寄存器,而段通常是过去的遗物。这是因为在描述符(描述段)中,总是设置这些段的最大可能大小,并且起始地址为零。此外,这对所有段寄存器都有效,例如CS\DS\SS\ES\FS\GS. 如果系统是 32 位的,则描述符中段的大小(限制)为0хFFFFFFFF(4Gb),基数 = 0. 此限制与 32 位处理器的寄存器大小相同,因此您的来源指出:

    CPU 可以直接(并且线性地)寻址所有可用空间,而无需求助于任何类型的内存分段或交换方案。

    如果您打开“OllyDbg”调试器,那么在 CPU 寄存器窗口中,您可以找到所有段寄存器的值,包括它们的选择器(可见部分),以及描述符中具有限制的基数。在这里你可以看到除了FS基数之外的每个人都是零,极限是最大值。在这种情况下,寄存器 (FS) 有一个基数0x7FFDF000和一个限制0x0FFF- 系统将这个段(一个 4K 页大小)分配给TEB进程信息\结构,线程环境块。在这种情况下,只读属性 (R) 设置在段描述符 (FS) 中。所有选择器中的 2-lbit 的值为 (3),表示第三个环的用户应用程序(RPL 位)。

    在此处输入图像描述

    1. 虚拟内存意味着将巨大的 4Gb 段分割成更小的 4Kb 页面。例如,如果一个应用程序只有一行文本,那么为什么要为其分配所有 4Gb 的内存,并将它们格式化为一个数据段呢?因此,我们引入了页面(如果没有足够的物理内存)可以随时在页面文件中卸载到磁盘,并为新数据分配空闲空间。事实上,任何大小的程序都可以在内存的一个虚拟页面中显示——只要一个 4K 块完成,我们就会卸载并用新的信息部分替换它。只有这样的程序才能运行缓慢。

    页面属性在PTE记录中分配,并且优先于段寄存器描述符中的属性。这就是为什么他们说使用分页,在平面内存模型中,段可以完全被忽略。例如,这里有一段代码专门通过代码段寄存器访问数据段CS:offset,虽然理论上应该有一对DS:offset. 同样,在代码中,您可以浏览DS. 这再次证实了 RM 中的段寄存器没有发挥任何作用——它们已将所有权力转移到虚拟页面。

    format   pe console
    include 'win32ax.inc'
    entry    start
    ;//---------- 
    .data
    jump   dd   @prn      ;//<--- переменная в секции-данных, с адресом перехода
    buff   db   0
    ;//----------
    .code
    start:   mov     ecx,-1
             mov     ebx,'DEAD'
             nop
             mov     eax,[cs:jump]   ;// Внимание! Указываю секцию-кода + значение из секции-данных!
             jmp     eax
    
            cinvoke  printf,<' Hello World!',0>   ;//<-- блок не получит управления
             jmp     @exit
    
    @prn:   cinvoke  printf,<' Jump OK!',0>       
    
    @exit:  cinvoke  _getch     ;// клавиша
            cinvoke  exit,0     ;// выход!
    ;//----------
    section '.idata' import data readable
    library   msvcrt,'msvcrt.dll'
    include  'api\msvcrt.inc'
    

    在此处输入图像描述

    还有平面内存模型与虚拟内存有什么关系,难道不是一回事吗?或者,例如,一个是另一个的实现?

    Flat Flat 是一个从零到最大值的内存模型。具有类似大小的 CPU 寄存器,允许使用单个寄存器寻址所有内存。虚拟内存是一种通过将一个物理页面替换为另一个物理页面来分配 RAM 物理内存的技术(算法)。

    系统有一个PFN数据库(PageFrameNumber),每个进程都有自己的树VAD(虚拟地址描述符)和一组工作页面“WorkingSet”。当将不必要的页面驱逐到页面文件时,由于 VAD 和 PFN,系统会跟踪它们属于哪个进程,以便在必要时将它们返回到它自己的内存,而不是其他人的进程(虚拟地址所有进程都相同)。

    • 3

相关问题

  • 传统RAM的重写资源是什么?

  • 为什么处理器“不喜欢”未对齐的数据?

  • 如何在低级别初始化值类型?

  • 当您快速格式化驱动器时会发生什么?

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5