
Linux内核之启动流程
文章平均质量分 68
qxqxa
meizuo
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
linux内核编译流程、驱动加载顺序
根据这个展开 vmlinux-deps := arch/$(SRCARCH)/kernel/vmlinux.lds (head-y init-y core-y libs-y2 drivers-y net-y virt-y libs-y1)上面的xxxx-y就是,每个目录生成的各.o文件集合,会被打包成一个个built-in.a。原创 2024-07-03 17:37:48 · 738 阅读 · 0 评论 -
ARM64的KASLR分析
上述操作执行完_text变了,kimage_vaddr(_text - TEXT_OFFSET)也就跟着变了,kimage_voffset也就成了虚拟地址转物理地址函数的实际偏移了,就可以通过start_kernel进内核的C语言部分了。3.分配完的地址跟编译时的链接地址不一样了,所以需要重定位内核镜像---对符号地址进行重定位,校正内核代码的符号寻址,以此确保内核代码的正常执行。,介绍了kimage_voffset,就是运行时的内核的虚拟地址跟物理地址映射的真实偏移,不管经过与否kaslr。原创 2024-05-28 17:02:04 · 669 阅读 · 0 评论 -
linux内核符号表
所以arm架构,如果是1/3的内核和用户空间的分配的话;内核在编译过程中生成的System.map与proc/kallsyms的区别在于System.map是在编译阶段生成的内核符号表,我们可以称为静态Linux内核符号表,而proc/kallsyms方式看到的是在内核启动后生成的动态符号表。对于ARM构架的设备,模块挂载后,模块中包含的函数和静态变量的虚拟地址不在3G(0xC0000000)以上,而是3G以下一点的位置,可能以0xBF000000开始。直接虚拟地址偏移 + 物理内存起始地址。原创 2024-05-24 16:50:43 · 456 阅读 · 0 评论 -
内核启动时的各参数详解
TEXT_OFFSET 通常为 0x8000,因此解压后的内核将位于物理内存起始地址 + TEXT_OFFSET。内核的.config文件里会有如下一些启动选项,来控制内核的启动,比如传参是通过dtb,还是atags,还是两种方式一起组合;PAGE_OFFSET一般就是内核空间的起始地址,对于不同架构,不同内核版本,也是差异的,并不是一个固定的值;内核会通过将 PC 寄存器进行 128MB 的对齐的方式来获得物理内存的起始地址,内核总是假设它是在物理内存的第一块的第一部分加载和执行。原创 2024-01-14 10:25:36 · 1566 阅读 · 0 评论 -
简述start_kernel每个函数的作用
每个函数具体干了什么,还是得进去看代码,以下只是很大概的一个总结。原创 2023-09-12 17:34:07 · 174 阅读 · 0 评论 -
内核启动之从汇编到C环境
_mmap_switched在__cpu_setup为开启处理器的MMU做准备,和__enable_mmu之后,搭建了c语言环境后,将设备树地址,给物理内存起始地址保存到对应寄存器后,就通过start_kernel进入C的世界了。我们一个一个看,首先preserve_boot_args,我们可以看到会保存x0-x3共4个寄存器的值到boot_args中,目前我们暂时只关注x0,这个是dtb的物理地址,这个是后续直接就会用到的。1.将.o文件链接成一个整体,那么各符号的相对位置也就确定下来了。原创 2023-09-02 22:31:41 · 288 阅读 · 0 评论 -
bootrom是什么?
但是对于一般的arm64处理器来说,要运行大型系统,就需要bootrom来引导系统启动了:简单来说,处理器上电后,就会根据程序计数器(pc)去取第一条指令,译码,然后执行;如下图对应不同启动模式的不同sp,pc值,这个是由硬件决定的,上电后,cpu就会通过总线,去到对应地址去取指令,译码,并执行。所以总结下,bootrom就是处理器上电后,最先启动的一段代码,可根据不同的启动模式(硬件拨码)去不同的存储设备取bootlaoder,并执行bootloader来做后续的启动系统的工作。原创 2023-03-25 18:51:24 · 6222 阅读 · 0 评论