嵌入式linux移植篇之kernel

Linux的启动过程概述

Linux内核的启动过程是一个复杂而又有序的流程,涉及到硬件初始化、引导加载、内核初始化等多个步骤。以下是Linux内核的典型启动流程:

BIOS/UEFI阶段:

电源启动:计算机通电后,BIOS(基本输入/输出系统)或UEFI(统一扩展固件接口)开始执行。
POST(电源自检):进行硬件自检,检查系统中的硬件设备是否正常。
引导加载程序阶段:

MBR/UEFI固件:BIOS通过Master Boot Record(MBR)或UEFI固件加载引导加载程序(Boot Loader)。
Boot Loader:常见的引导加载程序包括GRUB(GRand Unified Bootloader)或LILO(LInux LOader)等。引导加载程序的作用是加载内核映像。
内核加载阶段:

加载内核映像:引导加载程序加载内核映像(通常是vmlinuz)到内存中。
初始化RAM磁盘:如果有RAM磁盘(ramdisk),则初始化RAM磁盘。
内核启动阶段:

启动内核:引导加载程序将控制权交给内核,开始执行内核代码。
初始化内核数据结构:内核初始化页表、中断描述符表(IDT)等数据结构。
启动第一个进程:内核启动第一个用户空间进程(通常是init)。
初始化阶段:

设备初始化:内核开始初始化各种硬件设备,包括CPU、内存控制器、输入输出控制器等。
文件系统初始化:挂载根文件系统,初始化文件系统模块。
初始化进程:内核初始化其他重要的内核线程和进程。
用户空间阶段:

启动用户空间:用户空间初始化完成后,控制权交给init或systemd等用户空间的第一个进程。
启动系统服务:用户空间进程负责启动各种系统服务和用户应用程序。

内核的初次编译

编译内核之前需要先在 ubuntu 上安装 lzop 库

sudo apt-get install lzop

编译脚本的内容如下

 #!/bin/shmake ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distcleanmake ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_v7_defconfigmake ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfigmake ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j16

以上命令分别是清理工程,配置工程,打开图形配置页面,执行make编译linux源码

Linux 工程目录分析

编译之后,会有很多生成的文件,具体的文件夹和主要文件作用如下;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在 arch/arm/configs 中就包含有 I.MX6U-ALPHA 开发板的默认配置文件:imx_v7_defconfig,执行“make imx_v7_defconfig”即可完成配置。arch/arm/boot/dts 目录里面是对应开发平台的设备数文件。arch/arm/boot 目录下会保存编译出来的 Image 和 zImage 镜像文件,而 zImage 就是我们要用的 linux 镜像文件。arch/arm/mach-xxx 目录分别为相应平台的驱动和初始化文件,比如 mach-imx 目录里面就是 I.MX 系列 CPU 的驱动和初始化文件。

linux内核的启动流程

在Linux 内核的连接脚本文件 arch/arm/kernel/vmlinux.lds文件中,ENTRY指明了Linux的内核入口,入口为 stext,stext 定义在文件arch/arm/kernel/head.S。

stext 函数

Linux 内核启动之前要求如下:

  1. 关闭 MMU。
  2. 关闭 D-cache。
  3. I-Cache 无所谓。
  4. r0=0。
  5. r1=machine nr(也就是机器 ID)。
  6. r2=atags 或者设备树(dtb)首地址。

检查当前系统
在stext函数中,它做的主要操作是,确保CPU在SVC模式,关闭中断,读处理器的ID,检查当前的系统是否支持当前的CPU,这个就是通过比对proc_info_list 信息。

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

同时该函数会验证设备数的合法性,创建页表,最终会调用__mmap_switched 函数。

__mmap_switched 函数

该函数定义在文件 arch/arm/kernel/head-common.S中。最终调用 start_kernel 来启动 Linux 内核,start_kernel 函数定义在文件 init/main.c中。

start_kernel 函数

这个函数里面有很多的子函数,实现的功能很复杂,主要是进行系统各个异常的检测和各个设备模块的初始化。start_kernel 函数最后调用了 rest_init。

rest_init 函数

该函数定义在文件 init/main.c 中
该函数主要进行的是启动RCU锁调度器,kernel_thread 创建 kernel_init 进程,也就是的init 内核进程,进程的PID是1,在这个进程会实现由内核态带用户态的转变。接下来会调用函数 kernel_thread 创建 kthreadd 内核进程,此内核进程的 PID 为 2。kthreadd,进程负责所有内核进程的调度和管理。也会创建空闲进程,空闲进程的PID是0。

linux内核的移植过程

以I.MX6ULL EVK 开发板为参考,然后将 Linux 内核移植到正点原子的 I.MX6U-ALPHA 开发板上。

先对NXP官方开发板的linux内核进行修改和编译

修改顶层Makefile

ARCH    ?=ARM
CROSS_COMPILE    ?=arm-linux-gnueabihf-

配置并编译 Linux 内核

make clean
make imx_v7_mfg_defconfig
make -j16

Linux 内核编译完成以后会在 arch/arm/boot 目录下生成 zImage 镜像文件,如果使用设备树的话还会在 arch/arm/boot/dts 目录下开发板对应的.dtb(设备树)文件。

在测试之前,需要修改些环境变量,烧录到 I.MX6U-ALPHA 开发板会提示,提示内核崩溃,因为 VFS(虚拟文件系统)不能挂载根文件系统。

在linux内核添加自己的开发板

添加开发板默认配置文件

将 arch/arm/configs 目 录 下 的 imx_v7_mfg_defconfig 重 新 复 制 一 份 , 命 名 为
imx_alientek_emmc_defconfig

cd arch/arm/configs
cp imx_v7_mfg_defconfig imx_alientek_emmc_defconfig

后续可以使用以下命令配置内核

make imx_alientek_emmc_defconfig

添加开发板对应的设备树文件

进入目录 arch/arm/boot/dts 中,复制一份 imx6ull-14x14-evk.dts,然后将其重命名为 imx6ull-alientek-emmc.dts

cd arch/arm/boot/dts
cp imx6ull-14x14-evk.dts imx6ull-alientek-emmc.dts

.dts 是设备树源码文件,编译 Linux 的时候会将其编译为.dtb 文件, 需 要 修 改 文 件 arch/arm/boot/dts/Makefile , 找 到 “ dtb-$(CONFIG_SOC_IMX6ULL)”配置项,在此配置项中加入“imx6ull-alientek-emmc.dtb

编译脚本如下

#!/bin/sh
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihfimx_alientek_emmc_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j16

后续就是进行主频的修改,是能8线EMMC驱动,修改网络设备,保存修改后的图形化配置文件。

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

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

相关文章

#从零开始# 在深度学习环境中,如何用 pycharm配置使用 pipenv 虚拟环境

为Python项目创建虚拟环境 在深度学习环境和一般python环境中安装pipenv基本一致,只需要确认好pipenv指定的python版本即可,安装pipenv前,可以通过python --version来确认安装版本 快捷键:crtl alt S 查看interpreter,查看所有…

聊聊比特币----比特币地址

⽐特币地址是⼀个标识符(帐号),包含27-34个字母数字拉丁字符(0,O,I除外)。地址可以以QR码形式表⽰,是匿名的,不包含关于所有者的信息。 地址⽰例:14qViLJfdG…

【51单片机】开发板和单片机的介绍(2)

前言 大家好吖,欢迎来到 YY 滴单片机系列 ,热烈欢迎! 本章主要内容面向接触过单片机的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的…

[Python] 什么是KMeans聚类算法以及scikit-learn中的KMeans使用案例

什么是无监督学习? 无监督学习是机器学习中的一种方法,其主要目的是从无标签的数据集中发现隐藏的模式、结构或者规律。在无监督学习中,算法不依赖于任何先验的标签信息,而是根据数据本身的特征和规律进行学习和推断。无监督学习…

论文分享:利用对象存储进行高性能数据分析

本次分享的是慕尼黑工业大学(TUM) Dominik Durner,Viktor Leis,和 Thomas Neumann 于 2023 年 7 月发表在 PVLDB(Volume 16 No.11) 的论文: Exploiting Cloud Object Storage for High-Performance Analyt…

PyQT——蓝牙收发数据(上位机案例-小车控制器)

实现功能 由于本人水平有限,仅用了最简单的进行实现,主要功能: 蓝牙设备扫描以及刷新蓝牙连接蓝牙数据发送蓝牙数据接收 页面实现效果 代码目录结构 代码案例 代码已经全部添加注释,故不再做单独解释。 Main.py ble_contr…

大数据信用报告在线查询平台哪个好?

随着大数据技术在金融风控的运用,大数据信用越来越被人熟知,由于线下没有查询大数据信用的地方,想要查询大数据信用报告只有在线上查询,那大数据信用报告在线查询平台哪个好呢?本文贷你一起去了解市面上比较好的三个平台。 大数据…

【Springcloud篇】学习笔记九(十五、十六章):Cloud Alibaba介绍、Nacos服务注册、服务配置中心

第十五章_Cloud Alibaba简介 1.出现SpringCloud Alibaba的原因 SpringCloud Netflix项目进入维护模式 技术的发展 2.SpringCloud Alibaba简介 2.1是什么 2.2能干嘛 2.3去哪下 阿里巴巴中文文档下载网站: spring-cloud-alibaba/README-zh.md at 2022.x alibaba…

学成在线:采用XXL-JOB任务调度方案使用FFmpeg处理视频转码业务

分片技术方案 概述 XXL-JOB并不直接提供数据处理的功能,它只会给所有注册的执行器分配好分片序号,在向执行器下发任务调度的同时携带分片总数和当前分片序号等参数 设计作业分片方案保证多个执行器之间不会查询到重复的任务,保证任务不会重复执行 任…

由于误删了node依赖,导致这后面的一系列操作

文章目录 1. 事发原因:Delete select files2. Delete select files引起的cross-env报错3. cross-env是node_modules的依赖工具4. 那么Delete selected files到底是什么操作5. 重装node_modules依赖包,也报错6. 报错:cb() never called!7. 算了…

JSR303参数校验-SpringMVC

文章目录 JSR303技术标准简介JSR303标准几个具体实现框架validation-apijakarta.validation-apihibernate-validatorspring-boot-starter-validation Spring Validationjavax.validation.constraints包下提供的注解org.hibernate.validator.constraints包扩展的注解校验注解默认…

内衣洗衣机是不是鸡肋?好用的小型洗衣机全自动推荐

随着大家工作的压力越来越大,下了班之后只能想躺平,在洗完澡之后看着还需要手洗的内衣裤真的很头疼。有些小伙伴还有会攒几天再丢进去洗衣机里面一起,而且这样子是非常不好的,用过的内衣裤长时间不清洗容易滋生细菌,而…

无人机遥感技术在地质灾害监测应用分析,多旋翼无人机应急救援技术探讨

地质灾害是指在地球的发展演变过程中, 由各种自然地质作用和人类活动所形成的灾害性地质事件。给人民的生命和财产安全带来严重威胁,因此有必要开展地质灾害预测预报、灾害应急和风险区划 遥感技术的快速发展为我们提供了一种获取实时灾害信息的可靠手段…

陪女朋友学习计算机二级之数据库笛卡尔积和自然连接

数据库中的基本关系运算 交 和数学中的交集类似,但是需要相同的表模式 如果俩个表有相同的关系模式如表1为(ID,姓名,学号)表2为ID,姓名,学号) 表1 表2 交之后就可以变成 并 和数…

水面漂浮物监测识别摄像机

水面漂浮物监测识别摄像机是一种用于监测水域表面上漂浮物的设备,可以帮助环保部门或海洋研究机构快速发现和识别水中的浮游物,有助于保护水质和生态环境。这种摄像机通常具有以下功能和特点: 高分辨率摄像头:配备高清晰度摄像头&…

【数据分享】1929-2023年全球站点的逐日降雪深度数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、能见度等指标,说到气象数据,最详细的气象数据是具体到气象监测站点的数据! 之前我们分享过1929-2023年全球气象站点的逐日平均气温数据、逐日最高气温数据…

学习spring第十四天

Spring注解方式整合第三方框架 xml整合MyBatis方式,如下 用注解方式代替xml方式如下 : 在配置类上加上 MapperScan("com.itheima.mapper") MapperScan("com.itheima.mapper") //MyMapperScan 在配置类里写入代码如下 Beanpublic DataSource dataSourc…

风控安全产品系统设计

风控业务架构 我把风控业务架构的分层分为6层,分别是组件层、业务层、决策层、能力层、计算层、可视层。 以下基建为基础安全产品的简称。 组件层 组件层的职责是:数据收集与行为反制。 从接口、设备、行为三个维度进行数据收集,接收决策层的指令进行行为反制。为了保证…

Go语言深度解析:探索 crypto/md5 标准库的强大功能

Go语言深度解析:探索 crypto/md5 标准库的强大功能 引言Go语言和MD5的基础知识MD5算法简介Go语言概述Go中的MD5实现 crypto/md5 库的使用方法基本用法处理大型数据安全注意事项 实际案例分析示例1:文件的MD5校验示例2:网络数据的MD5哈希示例3…