问题标签 [memory-segmentation]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
winapi - 是否有适用于 Win32 的 API 允许我使用 ES、GS、FS?
我想在汇编程序中使用 ES、FS 和 GS,以允许我拥有 3 个独立的地址空间。
是否有Win32 API可以设置LDT并给我适当的选择器的值?
linux - 什么是汇编中的 %gs
在 gcc 中编译后,该函数转换为以下汇编代码:
我不明白两行:
什么是%gs,这两行到底是做什么的?
这是编译命令:
windows - TIB Custom Storage
After quite a bit of googling and some hints given here, I finally managed to find a layout of the FS
segment (used by windows to store TIB data). Of particular interest to me is the ArbitraryUserPointer
member provided in the PSDK:
How safe exactly is it to use this variable (under Vista and above)? and does it still exist on x64?
Secondary to that is the access of this variable. I'm using MSVC, and as such I
have access to the __readfsdword
& __readgsqword
intrinsics, however, MSDN for some reason marks these as privileged instructions:
These intrinsics are only available in kernel mode, and the routines are only available as intrinsics.
They are of course not kernel only, but why are they marked as such, just incorrect documentation? (my offline VS 2008 docs don't have this clause).
Finally, is it safe to access ArbitraryUserPointer
directly via a single __readfsdword(0x14)
or is it preferred to use it via the linear TIB address? (which will still require a read from FS
).
operating-system - 现代操作系统中的内存分段
在研究操作系统时(主要以 Linux 为参考),有几点我在所研究的材料中没有得到很好的解释。
加载到内存中的程序通常被描述为被划分为文本、数据、堆栈等段,即使在像 Linux 这样的虚拟内存完全基于分页的操作系统的上下文中也是如此。是否只是程序而不是内存本身被称为分段?如果是这样,我发现术语令人困惑。
我看到可以在 Linux 中使用增加数据段大小的调用“sbrk”来实现 malloc。同样,这个“数据段”是否只是按惯例用于数据的内存区域,而不是“真实”段?(额外的问题:“sbrk”似乎无法减小“段”的大小。这是否意味着进程除了退出之外永远不能向操作系统释放内存?)
我也有兴趣知道为什么现代操作系统似乎没有使用(分页)分段。将代码驻留在自己的受保护段中,是否可以防止某些类型的攻击,从而提高安全性?另一方面,这会使例如 JIT 编译变得不可能/困难吗?
除了对上述问题的“是”/“否”回答之外,我对任何关于该主题的有见地的阐述感兴趣。
assembly - 计算段:从绝对地址偏移
我可以将地址计算Segment:Offset
为Segment
* 0x10 + Offset
。但是我如何计算相反的呢?
例如,我如何从0xF4170
toF400:0170
和 from 0xACF04
to 到达ABCD:1234
?
memory-management - 关于流程图的问题
在这里,我在两个不同的终端中运行相同程序的两个实例。他们的流程图是
在第一个终端 -
在第二个航站楼 -
我的问题是——
“/lib/x86_64-linux-gnu/ld-2.13.so”这个库在终端 1 和 2 中有两个不同的地址( 00007f90f279a000 和 00007f3b0b0cb000 )。这是否意味着该库在主内存中加载了 2 次?
假设 a.out 是简单 Hello_World.c 程序的二进制文件
那么 a.out 的哪个部分有 r & w 权限?简而言之,该段应该包含源“0000000000601000 4K rw--- /home/vikram/a.out”的哪一部分?
为什么 anon 不像其他段那样连续?
什么“ 00007f90f2590000 2044K ----- /lib/x86_64-linux-gnu/libc-2.13.so ”这个段应该包含......因为它没有读,写,执行权限。
c - Win32中的TIB访问
深入研究使用 TIB 的 Win32 API 函数的实现,例如:
- TLS 访问函数:
TlsAlloc
,TlsFree
,TlsSetValue
,TlsGetValue
GetLastError
,SetLastError
- 消息传递子系统:
GetMessage
等PeekMessage
。
人们发现他们都通过读取fs:[0x18]
选择器的内容来访问 TIB(有时称为 TEB)。
OTOH 这是不必要的,因为fs
register直接指向它。根据这篇文章和我在实践中看到的,fs
寄存器保存指向 TIB 结构开头的地址,而在偏移量 0x18 处,它有指向自身的指针。
然而,间接访问 TIB 的原因可能是什么?
c - 总线错误:10. C 代码,malloc 示例
当我尝试编译以下 C 代码时,出现总线错误。我猜这与我调用 memcpy 的方式有关,但我无法弄清楚。任何帮助将不胜感激!
gdb - 如何在 gdb 中使用具有 FS 或 GS 基数的逻辑地址?
gdb 提供读取或写入特定线性地址的功能,例如:
但是你如何指定一个逻辑地址?我遇到了以下说明:
如何在 gdb 中读取“%gs:0x14”处的内存,或者将这个逻辑地址转换为我可以在x
命令中使用的线性地址?
注意:我知道在这条指令之后我可以简单地阅读 %eax,但这不是我关心的问题
memory-management - 程序是如何分段的?
如果这个问题被认为太琐碎,我提前道歉,但我确实花了很多时间试图在网上找到一个直截了当的答案,但找不到。
我最近读了一个关于程序分段的介绍性编程课程,以及程序通常如何划分为“段”,这些“段”在需要时单独加载到内存中(或部分加载到内存中,通过分页......我认为)。我们的书提到程序通常根据逻辑划分被划分为段,例如堆栈段、堆段、全局常量段等。
我想知道究竟是什么决定了这种分割是如何工作的。它是由编译器在编译时完成的吗?或者操作系统是否以某种方式处理它?每个子程序通常都有自己的段吗,不管它有多小?
我知道与段描述符等分段相关的信息是在体系结构级别使用寄存器处理的,并且专门分配用于处理分段。但我只是很难想象程序的实际分段首先在哪里/如何发生,以及这些信息如何进入这些寄存器。地址如何转换为段 id 和偏移量?任何人都可以启发我吗?非常感谢您提供的任何帮助,如果我在这里扼杀了任何概念,我们深表歉意。