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

树莓派:关于linux内核相关推荐

  1. 树莓派开发6-配置树莓派的Linux内核

    文章目录 配置树莓派的Linux内核 树莓派Linux内核编译 文件系统 Linux内核驱动基础框架 驱动测试步骤 树莓派学习笔记,本文图片文字皆为转述 配置树莓派的Linux内核 驱动两种加载方式: ...

  2. 树莓派——配置Linux内核适合树莓派

    文章目录 将linux内核代码和编译工具tools上传到ubuntu 树莓派等芯片带操作系统的启动过程 不带操作系统的: 带操作系统的: BootLoader的工作流程: 树莓派Linux源码目录树分 ...

  3. 树莓派基于Linux内核驱动开发

    一.驱动认知 1.1 为什么要学习写驱动 树莓派开发简单是因为有厂家提供的wiringPi库,实现超声波,实现继电器操作,做灯的点亮-都非常简单. 但未来做开发时,不一定都是用树莓派,则没有wirin ...

  4. 第三阶段:43-47.树莓派基于Linux内核驱动开发

    目录 一.驱动认知 1.1 为什么要学习写驱动 1.2 文件名与设备号 1.3 open函数打通上层到底层硬件的详细过程 二.基于框架编写驱动代码 2.1 编写上层应用代码 2.2 修改内核驱动框架代 ...

  5. 树莓派基于Linux内核驱动开发详解

    一.驱动认知 首先理解Linux内核框图 文件系统认知,Linux内核框图 1.什么是驱动 linux内核驱动.软件层面上的驱动 广义上是指:这一段代码操作了硬件去动,所以这一段代码就叫硬件的驱动程序 ...

  6. 树莓派之Linux内核基础

    Linux内核篇 一.为Linux内核开发做基础准备工作 二.嵌入式设备带操作系统的启动过程扫盲 三.Linux内核源码目录树 四.配置Linux内核适合树莓派相关操作 五.Linux内核编译 六.L ...

  7. 树莓派升级Linux内核,树莓派编译升级内核

    我的博客部分文章同步至简书. 编译环境: 主机CentOS6.8 树莓派3B Raspbian 备份 这次升级内核会影响到树莓派的/boot目录,首先备份/boot,如果不嫌麻烦那就备份整张SD卡 c ...

  8. 树莓派Linux内核配置、编译以及烧录详细步骤

    目录 一.内核配置 第一种方式:(cp 厂家.config .config) 第二种方式(make menuconfig 一项项配置,通常是基于厂家的config来配置) 二.内核编译 三.烧录 1. ...

  9. 编译64位linux内核,为树莓派4编译64位的内核

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 树莓派从3代开始就已经是64位的CPU了,64位的CPU当然要使用64位的系统了.但是即便性能更强大的树莓派4都已经发布 ...

最新文章

  1. OpenStack潜力巨大:红帽打造生态系统
  2. respect labor
  3. 用matlab编程简单电子琴,基于MATLAB的数字信号发生器及简易电子琴设计论文.doc...
  4. matlab mpt工具箱帮助文档_替代 Matlab 的国产软件出现?
  5. n个节点的二叉树n+1_使用C ++程序将链接列表中的最后N个节点附加到第一个
  6. java中gradlew 命令_gradle命令学习
  7. 台式电脑麦克风_还有人买台式PC吗?这份新品推荐攻略值得收藏
  8. 知方可补不足~数据库名称和数据库别名不同了怎么办
  9. 中国恒大、恒大物业在香港暂停交易
  10. vscode remote ssh_win10 下安装Vscode
  11. 码云怎么创建公开的仓库_使用码云创建属于你的免费私有git仓库
  12. EMERSON模块A6500-UM、SLS1508、MVME7100-0171、MVME61006E-0163、A6370D、SE3008、CE3008、MVME6100、VE3006,CE3008
  13. FPGA三段式状态机的思维陷阱
  14. 计算机表格复制粘贴,在Excel同一个工作表中,如何复制表格格式(excel表格粘贴复制技巧)...
  15. 手机无法连接wifi,提示正在获取ip, ip分配失败
  16. java分页查询表格显示数据格式_springBoot查询数据分页显示
  17. 小福利,通过python利用百度ai实现图片识别
  18. tspl 重置打印机命令_命令行添加删除打印机
  19. Fortunate Finds
  20. 为什么趋势(涨)都有大阳线回调

热门文章

  1. BRCM5.02编译八: ERROR: you are missing a basic functioning perl installation
  2. 【OMP信道估计】基于OMP压缩感知的信道估计算法的MATLAB仿真
  3. ppwjs之bootstrap表格:String.到表头单元格元素 和 String.到表格单元格元素
  4. caioj 1158 欧拉函数
  5. GIT服务器搭建(转载)
  6. Java中,内部类的概述和内部类的访问特点和内部类的分类(内部类的位置)
  7. 基于8086CPU微处理器的汇编学习之段地址与偏移地址的分析
  8. BUG管理系统(Mantis)迁移实录
  9. GridView的多主键(Key)取值问题
  10. Keil生成汇编文件、bin文件