linux 内核位置 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文件中定义如下:
从上面可以看出: _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内核。
linux内核配置与编译时,下载来的内核源代码应该放在哪呢
随便就行,/usr/src/linux放当前运行中的内核源代码的习惯你可以遵守,也可以不遵守。
只不过是一些软件在编译时会固定到这里找内核源代码的相关数据来保证自己的内核模块可以正确编译。不过有些时候/usr/module里面的内核目录里面也有到你的源代码目录的链接。很多软件两个地方找到一个就能继续编译。
反正你安装内核后,最好不要再动这个内核源代码的位置就行了。其实需要内核源代码的软件也没几个。除了 udev,我也就只能想起还有显卡驱动了。另外你如果用了虚拟机软件,那就还有虚拟机软件运行时需要的内核模块需要。不过也都是在编译时才需要。运行是不需要的(但改了内核版本,肯定是要重新编译内核模块的)。
iphone的内核镜像存放在 /kernel 目录吗
当PC启动时,Intel系列的CPU首先进入的是实模式,并开始执行位于地址0xFFFF0处
的代码,也就是ROM-BIOS起始位置的代码。BIOS先进行一系列的系统自检,然后初始化位
于地址0的中断向量表。最后BIOS将启动盘的第一个扇区装入到0x7C00,并开始执行此处
的代码。这就是对内核初始化过程的一个最简单的描述。
最初,linux核心的最开始部分是用8086汇编语言编写的。当开始运行时,核心将自
己装入到绝对地址0x90000,再将其后的2k字节装入到地址0x90200处,最后将核心的其余
部分装入到0x10000。
当系统装入时,会显示Loading...信息。装入完成后,控制转向另一个实模式下的汇
编语言代码boot/Setup.S。Setup部分首先设置一些系统的硬件设备,然后将核心从
0x10000处移至0x1000处。这时系统转入保护模式,开始执行位于0x1000处的代码。
接下来是内核的解压缩。0x1000处的代码来自于文件Boot/head.S,它用来初始化寄
存器和调用decompress_kernel()程序。decompress_kernel()程序由Boot/inflate.c,
Boot/unzip.c和Boot../misc.c组成。解压缩后的数据被装入到了0x100000处,这也是
linux不能在内存小于2M的环境下运行的主要原因。
解压后的代码在0x1010000处开始执行,紧接着所有的32位的设置都将完成: IDT、
GDT和LDT将被装入,处理器初始化完毕,设置好内存页面,最终调用start_kernel过程。
这大概是整个内核中最为复杂的部分。