【发布时间】:2016-02-08 07:41:12
【问题描述】:
我对内核如何加载到内存有一些疑问。通过检查/proc/kallsyms,我能够找到内核中各种符号的地址。
$ cat /proc/kallsyms | head -n 10
00000000 t __vectors_start
80008240 T asm_do_IRQ
80008240 T _stext
80008240 T __exception_text_start
80008244 T do_undefinstr
80008408 T do_IPI
8000840c T do_DataAbort
800084a8 T do_PrefetchAbort
80008544 t gic_handle_irq
800085a0 T secondary_startup
- 有什么方法可以找到内核加载的基地址吗?
- 在用户空间中,假设我使用了一个带有
puts函数的libc,偏移量为0x200。当以地址0x8048000加载到内存中时,我将能够在0x8048000 + 0x200找到已解析的puts。内核也一样吗?即内核映像是否作为 1 个连续的.text部分加载到内存中?
【问题讨论】:
-
你了解物理地址和虚拟地址的区别吗?
-
@IgnacioVazquez-Abrams 物理地址,例如:80008240(实际 RAM 地址)。虚拟地址,例如:0x08048000,需要翻译。我错过了什么吗?
-
是的。内核在启动时加载到一个物理位置,并在运行时映射到系统上每个进程的另一个虚拟位置。
-
@IgnacioVazquez-Abrams 这并不完全正确 - 内核在 can 时随机分配内核的基本物理地址(解压缩的位置)。
标签: linux linux-kernel kernel-module elf virtual-memory