233|2

468

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

《Linux内核深度解析》--U-Boot内核引导与初始化 [复制链接]

本帖最后由 dirty 于 2024-12-31 21:09 编辑

      本篇学习与笔记梳理U-Boot内核引导与初始化。

      处理器上电以后,首先执行引导程序,引导程序把内核加载到内存,然后执行内核内核初始化完成以后,启动用户空间的第一个进程。

      处理器在上电时自动把程序计数器设置为处理器厂商设计的某个固定值,对于ARM64处理器,这个固定值是0。处理器的内存管理单元(Memory Management Unit,MMU)负责把虚拟地址转换为物理地址。嵌入式设备通常使用NOR闪存作为只读存储器来存放引导程序。NOR闪存的容量比较小,最小读写单位是字节,程序可以直接在芯片内执行。从物理地址0开始的一段物理地址空间被分配给 NOR 闪存。

引导程序

      嵌入式设备通常使用 U-Boot 作为引导程序。U-Boot(Universal Boot Loader)是德国DENX软件工程中心开发的引导程序,是遵循GPL条款的开源项目。下面是U-Boot获取地址U-Boot资源可在GitLab克隆获取https://source.denx.de/u-boot/u-boot.git ,可以看到一直有更新和维护。

      鉴于该书出于2017年,选用当时U-Boot版本,这里引用@beyond_笑谈网友u-boot-2017.09.tar,也可以在上面history里搜寻查找。我们在Ubuntu下解压,tar -xvpjf u-boot-2017.09.tar.bz2,解压后如下:

      ARM64 处理器的 U-Boot 程序的执行过程,入口是文件“archarm/cfarmv8/start.S”定义的标号 start。

      这里对照 U-Boot源码与书籍,书籍中关键地方代码作了中文注释,且源文件路径也会在代码讲解前表明,很是便于读者阅读理解。上面可以看到,标号 start 是 U-Boot程序的入口,直接跳转到标号reset 执行。

 

      第二阶段程序加载器。U-Boot 分为 SPL 和正常的 U-Boot程序两个部分,如果想要编译为 SPL,需要开启配置宏CONPIG_SPL_BUILD。SPL是“Secondary Program Loader”的简称,即第二阶段程序加载器,第二阶段是相对于处理器里面的只读存储器中的固化程序来说的,处理器启动时最先执行的是只读存储器中的固化程序。

      U-Boot 程序初始化完成后,准备处理命令,这是通过数组 init sequencer的最后一个函数 run main loop实现的。

      上面讲了内核引导,下面是内核初始化部分。

 

内核初始化

      内核初始化分为汇编语言部分和C语言部分。

      汇编语言部分,ARM64架构的内核的入口是标号_head,直接跳转到标号stext。

      内核初始化的C语言部分入口是函数start kermel,函数 start_kernel首先初始化基础设施,即初始化内核的各个子系统,然后调用函数rest_init。

 

init 进程

      init 进程是用户空间的第一个进程,负责启动用户程序。Linux系统常用的imnit程序有sysvinit、busybox init、upstart、systemd和 procd。

 

      通过资源准备与对照概述梳理学习,对内核引导与初始化有了整体认识和进一步深入了解。代码部分主要涉及使用汇编语言,会略有些晦涩,参考书籍代码解说和流程说明,加强认识与理解,对细节部分可以按需研究理解。整体来说,对深入了解Linux内核很有助益。

 

最新回复

代码部分主要涉及使用汇编语言,不是会略有些晦涩,而是就是晦涩,哈哈   详情 回复 发表于 3 天前
点赞 关注

回复
举报

6731

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

代码部分主要涉及使用汇编语言,不是会略有些晦涩,而是就是晦涩,哈哈

点评

哈哈  详情 回复 发表于 3 天前
 
 

回复

468

帖子

0

TA的资源

纯净的硅(初级)

板凳
 
Jacktang 发表于 2024-12-30 07:28 代码部分主要涉及使用汇编语言,不是会略有些晦涩,而是就是晦涩,哈哈

哈哈

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/5 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表