树莓派Linux内核源码

2023-11-07

前期工作

  1. 配置好交叉编译工具链
    交叉编译工具链详细教程

  2. 树莓派Linux内核源码下载
    查看树莓派操作版本命令:uname -r
    源码下载

一、嵌入式裸机和带操作系统启动过程了解

  • C51,stm32启动过程:
    c直接操控底层寄存器实现相关业务,业务流程型的裸机代码

  • x86,Intel----windows 启动过程:
    电源–>BIOS–>windows内核–>C,D盘–>启动程序

  • 嵌入式产品 树莓派,mini2440,mini6410,nanopi,海思,RK(瑞芯微)启动过程:
    电源–>Bootloader(引导操作系统启动)–>Linux内核–>文件系统–>应用程序

  • 安卓启动过程:
    电源–>fastBoot/Bootloader(引导操作系统启动)–>Linux内核–>文件系统—>虚拟机–>home程序->APP
    Bootloader: 一阶段:让CPU跟内存,FLASH,串口,IIC,IIS,数据段打交道—驱动这些设备(汇编和C
    二阶段:引导Linux内核启动(纯C)

二、树莓派Linux源码目录树分析

  1. arch:包含和硬件体系结构相关的代码,每种平台占一个相应的目录。和32位PC相关的代码存放在i386目录下,其中比较重要的包括kernel(内核核心部分)、mm(内存管理)、math-emu(浮点单元仿真)、lib(硬件相关工具函数)、boot(引导程序)、pci(PCI总线)和power(CPU相关状态)。
  2. block:部分块设备驱动程序。
  3. crypto:常用加密和散列算法(如AES、SHA等),还有一些压缩和CRC校验算法。
  4. Documentation:关于内核各部分的通用解释和注释。
  5. drivers:设备驱动程序,每个不同的驱动占用一个子目录。
  6. fs:各种支持的文件系统,如ext、fat、ntfs等。
  7. include:头文件。其中,和系统相关的头文件被放置在linux子目录下。
  8. init:内核初始化代码(注意不是系统引导代码)。
  9. ipc:进程间通信的代码。
  10. kernel:内核的最核心部分,包括进程调度、定时器等,和平台相关的一部分代码放在arch/*/kernel目录下。
  11. lib:库文件代码。
  12. mm:内存管理代码,和平台相关的一部分代码放在arch/*/mm目录下。
  13. net:网络相关代码,实现了各种常见的网络协议。
  14. scripts:用于配置内核文件的脚本文件。
  15. security:主要是一个SELinux的模块。
  16. sound:常用音频设备的驱动程序等。
  17. usr:实现了一个cpio。
  1. Linux是开源的,支持多架构多平台代码
  2. 因为支持多架构,架构又会有很多子架构,比如ARM架构里又有海西、树莓派等。所以驱动代码通过gcc编译出来的可执行文件会很大,几M
  3. 驱动代码的编译需要在提前编译好的内核上进行,所以我们通过配置出合适的内核使编译出的可执行文件不会很大,适用于目标平台的架构即可
  4. 因此我们需要做内核配置,内核编译。来得到合适的内核

三、开始准备树莓派Linux内核

1 树莓派Linux内核配置

我们是配置生成xxx.config文件,是该文件指导Makefile去把有用的东西组织成内核

厂家提供好Linux内核源码。比如买了树莓派,厂家会提供树莓派内核源码,里面就有 xxx厂家树莓派.config

配置树莓派的Linux内核有三种方式

第一种:使用厂家自带config,cp 厂家.config .config。
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2709_defconfig
指定arm架构——————指定编译器——-————-—树莓派————树莓派核心指令

第二种:通过make menuconfig 一项项的配置,通常是基于厂家的config来配置,优点可以自己加入一些想要的驱动。
1.安装ncurses库:
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
2.执行menuconfig进入device drivers->Input device support 按空格键选择需要的驱动,*代表系统一开始就已经加载进了内核 在zImage里面包含了驱动,M代表系统启动后 可以通过指令insmod xxx.ko临时加载驱动,空格代表这个驱动不加载进内核
ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make menuconfig

第三种:略

2 树莓派内核编译

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

-j4 指定用4核编译
zImage 生成内核镜像
modules 生成驱动模块
dtbs 生成配置文件

  • 编译成功会在源码树目录生成vmlinux :是没有压缩的树莓派Linux内核文件,真正的内核是zImage文件。
    在arch/arm/boot下,生成zImage :是内核镜像,实际作用就是对内核进行解码

3 把编译好的zImage文件进行打包

目的:使打包后的zImage文件变成树莓派可用的xxx.img文件
回到源码根目录输入指令:./scripts/mkknlimg arch/arm/boot/zImage ./kernel_new.img

4 把树莓派SD卡2个分区挂载到Linux

按照文章写着做,千万别乱操作乱删除,否则可能会把sd卡所有内容删除掉

  1. 把树莓派sd卡插入Linux系统电脑,树莓派有2个分区sdb1(fat子目录分区,是boot相关的内容,kernel的img文件就放在这个分区里)和sdb2(ext4系统根分区)
  2. 创建2个文件夹用于挂载这2个分区
    mkdir data1 data2
    输入指令进行挂载
    在data1、2目录的上一级执行
    sudo mount /dev/sdb1 data1
    sudo mount /dev/sdb2 data2
  3. 安装modules
    为了得到设备驱动文件,如:hdmi usb wifi io …
    在inux-rpi-4.14.y目录下执行命令
    sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=data2路径 modules_install
    操作ext4分区,需要root权限。若不执行这条指令 则内核能跑起来 但很多驱动都不能用
  4. 先进入data1,备份一份kernel7.img,以防刷机失败 树莓派无法启动,执行命令备份:
    cp kernel7.img kernel7OLD.img
    进入inux-rpi-4.14.y目录执行命令继续拷贝cp kernel_new.img/home/pi/lessonPI/data1/kernel7.img
  5. 复制相关文件
    进入inux-rpi-4.14.y目录执行命令:
    cp arch/arm/boot/dts/.*dtb* data1路径
    cp arch/arm/boot/dts/overlays/.*dtb* data1路径/overlays/
    cp arch/arm/boot/dts/overlays/README data1路径/overlays/
  6. 完美的完成,接下来来验证是否配置树莓派内核成功
    把sd卡插进树莓派,通过串口登陆树莓派,ifconfig查看ip地址是否有,uname -r查看当前树莓派版本是否为前期工作下载的那个树莓派版本 我的是4.14.114-v7

**回顾:**第二大点第3小点,驱动代码的编译需要在提前编译好的内核上进行,所以我们以上操作已经是做好了一个编译好的内核(树莓派内核)

转发请表明出处
作者:星辰~念

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

树莓派Linux内核源码 的相关文章

随机推荐

  • 通过小皮面板启动后端php项目和数据库

    1 启动php项目开启后端网站 可去官网下载 下载后就能使用了 官网地址 小皮面板 phpstudy 让天下没有难配的服务器环境 下载完成后打开 php项目需要启动apache或nginx 目前我用的是nginx 可以更改一些配置 先下载后
  • Linux 定期清理内存脚本

    bin bash 清理内存脚本 释放 PageCache echo echo 1 gt proc sys vm drop caches sudo sh 释放 dentries 和 inodes echo echo 2 gt proc sys
  • 5个用于图像处理的Python库

    图像处理是操纵图像以从中提取特征的现象 在当今计算机视觉和深度学习的世界中 大量使用不同的图像处理算法对图像数据集进行边缘检测 识别和分类 有时 这些算法也会逐帧应用于视频 以从中提取特征 在今天的文章中 我们将介绍5个最好的Python库
  • 如何计算单个region server能支持的最大region数

    虽理论上说单个region server能支持最多1000个region 但实际上是不太可能的 RegionServer维护Master分配给它的region 处理对这些region的IO请求 负责切分在运行过程中变得过大的region r
  • git提交代码弹出windows安全中心

    不知道有没有uu和我一样 第一次用git提交代码到码云时 前面都挺好的 突然最后一步来个windows安全中心 我就上网搜 说啥都都有 就是一个用户名密码呗 我想 然后按照网上的方法是github的用户名和密码 我当时还奇怪了这和githu
  • Java设计模式——状态模式

    文章目录 介绍状态模式 状态模式 介绍状态模式 核心思想就是 当对象的状态改变时 同时改变其行为 也就是行为由其状态决定 介绍 意图 允许对象在内部状态发生改变时改变它的行为 对象看起来好像修改了它的类 主要解决 对象的行为依赖于它的状态
  • Java中的8种基本数据类型

    Java基本类型共有八种 基本类型可以分为三类 字符类型char 布尔类型boolean以及数值类型byte short int long float double 数值类型又可以分为整数类型byte short int long和浮点数类
  • 梯度下降算法对比

    损失函数为凸函数时 梯度下降一定可以得到全局最优解
  • Linux shell 暂停执行脚本

    bin bash current path pwd echo 当前路径 current path echo webapps path current path webapps echo 当前路径webapps子目录 webapps path
  • 玩具城

    官园小商品批发市场 路线 地铁2号线 车公庄 红桥市场路线 地铁5号线 天坛东门 来自 ITPUB博客 链接 http blog itpub net 118838 viewspace 625828 如需转载 请注明出处 否则将追究法律责任
  • 【系统】win11怎么退回win10

    根据微软官方提供的回滚方案显示 在升级Win11之后的10天之内 用户可以通过系统恢复选项将Win11还原Win10 操作方式也比较简单 大家可以打开系统设置 找到相应选项 选择并确认后即可轻松将Win11回退早期版本 详细操作步骤如下 一
  • C++学习(四六六)Multiple parse contexts are available for this file

    Note Multiple parse contexts are available for this file Choose the preferred one from the editor menu 参考 Multiple parse
  • Linux基础篇学习——常见系统命令:ls,pwd,cd,date,hwclock,passwd,su,clear,who,w,uname,uptime,last,dmesg,free,ps,top

    ls 显示指定目录中的内容 ls OPTION FILE OPTION a all 显示所有文件包括隐藏文件 l 列出长属性 显示出文件的属性与权限等数据信息 i 列出inode节点号 结合 l使用 d 显示目录本身 且不列出目录中的列表文
  • MD5算法分析及逆向详解

    题外话 最近在看加密与解密 看到加密算法部分 感觉对于初次接触的新手还是有些难度的 故写下该篇文章 算作一个引导吧 新手飘过 老鸟勿笑 基本原理 MD5的典型应用是对一段信息 Message 产生信息摘要 Message Digest 以防
  • springsecurity 获取token流程分析

    一 oauth token password模式获取token源码主要操作 1 定义请求参数 增加请求头 Authorization 否则 在请求参数使用 client id 注意 此头为base64拼接格式为 client id clie
  • 光耦隔离继电器驱动

    一 前言 因为吃亏了 而且不小 发个贴记录下 以后长记性 问题是由于不做光耦隔离 电路不稳定 做了光耦隔离 上电和断电瞬间被隔离器件上电抖动一下 明显不可以 错误的示范我就不发图了 二 环境 12V电源 stm32 驱动舵机 功率不大也不小
  • 一篇文章,从源码深入详解ThreadLocal内存泄漏问题

    原创文章 经验总结 从校招到A厂一路阳光一路沧桑 详情请戳www coderccc com 1 造成内存泄漏的原因 threadLocal是为了解决对象不能被多线程共享访问的问题 通过threadLocal set方法将对象实例保存在每个线
  • 在ISO/OSI参考模型中,网络层的主要功能是()----百度2016研发工程师笔试题(六)

    在ISO OSI参考模型中 网络层的主要功能是 正确答案 A 你的答案 A 正确 路由选择 拥塞控制与网络互连 提供可靠的端一端服务 透明地传送报文 数据格式变换 数据加密与解密 数据压缩与恢复 在通信实体之间传送以帧为单位的数据 添加笔记
  • Dynamics 365 安装后续

    之前说到Dynamics365安装时遇到的错误 这里将讲述最后一个错误的解决办法 这里指的是蓝色条选中的错误 根据错误的提示 我们需要去对Reporting Services进行安装和配置 首先说Reporting Services的安装
  • 树莓派Linux内核源码

    前期工作 配置好交叉编译工具链 交叉编译工具链详细教程 树莓派Linux内核源码下载 查看树莓派操作版本命令 uname r 源码下载 一 嵌入式裸机和带操作系统启动过程了解 C51 stm32启动过程 c直接操控底层寄存器实现相关业务 业