Linux内核程序入口地址

2021-05-04  本文已影响0人  小田BSP

在Linux内核中,使用vmlinux.lds.S文件(路径:arch/arm64/kernel/)布局内核映像中相关段(例:.text、.data)的位置。

在Linux内核编译时,vmlinux.lds.S文件最终会被构建成链接脚本vmlinux.lds文件(路径:arch/arm64/kernel/)。

本文主要介绍Linux内核程序运行的起始位置_text,在vmlinux.lds.S文件中定义如下:

    ENTRY(_text)          ## 指定内核程序入口地址
    ...
    . = KIMAGE_VADDR + TEXT_OFFSET; ## 当前地址为KIMAGE_VADDR + TEXT_OFFSET

    .head.text : {
        _text = .;       ## _text为当前地址 
        HEAD_TEXT
    }

从上面可以看出:_text = KIMAGE_VADDR + TEXT_OFFSET

1、KIMAGE_VADDR定义

文件:arch/arm64/include/asm/memory.h,定义如下:

#define VA_BITS         (CONFIG_ARM64_VA_BITS)     ## 39
#define VA_START        (UL(0xffffffffffffffff) - \
    (UL(1) << VA_BITS) + 1)

#define KIMAGE_VADDR        (MODULES_END)
#define MODULES_END         (MODULES_VADDR + MODULES_VSIZE)
#define MODULES_VADDR       (VA_START + KASAN_SHADOW_SIZE)
#define MODULES_VSIZE       (SZ_128M)
#define KASAN_SHADOW_SIZE   (0)

文件:include/linux/sizes.h,定义如下:

#define SZ_128M                         0x08000000

KIMAGE_VADDR展开如下:

((0xffffffffffffffff - (1 << (39)) + 1) + (0)) + (0x08000000)

上面是按照无符号计算,KIMAGE_VADDR为:0xFFFFFF8008000000

2、TEXT_OFFSET定义

文件:arch/arm64/Makefile,定义如下:

TEXT_OFFSET := 0x00080000

通过计算,_text值为:0xFFFFFF8008080000

在Linux内核启动时,从log信息中也可以找到对应的地址:

[    0.000000] Virtual kernel memory layout:
[    0.000000]     modules : 0xffffff8000000000 - 0xffffff8008000000   (   128 MB)
[    0.000000]     vmalloc : 0xffffff8008000000 - 0xffffffbdbfff0000   (   246 GB)
[    0.000000]       .init : 0xffffff8009050000 - 0xffffff8009180000   (  1216 KB)
[    0.000000]       .text : 0xffffff8008080000 - 0xffffff8008c00000   ( 11776 KB)  ##代码段
[    0.000000]     .rodata : 0xffffff8008c00000 - 0xffffff8009050000   (  4416 KB)
[    0.000000]       .data : 0xffffff8009180000 - 0xffffff8009307008   (  1565 KB)
[    0.000000]     vmemmap : 0xffffffbdc0000000 - 0xffffffbfc0000000   (     8 GB maximum)
[    0.000000]               0xffffffbdc0008000 - 0xffffffbdc2000000   (    31 MB actual)
[    0.000000]     fixed   : 0xffffffbffe7fb000 - 0xffffffbffec00000   (  4116 KB)
[    0.000000]     PCI I/O : 0xffffffbffee00000 - 0xffffffbfffe00000   (    16 MB)
[    0.000000]     memory  : 0xffffffc000200000 - 0xffffffc080000000   (  2046 MB)

_text对应的是虚拟地址在内核中可以直接通过访问该地址获取其保存的值,其对应Image映像中的第一个字0x14424000

Image映像查看方法如下:

root@ubuntu:/home/run/code/rockchip-bsp# hexdump -C -n 1000 out/kernel/Image
00000000  00 40 42 14 00 00 00 00  00 00 08 00 00 00 00 00  |.@B.............|
00000010  00 a0 43 01 00 00 00 00  0a 00 00 00 00 00 00 00  |..C.............|
00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000030  00 00 00 00 00 00 00 00  41 52 4d 64 00 00 00 00  |........ARMd....|
00000040  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|

本文基于RockPI 4A单板Linux 4.4内核。

上一篇 下一篇

猜你喜欢

热点阅读