我不确定这个问题应该在这里还是在reverseengineering.stackexchange.com 中
引自维基百科:
在8086处理器中,中断表称为IVT(interrupt vector table)。IVT 始终驻留在内存中的同一位置,范围从 0x0000 到 0x03ff,由 256 个四字节实模式远指针(256 × 4 = 1024 字节内存)组成。
这是我在 qemu 监视器中发现的:
(qemu) xp/128xw 0
0000000000000000: 0xf000ff53 0xf000ff53 0xf000e2c3 0xf000ff53
0000000000000010: 0xf000ff53 0xf000ff53 0xf000ff53 0xf000ff53
0000000000000020: 0xf000fea5 0xf000e987 0xf000d62c 0xf000d62c
0000000000000030: 0xf000d62c 0xf000d62c 0xf000ef57 0xf000d62c
0000000000000040: 0xc0005526 0xf000f84d 0xf000f841 0xf000e3fe
0000000000000050: 0xf000e739 0xf000f859 0xf000e82e 0xf000efd2
0000000000000060: 0xf000d648 0xf000e6f2 0xf000fe6e 0xf000ff53
0000000000000070: 0xf000ff53 0xf000ff53 0xf0006aa4 0xc0008930
0000000000000080: 0xf000ff53 0xf000ff53 0xf000ff53 0xf000ff53
0000000000000090: 0xf000ff53 0xf000ff53 0xf000ff53 0xf000ff53
00000000000000a0: 0xf000ff53 0xf000ff53 0xf000ff53 …Run Code Online (Sandbox Code Playgroud) 启动VirtualBox后,计算机变得迟钝,然后由于OOM而完全挂起。通常,OOM 应该开始杀死进程以释放一些空间,但这并没有发生(这是我第二次遇到这种情况)。
我在文本编辑器中有一些未保存的重要工作,所以我希望在使用SysRq+杀死当前控制台中的所有进程后,在系统 RAM 中找到它K。有问题的机器是具有 8 GiB RAM 的笔记本电脑,运行 Linux x86_64 3.7.5,以 SSD 作为目标磁盘。
我的第一次尝试是dd if=/dev/mem of=memory,但在读取 1MiB 数据后失败了。接下来,我尝试了dd if=/dev/fmem of=memory bs=1M,但在读取 3010461696 字节(正好 2871 MiB)后停止了。在查看/proc/mtrr(如下所示)后,我决定尝试添加skip=4096. 这最终变慢了,读取速度仅为 3 MiB/秒,所以我中断了它(产生了 5.8 GiB 的文件)。(至少文件的最后 100 MiB 包含FFs)
reg01: base=0x000000000 ( 0MB), size= 2048MB, count=1: write-back
reg02: base=0x080000000 ( 2048MB), size= 1024MB, count=1: write-back
reg03: base=0x100000000 ( 4096MB), size= 4096MB, count=1: write-back
reg04: base=0x200000000 ( 8192MB), size= 1024MB, count=1: …Run Code Online (Sandbox Code Playgroud) 让我先说这个问题,我已经找到了很多与我的问题类似但针对 32 位机器的问题的答案。但是,我找不到 64 位机器的任何东西。请不要回答有关 32 位机器的问题。
据对堆栈交换许多来源,/proc/kcore可以从字面上倾倒(例如,使用dd)的文件,以获得的物理内存副本...但是,这显然不适合一个64位的机器,对于这工作/proc/kcore是128TB在尺寸。
顺便说一句,我注意到可以通过/dev/mem. 这是出于安全原因。解决这个问题涉及重新编译内核,我不想这样做......我也不能这样做(我必须使用正在运行的内核)。
好的...所以,/proc/kcore是物理内存的 ELF 核心文件转储,可以使用gdb. 例如,与:
gdb /usr/[blah]/vmlinux /proc/kcore
Run Code Online (Sandbox Code Playgroud)
这个我可以做……但是,这不是我想做的。我想将物理内存导出到文件以进行离线分析。但我遇到了问题。
一方面,我不能只是转储/proc/kcore到一个文件,因为它是 128TB。我想转储所有的物理内存,但我不知道在那里它是/proc/kcore。我只看到非零数据直到字节 3600,然后就我所见(大约 40GB)而言,它全为零。我认为这可能与内存映射到 的方式有关/proc/kcore,但我不了解结构,需要一些指导。
我想我知道的更多东西:我知道只有 48 位用于寻址,而不是 64 位。这意味着应该有 2 48 = 256TB 的可用内存......但/proc/kcore只有 128TB,我认为这是因为寻址被进一步分为从 0x0000000000000000 到 0x00007fffffffffff (128TB) 的块和从 0xffff80000ff0ff (128TB) 到 0xffff8000ff0ff 到 0xffff80000ff0ff 的块. 所以,不知何故,这使得/proc/kcore128TB ......但这是因为这些块之一被映射到/proc/kcore一个不是吗?还是其他什么原因? …