linux 内核入口地址,Linux内核程序入口地址

在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内核。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值