嵌入式Linux 内核启动过程详解(第一阶段:汇编语言部分)

news2024/9/29 7:23:48

目录

概述

1 简述PC Linux 启动过程

2 嵌入式Linux内核启动流程

2.1 嵌入式Linux内核启动分析

2.2 启动Linux内核前的准备

2.3 启动内核第一阶段流程图

3 嵌入式Linux内核启动分析

3.1 链接文件 vmlinux.lds

3.2 启动文件head.S

3.2 启动文件head-common.S


概述

本文主要介绍嵌入式Linux 内核启动(内核版本: linux4.1.15)过程从链接文件进 和运行汇编部分代码的全部过程。笔者对汇编部分代码中重要函数的功能做了详细的介绍。通过流程图的方式,呈现内核启动过程中,在这一部分主要做了哪些工作。

 源代码下载地址:

【免费】NXP官方原版Uboot和Linux资源-CSDN文库

1 简述PC Linux 启动过程

在了解嵌入式Linux的启动过程之前,先了解一下PC Linux 启动过程,其总结如下:

第一阶段:从BOIS----->linux内核

用户打开 PC 的电源时,CPU 将自动进入实模式,并从地址 0xFFFF0 开始自动执行程序代码,这个地址通常是 ROM-BIOS 中的地址。此时 BIOS 进行开机自检,并按 BIOS 中设置的启动设备(通常是硬盘)进行启动。

接着启动设备上安装的引导程序lilo 或 grub 开始引导 Linux(也就是启动设备的第一个扇区),这时,Linux 才获了启动权 。

第二阶段:

Linux boot进行内核的引导,在这个阶段必须完成磁盘引导、读取机器系统数据、实模式和保护模式的切换、加载数据段寄存器以及重置中断描述符表等。

第三阶段:

执行 init 程序(也就是系统初始化工作),init 程序调用了 rc.sysinit 和 rc 等程序,而 rc.sysinit 和 rc 在完成系统初始化和运行服务的任务后,返回 init。

第四阶段:

init启动 mingetty,打开终端供用户登录系统,用户登录成功后进入了Shell,这样就完成了从开机到登录的整个启动过程。

                                                              图1:PC linux启动流程

2 嵌入式Linux内核启动流程

2.1 嵌入式Linux内核启动分析

嵌入式系统由于其复杂和多样性,不可能像PC 一样有一个标准的BIOS。整个系统的启动和初始化过程,必须要由用户来掌控。启动代码部分被称为Bootloader,其主要完成初始化硬件,分配内存映射空间,为linux内核的启动创造运行条件。

Bootloader严重依赖硬件,用户的板卡硬件是多样的,不可能有一个通用的bootloader以支持所有的设备。但对于内核而言,其启动的流程大致相同。嵌入式Linux系统启动的流程如下:

                                                             图2:嵌入式 linux启动流程

2.2 启动Linux内核前的准备

根据图2可知,启动Linux内核前,其实MCU已经做了许多工作,现在对启动内核的准备工作做如下总结:

Step - 1: 初始化MCU内部硬件

设置中断和向量表,屏蔽中断,防止硬件中断打断程序执行配置相关的寄存器,初始化看门狗和堆栈等,为程序运行准备环境。

Step - 2: 运行用户bootloader

这个阶段主要提供面向用户操作功能,包括配置Linux内核启动参数,查看和修改内存,下载根文件系统或者内核文件等

Step - 3: 加载内核

这个工作主要有用户bootloader完成,其将Linux内核复制到内存中进行解压缩,设置指令寄存器的值,指向内核代码的入口,为启动内核做准备。

2.3 启动内核第一阶段流程图

第一阶段也可以被称为内核引导阶段,其主要为内核的启动创造条件。该阶段的执行流程如下:

                                                                  图3:嵌入式 linux内核启动流程

3 嵌入式Linux内核启动分析

笔者使用基于ARM的板卡,芯片型号为i.MX6ULL,Linux内核版本为4.1.15。查看内核源码之前注意,必须编译一次源码,否则,许多链接文件是找不到的。这些文件是在编译代码之后才会产生。

3.1 链接文件 vmlinux.lds

文件路径: kernel/arch/arm/kernel/vmlinux.lds

通过这个链接文件,可以知道ARM系统中的Linux汇编代码入口位置在/arch/arm/kernel/head.S文件中的stext,图中几行代码的功能介绍如下“

代码492行:定义系统的硬件架构为arm内核

代码493行:内核启动的入口为stext

3.2 启动文件head.S

此时CPU的状态

类型状态
MMU关闭
D-cache关闭
I-cache关闭或者带卡
r0等于0
r1保存硬件平台的编号

在内核根目录下:/arch/arm/kernel/head.S, 打开head.S,可以找到stext的原型:

代码81行:确定内核运行BE8模式

代码83行:确定运行的CPU内核是ARM

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

代码 94 行:读处理器 ID, ID 值保存在 r9 寄存器中。 __lookup_processor_type定义在arch/arm/kernel/head-common.S 中。

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

代码 121 行:调用函数vet_atags 验证 atags 或设备树(dtb)的合法性。函数vet_atags 定义在文件 arch/arm/kernel/head-common.S 中。

代码 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 函数。

3.2 启动文件head-common.S

在内核根目录下:arch/arm/kernel/head-common.S

代码 82 行:调用函数mmap_switched_data 。函数mmap_switched_data定义在文件 arch/arm/kernel/head-common.S 中。

代码 104 行:调用函数start_kernel,start_kernel 函数定义在文件 init/main.c中。

该函数主要获取MCU的ID,__lookup_processor_type被/arch/arm/kernel/head.S中的ENTRY(stext)调用

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

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

相关文章

2024蓝桥杯每日一题(哈希)

备战2024年蓝桥杯 -- 每日一题 Python大学A组 试题一:星空之夜 试题二:模拟散列表 试题三:字符串哈希 试题四:四数方和 试题五:扫雷 试题一:星空之夜 【题目描述】 夜空深…

【JavaScript 漫游】【041】File 对象、FileList 对象、FileReader 对象

文章简介 本篇文章为【JavaScript 漫游】专栏的第 041 篇文章,主要对浏览器模型中 File 对象、FileList 对象和 FileReader 对象的知识点进行了简记。 File 对象 File 对象代表一个文件,用来读写文件信息。它继承了 Blob 对象,或者说是一种…

Springboot+vue的四川美食分享网站+数据库+报告+免费远程调试

项目介绍: Springbootvue的四川美食分享网站。Javaee项目,springboot vue前后端分离项目 本文设计了一个基于Springbootvue的前后端分离的四川美食分享网站,采用M(model)V(view)C(controller&am…

计算机视觉之三维重建(3)---单视几何

文章目录 一、问题提出二、无穷远点、无穷远线、无穷远平面2.1 2D空间2.2 3D空间 三、影消点和影消线3.1 2D平面上的无穷远点,无穷远线变换3.2 影消点3.3 影消线 四、单视重构 一、问题提出 1. 当摄像机标定后,内部参数 K K K 已知,外部参数…

界面控件DevExpress ASP.NET Ribbon组件 - 完美复刻Office 365体验!

无论用户是喜欢传统工具栏菜单外观、样式,还是想在下一个项目中复制Office 365 web UI,DevExpress ASP.NET都提供了所需要的工具,帮助用户打造更好的应用程序界面。 P.S:DevExpress ASP.NET Web Forms Controls拥有针对Web表单&a…

JavaWeb -- HTTP -- WEB服务器TOMCAT

一.HTTP介绍: HTTP(Hyper Text Protocol) 实际上是一种超文本传输的协议,规定了浏览器跟服务器之间的一些数据传输的规则 例如B/S 对于浏览器的请求,以及相应服务器的响应,都必须依靠这种协议,规范,才能够彼此之间相互 理解 HTTP的协议特点: 1.基于TCP协议: 面向连接 更加安全…

Vscode初建Vue时几个需要注意的问题

首先放图 注意点1.打开文件夹时,可以是VUE2 或者其他,但不能是VUE,会报错 注意点2.终端输入命令“npm init -y" npm init -y -y 的含义:yes的意思,在init的时候省去了敲回车的步骤,生成的默认的packag…

【目标检测】YOLOv9理论解读与代码分析

前言 YOLO这个系列的故事已经很完备了,比如一些Decoupled-Head或者Anchor-Free等大的策略改动已经在YOLOv8固定下来,后面已经估计只有拿一些即插即用的tricks进行小改。 mmdetection框架的作者深度眸也在知乎上对“是否会有YOLOv9”这一观点发表看法&a…

搞了半天blender整动画这么爽,骨骼重定向一回,动作就可以到处套用,和音频对轨也好使

我们搞到了运动数据(可能是bvh文件,也可能是fbx文件)之后,想要让某个静态的模型动起来。 我们假定用的是Tpose的模型(因为我这个bvh文件是Tpose用的,所以为了动作映射不出问题,优先整的这种模型…

C语言——利用冒泡排序模拟实现qsort函数

一.冒泡排序 冒泡排序是C语言中众多排序中的一种。它的排序逻辑为(升序):从第一个元素开始和相邻的比较,如果第一个元素大于第二个元素,则交换,反之不交换;第二个再与第三个元素比较&#xff0…

jsvmp逆向实战X-Bogus篇,算法还原

jsvmp逆向实战X-Bogus篇,算法还原 前言X-Bogus算法逻辑寻找log插桩位置第四步第三步 前言 看过很多大佬关于X-Bogus算法还原的文章,都是通过log插桩,分析日志信息再结合动态调试一步步抽丝剥茧,最终还原算法,但是不同…

第1篇:Mysql数据库表结构导出字段到Excel(一个sheet中)

package com.xx.util;import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.sql.*; import java.io.*;public class DatabaseToExcel {public static void main(String[] args) throws Exception {// 数据库连接配置String u…

基于SpringBoot和HeatMap的全球地震热力图可视化实践

目录 前言 一、关于热力图 1、HeatMap简介 2、属性和方法介绍 二、全球地震热力图反演 1、地震信息查询开发 2、前端地图开发 三、地震带反演成果 1、三大地震带反演 2、地震区域分析 总结 前言 众所周知,全球的地震带主要可以分为三处地震带——环太平洋地…

利用API打造卓越的用户体验

🍎个人博客:个人主页 🏆个人专栏:日常聊聊 ⛳️ 功不唐捐,玉汝于成 目录 正文 1. 数据驱动的设计 2. 功能扩展与整合 3. 实时性与响应性 4. 个性化推荐与定制化服务 结语 我的其他博客 正文 随着数字化时代的…

我的电脑win11系统安装了谷歌浏览器,桌面的快捷方式打不开

安装好浏览器以后双击打不开右键打开文件位置也弹窗报错提示 但是我发现开始栏里面可以打开 说明我的软件应该是没有问题的,研究了一下 我实际的安装目录在:C:\Program Files\Google\Chrome\Application 桌面的快捷方式右键查看属性显示的地址却不对&a…

js生成笛卡尔集合

let arr[[黑, 金, 白],[16G, 32G],[电信, 移动, 联通], ]let listarr.reduce((a, b) > { return a.flatMap(x > b.map(y > [...x, y]))}, [[]] )console.log(list)生成结果

easyExcel大数据量导出oom

easyExcel大数据量导出 异常信息 com.alibaba.excel.exception.ExcelGenerateException: java.lang.OutOfMemoryError: GC overhead limit exceededat com.alibaba.excel.write.ExcelBuilderImpl.fill(ExcelBuilderImpl.java:84)at com.alibaba.excel.ExcelWriter.fill(Excel…

(MATLAB)第二十一章 Simulink仿真设计初步

Simulink是MATLAB的重要组成部分,可以非常容易地实现可视化建模,并把理论研究和工程实践有机地结合在一起,不需要书写大量程序,只需要使用鼠标和键盘对已有模块进行简单的操作和设置。 21.1 Simulink简介 Simulink是MATLAB软件的…

汽车ECU的虚拟化技术(五) -- 对MCU虚拟化实现难点的思考

目录 1.概述 2.虚拟化软件的难点 2.1 虚拟化中的中断处理 2.2 虚拟ECU的通信 3.小结 1.概述 在上面文章里汽车ECU的虚拟化技术(四) -- 对MCU虚拟化实现难点的思考-CSDN博客,解了OEM面临新的电子电气架构下的集成难点,引入了hypervisor以及VM调度机制…

内网使用rustdesk进行远程协助

文章目录 前言一、搭建rustdesk中继服务器二、搭建文件下载服务器三、创建引导脚本四、使用 前言 内网没有互联网环境,没法使用互联网上有中继服务器的远程协助工具,如teamviewer、todesk、向日癸等;在内网进行远程维护可以自己搭建中继服务…