树莓派:关于linux内核

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

                c51,STM32(裸机)》》》》》》》c直接操控底层寄存器实现相关业务。业务流程形的裸机代码

                                           遥控灯:while(1)

                                            垃圾桶:WemosD1  LOOP

                                            恩智浦智能车:stm32

                x 86,Intel    windows

                   启动过程: 电源-》BIOS -》Windows内核-》C,D盘-》程序启动(QQ)

                

                  嵌入式产品:树莓派,mini2440,mini6410,nanopi,海思,RK(瑞芯微)----------------------------------------------人脸识别打卡器,智能家居主控

                启动过程:  电源-》 BootLoader(引导操作系统启动) -》Linux内核 -》文件系统(根据功能性来组织文件夹,带访问权限)-》ktv点歌机

                 安卓

                  启动过程:电源-》fastBoot/Bootloader/ -》linux内核 -》文件系统-》虚拟机-》HOME应用程序 -》点某图标打开某app

        

                BootLoader:   一阶段  让CPU    跟内存  ,FLASH,串口,IIC,IIS,数据段      打交道,驱动这些设备(汇编和c结合)

                                        二阶段     引导Linux内核启动(纯c)

=====================================================

树莓派的文件系统:(就是我们根目录底下的东西,他的组织架构没有c盘,D盘的概念)

比如dev底下放的是和设备相关的

lib底下放的是库,各种动态库和静态库

proc底下放的都是内核的一些数据信息,以文件的形式反射出来

home 是用户登录的数据界面,工作目录

opt也是和内核底层有关系的东西

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

bin也是系统的可执行文件或者指令

比如我们想看内核的版本

比如查看ls 的指令的文件夹在哪里

 boot是启动时的数据,包括启动时加载的内容,或者一些命名行的配置

===================================================

====== ============================================

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

大约1.3w个文件                 1100W行代码

Linux是开源的,免费   Linux开源社区工作者共同维护,爱好

                        Linux是一个开源的,支持多架构多平台代码  = 非常牛逼

                        可移植性非常高

                         但是Linux内核编译出来一般就几M        树莓派一般4M                   

                        因为支持多平台,多架构,所以编译之前要配置,配置成适合的目标平台来用

                        ARM

                                               海思     友善之臂          RK         树莓派          nanopi

                        X86         

                        powerPC

                        MIPS

(他们四个都有很多的架构)

我们来看一眼前几节课解压的Linux内核

,在这里可能体现不出一个树状结构

实际上Linux的指令有个tree的这个指令

,现在没有,安装一下

有时候

 

解决方法

半个小时后再试

或者把自动升级关了,重启下

基于命令行修改配置文件的方法 

a、找到这里

然后修改成

b、 接着弄下一个, 然后把后面文件修改成都是"0"

 然后把树状图下载出来(一个文件不会特别多,但是文件夹特别多,用这个树状图)

 然后tree就可以查看有啥文件

 那么这些目录都是存放啥文件的呢?

参考文章

https://www.cnblogs.com/senior-engineer/p/4929703.html

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

===================================================

=================================================

3、Linux内核源码的配置

        

                        驱动代码的编写

                                驱动代码的编译需要一个提前编译好的内核

                                        编译内核就必须配置

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

      

                        厂家配linux内核源码,比如说买了树莓派,树莓派linux内核源码

                 第一种方式:

                            cp 厂家.config  .config

                 第二种方式:

                               make menuconfig  一项项配置,通常是基于厂家的config来配置        

                 第三种方式:        

                               完全自己来

                如何配置树莓派的linux内核 

参考文章

        树莓派-内核开发-说明 下载代码 编译 替换内核_nicekwell的专栏-CSDN博客_树莓派内核开发

   第一种方法:

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

    第二种方法

(比如我们要添某些驱动进来)

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

这个时候他会去读取现有的 .config 给这个menuconfig 一个基本的填充

产生下面的结果是因为环境没有ncurses库,就是我们之前做的贪吃蛇的那个库

安装就好啦

sudo apt-get install libncurses5-dev libncursesw5-dev

然后还需要安装一个ncureses库

sudo apt-get install libc6-i386 lib32stdc++6 lib32gcc1 lib32ncurses5 

运行的时候我们缺什么装什么 

,再来看sudo apt-get install bc 

他的提示0更新,0安装,0x卸载

 还有一个配置和编译的基础工具

sudo apt-get install zlib1g:i386

 然后可以接着安装刚才缺ncureses库的那个

 然后自己就成这样了

上下左右键能切换不同的东西

 一般我们配置的较多的是

 我们回车进去以后,发现* 和m很多

    驱动两种加载方式

                * 编译进内核   zImage包含了驱动

                M 模块方式生成驱动文件xxx.ko   系统启动后,通过命令innosd xxx.ko 加载   

        

内核配置:

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

                              指定arm架构                指定编译器                                         树莓派

make bcm2709_defconfig

         主要核心指令

==========================================================================================================

4、树莓派Linu内核编译

                4.1编译:

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

                                j4是指定用多少电脑资源编译

                                 zImage 生成内核镜像

                                 modules   要生成驱动模块

                                  dtbs   生成配置文件

        

        4.2编译成功后,看到源码树目录多了vmlinux,失败则无此文件

        成功后,目标zImage 镜像arch/arm/boot底下

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

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

        4.4数据拷贝

                mkdir         data1   data2

                挂载u盘

                 sudo mount /dev/sdb1 data1

                 sudo mount /dev/sdb2 data2

        

                安装modules,设备驱动文件:hdmi   usb wifi io ......(没有下面的话,内核能起来,驱动用不了)
sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=data2 modules_install

                      data2前面  给他加个绝对路径/home/lihzhaopeng/

sudo ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make INSTALL_MOD_PATH=/home/lihzhaopeng/data2 modules_install

                   安装更新kernel.img 文件 ,注意镜像名字事kernel7.img

                        先备份

                                cd/home/lizhaopeng/data1

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

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

        

=====================================================

可是这样弄完

ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- KERNEL=kernel7 make -j4 zImage modules dtbs 2>&1 | tee build.log

(后面比前面多出来的那部分是错误相关的)

 成功以后会生成vmlinux,vmlinux就是没有压缩的linux

 真正生成的linux 内核

,这个zImage就是我们想要的东西

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

然后我们把树莓派的sd卡插到读卡器,读卡器插到电脑 

,我们要把u盘挂载到我们的ubuntu上面

然后我们看一下有没有相应的信息

,用dmseg查看内核的信息

 相应的信息好像被电脑拿走了

 找到这里

,然后找到可移动设备

,找到super Top

有设备接入的时候,会打印一些驱动层面的东西 

有了,看那个sdb1,sdb2

那么sdb1,sdb2是什么呢?

我么刷树莓派是有两个分区的

第一个分区是操作系统内核存在的分区,叫做kernel.img

第二个分区是根目录分区

 根目录咋进去呢?

 说以我们看到两个分区sdb1,sdb2,现在我们要把他挂到我们的ubuntu这面来

插进来不是能直接用的,需要用到超级用户的权限

看好我现在的路径

看好我现在的路径

看好我现在的路径

(我多打了个h)

 结果

把sudo 去掉,sudo 环境变量会有问题

把sudo 去掉,sudo 环境变量会有问题

把sudo 去掉,sudo 环境变量会有问题

然后我们开个窗口,不要把他删了或者覆盖了,以免刷机失败,树莓派无法启动

挂载之后要解除挂载:sudo umount data2/

然后再重新挂载

先看看大小,再看看拷贝过程有没有坏掉

 md5sum是啥意思呢?

每个文件都有它特殊的唯一的编码号,就是md5sum的值

只要拷贝过程文件是变量,或者损坏了,md5sum的值就会变

 两个md5sum值一样,没拷坏

然后还有点配置文件

cp arch/arm/boot/dts/.dtb /home/lizhaopeng/data1

 需要改一下

cp arch/arm/boot/dts/.*dtb* /home/lizhaopeng/data1

 接着第二个

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

这*叫做通配符

,就是.和dtb中间有啥东西都不管,b后面有哈也不管

它拷贝的是啥呢?

 顺便看一下拷贝了多大

还有最后一个

cp arch/arm/boot/dts/overlays/README /home/lizhaopeng/data1/overlays/

拷贝完毕

然后我们把卡插到树莓派里面去

 首先断开连接(虚拟机的可移动设备里面)

然后最好还原cmdline.txt  和config.txt

然后我们把卡插到树莓派上面

看看版本是否一样

,在树莓派下用uname -r 查看一下

config.txt源代码

# For more options and information see
# http://rpf.io/configtxt
# Some settings may impact device functionality. See link above for details

# uncomment if you get no picture on HDMI for a default "safe" mode
#hdmi_safe=1

# uncomment this if your display has a black border of unused pixels visible
# and your display can output without overscan
#disable_overscan=1

# uncomment the following to adjust overscan. Use positive numbers if console
# goes off screen, and negative if there is too much border
#overscan_left=16
#overscan_right=16
#overscan_top=16
#overscan_bottom=16

# uncomment to force a console size. By default it will be display's size minus
# overscan.
#framebuffer_width=1280
#framebuffer_height=720

# uncomment if hdmi display is not detected and composite is being output
#hdmi_force_hotplug=1

# uncomment to force a specific HDMI mode (this will force VGA)
#hdmi_group=1
#hdmi_mode=1

# uncomment to force a HDMI mode rather than DVI. This can make audio work in
# DMT (computer monitor) modes
#hdmi_drive=2

# uncomment to increase signal to HDMI, if you have interference, blanking, or
# no display
#config_hdmi_boost=4

# uncomment for composite PAL
#sdtv_mode=2

#uncomment to overclock the arm. 700 MHz is the default.
#arm_freq=800

# Uncomment some or all of these to enable the optional hardware interfaces
#dtparam=i2c_arm=on
#dtparam=i2s=on
#dtparam=spi=on

# Uncomment this to enable the lirc-rpi module
#dtoverlay=lirc-rpi

# Additional overlays and parameters are documented /boot/overlays/README

# Enable audio (loads snd_bcm2835)
dtparam=audio=on
 dtoverlay=pi3-miniuart-bt

改成

# For more options and information see
# http://rpf.io/configtxt
# Some settings may impact device functionality. See link above for details

# uncomment if you get no picture on HDMI for a default "safe" mode
#hdmi_safe=1

# uncomment this if your display has a black border of unused pixels visible
# and your display can output without overscan
#disable_overscan=1

# uncomment the following to adjust overscan. Use positive numbers if console
# goes off screen, and negative if there is too much border
#overscan_left=16
#overscan_right=16
#overscan_top=16
#overscan_bottom=16

# uncomment to force a console size. By default it will be display's size minus
# overscan.
#framebuffer_width=1280
#framebuffer_height=720

# uncomment if hdmi display is not detected and composite is being output
#hdmi_force_hotplug=1

# uncomment to force a specific HDMI mode (this will force VGA)
#hdmi_group=1
#hdmi_mode=1

# uncomment to force a HDMI mode rather than DVI. This can make audio work in
# DMT (computer monitor) modes
#hdmi_drive=2

# uncomment to increase signal to HDMI, if you have interference, blanking, or
# no display
#config_hdmi_boost=4

# uncomment for composite PAL
#sdtv_mode=2

#uncomment to overclock the arm. 700 MHz is the default.
#arm_freq=800

# Uncomment some or all of these to enable the optional hardware interfaces
#dtparam=i2c_arm=on
#dtparam=i2s=on
#dtparam=spi=on

# Uncomment this to enable infrared communication.
#dtoverlay=gpio-ir,gpio_pin=17
#dtoverlay=gpio-ir-tx,gpio_pin=18

# Additional overlays and parameters are documented /boot/overlays/README

# Enable audio (loads snd_bcm2835)
dtparam=audio=on

[pi4]
# Enable DRM VC4 V3D driver on top of the dispmanx display stack
dtoverlay=vc4-fkms-v3d
max_framebuffers=2

[all]
#dtoverlay=vc4-fkms-v3d
dtoverlay=pi3-disable-bt
start_x=1
gpu_mem=128

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值