树莓派:关于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
總結
以上是生活随笔為你收集整理的树莓派:关于linux内核的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 乌鲁木齐买车贷款利率是多少?
- 下一篇: Java:Java和c的区别