memory-segmentation相关内容

根据这种情况,如何将C程序划分为页面,然后放入RAM帧中?

查看此方案,然后回答以下问题: 如您所见,有一个简单的C程序粗略地转换为汇编指令。为简单起见,让我们假设每条指令是3字节长,我们假设页面和帧大小也是3字节长。 此过程流正确吗? 程序是否真的分散到页面中,然后像那样放入RAM框架中? 如果是这样,系统如何能够将特定页面与它们所属的特定段相关联? 我在一本操作系统书中读到分段和分页可以共存。此方案是否与此方案相关? ..
发布时间:2022-09-06 16:16:53 其他开发

16位实数模式下的物理地址公式:为什么将数据段乘以16?

physical address=16*selector+offset 但我不知道为什么要用16乘以选择器? 推荐答案 为了与Z80“程序员兼容”,但仍能使用超过64 KiB的内存,早期的英特尔处理器引入了内存分段。在添加到16位偏移量之前,16位段将左移4位(意思是乘以16,不是64),从而得到20位地址。 对于习惯于Z80的程序员来说,所需要的只是使用操作系统提供的段,他们将能 ..
发布时间:2022-08-23 21:11:36 其他开发

什么是段落(当提到记忆时)

我觉得问一些看起来很容易查找的问题很愚蠢,但正如你可能猜到的那样,搜索段落会得到很多与我想知道的无关的结果。 这几天我一直在学习汇编(编写一个很小的引导加载器,诸如此类的练习),我看到了一些对称为段落的内存块的引用。我有一个遥远的记忆,一个段落是两个词,但我真的不确定。究竟什么是段落,它的意义是什么? 推荐答案 一个段落有16个字节。它主要与x86实数模式有关(如果不是唯一的), ..
发布时间:2022-08-23 19:59:22 其他开发

使用 GDB 读取 MSR

在使用 GDB 调试程序时,有什么方法可以读取特定于 x86-64 模型的寄存器,特别是 IA32_FS_BASE 和 IA32_GS_BASE? 不太可取的是使用动态仪器包(如英特尔的 Pintool)的解决方案,但同样值得赞赏. 解决方案 如果您不想更改代码(或者如果代码不可用),您可以通过以下方式执行类似于 amdn 的答案的操作.对 arch_prctl 的调用需要一个指向 ..
发布时间:2022-01-20 20:11:04 其他开发

如何在不链接 libc.so 的情况下访问段寄存器?

我正在尝试在 Ubuntu 20.10 上使用 NASM 版本 2.15.04 在 64 位程序集中编写一个简单的堆栈金丝雀.使用命令 nasm -felf64 canary.asm && 进行组装和链接时,执行以下代码会导致分段错误ld canary.o. 全局 _start部分 .text_start: endbr64推 rbp ;保存基指针移动 rbp, rsp ;设置堆栈指针调用 _f ..

Segmented paging 和 Paged segmentation 的异同?

我正在研究组合分页/分段系统,在我的书中有两种方法: 1.paged 分割2.分段分页 我无法区分两者之间的区别.我认为在分页分段中,段被分成页面,在分段分页中,页面被分成段,虽然我不知道我是对还是错.同时在互联网上,仅使用一种方案来描述组合的寻呼/分段.我不明白为什么在我的课本中有两种方案.任何帮助将不胜感激. 解决方案 所以,在网上大力搜索这两个术语的异同后,我得出了一个最终的答案 ..

x86 实模式下的段大小

我对实模式下段的大小有一个疑问,因为它们不能超过 64K,但可以是 小于那个. 我的问题是这些段大小和基地址是如何初始化的?就像在保护模式下有 GDT 和 LDT.实模式段也可以重叠,不相交或相邻.就像 BIOS 有一些保留区域用于特定的东西,比如引导代码、视频缓冲区等,汇编程序需要做这样的事情吗? 解决方案 实模式下的段限制是 64k,即使在可以通过前缀使用 32 位地址大小的 386 ..
发布时间:2022-01-06 13:05:32 其他开发

为什么 x86 上的 Linux 对用户进程和内核使用不同的段?

所以,我知道 Linux 为 x86 处理器使用四个默认段(内核代码、内核数据、用户代码、用户数据),但它们都有相同的基数和限制(0x00000000 和 0xfffff),这意味着每个段映射到同一组线性地址. 鉴于此,为什么还要有用户/内核段?我理解为什么应该有单独的代码段和数据段(仅仅因为 x86 处理器如何处理 cs 和 ds 寄存器),但为什么没有单个代码段和单个数据段?内存保护是通 ..
发布时间:2022-01-04 22:39:48 其他开发

linux x86 64 中 MSR_GS_BASE 的详细信息

我试图找出 Linux 内核中 MACRO current 的详细信息.当前的最终汇编代码为: movq %%gs:0xb000,%0 上面的代码可以工作!但是当我打印 %%gs 时,它的值为 0,所以 %%gs 指向 GDT NULL 的第一项!!??它是如何工作的? mov %%gs, %0 相反,gs 的基数在 MSR_GS_BASE 中,当前可以像这样替换: /*0xb000 是 ..
发布时间:2022-01-04 22:12:18 其他开发

x86 保护模式下段寄存器的用途是什么?

我需要修改一些 dll,但我不知道,在保护模式下段寄存器(DS、SS、...)究竟做了什么.我在学校学到了真正的 16 位模式,其中段寄存器乘以 16 加上正常寄存器中的偏移量给出物理内存中的有效地址.在保护模式下,有一些平面内存模型和虚拟内存,其中每个进程“有"4GB 内存,所以如果寄存器有 32 位,那么我只能通过“偏移"寄存器来寻址虚拟内存的每个字节.那么哪些目的在保护模式下有段寄存器,例如 ..
发布时间:2021-12-18 09:29:18 其他开发

实模式内存寻址中的段和偏移量是多少?

我正在阅读有关内存寻址的信息.我阅读了段偏移,然后阅读了描述符偏移.我知道如何在实模式下计算确切地址.所有这些都可以,但我无法理解偏移量到底是什么?我读到的任何地方: 在实模式下,寄存器只有 16 位,所以你只能寻址高达 64k.为了允许寻址更多的内存,地址是由 segment * 16 + offset 计算. 这里我可以理解第一行.我们有 16 位,所以我们最多可以寻址 2^16 ..
发布时间:2021-12-18 09:08:06 其他开发

什么是“FS"/“GS"?注册的目的?

所以我知道以下寄存器及其用途应该是什么: CS = 代码段(用于 IP) DS = 数据段(用于 MOV) ES = 目标段(用于 MOVS 等) SS = 堆栈段(用于 SP) 但是以下寄存器的用途是什么? FS = "文件段"? GS = ??? 注意:我不是询问任何特定的操作系统——我询问的是它们打算被 CPU 用来做什么,如果有的话. ..

STOSB 使用额外段有什么特殊原因吗?

我读过 STOSB 的功能如下: ES:[DI] 如果 DF = 0 递增 DI 否则递减 DI. 那么为什么STOSB 不会改变DS:[DI]? 使用额外段有什么特殊目的吗? 在大多数字符串指令中,我们使用额外的段.为什么? 解决方案 那么为什么 STOSB 不改变 DS:[DI] 因为这个定义会与已经使用 DS:[SI] 的 LODSB 的使用发生冲突.使用单 ..
发布时间:2021-09-29 19:43:37 其他开发

从给定的物理地址和有效地址中查找段地址

如何从给定数据中找到段地址? 物理地址 = 0x119B,有效地址 = 0x10AB 公式是什么? 解决方案 x86 16 位实模式中的有效地址只是 20 位 segment:offset 地址.给你的问题是确定一个段值,当与有效地址 0x10AB 结合产生一个物理(线性)地址 0x119B 时. 物理地址可以从 segment:offset 对使用公式 physaddr ..
发布时间:2021-09-29 19:43:25 其他开发

即使我确实为变量设置了初始值,数据段也没有被初始化

我已经编写了一个代码,它应该生成某种数字列表,但是即使我为它们分配了初始值,我的数据段变量也没有被初始化? 这是我运行 DS:0000 时的样子: 这是我的代码,但数据段只保留垃圾值: MODEL 小堆栈 100 小时数据段尺寸 1 dw 0000harr dw 20 dup(0000h)数据结束代码段假设 CS:CODE, DS:DATAsidra_rekursivit procm ..
发布时间:2021-09-29 19:42:27 其他开发

平面地址空间、线性地址、基地址、有效地址计算有什么区别

所有这些东西之间有什么区别:平面地址,基址地址,线性地址,有效地址,物理地址,有效地址计算??? 解决方案 80x86 既有分段又有分页;其中虚拟地址(该软件使用)被转换为物理地址(该硬件如内存控制器)使用.完整转换: 第一个 CPU 确定有效地址/偏移量(例如,对于像“mov eax,[eax+ebx*4+99]"这样的指令,CPU计算结果"eax+ebx*4+99") 然后 ..

如何在将自身缝合到自己的尾部的程序中,无限地环绕在 64KB 代码段中?

如果指令的顺序执行通过了偏移量 65535,那么 8086 将从同一代码段中的偏移量 0 处获取下一个指令字节. 下一个 .COM 程序使用这个事实并不断地将其整个代码(总共 32 个字节)拼接到自己的尾部,环绕在 64KB 代码段中.你可以称之为二元奎因. ORG 256 ;.COM 程序以 CS=DS=ES=SS 开头开始:mov ax, cs ;2 提供外部堆栈添加斧头,4096; ..
发布时间:2021-09-29 19:37:09 其他开发

内存对齐检查机制检查的地址是有效地址、线性地址还是物理地址?

我正在研究对齐检查的问题.但我不知道处理器是在检查有效地址、线性地址还是物理地址,还是全部检查. 比如一个数据的有效地址已经对齐,但是加上段描述符的基地址形成的线性地址不再对齐,此时处理器抛出#AC异常. 解决方案 TL;DR 我认为是线性地址. 继续阅读测试方法和测试代码. 它不是有效地址(也就是偏移量) 为了测试这一点,使用一个基数未对齐的段就足够了. ..
发布时间:2021-09-29 19:34:48 其他开发

线性地址和物理地址

什么是线性地址?它与物理地址有何不同? 解决方案 Linear address is generated after before page表映射.物理地址是生成before after页表映射(即分页). 线性地址,通过添加创建基址的逻辑地址段、CS、DS、ES、SS、FS 或 GS​​. 启用分页时,页面表格用于翻译线性地址到物理地址. 另一方面,物理地址是只不过,地 ..