linux内核


前言

linux内核配置,编译
官方文档:
https://www.raspberrypi.com/documentation/computers/linux_kernel.html#cross-compiling-the-kernel


一、linux源码目录树

嵌入式开发比较关心设备驱动开发相关,而驱动部分的编译需在一个提前编译好的内核,编译内核就必须先配置内核。

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等。(file system)

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

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

ipc:进程间通信的代码。

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

lib:库文件代码。

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

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

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

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

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

usr:实现了一个cpio。

二、linux内核

1.linux源码下载

先查看自己树莓派板子系统的版本(5.15 32位)

uname -a

在这里插入图片描述
树莓派github中linux一栏,选择系统型号,下载linux源码,
在这里插入图片描述
在这里插入图片描述
将源码放入共享文件夹,将其拷贝到ubuntu中并解压,进入其文件夹
在这里插入图片描述

2.内核配置

配置的最终目标会生成 .config文件,该文件的作用是指导Makefile去把有用东西组织成内核

首先安装必要的库

sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev

安装工具链

sudo apt install crossbuild-essential-armhf  //32位内核
sudo apt install crossbuild-essential-arm64  //64位内核

进入到linux源码文件夹,配置内核

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7l make bcm2711_defconfig //树莓派4 32ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make bcm2709_defconfig //树莓派2.3 32ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel make bcmrpi_defconfig //树莓派0,1 32ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- KERNEL=kernel7l make bcm2711_defconfig //所有型号 64位
//ARCH指定内核架构,CROSS_COMPILE指定交叉编译工具链,KERNEL树莓派指定

也可继续进入到menuconfig一项项配置

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7l make menuconfig //参数同上

在这里插入图片描述

3.内核编译

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7l make -j4 zImage modules dtbs //32位 KERNEL参数同上
ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- KERNEL=kernel7l make -j4 Image modules dtbs //64位
//-jn:指定用多少电脑资源进行编译, n 是处理器数量 * 1.5,zImage生成内核镜像,modules要生成驱动模块,dtbs生成配置文件

等内核编译生成后,会在源码目录下生成一个vmlinux文件,而目标镜像文件在

源码目录/arch/arm/boot //32位
源码目录/arch/arm64/boot  //64位

4.内核拷贝

将树莓派的sd卡通过读卡器连接到虚拟机上
挂载u盘
先创建两个文件夹

mkdir ~/mnt/fat32
mkdir ~/mnt/ext4
sudo mount /dev/sdb1 ~/mnt/fat32  //boot相关内容,存放内核镜像
sudo mount /dev/sdb2 ~/mnt/ext4  //根目录文件夹

进入到源码目录下,安装modules(设备驱动文件: hdmi usb wifi io)

sudo env PATH=$PATH make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=~/mnt/ext4 modules_install

更新内核镜像

sudo cp ~/mnt/fat32/$KERNEL.img ~/mnt/fat32/$KERNEL-backup.img  #备份旧内核
sudo cp arch/arm/boot/zImage ~/mnt/fat32/$KERNEL.img  #32位更新
sudo cp arch/arm64/boot/Image ~/mnt/fat32/$KERNEL.img  #64位更新

复制其他文件

#32位
sudo cp arch/arm/boot/dts/*.dtb ~/mnt/fat32/
sudo cp arch/arm/boot/dts/overlays/*.dtb* ~/mnt/fat32/overlays/
sudo cp arch/arm/boot/dts/overlays/README ~/mnt/fat32/overlays/
#64位
sudo cp arch/arm64/boot/dts/broadcom/*.dtb ~/mnt/fat32/
sudo cp arch/arm64/boot/dts/overlays/*.dtb* ~/mnt/fat32/overlays/
sudo cp arch/arm64/boot/dts/overlays/README ~/mnt/fat32/overlays/

卸载设备

sudo umount ~/mnt/fat32
sudo umount ~/mnt/ext4

将sd卡插入树莓派中启动查看版本


总结

1.启动过程:
C51,STM32(裸机)->C直接操控底层寄存器实现相关业务
X86,Intel windows等:电源 -> BIOS ->windows内核->C,D盘等-> 程序启动
嵌入式产品: 树莓派,nanopi,等:电源->BootLoader(引导操作系统启动)->Linux内核->文件系统(根据功能性来组织文件夹,带访问权限)->程序
安卓:电源->fastBoot/Bootloader/->linux内核->文件系统->虚拟机(跑java程序)->HOME应用程序->点某图标打开某APP
2.uname -r 显示系统的发行版号
 uname -a显示系统名、节点名称、操作系统的发行版号、内核版本等等。
 nproc:查看cpu核数
 dmesg:查看内核信息,当有设备接入时,内核会打印驱动的一些相关信息
 sudo mount /dev/sdb1 mnt/fat32 挂载设备
 sudo umount ~/mnt/fat32 卸载设备
 md5sum:文件内容相同时,md5值也是相同的,检查拷贝过程中是否损坏文件
 getconf LONG_BIT:查看多少位处理器
3.tree:当前目录下采用树状的形式列出目录的内容
安装tree:

sudo apt install tree

4.make:是一个根据makefile文件内容,针对目标(可执行文件)进行依赖性检测(要生成该可执行文件之前要有哪些中间文件)并执行相关动作(编译等)的工具 。
  比如>make a.txt
此时调用make命令并不起作用,因为make本身并不知道如何做出a.txt,需要有人告诉它,如何调用其他命令完成这个目标,所以有了Makefile,(Makefile文件也可以写为makefile),makefile文件类似一个脚本,其中内容包含make所要进行的处理动作以及依赖关系。
  make的一个好处就是当你对某个源文件进行了修改,你再次执行 make 命令,它将只编译与该源文件相关的目标文件而不是整个代码工程,
  make 命令必须要在 Makefile 的当前目录执行

配置内核方法:make config(基于文本的为传统的配置界面)、make oldconfig(在原来内核配置的基础上修改一部分)、make xconfig(基于图形窗口模式的配置界面,Xwindow下推荐使用)、make menuconfig(基于文本选择的配置界面,字符终端下推荐使用),以上4种配置方式的目的都是在源码的顶层目录下面生成一个 .config 文件(配置文件)

defconfig文件:平台厂商提供,内核编译用作.config的参考

5.在参考官方文档之前参考过别的博主博文过程中出现的一些问题,但之后在按照官方文档这些问题被修复
在这里插入图片描述在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值