linux驅動學習(三)之uboot與內核編譯

需要板子一起學習的可以這里購買(含資料):點擊跳轉

GEC6818內核源碼下載:點擊跳轉

一、環境配置?????????

????????由于GEC6818對應是64位系統,虛擬機中的linux系統也要是64位,比如:ubuntu16.04.rar
? ?
? ?但是,ubuntu16.04.rar系統,對虛擬機有要求:
? ?打開ubuntu16.04.vmx查看對虛擬機的要求:
? ?virtualHW.version = "12" ----- VM為12
? ?如果說電腦上的VM低于12,不要重新安裝VM,
? ?virtualHW.version = "10"

二、源碼拷貝

????????把6818GEC.tar.gz拷貝到linux系統下,不能采用文件共享來在windows下編譯uboot和內核

第一步:拷貝源碼到linux的家目錄下

第二步:解壓源碼

sudo tar zxvf 6818GEC.tar.gz

第三步:修改源碼的權限

chmod 777 6818GEC

第四步:查看源碼的目錄內容

$ ls -l
total 40
drwxrwxr-x 15 gec gec 4096 Feb 15  2017 buildroot
drwxrwxr-x 20 gec gec 4096 Jul 17  2017 GEC6818uboot ---->開發板Uboot的源碼
drwxrwxr-x 25 gec gec 4096 Jul 17  2017 kernel ---> 開發板內核的源碼
drwxrwxr-x  3 gec gec 4096 Jul 18  2016 linux
-rwxrwxr-x  1 gec gec 6019 Jul 17  2017 mk ---> 腳本
drwxrwxr-x  5 gec gec 4096 Dec 21  2016 out ----> UBOOT和內核的輸出
drwxrwxr-x  3 gec gec 4096 Jul 18  2016 prebuilts ---> 編譯uboot與內核使用到的工具鏈
drwxrwxr-x  3 gec gec 4096 Jul 18  2016 prototype
drwxrwxr-x  3 gec gec 4096 Feb 14  2017 tools

三、mk腳本分析

1) 關于路徑變量
? ? BS_DIR_TOP=$(cd `dirname $0` ; pwd) ----> gec@ubuntu:~/6818GEC$ ./mk 1 2 3 1 ?./mk 相當于 $0
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? $() ----->提取內容,并且把內容賦值給變量BS_DIR_TOP
?? ??? ??? ??? ??? ??? ??? ? ? ? gec@ubuntu:~/6818GEC$ pwd
?? ??? ??? ??? ??? ??? ??? ??? ?/home/gec/6818GEC
?? ??? ??? ??? ??? ??? ??? ??? ?BS_DIR_TOP=/home/gec/6818GEC
?? ?BS_DIR_RELEASE=${BS_DIR_TOP}/out/release
?? ?BS_DIR_TARGET=${BS_DIR_TOP}/out/target/product/GEC6818/
?? ?BS_DIR_UBOOT=${BS_DIR_TOP}/GEC6818uboot ?----> uboot的路徑
?? ?BS_DIR_KERNEL=${BS_DIR_TOP}/kernel ----> 內核的路徑
?? ?BS_DIR_BUILDROOT=${BS_DIR_TOP}/buildroot
?? ?
?? ?以上都是變量進行賦值

2)關于路徑變量
? BS_CROSS_TOOLCHAIN_BOOTLOADER=${BS_DIR_TOP}/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-
? BS_CROSS_TOOLCHAIN_KERNEL=${BS_DIR_TOP}/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-
? 以上都是工具邏的路徑

3) Target Config
? ? BS_CONFIG_BOOTLOADER_UBOOT=GEC6818_config ?---->編譯uboot要使用到的配置文件
?? ?BS_CONFIG_KERNEL=GEC6818_defconfig ---> 編譯kernel要使用到的配置文件
?? ??? ?gec@ubuntu:~/6818GEC/kernel/arch/arm/configs$ ls
?? ??? ?GEC6818_defconfig?
?? ?BS_CONFIG_FILESYSTEM=PRODUCT-GEC6818-userdebug
?? ?BS_CONFIT_BUILDROOT=GEC6818_defconfig

4)編譯各個模塊的功能函數
? ? setup_environment()
?? ?build_bootloader_uboot()
?? ?build_kernel()
?? ?
? 5) 普通變量
?? ?threads=4
?? ?uboot=no ----> 默認情況下為no
?? ?kernel=no
?? ?system=no
?? ?buildroot=no
? 6) 分析shell語句
? ?if [ -z $1 ]; then
?? ?uboot=yes
?? ?kernel=yes
?? ?system=yes
?? ?buildroot=yes
? fi

7) case語句
? ?while [ "$1" ]; do
? ? case "$1" in
?? ?-j=*)
?? ??? ?x=$1
?? ??? ?threads=${x#-j=}
?? ??? ?;;
?? ?-u|--uboot)
?? ??? ?uboot=yes
?? ? ? ?;;
?? ?-k|--kernel)
?? ? ? ?kernel=yes
?? ? ? ?;;
?? ?-s|--system)
?? ??? ?system=yes
?? ? ? ?;;
?? ?-b|--buildroot)
?? ? ? ?buildroot=yes
?? ? ? ?;;
?? ?-a|--all)
?? ??? ?uboot=yes
?? ??? ?kernel=yes
?? ??? ?system=yes
?? ??? ?buildroot=yes
?? ? ? ?;;
?? ?如果$1 的值為 -u 或者 --uboot,則執行
?? ? ? uboot=yes

8) ?根據變量的值的狀態調用相應的函數
? ?if [ "${uboot}" = yes ]; then
?? ?build_bootloader_uboot || exit 1
?? ?fi

?? ?if [ "${kernel}" = yes ]; then
?? ??? ?build_kernel || exit 1
?? ?fi
?? ?
9)分析相關的函數
?? ? ?build_bootloader_uboot
?? ? ?
?? ? ?build_kernel()
?? ?{
?? ??? ?export PATH=${BS_DIR_UBOOT}/tools:$PATH ?---> 配置PATH
?? ??? ?# Compiler kernel
?? ??? ?cd ${BS_DIR_KERNEL} || return 1 ---> 進入到內核目錄
?? ??? ?make ${BS_CONFIG_KERNEL} ARCH=arm CROSS_COMPILE=${BS_CROSS_TOOLCHAIN_KERNEL} || return 1-->
?? ??? ?等 價于 make GEC6818_defconfig ARCH=arm CROSS_COMPILE=/home/gec/6818GEC/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-
?? ??? ?make -j${threads} ARCH=arm CROSS_COMPILE=${BS_CROSS_TOOLCHAIN_KERNEL} || return 1
?? ??? ?make -j${threads} ARCH=arm CROSS_COMPILE=${BS_CROSS_TOOLCHAIN_KERNEL} uImage || return 1 --->
?? ??? ?生成內核的鏡像:uImage

?? ??? ?# Copy uImage to release directory
?? ??? ?#cp -v ${BS_DIR_KERNEL}/arch/arm/boot/uImage ${BS_DIR_RELEASE}

?? ??? ?#echo "^_^ kernel path: ${BS_DIR_RELEASE}/uImage"

?? ??? ?# generate boot.img
?? ??? ?cd ${BS_DIR_TOP} || return 1
?? ??? ?echo 'boot.img ->' ${BS_DIR_RELEASE}
?? ??? ?# Make boot.img with ext4 format, 64MB
?? ??? ?cp -v ${BS_DIR_KERNEL}/arch/arm/boot/uImage ${BS_DIR_TARGET}/boot --->
?? ??? ?把uImage拷貝到${BS_DIR_TARGET}/boot目錄下
?? ??? ?
?? ??? ?mkuserimg.sh -s ${BS_DIR_TARGET}/boot ${BS_DIR_TARGET}/boot.img ext4 boot 67108864 --->
?? ??? ?通過mkuserimg.sh腳本中的命令,把${BS_DIR_TARGET}/boot目錄的uImage文件,制作成
?? ??? ?${BS_DIR_TARGET}/目錄 下boot.img鏡像文件

?? ??? ?cp -av ${BS_DIR_TARGET}/boot.img ${BS_DIR_RELEASE} || return 1; --->
?? ??? ?把編譯好的boot.img拷貝到 ${BS_DIR_RELEASE}目錄下
?? ??? ?return 0
?? ?}
?? ?
?? ?綜上分析得出:
?? ?編譯uboot:./mk -u
?? ?編譯內核:./mk -k?

四、使用mk腳本來編譯內核

~/6818GEC$ ls

buildroot ?GEC6818uboot ?kernel ?linux ?mk ?out ?prebuilts ?prototype ?tools

~/6818GEC$ ./mk -k?

?內核編譯輸出的結果:
? ?

Kernel: arch/arm/boot/Image is ready ---> 內核ImageKernel: arch/arm/boot/zImage is ready ---> 內核zImageUIMAGE ?arch/arm/boot/uImage ---->內核的最終鏡像gec@ubuntu:~/6818GEC/kernel/arch/arm/boot$ lsbootp ?compressed ?dts ?Image ?install.sh ?Makefile ?uImage ?zImageImage Name: ? Linux-3.4.39-gecCreated: ? ? ?Sun Feb 17 19:14:47 2019Image Type: ? ARM Linux Kernel Image (uncompressed)Data Size: ? ?5532568 Bytes = 5402.90 kB = 5.28 MBLoad Address: 40008000Entry Point: ?40008000Image arch/arm/boot/uImage is readyboot.img -> /home/gec/6818GEC/out/release'/home/gec/6818GEC/kernel/arch/arm/boot/uImage' -> '/home/gec/6818GEC/out/target/product/GEC6818//boot/uImage'make_ext4fs -s -T -1 -l 67108864 -a boot /home/gec/6818GEC/out/target/product/GEC6818//boot.img /home/gec/6818GEC/out/target/product/GEC6818//bootCreating filesystem with parameters:Size: 67108864Block size: 4096Blocks per group: 32768Inodes per group: 4096Inode size: 256Journal blocks: 1024Label:?Blocks: 16384Block groups: 1Reserved block group size: 7Created filesystem with 18/4096 inodes and 4212/16384 blocks'/home/gec/6818GEC/out/target/product/GEC6818//boot.img' -> '/home/gec/6818GEC/out/release/boot.img'

? ? 最終在6818GEC/out/release/boot.img找到鏡像文件boot.img
?? ?
?? ?
注意事項:
?? ? ? 問題一:在首次編譯內核時,未先編譯uboot,會出現錯誤
?? ? ? "mkimage" command not found - U-Boot images will not be built
?? ? ? 解決辦法:先編譯u-boot,再重新編譯內核
?? ? ? ./mk -u?
?? ? ? ./mk -k
?

五、燒寫內核到開發板

第一步:把編譯生成的boot.img單獨拷貝,并且與fastboot.exe、adb.exe AdbWinUsbApi.dll,AdbWinApi.dll
? 第二步:連接USB線到開發板與電腦
?? ??? ?大端的USB口接電腦
?? ??? ?小端的USB口接開發板
? 第三步:啟動開發板并且運行在u-boot命令行下,執行fastboot命令? ?

X6818# fastboot

Fastboot Partitions:mmc.2: ubootpak, img : 0x200, 0x78000mmc.2: 2ndboot, img : 0x200, 0x4000mmc.2: bootloader, img : 0x8000, 0x70000mmc.2: boot, fs : 0x100000, 0x4000000mmc.2: system, fs : 0x4100000, 0x2f200000mmc.2: cache, fs : 0x33300000, 0x1ac00000mmc.2: misc, fs : 0x4e000000, 0x800000mmc.2: recovery, fs : 0x4e900000, 0x1600000mmc.2: userdata, fs : 0x50000000, 0x0Support fstype : 2nd  boot  factory  raw  fat  ext4  emmc  nand  ubi  ubifs Reserved part  : partmap  mem  env  cmd DONE: Logo bmp 311 by 300 (3bpp), len=280854 DRAW: 0x47000000 -> 0x46000000 Load USB Driver: androidCore usb device tie configuration doneOTG cable Connected!

在PC端的設備管理器上顯示:Android Device

第四步:在PC端的命令行
?? ?ctrl + r ---> cmd ---->彈出終端界面,并且進入到boot.img目錄下

第五步:通過fastboot命令上傳文件到開發板

fastboot flash boot boot.img

sending 'boot' (16848 KB)... OKAY
writing 'boot'... OKAY

第六步:重啟動開發板
X6818# reset

六、使用make命令來編譯kernel源碼

第一步:進入到內核源碼的目錄下(~/6818GEC/kernel)

make clean -----> 清理一下項目

第二步:拷貝內核源碼編譯的配置文件(***_config)

cp arch/arm/configs/GEC6818_defconfig .config

第三步:執行make menuconfig?

make menuconfig ----->配置內核(以菜單來進行配置)

第四步:把執行make menuconfig修改后的.config拷貝回到對應的硬件平臺配置目錄下

cp .config arch/arm/configs/GEC6818_defconfig?

第五步:執行make 進行源碼的編譯

make ?ARCH=arm CROSS_COMPILE=/home/gec/6818GEC/prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-

七、內核源碼的結構

Linux 內核源代碼包含如下目錄。
?? ?● arch :包含和硬件體系結構相關的代碼,每種平臺占一個相應的目錄,如i386、arm、arm64、powerpc、mips 等。Linux 內核目前已經支持30 種左右的體系結構。在arch目錄下,存放的是各個平臺以及各個平臺的芯片對Linux 內核進程調度、內存管理、中斷等的支持,以及每個具體的SoC 和電路板的板級支持代碼。
?? ?● block:塊設備驅動程序I/O 調度。
?? ?● crypto:常用加密和散列算法(如AES、SHA 等),還有一些壓縮和CRC 校驗算法。
?? ?● documentation:內核各部分的通用解釋和注釋。
?? ?● drivers :設備驅動程序,每個不同的驅動占用一個子目錄,如char、block、net、mtd、i2c 等。
?? ?● fs:所支持的各種文件系統,如EXT、FAT、NTFS、JFFS2 等。
?? ?● include:頭文件,與系統相關的頭文件放置在include/linux 子目錄下。
?? ?● init:內核初始化代碼。著名的start_kernel() 就位于init/main.c 文件中。
?? ?● ipc:進程間通信的代碼。
?? ?● kernel :內核最核心的部分,包括進程調度、定時器等,而和平臺相關的一部分代碼
?? ?放在arch/*/kernel 目錄下。
?? ?● lib:庫文件代碼。
?? ?● mm:內存管理代碼,和平臺相關的一部分代碼放在arch/*/mm 目錄下。
?? ?● net:網絡相關代碼,實現各種常見的網絡協議。
?? ?● scripts:用于配置內核的腳本文件。
?? ?● security:主要是一個SELinux 的模塊。
?? ?● sound:ALSA、OSS 音頻設備的驅動核心代碼和常用設備驅動。
?? ?● usr:實現用于打包和壓縮的cpio 等。
?? ?● include:內核API 級別頭文件。
??
? ?

覺得有幫助的話,打賞一下唄。。

? ? ? ? ? ?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/21516.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/21516.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/21516.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Bee 支持 與 mybatis-plus 混用嗎?

Bee 支持 與 mybatis-plus 混用嗎? 你是在什么場景下要混用呢? mybatis-plus是基于mybatis. 而Bee本身就是一個ORM框架了. Hibernate/MyBatis plus Sharding JDBC Jpa Spring data GraphQL App ORM (Android, 鴻蒙) Bee Bee支持的數據庫 1.MySQL 2.Oracle 3.SQL…

elasticsearch的常規操作--增刪改查和批量處理

1、_cat 查詢 GET /_cat/nodes: 查看所有節點 GET /_cat/health: 查看es 健康狀況 GET /_cat/master: 查看主節點 GET /_cat/indices:查看所有索引show databases; 2、索引一個文檔(保存) 保存一個數據&…

某紅書旋轉滑塊驗證碼分析與協議算法實現(高通過率)

文章目錄 1. 寫在前面2. 接口分析3. 驗證軌跡4. 算法還原 【🏠作者主頁】:吳秋霖 【💼作者介紹】:擅長爬蟲與JS加密逆向分析!Python領域優質創作者、CSDN博客專家、阿里云博客專家、華為云享專家。一路走來長期堅守并致…

力扣SQL50 學生們參加各科測試的次數 查詢 三表查詢

Problem: 1280. 學生們參加各科測試的次數 👨?🏫 參考題解 join等價于inner join,不用關聯條件的join等價于cross join Code select stu.student_id,stu.student_name, sub.subject_name,count(e.subject_name) attended_exams from Stud…

關于windosw打開安全中心空白的解決方案

關于windosw打開安全中心空白的解決方案 問題如下 問題如下 之后點擊一片空白 解決方案如下 按下WINR,輸入regedit回車找到路徑:“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SecurityHealthService”,然后雙擊右邊的“start”…

【最新鴻蒙應用開發】——關系型數據庫簡單上手(RDB)

關系型數據庫(RDB) 關系型數據庫(Relational Database,RDB)是一種基于關系模型來管理數據的數據庫。關系型數據庫基于SQLite組件提供了一套完整的對本地數據庫進行管理的機制,對外提供了一系列的增、刪、改…

【cocos sreator】判定多邊形和多邊形相交

核心代碼: cc.Intersection.polygonPolygon(points2, points) 拖拽物品拖到多個目標位置判定,取最近的: getTargetItem(collider2: cc.PolygonCollider, touchPos: cc.Vec2, targetRoot: cc.Node) {let length 99999;let target null;//col…

windows 下編譯 TessRact+leptonica 識別圖片文字

目錄 1、下載 2. 編譯基礎依賴庫 1.1 zlib 1.2 jpegsr9f 1.3 lpng1643 1.4 libgif 3. 編譯tifflib 4. 配置nasm到系統環境中 5. 編譯 libjpeg-turbo 6 編譯leptonica 7. 編譯tesseract 8. 測試驗證 1、下載 下載tesseract5.3.2 下載leptonica1.83.1 下載l…

1638. 統計只差一個字符的子串數目

題目 給你兩個字符串 s 和 t,請找出 s 中的非空子串的數目,這些子串滿足替換一個不同字符以后,是 t 串的子串。換言之,請你找到 s 和 t 串中恰好只有一個字符不同的子字符串對的數目。 一個子字符串是一個字符串中連續的字符。 …

【全開源】旅游門票預訂系統(FastAdmin+ThinkPHP+Uniapp)

一款基于FastAdminThinkPHPUniapp開發的旅游門票預訂系統,支持景點門票、導游產品便捷預訂、美食打卡、景點分享、旅游筆記分享等綜合系統,提供前后臺無加密源碼,支持私有化部署。 ?便捷你的每一次出行🌍 🌟 輕松預訂…

PMP中的各種圖

單、雙代號網絡圖 區別 內容 箭線圖(ADM)-雙 箭線活動 節點依賴關系 箭線圖只能表示一種FS的關系 規劃和控制項目活動進度的項目 (建筑、軟件) 前導圖(PDM)-單 節點代表活動 前導圖法可以體現多種邏…

語義化版本控制:軟件工程的實用之道

語義化版本控制:軟件工程的實用之道 在軟件開發過程中,版本控制是確保項目穩定、有序進行的關鍵環節。隨著項目的發展,功能的增加、錯誤的修復以及API的修改變得日益頻繁。為了有效管理這些變化,并確保團隊成員、用戶以及依賴該軟…

Python中的上下文管理:深入探索contextlib模塊

Python中的上下文管理:深入探索contextlib模塊 在Python編程中,上下文管理器扮演著至關重要的角色,它們允許我們以一種非常優雅和高效的方式來管理資源,如文件操作、鎖的獲取與釋放等。contextlib模塊是Python標準庫中的一個模塊…

骨傳導藍牙耳機買哪款好?年度精選五款骨傳導藍牙耳機推薦

作為音樂愛好者的我,也一直在尋找一款好的骨傳導耳機,聽音樂對我來說不僅僅是一種消遣方式,更多是一種對生活、工作上壓力和困難的舒緩,所以今天給大家推薦幾款骨傳導耳機。今天推薦這幾款骨傳導耳機都是比較有性價比,…

計算機網絡學習實踐:模擬RIP動態路由

計算機網絡學習實踐:模擬RIP動態路由 模擬動態路由RIP協議 1.實驗準備 實驗環境:華為模擬器ENSP 實驗設備: 3個路由器,3個二層交換機(不是三層的),3個PC機 5個網段 192.168.1.0 255.255.…

【Linux】文件IO基礎

man手冊 通過man手冊可以獲取詳細的Linux操作命令共有8章,查詢使用man ls即可查詢ls的相應命令,也可以使用相應的章節man 2 open查詢第二章的open如何使用。 常用文件IO函數 功能函數描述實例打開文件int open(const char *pathname, int flags);打開…

21data 數據可視化 代碼合集

<!-- <!DOCTYPE html> <html> <head><title>視覺映射和圖例</title><meta charset"utf-8"><script src"echarts.js"></script> </head> <body> <div style"width: 600px;height:4…

電腦視頻錄制工具,推薦3款,讓你的作品更專業!

隨著信息技術的飛速發展&#xff0c;電腦視頻錄制工具在日常工作和娛樂中扮演著越來越重要的角色。它們不僅能幫助我們記錄電腦屏幕上的精彩瞬間&#xff0c;還能為教學、演示、游戲直播等多種場景提供便利。本文將詳細介紹三款電腦視頻錄制工具&#xff0c;并分步驟闡述它們的…

【TB作品】msp430f5529單片機,dht22,煙霧傳感器

功能 //硬件&#xff1a;msp430f5529、dht22、LCD1602、蜂鳴器、煙霧傳感器、藍牙模塊。 //功能&#xff1a;讀取溫濕度、煙霧濃度顯示到屏幕&#xff1b; //按鍵調節三個報警數值&#xff1b; //溫度、濕度、煙霧濃度&#xff0c;任意一個大于報警數值就蜂鳴器報警&#xff1…

如何編輯pdf文件內容?編輯技巧大揭秘,秒變辦公達人!

如何編輯pdf文件內容&#xff1f;在數字化辦公日益普及的今天&#xff0c;PDF文件因其跨平臺、格式穩定的特點&#xff0c;成為我們日常工作和學習中不可或缺的一部分。然而&#xff0c;PDF文件的編輯卻常常令人頭疼&#xff0c;許多人面對需要修改內容的PDF文件時感到無從下手…