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

linux 内核入口地址,Linux内核程序入口地址相关推荐

  1. linux内核根据skb获取目的mac地址

    linux内核根据skb获取目的mac地址 工作笔记 工作笔记 linux编程 直接通过skb里面的信息获取mac,如下 1.struct ethhdr *eth_hdr = (struct ethh ...

  2. 简述arm linux内核启动流程,Linux内核启动过程和Bootloader(总述)

    1.Linux内核启动过程概述 一个嵌入式 Linux 系统从软件角度看可以分为四个部分:引导加载程序(Bootloader),Linux 内核,文件系统,应用程序.其中 Bootloader是系统启 ...

  3. 编译Linux内核没有zImage,Linux 编译系统的简单介绍与内核编译安装

    这里不只是讲怎样编译.安装Linux内核的,更主要的是介绍内核的编译系统和各个重要的文件.最后还利用学到的编译.安装Linux内核去修改Linux的01调度变成随机调度.如果你只是需要编译.安装内核的 ...

  4. 编译3.0的linux内核,1-3-编译Linux内核

    1-3-编译Linux内核 1.将Linux源码包拷贝到共享文件夹. 2.进入共享文件夹. 3.解压,命令#tar xvfj Kernel_3.0.8_TQ210_for_Linux_v2.2.tar ...

  5. 手机linux内核版本了解,Linux内核版本介绍与查询

    Linux内核版本命名在不同时期有着不同的规范,在涉及到Linux版本问题时经常容易混淆,主线版本/稳定版/长期支持版本经常搞不清楚,本文主要记录下内核版本命名的规则以及如何查看Linux系统版本信息 ...

  6. linux内核 设备列表,Linux 设备树(Device Tree)(转载)

    ARM Device Tree起源 Linus Torvalds在2011年3月17日的ARM Linux邮件列表宣称 "this whole ARM thing is a f*cking ...

  7. 【Linux 内核】编译 Linux 内核 ⑤ ( 查看 .config 编译配置文件 | 正式编译内核 )

    文章目录 一.查看 .config 编译配置文件 二.正式编译内核 一.查看 .config 编译配置文件 在上一篇博客 [Linux 内核]编译 Linux 内核 ④ ( 打开 Linux 内核编译 ...

  8. 【Linux 内核】编译 Linux 内核 ① ( 下载指定版本的 Linux 内核源码 | Linux 内核版本号含义 | 主版本号 | 次版本号 | 小版本号 | 稳定版本 )

    文章目录 一.下载 Linux 内核 1.下载最新版本 Linux 内核 2.下载指定版本 Linux 内核 二.Linux 内核版本号含义 一.下载 Linux 内核 1.下载最新版本 Linux ...

  9. 武汉linux内核好找吗,Linux内核入门

    Linux内核入门 收藏 如何获取Linux内核源代码 下载Linux内核当然要去http://www.kernel.org/了,网站提供了两种文件下载,一种是完整的Linux内核,另一种是内核增量补 ...

  10. linux 内核优化实战,Linux编译优化必须掌握的几个姿势总结

    01.编译选项和内核编译 Linux内核(英语:linux kernel),是一种计算机操作系统内核,已C语言和汇编语言写成,匹配POSIX标准,以GNU通用公共许可证发布.从技术上说Linux只是一 ...

最新文章

  1. VScode配置anaconda虚拟环境+运行
  2. spring-注入对象list
  3. QT的QReadWriteLock类的使用
  4. Zookeeper基于Java 访问-节点权限设置
  5. AJAX Control Toolkit——DropShadow(阴影和圆角框)
  6. 从零开始搭建vue移动端项目到上线的步骤
  7. 【MySQL】MySQL开启general_log报错ERROR 29 (HY000) not found (OS errno 13 - Permission denied)
  8. 互换元素(swap,swap_ranges)
  9. android点击不同次切换不同图片,Android实现简单的上一张、下一张图片切换显示...
  10. 为什么手机里的小爱音响app里搜不到家里的小爱音箱_小爱触屏音箱体验:小爱同学有了屏幕增加功能,是不是你的菜?...
  11. 自抗扰控制的入门学习(一)—— 前言
  12. 【CSS】制作ICO图标
  13. 组织行为学笔记-第一章
  14. 4.6 linux文件系统-虚拟文件系统VFS
  15. 《Qt on Android核心编程》介绍
  16. 当前计算机与医学结合的研究热点,浅谈医学影像技术的现在与未来论文范文
  17. 做 UI 设计用PS还是AI?都不建议!
  18. poj 2152 Fire - 经典树形dp
  19. 离线强化学习(Offline RL)系列3: (算法篇)策略约束 - BRAC算法原理详解与实现(经验篇)
  20. GPS周和周内秒转公历时间 以及 公历时间转GPS周和周内秒 (python版)

热门文章

  1. cs229吴恩达机器学习课件
  2. android蓝牙协议栈bluedroid分析,安卓系统蓝牙协议栈 bluedroid 的使能
  3. Windows下无损分区
  4. 红帽Linux7考题,RHCSA题库-RedHat-7.pdf
  5. 元胞自动机(又称细胞自动机)
  6. 三菱q plc modbus通讯协议详解_三菱PLC串口通讯模块QJ71C24N和MR-JE-A的modbus通讯
  7. Django表单系统
  8. 用计算机画函数图象的软件,自动画出函数图象的软件 真像函数图像绘制器
  9. 数学建模(5.5)相关系数_斯皮尔曼相关系数
  10. Win11添加新的Microsoft Teams集成:共享屏幕变得更容易