Linux页面表的过程
作者:互联网
Intel core i5, Ubunu 16.04
我正在阅读有关内存分页here的内容,现在正在尝试使用它. I wrote a simple assembly program for getting Segmentation Fault并在gdb中运行.这里是:
section .text
global _start
_start:
mov rax, 0xFFFFFFFFFFFF0A31
mov [val], eax
mov eax, 4
mov ebx, 1
mov ecx, val
mov edx, 2
int 0x80
mov eax, 1
int 0x80
segment .bss
dummy resb 0xFFA
val resb 1
我将它组装并链接到64位ELF静态可执行文件中.
据我所知,每个进程都有自己的页表,cr3注册指向该表.现在我想自己查看页面表?是否有可能在Linux中找到有关进程页表的信息?
解决方法:
您可以在/ proc / PID / smaps中看到进程的所有映射.这告诉您在不获取SIGSEGV的情况下可以访问的内容.
这与cr3页表不同,因为内核并不总是“连接”所有映射.即硬件页面错误并不总是SIGSEGV:内核页面错误处理程序检查您的进程是否逻辑上已映射该内存并更正情况,或者您是否确实违反了内存保护.
在mmap()系统调用之后,或者在进程启动以映射文本/数据/ BSS段时,您在逻辑上已经映射了内存,但Linux可能已经决定是懒惰的并且还没有提供任何物理页面. (例如,页面可能尚未在页面缓存中,因此在您尝试实际触摸该内存并出现页面错误之前无需阻止).
或者对于BSS内存,多个逻辑页面可能会开始写入映射到零的相同物理页面的写入时复制.尽管根据Unix语义,您的内存是读写的,但页表实际上只具有只读映射.编写页面会出现页面错误,内核会在新的零物理页面指向该条目,然后在出现故障的指令返回到您的进程(然后将重新运行并成功).
无论如何,这并不直接回答你的问题,但可能是你真正想要的一部分.如果你想深入了解,那么确实可以看到实际的页面表,但通常不需要这样做. smaps可以告诉你有多少映射驻留在内存中.
有关字段含义的详细信息,另请参见what does pss mean in /proc/pid/smaps.
顺便说一句,请参阅Why in 64bit the virtual address are 4 bits short (48bit long) compared with the physical address (52 bit long)?,了解4级页表格式的漂亮图表(以及2M / 1G大页面如何适应).
标签:x86,linux,assembly,memory-management,virtual-memory 来源: https://codeday.me/bug/20190828/1749713.html