當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 學(xué)習(xí)筆記 > 系統(tǒng)移植詳細步驟,學(xué)霸總結(jié)
系統(tǒng)移植
一.服務(wù)器的搭建
1. TFTP服務(wù)器
1.1 安裝
#sudo apt-get install tftpd-hpa tftp-hpa
1.2配置服務(wù)器客戶端在同一網(wǎng)段
服務(wù)器 (Ubuntu)$ sudo ifconfig eth0(網(wǎng)卡) 192.168.~.~ netmask 255.255.255.0
上面的命令,將ip地址和子網(wǎng)掩碼設(shè)置到內(nèi)核;
當(dāng)網(wǎng)卡斷開時,內(nèi)核會丟掉ip地址;
當(dāng)網(wǎng)卡連接時,內(nèi)核會從配置文件(從網(wǎng)絡(luò)自動獲取)讀取ip地址和子網(wǎng)掩碼
客戶端 (開發(fā)板)# setenv ipaddr 192.168.~.~ 將ip地址設(shè)置到ipaddr環(huán)境變量
# setenv netmask 255.255.255.0 設(shè)置子網(wǎng)掩碼
# saveenv 保存所有的環(huán)境變量到emmc
網(wǎng)卡:將虛擬機設(shè)置為橋接模式
1.3修改配置文件
# sudo vi /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/tftpboot" #****指定tftp服務(wù)器的根目錄,就是下載文件的位置
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="-c -s -l" #這里是選項,-c是可以上傳文件的參數(shù),-s是指定tftpd-hpa服務(wù)目錄,上面已經(jīng)指定 -l 監(jiān)聽模式
創(chuàng)建tftpboot目錄,重啟啟動 tftp-server
#sudo mkdir /tftpboot
#sudo chmod 777 /tftpboot
#sudo service tftpd-hpa restart
2.通過TFTP服務(wù)器移植系統(tǒng)
通過網(wǎng)線將(Ubuntu)中tftp文件夾下的系統(tǒng)配置文件燒寫到開發(fā)板中
2.1燒寫kernel(uImage)
1. 拷貝uImage到虛擬機的/tftpboot
2. 下載uImage到開發(fā)板內(nèi)存(0x41000000)
# tftp 41000000(內(nèi)存地址) uImage
2.2 燒寫設(shè)備樹(exynos4412-fs4412.dtb)
1. 拷貝exynos4412-fs4412.dtb到虛擬機的/tftpboot
2. 下載exynos4412-fs4412.dtb到開發(fā)板內(nèi)存(0x41000000)
# tftp 0x41000000(內(nèi)存地址) exynos4412-fs4412.dtb
3. 燒寫exynos4412-fs4412.dtb到emmc
# movi write dtbs(分區(qū)名) 0x41000000(內(nèi)存,放了exynos4412-fs4412.dtb)
2.3燒寫文件系統(tǒng)rootfs(ramdisk.img)
1. 拷貝ramdisk.img到虛擬機的/tftpboot
2. 下載ramdisk.img到開發(fā)板內(nèi)存(0x41000000)
# tftp 0x41000000(內(nèi)存地址) ramdisk.img
3. 燒寫ramdisk.img到emmc
# movi write rootfs(分區(qū)名) 0x41000000(內(nèi)存,放了ramdisk.img) 0x300000(分區(qū)大小)
2.4手動啟動
1. 設(shè)置內(nèi)核的啟動參數(shù)
# setenv bootargs init=/linuxrc(告訴內(nèi)核第一個應(yīng)用程序的位置) console=ttySAC2,115200(告訴內(nèi)核哪個終端是它的輸入/輸出終端)
# saveenv
2. 讀取kernel到內(nèi)存(運行時以下三個文件要并存,地址要偏移下,不要覆蓋)
# movi read kernel 0x41000000
3. 讀取設(shè)備樹到內(nèi)存
# movi read dtbs 0x42000000
4. 讀取rootfs(ramdisk.img)到內(nèi)存
# movi read rootfs 0x43000000(放在內(nèi)存的位置) 0x300000(大小)
5. 啟動內(nèi)核
#bootm 0x41000000(內(nèi)核) 0x43000000(根文件系統(tǒng)) 0x42000000(設(shè)備樹的位置)
2.5自動啟動
1. 原理
u-boot啟動后,如果倒計時到0, 它會自動運行bootcmd環(huán)境變量中的命令
2. 設(shè)置bootcmd環(huán)境變量
# setenv bootcmd movi read kernel 0x41000000\;movi read dtbs 0x42000000\;movi read rootfs 0x43000000 0x300000\;bootm 0x41000000 0x43000000 0x42000000
# saveenv
3. 重啟開發(fā)板
注:當(dāng)出現(xiàn)下載不動,終端一直打印T時,檢查服務(wù)器配置,端口設(shè)置,重啟服務(wù)器
3.通過NFS服務(wù)器掛載網(wǎng)絡(luò)文件系統(tǒng)
3.1原理
將開發(fā)板上的文件系統(tǒng)掛載到服務(wù)器(Ubuntu)上,實現(xiàn)服務(wù)器和開發(fā)板可以同時對改文件系統(tǒng)進行操作。
3.2 安裝
#sudo apt-get install nfs-kernel-server nfs-common
3.3修改配置文件系統(tǒng)
sudo vi /etc/exports
在注視下添加一行:
/source/rootfs *(rw,sync,no_root_squash,no_subtree_check)
/source/rootfs”是存放nfs文件系統(tǒng)的路徑;“*”表示在所有的網(wǎng)段都可以共享;“rw”表示nfs文件系統(tǒng)允許讀寫;
“sync”表示修改都會同步到nfs服務(wù)端,否則只是會暫存在本地內(nèi)存;
新建配置文件指定的對應(yīng)的nfs服務(wù)器根目錄
sudo mkdir -p /source/rootfs
重啟nfs服務(wù)程序,使配置生效
sudo service nfs-kernel-server restart
3.4就該開發(fā)板Uboot的內(nèi)核啟動參數(shù)
//根文件系統(tǒng)通過nfs協(xié)議去掛載 網(wǎng)絡(luò)文件系統(tǒng)存放的位置
#setenv bootargs root=/dev/nfs rw nfsroot=192.168.1.250:/source/rootfs ip=192.168.1.4(內(nèi)核用到的ip地址,因為內(nèi)核要和nfs服務(wù)器進行網(wǎng)絡(luò)通訊) console=ttySAC2,115200 init=/linuxrc
(3) 設(shè)置自動運行命令
#setenv bootcmd tftp 41000000 uImage\;tftp 42000000 exynos4412-fs4412.dtb\;bootm 41000000 - 42000000 ("-"表示不指定根文件系統(tǒng)地址)
#saveenv
3. boot或重啟開發(fā)板
二.U-boot
1.BootLoader.
1.1簡介:
屬于嵌入式系統(tǒng)的軟件層次,固話在固件中的boot程序,類似于(BOIS),grub,它是在操作系統(tǒng)運行前執(zhí)行的一小段程序,主要是用于引導(dǎo)操作系統(tǒng)。
1.2基本功能
a.初始化硬件 b.把BootLoader自搬到內(nèi)存中 c.執(zhí)行用戶命令(訪問環(huán)境變量,網(wǎng)絡(luò),串口通訊,讀寫ram/flash) d.設(shè)置Linux啟動參數(shù)
1.3 執(zhí)行過程
不同的處理器上電或復(fù)位后執(zhí)行的第一條指令地址并不相同,對于 ARM 處理器來說,該地址為 0x00000000。
對于一般的嵌入式系統(tǒng),通常把 Flash 等非易失性存儲器映射到這個地址處,而 Bootloader就位于該存儲器的最前端,
所以系統(tǒng)上電或復(fù)位后執(zhí)行的第一段程序便是Bootloader。而因為存儲 Bootloader的存儲器不同,Bootloader的執(zhí)行過程也并不相同,
嵌入式系統(tǒng)中廣泛采用的非易失性存儲器通常是 Flash,而 Flash 又分為 Nor Flash 和Nand Flash 兩種。
它們之間的不同在于:Nor Flash 支持芯片內(nèi)執(zhí)行(XIP, eXecute In Place),這樣代碼可以在Flash上直接執(zhí)行而不必拷貝到RAM中去執(zhí)行。
而Nand Flash并不支持XIP,所以要想執(zhí)行 Nand Flash 上的代碼,必須先將其拷貝到 RAM中去,然后跳到 RAM 中去執(zhí)行
2.uboot分析
2.1 uboot特點
代碼結(jié)構(gòu)清晰,易于一直,支持多種CUP,可以支持多種操作系統(tǒng),支持許多開發(fā)板,支持多種協(xié)議文件系統(tǒng)。
2.2uboot常用命令
setenv var value 設(shè)置環(huán)境變量
setenv var 刪除var變量
saveenv <==>save
printenv <==> pri
特殊變量 bootcmd uboot在自啟動模式下會自動執(zhí)行。
bootcmd 在uboot啟動的時候,當(dāng)?shù)褂嫊r到0的時候,uboot會去找到bootcmd環(huán)境變量,取得它的值。
bootcmd的值都是一些uboot可執(zhí)行的命令,uboot會去自動執(zhí)行這些命令。
bootargs linux內(nèi)核啟動參數(shù),uboot會將此環(huán)境變量的值存到啟動參數(shù)區(qū),內(nèi)核在啟動的時候,首先會去啟動參數(shù)區(qū)
獲取相關(guān)參數(shù),解析處理,做相應(yīng)的處理。參數(shù)格式,名稱不能隨意,固定的。
2.3uboot啟動流程
第一階段:匯編
1>初始化硬件(CPU內(nèi)部的寄存器)
2>初始化RAM,為第二階段程序準(zhǔn)備空間
3>拷貝第二階段的程序到內(nèi)存空間
4>跳轉(zhuǎn)到第二階段C入口
第二階段:C語言
1>初始化硬件(板級硬件設(shè)備)
2>將內(nèi)核和根文件系統(tǒng)鏡像加載到內(nèi)存中
3>執(zhí)行內(nèi)核
3.U-BOOT移植
3.1基本步驟
1.找到相近的代碼,并拷貝一份作為自己修改的源碼
2.先修改源碼,使能核心部件(uart clock ram..),能串口輸出信息。
3.移植修改其他非核心源碼
三.Linux內(nèi)核
1 Linux內(nèi)核的基本組成
a.MM內(nèi)存管理
b.PM進程管理
c.FS文件系統(tǒng)
d.DC驅(qū)動架構(gòu)
e.NET網(wǎng)絡(luò)
f.驅(qū)動代碼(占很大部分代碼)
Linux內(nèi)核是一個有文件系統(tǒng),多任務(wù)管理,硬件抽象層2等功能的系統(tǒng)軟件。內(nèi)核不是一個完整的操作系統(tǒng)
linux系統(tǒng) = Linux kernel + lib + apps + GUI(圖形界面 qt window gome)
2.Linux內(nèi)核的特征
2.1特點
1.可裁剪,可擴展,可定制。
2.可移植性強,支持多種體系結(jié)構(gòu)。
3.穩(wěn)定性強,網(wǎng)絡(luò)功能強。
4.支持多任務(wù)多用戶,資源耗費少。
2.2內(nèi)核源碼目錄
git分布式 svn托管 代碼管理系統(tǒng)
*arch 體系結(jié)構(gòu)相關(guān)代碼,各體系結(jié)構(gòu)cpu
arch/arm/板子 arm體系結(jié)構(gòu) 目錄都是開發(fā)板
mach-開發(fā)板名稱
開發(fā)板相關(guān)代碼,以前有各個板子硬件信息。
后面device tree技術(shù)出來之后,硬件信息提取出來。
boot/compressed 下面是壓縮解壓代碼(image<->zImage --mkimage--> uImage)
arch/arm/kernel/head.S是第一個被執(zhí)行文件
boot/dts 設(shè)備樹源碼文件
.dtsi 設(shè)備樹頭文件 .h
.dts 設(shè)備樹源碼 .c
.dtb 被編譯過的產(chǎn)物
*Documentation 文檔
init 內(nèi)核啟動初始化代碼 不可裁剪
lib 通用庫實現(xiàn)
sound 音頻驅(qū)動
block 塊設(shè)備
*drivers 設(shè)備驅(qū)動
ipc 進程間通訊
fs 文件系統(tǒng)
include 通用頭文件
kernel 核心代碼不可裁剪 pm
scripts 配置編譯腳本 這些腳本用于系統(tǒng)源碼的配置和編譯
mm 內(nèi)存管理
3.配置編譯
1.修改源碼目錄下頂層的Makefile
ARCH ?= arm
CROSS_COMPILE ?= arm-none-linux-gnueabi-
2.找一個與開發(fā)板類似的缺省配置,參考導(dǎo)入默認參考配置
make exynos_defconfig(只用執(zhí)行一次,生成一個默認的.config)
3.執(zhí)行配置命令
make menuconfig 字符界面配置菜單,需要ncureses庫
sudo apt-get install ncurses-dev
4.內(nèi)核啟動流程
上電--->CPU跳到中斷向量處執(zhí)行--->加載并執(zhí)行bootloader代碼--->加載內(nèi)核--->
執(zhí)行內(nèi)核---->掛載根文件系統(tǒng)--》運行第一個用戶空間程序 bootargs init=/linuxrc