基于树莓派对Linux内核简单认识

树莓派等芯片带操作系统的启动过程

X86 Intel Windows

启动过程: 电源-> BIOS ->windows内核 -> 
C\D等磁盘 -> 程序启动(如QQ);

嵌入式产品,如树莓派,海思,mini2440等

启动过程: 电源 -> bootloader(引导操作系统启动) ->Linux内核 ->
 文件系统(根据功能性来组织文件夹,带权限访问)->
  程序启动(KTV点歌机、人脸识别打卡器、智能家居主控等)

安卓

启动过程; 电源 -> bootloader\fastboot -> Linux内核 ->
 文件系统 -> 虚拟机 -> HOME应用程序 -> 点某图标打开app

C51 Stm32 (裸机) 业务流程型的裸机代码

直接c操控底层寄存器,实现相关业务。

Bootloader

一阶段: 让CPU与内存、FLASH、串口、IIS、IIC、数据段,进行设备驱动(汇编和C)
二阶段:引导Linux内核启动(纯C)

Linux 内核源码

大约1.3w个C文件 1100w行代码
Linux是开源,免费,LInux开源社区工作者共同维护,爱好者
支持多平台多架构;可移植性非常高。
但Linux内核编译出来就若干个M。
因为我们的内核编译出来就给一个平台一个架构用所以很多代码是不参与编译的。

比如
ARM
	  			海思 友善之臂 RK 树莓派 nanoPi
X86

PowerPC

MIPS

Linux 内核源码目录树

内核源码目录的一个组织

(一般用于检查源码包里的文件;
查看文件不多但是文件夹比较多得时候,比较方便。)

安装tree命令

sudo apt-get install tree

目录树结构

Linux内核源代码目录树结构。

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

block: 部分块设备驱动程序。
与存储介质相关;内存、FLASH等。

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。

在i386体系下,系统引导将从arch/i386/kernel/head.s开始执行,并进而转移到init/main.c中的main()函数初始化内核

Linux根目录下 \

根目录下

cd  /

dev 文件下 是设备有关的

lib 文件下 是库 各种动态库与静态库

proc 文件下 是内核的一些数据信息 以文件的形式显示出来

home 工作目录

opt 与内核底层有关

sbin 文件下 通常是一些系统的可执行的文件或者指令

bin 文件下 也是通常是一些系统的可执行的文件或指令

boot 文件下 是启动的时候相关的数据包括加载的内容,命令行的一些配置
在这里插入图片描述

树莓派Linux源码配置 替换内核

为什么要配置

驱动代码的编写
				驱动代码的编译需要一个提前编译好的内核
					编译内核就必须配置
			配置的最终目标会生成 .config文件,该文件指导Makefile去把有用东西组织成内核
查找config文件 命令
find . -name*_defconfig  

如何配置

厂家配linux内核源码,比如说买了树莓派,树莓派linux内核源码
		第一种方式:
			cp 厂家.config .config
		第二种方式:
			make menuconfig 一项项配置,通常是基于厂家的config来配置
		第三种方式:
			完全自己来

方法实操1

方法1:使用源码里自带的config

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

这里该命令是把厂家的config文件(bcm2709_defconfig)中的配置生成自己的.config文件。

方法实操2

方法2:make menuconfig

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

在这里插入图片描述

一项项配置,通常是基于厂家的config来配置在这里插入图片描述
我们就进入了ncurses的库,在这里配置内核文件
我们通常配置drivers(驱动)
在这里插入图片描述

这是就可以更具菜单来进行配置
驱动两种加载方式:

‘ * ’ 编译进内核 zImage里包含了驱动
M 以模块的方式生成驱动文件 xxx.ko ,系统启动后,通过命令inmosd xxx.ko加载

括号内没有就表示我们不需要
这几种状态可以用空格来进行切换

所谓内核裁剪,就是把不要的东西变成空格,M(modularize也是一种让内核变小的方法,它是系统启动后通过指令临时加载的)

树莓派Linux内核编译

想要替换内核,仅仅完成配置是不行的,再进行编译。

安装必要的库:

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 -j4 zImage modules dtbs (2>&1 | tee build.log)
----------------------------------------------------------------------
括号中是错误处理相关,若使用就去掉括号
j4 指定用多少电脑资源进行编译																			
zImage 生成内核镜像																			
modules 要生成驱动模块																		
dtbs 生成配置文件

这个过程大概会持续20分钟,如果一开始没报错,多半是对了。

查看编译是否成功

1、没有报错
2、 在源码树目录底下生成vmlinux,就是没有被压缩的linux
在这里插入图片描述
失败则无此文件

真正的linux(目标zImage镜像)生成在路径 arch/arm/boot(arm架构的都在这) 底下。

在这里插入图片描述
生成的zImage就是我们需要的文件。

打包zImage文件

打包zImage成树莓派可用的xxx.img

./scripts/mkknlimg arch/arm/boot/zImage ./kernel_new.img

因为树莓派中的镜像是img结尾的,所以要去生成该文件。
在这里插入图片描述
kernel_new.img文件。

挂载树莓派sd卡并安装编译出的DIRECTLY 到sd卡

插入内存卡

接下来把树莓派断电,将内存卡插到读卡器接入虚拟机
输入指令 dmesg 查看是否有usb接入
在这里插入图片描述

看到已连接

把树莓派的sd卡插入ubuntu系统电脑,树莓派的sd卡有两个分区:
一个fat分区,是boot相关的内容,kernel的img文件就放在这个分区里;
一个是ext4分区,也就是系统的根目录分区。

所以这里有sdb1和sdb2

数据拷贝

创建data1 和data2 两个文件夹

将u盘中的sdb1和sdb2挂载到data1和data2

sudo mount /dev/sdb1 data1

在这里插入图片描述
在这里插入图片描述

这样我们就能够访问u盘中的数据

可以看出,data1/sdb1 是存放树莓派内核镜像的分区——有kernel.img
在这里插入图片描述

可以看出,data2/sdb2 是树莓派根目录的分区。

安装modules

安装modules, 设备驱动文件: hdmi usb wifi io …

sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=/home/xxxx(你的路径) modules_install

操作ext4分区,需要root权限。(这个指令就是把驱动放到内核里去,不然的话内核可以起来,但是驱动不能用)。

安装更新kernel.img文件

安装更新 kernel.img 文件,注意镜像名字是kernel7.img。
先备份,以免刷机失败树莓派无法启动。

cd /home/chenlc/data1
cp kernel7.img kernel7OLD.img

再把编译新生成的拷贝到data1,起名kernel7.img

cp kernel_new.img  /home/chenlc/data1/kernel7.img

查看文件有没有烤坏

用md5sum 指令查看
(每个文件都有一个特殊文件编码值,查看前后两个文件是否相同。)

拷贝其他相关文件

拷贝配置文件
cp arch/arm/boot/dts/.*dtb*    /home/xxxxx/datax(你的fat文件所在位置)
cp arch/arm/boot/dts/overlays/.*dtb* [fat]/overlays/
cp arch/arm/boot/dts/overlays/README [fat]/overlays/
  • *是通配符 这里意思是.和d之间有什么字符不管,dtb之后有什么字符也不管 只要有这个格式的文件都拷贝过来。

更新完成

更新完成后插回树莓派即可开机;使用uname -r命令可查看kernel内核信息是否改变。

替换内核后如何在树莓派上看到启动信息

使用串口登录
之前的串口登录配置文章参考:
https://editor.csdn.net/md/?articleId=117226073#_2
记得再虚拟机上把串口usb断开,以免在连接串口的时候被虚拟机连接了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值