在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内核。
1、先是输入账号密码进入centos7。
2、进入系统后,先用 pwd 命令查看一下当前所在的目录。
3、切换文件目录使用的命令是 cd ,如图命令 cd / 就是切换到根目录。
4、在根目录下用 ls 命令查看该目录下有哪些文件,查看后,用绝对路径的方式进入usr目录中,命令为 cd /usr。
5、进入usr目录后,用ls查看一下usr下有什么文件。
6、想用绝对路径进入usr下的local目录,使用cd /usr/local , 如果使用 cd /local 是会报错说找不到该目录的。
linux下的内核头文件放在/usr/include/linux/和/usr/include/sys/linux目录树:scripts目录该目录中不包含任何核心代码,该目录下存放了用来配置内核的脚本和应用程序源码。lib目录该目录主要包含两部分内容:gnuzip解压缩算法,用于在系统启动过程中将压缩的内核镜像解压缩;剩余的文件用于实现一个C库的子集,主要包括字符串和内存 *** 作等相关函数。mm目录该目录包含了体系结构无关的内存管理代码,包括通用的分页模型的框架、伙伴算法的实现和对象缓冲器slab的实现代码。include目录这个目录包含了Linux源代码目录树中绝大部分头文件,每个体系架构都在该目录下对应一个子目录,该子目录中包含了给定体系结构所必需的宏定义和内联函数。init目录该目录中存放的是系统核心初始化代码,内核初始化入口函数start_kernel就是在该目录中的文件main.c内实现的。kernel目录该目录中存放的是Linux内核的最核心的代码,用于实现系统的核心模块,这些模块包括:进程管理、进程调度器、中断处理、系统时钟管理、同步机制等。arch目录该目录中的每个子目录中都与某种体系结构相对应,用于存放体系结构相关代码,向平台无关的系统核心模块提供所需的功能接口。每个体系结构对应的子目录下通常至少包含以下几个子目录:kernel子目录、lib子目录、mm子目录、boot子目录。系统次核心组件包括:block目录:用于实现块设备的基本框架和块设备的I/O调度算法。usr目录:该目录中的代码为内核尚未完全启动时执行用户空间代码提供了支持ipc目录:该目录中的文件用于实现SystemV的进程间通信模块。driver目录:用于存放各类设备的驱动程序。sound目录:存放了声音系统架构,如OpenSoundSystem(OSS)、AdvancedLinuxSoundArchitecture(ALSA)的相关代码和具体声卡的设备驱动程序。security目录:存放了Security-EnhancedLinux(SELinux)安全框架的实现代码crypto目录:该目录中存放了相关的加密算法的代码。Documentation目录:存放了与内核相关的文档。net和fs目录:包含linux内核支持的众多网络协议和文件系统。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)