
本文介绍 Linux 内核 Makefiles 的一些基础内容。
Makefiles 包括:
Linux 内核顶层的 Makefile 文件递归访问内核源代码的子目录。
每个子目录都有一个 kbuild Makefile 文件,根据 .config 文件内容构建内置或模块化目标。
arch/$(ARCH)/Makefile 文件向顶层 Makefile 提供特指定的体系结构信息。
scripts/Makefile.* 文件定义了 kbuild Makefile 构建内核的所有定义和规则等。
Linux 内核编译完成后,最终生成 vmlinux 和 modules 。
Linux 内核中的大多数 Makefile 都使用 kbuild 基础结构, kbuild 文件的首选名称是 Makefile 。如果 Makefile 和 kbuild 文件都存在,则使用 kbuild 文件。
目标定义是 kbuild Makefile 里的核心部分,定义了要构建的文件、特殊的编译选项和递归输入的任何子目录。
例:
kbuild Makefile 将编译所有 $(obj-y) 文件,然后调用 $(AR)rcSTP 将这些文件合并到 built-in.a 文件中。
built-in.a 中不包括符号表,稍后将通过 scripts/link-vmlinux.sh 脚本链接到 vmlinux 文件中。
在 Linux 内核引导期间,将按照链接顺序调用某些函数(例: module_init() 等)。
参考:
Documentation/kbuild/makefiles.txt
在Linux内核中,使用 vmlinux.lds.S 文件(路径: arch/arm64/kernel/ )布局内核映像中相关段(例: .text、.data )的位置。
在Linux内核编译时, vmlinux.lds.S 文件最终会被构建成链接脚本 vmlinux.lds 文件(路径: arch/arm64/kernel/ )。
本文主要介绍Linux内核程序运行的起始位置 _text ,在 vmlinux.lds.S 文件中定义如下:
从上面可以看出: _text = KIMAGE_VADDR + TEXT_OFFSET 。
1、KIMAGE_VADDR定义
文件: arch/arm64/include/asm/memory.h ,定义如下:
文件: include/linux/sizes.h ,定义如下:
宏 KIMAGE_VADDR 展开如下:
上面是按照无符号计算, KIMAGE_VADDR 为: 0xFFFFFF8008000000 。
2、TEXT_OFFSET定义
文件: arch/arm64/Makefile ,定义如下:
通过计算, _text 值为: 0xFFFFFF8008080000 。
在Linux内核启动时,从 log 信息中也可以找到对应的地址:
_text 对应的是虚拟地址 , 在内核中可以直接通过访问该地址获取其保存的值 ,其对应 Image 映像中的第一个字 0x14424000 。
Image 映像查看方法如下:
本文基于 RockPI 4A 单板Linux 4.4内核。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)