我正在研究组合的分页/分段系统,在我的书中有两种方法:
1.paged segmentation
2.segmented paging
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚两者之间的区别.我认为在分页分段中,分段被分成页面,在分段分页中,页面被分成段,但我不知道我是对还是错.同时在因特网上,仅使用一种方案来描述组合的寻呼/分段.我无法弄清楚为什么在我的课本中有两种方案.任何帮助将深表感谢.
paging operating-system memory-management memory-segmentation
我最近在回答一个关于p < q当p和q是指向不同对象/数组的指针时在C 中执行的未定义行为的问题。这让我想到:C ++ <在这种情况下具有相同(未定义)的行为,但是还提供了标准库模板std::less,该模板保证可以返回与<可以比较指针时相同的东西,并在不能比较时返回一些一致的顺序。
C是否提供具有类似功能的东西,从而可以安全地比较任意指针(相同类型)?我尝试浏览C11标准并没有发现任何东西,但是我在C中的经验比在C ++中小得多,因此我很容易错过一些东西。
c pointers memory-model undefined-behavior memory-segmentation
因此,我知道Linux对x86处理器使用四个默认段(内核代码,内核数据,用户代码,用户数据),但它们都具有相同的基数和限制(0x00000000和0xfffff),这意味着每个段映射到相同的一组线性地址.
鉴于此,为什么甚至有用户/内核段?我理解为什么代码和数据应该有单独的段(仅仅是由于x86处理器如何处理cs和ds寄存器),但为什么没有单个代码段和单个数据段呢?内存保护通过分页完成,用户和内核段无论如何都映射到相同的线性地址.
我是初学者级别的学生:)我正在研究英特尔架构,我正在研究内存管理,例如分段和分页.我正在阅读英特尔的手册,了解英特尔的架构非常好.
但是我仍然对一些基本的东西感到好奇.为什么在64位长模式下,所有段寄存器都会转到0位?为什么系统不再使用段寄存器?
因为系统的64位大小(例如GP寄存器)足以一次包含那些逻辑地址?保护是否在64位模式下正常工作?
我试图找到64位寻址但我在谷歌找不到.也许我有很糟糕的搜索技巧,或者我可能需要一些特定的先前知识来搜索谷歌.
因此,我想知道为什么16位段寄存器不会在64位模式下使用,以及如何在64位模式下正常工作.
谢谢!
gdb提供读取或写入特定线性地址的功能,例如:
(gdb) x/1wx 0x080483e4
0x80483e4 <main>: 0x83e58955
(gdb)
Run Code Online (Sandbox Code Playgroud)
但是如何指定逻辑地址?我按照以下指示来:
0x0804841a <+6>: mov %gs:0x14,%eax
Run Code Online (Sandbox Code Playgroud)
我如何读取gdb中"%gs:0x14"的内存,或者将此逻辑地址转换为我可以在x命令中使用的线性地址?
注意:我知道在这条指令之后我只能阅读%eax,但这不是我关心的问题
我需要修改一些DLL,但我不知道,什么excatly确实段寄存器(DS,SS,...)的保护模式.我在学校里学到了真正的16位模式,其中段寄存器在正常寄存器中乘以16加偏移量,在物理存储器中提供有效地址.在保护模式下,有一些平面内存模型和虚拟内存,每个进程"有"4GB内存,所以如果寄存器有32位,那么我只能通过"偏移"寄存器来寻址虚拟内存的每个字节.例如,哪些瞳孔具有保护模式中的段寄存器
mov eax, dword ptr ds:[20037DA0]
Run Code Online (Sandbox Code Playgroud) 阅读intel x86手册和其他资源,我不明白DPL(描述符权限级别)和RPL(请求权限级别)之间的区别.为什么两者都有必要?非常感谢
在研究操作系统(主要以Linux作为参考)时,我在研究的材料中找不到很好的解释.
加载到存储器中的程序通常被描述为被分成文本,数据,堆栈等的段,甚至在诸如Linux的操作系统的上下文中,其中虚拟存储器完全基于分页.它只是程序,而不是被称为分段的内存本身吗?如果是这样,我发现术语令人困惑.
我看到malloc可以在Linux中使用调用'sbrk'来实现,这会增加数据段的大小.同样,这个"数据段"是否只是按惯例用于数据的内存区域而不是"真实"段?(额外的问题:'sbrk'似乎无法减小'段'的大小.这是否意味着进程永远不会释放内存到操作系统而不是退出?)
此外,我有兴趣知道为什么现代操作系统似乎不使用(分页)分段.它不会阻止某些类型的攻击使代码驻留在它自己的受保护段中,从而提高安全性吗?另一方面,这会使JIT编译变得不可能/困难吗?
除了上述问题的"是"/"否"答案之外,我对任何有关该主题的深刻阐述感兴趣.
先感谢您.
我正在研究对齐检查的问题。但我不知道处理器是在检查有效地址、线性地址还是物理地址,还是所有检查。
比如一个数据的有效地址已经对齐,但是加上段描述符的基地址形成的线性地址不再对齐,此时处理器抛出#AC异常。
为什么英特尔选择将段的基数和限制划分为段描述符中的不同部分而不是使用连续位?
见http://css.csail.mit.edu/6.858/2014/readings/i386/s05_01.htm的图5-3
为什么它们不将位地址存储在位0到31中,限制位32到51并将剩余位置用于其他位(或某些类似的布局)?