正点原子[第三期]Arm(iMX6U)Linux移植学习笔记-12.1 Linux内核启动流程简介

 前言:

本文是根据哔哩哔哩网站上“Arm(iMX6U)Linux系统移植和根文件系统构键篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。

引用:

正点原子IMX6U仓库 (GuangzhouXingyi) - Gitee.com

《【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.5.2.pdf》

正点原子资料下载中心 — 正点原子资料下载中心 1.0.0 文档

正点原子imx6ull-mini-Linux驱动之Linux I2C 驱动实验(21)-CSDN博客

正文:

本文是 “Arm(iMX6U)Linux系统移植和根文件系统构键篇--9 Linux内核编译和体验。本节将参考正点原子的视频教程和配套的正点原子开发指南文档进行学习。

0. 概述

看完 Linux 内核的顶层 Makefile 以后再来看 Linux 内核的大致启动流程, Linux 内核的启动流程要比 uboot 复杂的多,涉及到的内容也更多,因此本章我们就大致的了解一下 Linux 内核的启动流程。

1 链接脚本 vmlinux.lds

要分析 Linux 启动流程,同样需要先编译一下 Linux 源码,因为有很多文件是需要编译才会生成的。首先分析 Linux 内核的连接脚本文件 arch/arm/kernel/vmlinux.lds,通过链接脚本可以找到 Linux 内核的第一行程序是从哪里执行的。 vmlinux.lds 中有如下代码:

arch/arm/kernel/vmlinux.lds

 第 493 行的 ENTRY 指明了了 Linux 内核入口,入口为 stext, stext 定义在文件arch/arm/kernel/head.S 中 , 因 此 要 分 析 Linux 内 核 的 启 动 流 程 , 就 得 先 从 文 件arch/arm/kernel/head.S 的 stext 处开始分析。

arch/arm/kernel/head.S

 2 Linux 内核启动流程分析

2.1 Linux 内核入口 stext

stext 是 Linux 内核的入口地址,在文件 arch/arm/kernel/head.S 中有如下所示提示内容:

根据示例代码 36.2.1.1 中的注释, Linux 内核启动之前要求如下:

①、关闭 MMU。
②、关闭 D-cache。
③、 I-Cache 无所谓。
④、 r0=0。
⑤、 r1=machine nr(也就是机器 ID)。
⑥、 r2=atags 或者设备树(dtb)首地址。

Linux 内核的入口点 stext 其实相当于内核的入口函数, stext 函数内容如下:

 第 92 行,调用函数 safe_svcmode_maskall 确保 CPU 处于 SVC 模式,并且关闭了所有的中断。 safe_svcmode_maskall 定义在文件 arch/arm/include/asm/assembler.h 中。

第 94 行,读处理器 ID, ID 值保存在 r9 寄存器中。

第 95 行,调用函数__lookup_processor_type 检查当前系统是否支持此 CPU,如果支持就获取 procinfo 信 息 。 procinfo 是 proc_info_list 类 型 的 结 构 体 , proc_info_list 在 文 件arch/arm/include/asm/procinfo.h 中的定义如下:

Linux 内核将每种处理器都抽象为一个 proc_info_list 结构体,每种处理器都对应一个procinfo。因此可以通过处理器 ID 来找到对应的 procinfo 结构, __lookup_processor_type 函数找到对应处理器的 procinfo 以后会将其保存到 r5 寄存器中。

继续回到示例代码 36.2.1.2 中,第 121 行,调用函数__vet_atags 验证 atags 或设备树(dtb)的合法性。函数__vet_atags 定义在文件 arch/arm/kernel/head-common.S 中。

第 128 行,调用函数__create_page_tables 创建页表。

第 137 行,将函数__mmap_switched 的地址保存到 r13 寄存器中。 __mmap_switched 定义在文件 arch/arm/kernel/head-common.S__mmap_switched 最终会调用 start_kernel 函数

第 144 行 , 调 用 __enable_mmu 函 数 使 能 MMU , __enable_mmu 定 义 在 文 件arch/arm/kernel/head.S 中。 __enable_mmu 最终会通过调用__turn_mmu_on 来打开 MMU,__turn_mmu_on 最后会执行 r13 里面保存的__mmap_switched 函数。

2.2 __mmap_switched 函数

__mmap_switched 函数定义在文件 arch/arm/kernel/head-common.S 中,函数代码如下:

第 104 行最终调用 start_kernel 来启动 Linux 内核, start_kernel 函数定义在文件 init/main.c中。

init/main.c

 2.3 start_kernel 函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/84136.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UDP与TCP通信协议技术解析

文章目录 协议基础原理TCP:可靠的面向连接通信UDP:高效的无连接通信 性能特征分析TCP性能表现UDP性能表现 应用场景分析TCP适用场景UDP适用场景 技术实现考量错误处理策略网络资源利用 选择决策框架可靠性需求评估性能要求分析 混合方案设计协议组合策略…

mysql 页的理解和实际分析

目录 页(Page)是 Innodb 存储引擎用于管理数据的最小磁盘单位B树的一般高度记录在页中的存储 innodb ibd文件innodb 页类型分析ibd文件查看数据表的行格式查看ibd文件 分析 ibd的第4个页:B-tree Node类型先分析File Header(38字节-描述页信息…

【优选算法】C++滑动窗口

1、长度最小的子数组 思路&#xff1a; class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {// 滑动窗口// 1.left0,right0// 2.进窗口( nums[right])// 3.判断// 出窗口// (4.更新结果)// 总和大于等于 target 的长度最小的 子数组…

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…

408考研逐题详解:2009年第33题

2009年第33题 在 OSI 参考模型中&#xff0c;自下而上第一个提供端到端服务的层次是&#xff08; &#xff09; A. 数据链路层 \qquad B. 传输层 \qquad C. 会话层 \qquad D.应用层 解析 本题主要考查 OSI 参考模型各层的核心功能、端到端服务的定义。 OSI 参考模型&am…

CentOS 7.9安装Nginx1.24.0时报 checking for LuaJIT 2.x ... not found

Nginx1.24编译时&#xff0c;报LuaJIT2.x错误&#xff0c; configuring additional modules adding module in /www/server/nginx/src/ngx_devel_kit ngx_devel_kit was configured adding module in /www/server/nginx/src/lua_nginx_module checking for LuaJIT 2.x ... not…

自制喜悦字贴

一、想法 据说&#xff0c;把“喜悦”两个字挂在家里显眼的地方&#xff0c;时常看到&#xff0c;就能心情愉悦。刚好最近在学习前端flex布局&#xff0c;用代码实现&#xff0c;导出图片&#xff0c;打印出来&#xff0c;帖在家里&#xff0c;非常nice。现在分享给大家。 二…

每日八股文6.3

每日八股-6.3 Mysql1.COUNT 作用于主键列和非主键列时&#xff0c;结果会有不同吗&#xff1f;2.MySQL 中的内连接&#xff08;INNER JOIN&#xff09;和外连接&#xff08;OUTER JOIN&#xff09;有什么主要的区别&#xff1f;3.能详细描述一下 MySQL 执行一条查询 SQL 语句的…

量化面试绿皮书:6. 烧绳子计时

文中内容仅限技术学习与代码实践参考&#xff0c;市场存在不确定性&#xff0c;技术分析需谨慎验证&#xff0c;不构成任何投资建议。 6. 烧绳子计时 你有两根绳子&#xff0c;每根绳子燃烧需要1小时。但是任何一根绳子在不同点都有不同的密度&#xff0c;所以不能保证绳子内不…

2-深度学习挖短线股1

选短线个股的流程 &#xff08;1&#xff09;数据预处理&#xff0c;根据短线个股筛选标准&#xff0c;给个股日线数据打标。 &#xff08;2&#xff09;模型训练&#xff0c;针对每只股票&#xff0c;训练得到分类模型。 &#xff08;3&#xff09;结果预测&#xff0c;根据训…

【数据分析】探索婴儿年龄变化对微生物群落(呼吸道病毒和细菌病原体)结构的影响

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍1. 混合效应逻辑回归模型2. 随机森林模型3. Maaslin2 分析加载R包数据下载导入数据数据预处理混合效应逻辑回归模型分析微生物群落结构随年龄的变化随机森林模型预测病原体定植Maas…

实战:子组件获取父组件订单信息

最佳实践建议 优先使用 props&#xff1a;适合父子组件直接通信&#xff0c;数据流向清晰复杂场景用 eventBus&#xff1a;跨组件通信推荐使用 mitt 库避免过度使用 $parent&#xff1a;会导致组件耦合度高&#xff0c;难以维护provide/inject 适用于跨层级&#xff1a;如主题…

Spring Security深度解析:构建企业级安全框架

Spring Security深度解析:构建企业级安全框架 本文将深入探讨Spring Security安全框架的核心原理、架构设计和实际应用,帮助开发者全面掌握企业级应用安全防护技术。 目录 Spring Security概述核心架构与原理认证机制详解授权机制详解核心组件分析配置与集成高级特性应用安全…

计算矩阵A和B的乘积

根据矩阵乘法规则&#xff0c;编程计算矩阵的乘积。函数fix_prod_ele()是基本方法编写&#xff0c;函数fix_prod_opt()是优化方法编写。 程序代码 #define N 3 #define M 4 typedef int fix_matrix1[N][M]; typedef int fix_matrix2[M][N]; int fix_prod_ele(f…

《Brief Bioinform》: 鼠脑单细胞与Stereo-seq数据整合算法评估

一、写在前面 基因捕获效率、分辨率一直是空间转录组细胞类型识别的拦路虎&#xff0c;许多算法能够整合单细胞(single-cell, sc)或单细胞核(single-nuclear, sn)数据与空间转录组数据&#xff0c;从而帮助空转数据的细胞类型注释。此前我们介绍过近年新出炉的Stereo-seq平台&…

camera功能真的那么难用吗

背景 Android开发工作过程中&#xff0c;经常需要用到camera相关能力&#xff0c;比如&#xff1a;人脸识别&#xff0c;ai识别&#xff0c;拍照预览&#xff0c;摄像头录制等等需求。都需要使用到camera&#xff0c;且需要拿到camera的预览数据。但是每次开发这块代码都比较繁…

USART 串口通信全解析:原理、结构与代码实战

文章目录 USARTUSART简介USART框图USART基本结构数据帧起始位侦测数据采样波特率发生器串口发送数据 主要代码串口接收数据与发送数据主要代码 USART USART简介 一、USART 的全称与基本定义 英文全称 USART&#xff1a;Universal Synchronous Asynchronous Receiver Transmi…

LeetCode 152. 乘积最大子数组 - 动态规划解法详解

文章目录 问题描述解题思路动态规划状态定义状态转移方程完整代码实现复杂度分析示例解析关键点说明总结问题描述 给定一个整数数组 nums,请找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组对应的乘积。 示例: 输入: [2,3,-2,4] 输出: 6 解…

Python: 操作 Excel折叠

💡Python 操作 Excel 折叠(分组)功能详解(openpyxl & xlsxwriter 双方案) 在处理 Excel 报表或数据分析时,我们常常希望通过 折叠(分组)功能 来提升表格的可读性和组织性。本文将详细介绍如何使用 Python 中的两个主流 Excel 操作库 —— openpyxl 和 xlsxwriter …

28、元组的遍历

const_cast 只能用于指针或引用类型&#xff0c;而不能用于基本类型如 int。 在的代码中&#xff0c;试图将 i 转换为 const_cast<int>(i)&#xff0c;这是不合法的。 可以使用模板函数来获取元组中的元素&#xff0c;而不是使用 const_cast。以下是修正后的代码&#x…