Linux内核编译并移植至ARM平台

news2024/12/24 17:18:37

Linux内核编译并移植至ARM平台

  • Linux系统相关概念
    • 操作系统的启动过程
    • 获取树莓派源码
    • Linux内核源代码目录树结构
  • 树莓派Linux源码配置
  • 树莓派Linux内核编译
  • 移植内核至树莓派

Linux系统相关概念

操作系统的启动过程

  • x86,Intel的启动过程: 电源上电 -> BIOS -> Windows内核 -> C盘,D盘 -> 应用程序启动(QQ等)

  • 嵌入式产品(Linux系统)启动过程: 电源上电 -> BootLoader -> Linux内核 ->文件系统 -> 应用程序

  • 安卓的启动过程: 电源上电 -> fastBoot/Bootloader -> linux内核 -> 文件系统 -> 虚拟机 -> HOME应用程序 -> 通过图标打开某APP

获取树莓派源码

1. 通过指令查看树莓派的内核版本号:

uname -r

内核版本号:

2. 下载树莓派对应内核源码

通过 树莓派官网 下载源码,并将其拷贝到Ubuntu并解压

解压命令:

unzip linux-rpi-4.14.y

Linux内核源代码目录树结构

  • arch: 包含和硬件体系结构相关的代码,每种平台占一个相应的目录。和32位PC相关的代码存放在i386目录下,其中比较重要的包括kernel(内核核心部分)、mm(内存管理)、math-emu(浮点单元仿真)、lib(硬件相关工具函数)、boot(引导程序)、pci(PCI总线)和power(CPU相关状态)。

  • block: 部分块设备驱动程序。

  • crypto: 常用加密和散列算法(如AES、SHA等),还有一些压缩和CRC校验算法。

  • Documentation: 关于内核各部分的通用解释和注释。

  • drivers: 设备驱动程序,每个不同的驱动占用一个子目录。

  • fs: 各种支持的文件系统,如ext、fat、ntfs等。

  • include: 头文件,其中,和系统相关的头文件被放置在linux子目录下。

  • init: 内核初始化代码(注意不是系统引导代码)。

  • ipc: 进程间通信的代码。

  • kernel: 内核的最核心部分,包括进程调度、定时器等,和平台相关的一部分代码放在arch/*/kernel目录下。

  • lib: 库文件代码。

  • mm: 内存管理代码,和平台相关的一部分代码放在arch/*/mm目录下。

  • net: 网络相关代码,实现了各种常见的网络协议。

  • scripts: 用于配置内核文件的脚本文件。

  • security: 主要是一个SELinux的模块。

  • sound: 常用音频设备的驱动程序等。

  • usr: 实现了一个cpio。

树莓派Linux源码配置

  • 当我们工作中要进行驱动代码的编写,编写完以后要进行编译,要进行驱动代码的编译就必须要一个提前编译好的内核,编译内核就必须要先配置。

  • 配置的最终目标会生成 .config文件,该文件指导Makefile去把有用东西组织成内核。 厂家配linux内核源码,比如说买了树莓派,树莓派linux内核源码:使用源码里自带的config。

其中Linux源码配置有三种方式:

  • 方式一:厂家会配linux内核源码,厂家会提供对于芯片的内核源码,拷贝厂家的.cinfig文件进行配置
  • 方式二:make menuconfig 一项项配置 ,通常是基于厂家的config来配置
  • 方式三:完全自己来

其中编译Linux源码需要先安装好arm-linux交叉编译工具链。

其中交叉编译工具链的安装参考以下博文:交叉编译工具链的安装及带wiringPi库的交叉编译实现

方式一:拷贝厂家提供的config文件

执行命令,查看厂家给的配置文件

cd linux-rpi-4.14.y/
find .  -name  *_defconfig
find .  -name  *_defconfig|grep bcm2709

内核配置:

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2709_defconfig
  • 指定ARM架构 : ARCH=arm
  • 指定编译器 : CROSS_COMPILE=arm-linux-gnueabihf-
  • 树莓派 : KERNEL=kernel7
  • 主要核心指令 : make bcm2709_defconfig

方式二:make menuconfig

一项项配置,常是基于厂家的config来配置,首先要安装必要的库:

sudo apt-get install bc
sudo apt-get install libncurses5-dev libncursesw5-dev
sudo apt-get install zlib1g:i386
sudo apt-get install libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5

安装完后执行以下配置指令:

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make menuconfig


然后根据自己的需要来剪裁内核,按需配置

驱动两种加载方式:

  1. [*] 编译进内核 zImage包含了驱动

  2. [M] 模块方式生成驱动文件xxx.ko 系统启动后,通过命令inmosd xxx.ko 加载
    [ * ] 和< M >是驱动加载的两种方式,可以按空格键进行加载方式的切换。
    [ ] :表示略过的,不参与编译,也就是需要裁剪的东西

方式三:完全自己来: 配置完内核后就可以进行内核的编译了。

树莓派Linux内核编译

编译指令:

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make -j4 zImage modules dtbs

此过程较慢,大约要20多分钟左右

  • -j4: 指定用多少电脑资源进行编译
  • zImage: 生成内核镜像
  • modules: 要生成驱动模块
  • dtbs: 生成配置文件

编译成功后,看到源码树目录多了vmlinux,失败则无此文件。成功后,目标zImage镜像arch/arm/boot底下

移植内核至树莓派

STEP 1:打包zImage文件

  • 用mkknlimg 工具打包zImage 文件,将生成的zImage打包成树莓派可用的 xxx.img 比如 kernel_new.img
    ./scripts/mkknlimg arch/arm/boot/zImage ./kernel_new.img
    


STEP 2:挂载U盘

  • 插入带有树莓派系统的内存卡的读卡器并挂载到虚拟机,并输入 dmesg 命令后出现sda1和sda2表示连接成功

  • 在根目录新建两个文件夹data1、data2并将U盘里的内容挂载到这两个文件夹中

    mkdir data1 data2
    sudo mount /dev/sdb1 data1   
    sudo mount /dev/sdb2 data2   
    
  • sdb1、sdb2 分别是树莓派SD卡的两个分区

    • sdb1即data1是fat分区,是boot相关的内容,kernel的img文件在此分区
    • sdb2即data2是ext4分区,也就是系统的根目录分区。(cd /进入的就是系统的根目录
  • 通过挂载U盘,data1 和 data2 文件夹内就有了U盘内部的数据

STEP 3 :安装modules:

  • 用于安装设备驱动文件,像无线网卡,IIC等驱动设备,进入树莓派源码树目录键入
    sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=[ext4] modules_install
    
    注意:这里要将【ext4】改为自己具体的绝对路径
    sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=/home/yuanjl/data2 modules_install
    

STEP 4:更新 kernel.img 文件

  • 因为之前用 mkknlimg 工具打包了kernel_new.img文件,只要把它复制到fat分区(data1)并配置使用即可,防止刷机失败,首先备份之前的kernel.img 文件 ,进入挂载fat分区(data1)文件键入下列命令:
    cp kernel7.img kernel7OLD.img
    
  • 将之前在源码树目录生成的kernel_new.img拷贝到fat分区(data1)并替代之前的kernel7.img
    cp kernel_new.img /home/yuanjl/data1/kernel7.img
    
  • 拷贝完成后需要校验md5值,如果两文件的md5值不一样则需要重新拷贝。
    md5sum /home/zh/SYSTEM/linux-rpi-4.14.y/kernel_new.img 
    md5sum kernel7.img
    

STEP 5:在源码树中复制其它配置文件到fat分区(data1)

cp arch/arm/boot/dts/.*dtb* /home/yuanjl/data1
cp arch/arm/boot/dts/overlays/.*dtb* /home/yuanjl/data1/overlays/
cp arch/arm/boot/dts/overlays/README /home/yuanjl/data1/overlays/

STEP 6: 将配置玩的内存卡放入树莓派中键入uname -r查看更换后的内核版

在这里插入图片描述

参考博文:
1. 树莓派Linux内核配置
2. 树莓派-内核开发-说明 下载代码 编译 替换内核
3. Linux内核源代码目录树结构
4. 配置、编译Linux内核适合树莓派相关操作
5. 树莓派——配置Linux内核适合树莓派

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

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

相关文章

基于scRNA-data,运用pySCENIC寻找细胞群里面活跃的调节子

愿武艺晴小朋友一定得每天都开心 pySCENIC 在步骤上&#xff0c;分为4大步&#xff1a; 1&#xff09;准备工作&#xff1a;counts矩阵文件&#xff08;R语言写出csv文件&#xff09; 2&#xff09;将csv文件转换为loom文件(用python做) 3&#xff09;然后slurm平台申请资源…

概述03 A/B test

分层实验&#xff1a;

Python 课程9-資料庫操作

前言 在现代软件开发中&#xff0c;数据库是核心组件之一&#xff0c;它负责数据的存储、管理和检索。无论是简单的应用程序还是复杂的企业级系统&#xff0c;数据库操作都是必不可少的。本教程将深入讲解如何使用 Python 进行数据库操作&#xff0c;涵盖使用 sqlite3 进行本地…

Autosar学习----AUTOSAR_SWS_BSWGeneral(四)

General Implementation Specification 7.1 General Implementation Specification7.1.1 遵循 MISRA C 和 C 标准7.1.2 遵循 AUTOSAR 基本软件需求7.1.3 遵循 AUTOSAR 方法论7.1.4 平台独立性和编译器抽象7.1.5 可配置性7.1.6 各种命名约定7.1.7 配置参数7.1.8 共享代码7.1.9 全…

论文写作难?用这套ChatGPT提示词3小时完成论文初稿!

AIPaperGPT&#xff0c;论文写作神器~ https://www.aipapergpt.com/ 还在因为写论文头秃吗&#xff1f;你不是一个人&#xff01;从选题到文献综述&#xff0c;再到最后的结论&#xff0c;每一步都让人抓狂。选题纠结、文献多到看不过来、结构怎么写都不满意——这些是不是让你…

AI 加持的云端 IDE——三种方法高效开发前后端聊天交互功能

以下是「豆包 MarsCode 体验官」优秀文章&#xff0c;作者努力的小雨。 豆包 MarsCode 豆包MarsCode 编程助手支持的 IDE: 支持 Visual Studio Code 1.67.0 及以上版本&#xff0c;以及 JetBrains 系列 IDE&#xff0c;如 IntelliJ IDEA、Pycharm 等&#xff0c;版本要求为 22…

C++八股文基础知识点

1.指针和引用的区别 指针是一个指向内存地址的变量&#xff0c;其本身是一个地址&#xff0c;地址保存的是变量的值&#xff0c;而且它本身可变&#xff0c;包括它指向的地址和地址上的存放的数据&#xff1b;引用即为一个变量的地址&#xff0c;也是变量的别名&#xff0c;和…

opeGauss 之BitmapOr算子代码走读

一. 前言 在openGauss中&#xff0c;BitmapOr算子扫描是指谓词条件是索引列的or条件时&#xff0c;将多个or条件的索引谓词先组成一个需要扫描元组的BitmapOr扫描算子&#xff0c;然后再通过BitmapOr算子的tid信息去扫描元组&#xff0c;从而减少or条件带来的随机扫描过多的问题…

《企业实战分享 · SonarQube10.x 详细教程》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

线下活动|落地武汉、长沙高校,10场AI沙龙火爆来袭

人工智能作为引领时代发展的重要力量&#xff0c;正以前所未有的速度改变着我们的世界&#xff0c;而智能体因其开发门槛低、应用场景广泛等优势成为最热门的AI应用方向之一&#xff0c;未来将拥有庞大生态。为此&#xff0c;百度百科校园在开学季的9月联合文心智能体平台在武汉…

清理C盘缓存的垃圾,专业清理C盘缓存垃圾的步骤与策略

在维护计算机系统的过程中&#xff0c;定期清理C盘&#xff08;通常是系统盘&#xff09;中的缓存和垃圾文件是一项至关重要的任务。这不仅能有效释放磁盘空间&#xff0c;提升系统性能&#xff0c;还能减少因磁盘空间不足导致的程序运行缓慢或错误。以下是一系列专业且安全的步…

品胜电子携手成都蓉城,共谋“商业+体育”合作新篇章

9月14日,广东品胜电子股份有限公司(以下简称品胜电子)与成都蓉城足球俱乐部(以下简称成都蓉城)正式签约,成为其官方合作伙伴。全国数码3C行业领军企业与中超强队的携手合作,标志着双方将在“商业体育”融合的模式下资源共享相互赋能,提升其品牌影响力。 蓉城足球俱乐部相关人士…

HTB-Included(本地文件包含、TFTP文件上传、LXD容器挂载目录)

前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天给大家讲解Included靶机 渗透过程 信息搜集 rustscan工具 通常只扫描TCP端口&#xff0c;所以我们要配合nmap进行-sU 执行udp端口扫描 可以观察到 服务器开放了TFTP UDP端口&#xff0c;用来进行文件传输协议…

2024年度10款视频剪辑软件分享

在视频创作日益盛行的今天&#xff0c;一款强大而易于上手的视频剪辑软件成为了每位创作者不可或缺的工具。无论是专业电影制作人、Vlog博主&#xff0c;还是视频编辑爱好者&#xff0c;都能在市场上找到适合自己的那一款。以下是2024年度推荐的10款视频剪辑软件&#xff0c;涵…

推荐一款免费的图片压缩软件,自媒体运营者、摄影爱好者的必备工具

随着社会的发展&#xff0c;咱们生活里的各种新鲜玩意儿越来越多&#xff0c;互联网就像是一个超级大的市场&#xff0c;啥都能干。比如说&#xff0c;咱们现在拍照、看视频、刷朋友圈、逛网店&#xff0c;这些都离不开图片。但是呢&#xff0c;图片这玩意儿&#xff0c;它占地…

self-play RL学习笔记

让AI用随机的路径尝试新的任务&#xff0c;如果效果超预期&#xff0c;那就更新神经网络的权重&#xff0c;使得AI记住多使用这个成功的事件&#xff0c;再开始下一次的尝试。——llya Sutskever 这两天炸裂朋友圈的OpenAI草莓大模型o1和此前代码能力大幅升级的Claude 3.5&…

跨平台Markdown写作软件:小书匠

本文软件由好友 Eduna 推荐&#xff1b; 什么是小书匠 &#xff1f; 小书匠是一款本地优先&#xff0c;去中心化&#xff0c;分布式&#xff0c;支持选择性同步的全平台覆盖笔记软件&#xff0c;是专注于 markdown 写作的客户端编辑器。它支持多种平台&#xff0c;包括 Windows…

Qt Model/View之代理

概念 与模型-视图-控制器模式不同&#xff0c;模型/视图设计没有包含一个完全独立的组件来管理与用户的交互。通常&#xff0c;视图负责向用户展示模型数据&#xff0c;并负责处理用户输入。为了在获取输入的方式上具有一定的灵活性&#xff0c;交互由委托执行。这些组件提供输…

5 个最佳开源无代码项目管理工具

想象一下&#xff0c;你是一名项目经理&#xff0c;每天早上刚坐到办公桌前&#xff0c;咖啡还在手里&#xff0c;你的手机和电脑屏幕上已经被各种未完成的任务、项目更新和团队消息填满。 你快速浏览着的电子邮件&#xff0c;分配任务的通知不断弹出&#xff0c;而每一个通知…

Shopee虾皮:广告类型选择与效果优化要点

Shopee虾皮作为东南亚增势迅猛的电商平台&#xff0c;是很多跨境卖家出海东南亚的首要选择。这势必带来强烈的竞争&#xff0c;因此&#xff0c;如果卖家想要突出重围&#xff0c;广告投放和优化则格外重要。 一、虾皮的广告类型 1.关键词广告 当买家搜索的关键字与卖家投放的…