加载linux内核的基地址

时间:2015-11-07 04:01:56

标签: linux linux-kernel kernel-module elf virtual-memory

我对内核如何加载到内存中有一些疑问。检查/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
  1. 有什么方法可以找到加载内核的基地址吗?
  2. 在用户空间中,假设我使用一个libc,假设puts函数的偏移量为0x200。当我在地址0x8048000加载到内存中时,我可以在puts找到已解决的0x8048000 + 0x200。内核也一样吗?即内核图像是作为1个连续.text部分加载到内存中的?

5 个答案:

答案 0 :(得分:1)

MIPS 架构

file Platform 包含分配了物理地址空间位置的字段/变量“load -...”。

示例:

的OpenWrt / build_dir /目标mips_mips32_musl-1.1.16 / Linux的brcm63xx_smp / Linux的4.4.14 /拱/ MIPS / bcm63xx /平台

#
# Broadcom BCM63XX boards
#
platform-$(CONFIG_BCM63XX)  += bcm63xx/
cflags-$(CONFIG_BCM63XX)    +=                  \
    -I$(srctree)/arch/mips/include/asm/mach-bcm63xx/
load-$(CONFIG_BCM63XX)      := 0xffffffff80010000

ARM 架构

file Makefile.boot 包含分配了物理地址空间位置的字段/变量“zreladdr-y”。

示例:

的OpenWrt / build_dir /目标mips_mips32_musl-1.1.16 / Linux的brcm63xx_smp / Linux的4.4.14 /拱/臂/马赫 - omap1 / Makefile.boot

   zreladdr-y       += 0x10008000
params_phys-y       := 0x10000100
initrd_phys-y       := 0x10800000

Microblaze 架构

file Makefile 包含分配了物理地址空间中的位置(从Xilinx ISE导出)的字段/变量“UIMAGE_LOADADDR”。

示例:

的OpenWrt / build_dir /目标mips_mips32_musl-1.1.16 / Linux的brcm63xx_smp / Linux的4.4.14 /拱/ MicroBlaze的/引导/生成文件

UIMAGE_LOADADDR = $(CONFIG_KERNEL_BASE_ADDR)

答案 1 :(得分:1)

正如其他答案所述,内核基址对于特定架构是固定的。但由于许多安全问题,内核开发社区决定将其随机化。它被称为ASLR(地址空间布局随机化)。

通过阅读您的问题(或因为我在2017年阅读它),您可能正在尝试查找ASLR(或KASLR for kernel)中使用的偏移量。

KASLR offset = address of symbol loaded in memory - address of symbol present in binary.

正如您的问题所述,您已经知道/proc/kallsyms内存中符号的地址。

我们可以使用nm实用程序和vmlinux文件找到二进制符号的地址。

nm vmlinux | grep do_IPI

这将在vmlinux文件中打印符号do_IPI的地址。减去这两个地址将为您提供KASLR偏移。

答案 2 :(得分:0)

内核加载在 1MiB 的物理地址上,该地址映射在PAGE_OFFSET + 0x00100000(虚拟地址)上。通常8MiB的虚拟空间是从PAGE_OFFSET + 0x00100000

开始为内核映像保留的

答案 3 :(得分:0)

如果您使用的是u-boot,则在引导时,bootloader通常会打印内核加载地址和入口点。

Erase Group Size: 512 Bytes
reading uImage
4670784 bytes read in 469 ms (9.5 MiB/s)
reading devicetree.dtb
20597 bytes read in 17 ms (1.2 MiB/s)
Booting Linux kernel with ramdisk and devicetree
## Booting kernel from Legacy Image at 02004000 ...
   Image Name:   Linux-4.9.0-xilinx
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    4670720 Bytes = 4.5 MiB
   Load Address: 10000000
   Entry Point:  10000000
   Verifying Checksum ... OK
## Flattened Device Tree blob at 04000000
   Booting using the fdt blob at 0x4000000
   Loading Kernel Image ... OK
   Loading Device Tree to 1cb3d000, end 1cb45074 ... OK

Starting kernel ...

答案 4 :(得分:-1)

对于此ARM内核,加载地址为0x80008000。此外,内核以连续的方式加载。