Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 为什么内核代码会在加载时更改?指针地址是否在加载时更改?_Assembly_Memory_Linux Kernel - Fatal编程技术网

Assembly 为什么内核代码会在加载时更改?指针地址是否在加载时更改?

Assembly 为什么内核代码会在加载时更改?指针地址是否在加载时更改?,assembly,memory,linux-kernel,Assembly,Memory,Linux Kernel,我从内存中获取内核代码,从磁盘获取zmlinuz(vmlinuz)文件。我将vmlinuz解压为elf文件,并比较了内存和磁盘文件的代码部分。 我发现内存中的代码有点变化。 内存中的代码和磁盘上的代码之间的更改是指向字符串的指针。 红方块中的下图显示了变化: 值“02 82”更改为“62 a8” 所有代码更改的偏移量都是固定的(0x6026)。 我想知道为什么会发生这种变化?elf文件中是否有映射到进行此更改的所有位置? 内核加载器如何知道在哪里更改地址 谢谢您是否在问为什么ELF文件上的地址

我从内存中获取内核代码,从磁盘获取zmlinuz(vmlinuz)文件。我将vmlinuz解压为elf文件,并比较了内存和磁盘文件的代码部分。 我发现内存中的代码有点变化。 内存中的代码和磁盘上的代码之间的更改是指向字符串的指针。 红方块中的下图显示了变化:

值“02 82”更改为“62 a8”

所有代码更改的偏移量都是固定的(0x6026)。 我想知道为什么会发生这种变化?elf文件中是否有映射到进行此更改的所有位置? 内核加载器如何知道在哪里更改地址


谢谢

您是否在问为什么ELF文件上的地址与内存中的地址不同?这是正常的重新定位,出于安全目的,内核地址空间可以/被随机化。ELF拥有加载程序在选择随机加载地址后修补代码所需的所有信息。ELF包括一种存储重定位条目表的方法。你会在用户空间中看到同样的东西,比如global
void*p=p
在饼图可执行文件(指向自身的静态初始化指针)中,或在手写asm
mov rax中,偏移一些_符号
以获得具有绝对地址的
mov r64,imm64
。内核代码可以使用符号扩展imm32重定位,因为它加载在高2GiB的虚拟地址空间中。@DinDan内核文件包含一个重定位表,其中列出了所有这些更改。它们在内核加载时被解析。请尝试
objdump-rvmlinux
列出它们。@fuz引导到内核时,没有加载程序来解决重定位问题。内核是在引导加载程序之后运行的第一个东西,它会解压并重新定位自身。@0andriy是的,这就是我的意思,它不是外部的,它嵌入内核本身,不是我们都知道的“常用”加载程序。