系統(tong)移植(zhi)詳(xiang)細(xi)步驟(zou),學霸總結
時間:2018-08-24 來源:未知
系統移植
一.服務器的搭建(jian)
1. TFTP服務器
1.1 安裝
#sudo apt-get install tftpd-hpa tftp-hpa
1.2配置(zhi)服務器客戶端在同一網(wang)段
服(fu)務器 (Ubuntu)$ sudo ifconfig eth0(網卡) 192.168.~.~ netmask 255.255.255.0
上(shang)面(mian)的命令,將ip地址和子網(wang)掩碼設(she)置(zhi)到內(nei)核(he);
當網卡斷開(kai)時,內核會丟掉ip地址;
當網卡連接時,內核會從配置文件(從網絡自動獲取(qu))讀取(qu)ip地址和子網掩碼(ma)
客戶端(duan) (開(kai)發板)# setenv ipaddr 192.168.~.~ 將ip地址設置到ipaddr環(huan)境(jing)變量
# setenv netmask 255.255.255.0 設置子網掩碼
# saveenv 保(bao)存所有的環境變量到emmc
網(wang)卡:將虛(xu)擬(ni)機設置為橋接模式
1.3修(xiu)改配置文件
# sudo vi /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/tftpboot" #****指定(ding)tftp服務(wu)器的根目錄,就是下載文件的位置
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="-c -s -l" #這里(li)是選(xuan)項,-c是可以上(shang)傳文(wen)件(jian)的參數(shu),-s是指定tftpd-hpa服務目(mu)錄,上(shang)面(mian)已經指定 -l 監(jian)聽(ting)模式(shi)
創(chuang)建tftpboot目錄,重啟啟動 tftp-server
#sudo mkdir /tftpboot
#sudo chmod 777 /tftpboot
#sudo service tftpd-hpa restart
2.通(tong)過(guo)TFTP服務器移植系(xi)統(tong)
通(tong)過(guo)網(wang)線將(Ubuntu)中(zhong)tftp文件夾下的(de)系統配置文件燒寫到開(kai)發(fa)板中(zhong)
2.1燒寫kernel(uImage)
1. 拷貝(bei)uImage到虛擬機的/tftpboot
2. 下載uImage到開發(fa)板內存(0x41000000)
# tftp 41000000(內存地址) uImage
2.2 燒寫設備樹(exynos4412-fs4412.dtb)
1. 拷(kao)貝exynos4412-fs4412.dtb到(dao)虛擬(ni)機的/tftpboot
2. 下(xia)載exynos4412-fs4412.dtb到開發板(ban)內存(0x41000000)
# tftp 0x41000000(內存地址) exynos4412-fs4412.dtb
3. 燒寫exynos4412-fs4412.dtb到(dao)emmc
# movi write dtbs(分區名) 0x41000000(內存,放(fang)了(le)exynos4412-fs4412.dtb)
2.3燒寫文件(jian)系統rootfs(ramdisk.img)
1. 拷貝ramdisk.img到虛(xu)擬機的(de)/tftpboot
2. 下載ramdisk.img到開發板內存(0x41000000)
# tftp 0x41000000(內存地址) ramdisk.img
3. 燒寫ramdisk.img到emmc
# movi write rootfs(分(fen)區名) 0x41000000(內存,放了(le)ramdisk.img) 0x300000(分(fen)區大小)
2.4手動(dong)啟動(dong)
1. 設置(zhi)內核的啟動參數
# setenv bootargs init=/linuxrc(告訴內核(he)第一個(ge)應用程(cheng)序的位置(zhi)) console=ttySAC2,115200(告訴內核(he)哪(na)個(ge)終端是它的輸(shu)入/輸(shu)出終端)
# saveenv
2. 讀取(qu)kernel到內存(運行時以下(xia)三個文件要并存,地址要偏移下(xia),不要覆蓋(gai))
# movi read kernel 0x41000000
3. 讀取設備樹到內存
# movi read dtbs 0x42000000
4. 讀取(qu)rootfs(ramdisk.img)到內存
# movi read rootfs 0x43000000(放在內存(cun)的位置) 0x300000(大小)
5. 啟(qi)動內核
#bootm 0x41000000(內核) 0x43000000(根文件系統(tong)) 0x42000000(設備(bei)樹的位置)
2.5自動啟動
1. 原理
u-boot啟動(dong)后,如(ru)果(guo)倒計時到0, 它會自動(dong)運行bootcmd環境變(bian)量中的命(ming)令
2. 設置bootcmd環境變量
# setenv bootcmd movi read kernel 0x41000000\;movi read dtbs 0x42000000\;movi read rootfs 0x43000000 0x300000\;bootm 0x41000000 0x43000000 0x42000000
# saveenv
3. 重啟開發板
注:當出現下(xia)載不動,終端一直打印(yin)T時,檢查(cha)服務器配置,端口(kou)設置,重啟服務器
3.通過NFS服務器掛載網絡(luo)文件系統(tong)
3.1原理
將開發板上的(de)文件系統掛載到服務器(qi)(Ubuntu)上,實現(xian)服務器(qi)和開發板可以(yi)同時對(dui)改文件系統進行操作(zuo)。
3.2 安裝
#sudo apt-get install nfs-kernel-server nfs-common
3.3修改(gai)配置(zhi)文件系統(tong)
sudo vi /etc/exports
在注視(shi)下添加一行:
/source/rootfs *(rw,sync,no_root_squash,no_subtree_check)
/source/rootfs”是存放nfs文件(jian)系統(tong)的路徑;“*”表示(shi)在所有的網段都可以共(gong)享;“rw”表示(shi)nfs文件(jian)系統(tong)允許讀寫(xie);
“sync”表示修改都會(hui)同(tong)步(bu)到nfs服務端,否則只是(shi)會(hui)暫存(cun)在本地內(nei)存(cun);
新建配置文件(jian)指(zhi)定的對應的nfs服務(wu)器根目(mu)錄
sudo mkdir -p /source/rootfs
重啟nfs服務程序,使配(pei)置生效
sudo service nfs-kernel-server restart
3.4就該(gai)開(kai)發板Uboot的內核啟(qi)動參數
//根文件系統通過(guo)nfs協(xie)議去(qu)掛載(zai) 網絡文件系統存(cun)放(fang)的位置
#setenv bootargs root=/dev/nfs rw nfsroot=192.168.1.250:/source/rootfs ip=192.168.1.4(內核用到的ip地址(zhi),因為(wei)內核要和nfs服務(wu)器進行網絡通訊) console=ttySAC2,115200 init=/linuxrc
(3) 設置自動運(yun)行命(ming)令(ling)
#setenv bootcmd tftp 41000000 uImage\;tftp 42000000 exynos4412-fs4412.dtb\;bootm 41000000 - 42000000 ("-"表示(shi)不(bu)指定根文件系(xi)統地址(zhi))
#saveenv
3. boot或(huo)重(zhong)啟(qi)開發板
二.U-boot
1.BootLoader.
1.1簡介:
屬于(yu)嵌(qian)入式系(xi)(xi)統(tong)的軟件層次,固(gu)話在(zai)固(gu)件中的boot程序,類似(si)于(yu)(BOIS),grub,它是(shi)在(zai)操(cao)作系(xi)(xi)統(tong)運行前執行的一小(xiao)段程序,主(zhu)要(yao)是(shi)用于(yu)引導操(cao)作系(xi)(xi)統(tong)。
1.2基本功能
a.初(chu)始化硬件 b.把BootLoader自(zi)搬到內存中(zhong) c.執行用戶命(ming)令(訪問環境變量,網絡,串口(kou)通訊,讀寫ram/flash) d.設置(zhi)Linux啟動參數(shu)
1.3 執行過程
不同的處理(li)器上電或復位后(hou)執行的第一條指令地址(zhi)(zhi)并不相同,對于(yu) ARM 處理(li)器來說,該地址(zhi)(zhi)為 0x00000000。
對(dui)于一(yi)般(ban)的嵌入式系統,通常(chang)把 Flash 等非易失性存儲(chu)器映射(she)到這個地址處(chu),而(er) Bootloader就位于該存儲(chu)器的最(zui)前端,
所(suo)以系統上電或(huo)復(fu)位(wei)后執行(xing)(xing)的(de)第一段程(cheng)序便是Bootloader。而因為存儲 Bootloader的(de)存儲器不同(tong),Bootloader的(de)執行(xing)(xing)過程(cheng)也并不相同(tong),
嵌(qian)入式(shi)系統(tong)中(zhong)廣泛采用的(de)非易失(shi)性存儲(chu)器通常(chang)是 Flash,而 Flash 又分為 Nor Flash 和Nand Flash 兩(liang)種(zhong)。
它們之間的不同在于:Nor Flash 支持芯(xin)片內執行(xing)(XIP, eXecute In Place),這樣代碼(ma)可以在Flash上直接執行(xing)而不必拷貝到RAM中去執行(xing)。
而Nand Flash并不支持(chi)XIP,所以要想執行 Nand Flash 上的代碼(ma),必須先將其(qi)拷貝到 RAM中去(qu),然后跳到 RAM 中去(qu)執行
2.uboot分析(xi)
2.1 uboot特點(dian)
代碼結構清晰,易于(yu)一直,支(zhi)持(chi)多(duo)(duo)(duo)種(zhong)(zhong)CUP,可以支(zhi)持(chi)多(duo)(duo)(duo)種(zhong)(zhong)操作(zuo)系統,支(zhi)持(chi)許多(duo)(duo)(duo)開(kai)發板,支(zhi)持(chi)多(duo)(duo)(duo)種(zhong)(zhong)協議文件系統。
2.2uboot常用命令
setenv var value 設置(zhi)環(huan)境(jing)變量(liang)
setenv var 刪除var變(bian)量
saveenv <==>save
printenv <==> pri
特殊變(bian)量 bootcmd uboot在自啟動模式下會(hui)自動執行。
bootcmd 在(zai)uboot啟動的時(shi)候,當倒計(ji)時(shi)到0的時(shi)候,uboot會去(qu)找到bootcmd環境變(bian)量,取得它的值。
bootcmd的值都是一些(xie)uboot可執(zhi)行的命令,uboot會去自動(dong)執(zhi)行這些(xie)命令。
bootargs linux內(nei)核(he)啟動(dong)參數,uboot會(hui)將此環境變(bian)量的(de)值存到啟動(dong)參數區,內(nei)核(he)在啟動(dong)的(de)時候,首先(xian)會(hui)去(qu)啟動(dong)參數區
獲取相關參數(shu),解析(xi)處(chu)理,做相應的(de)處(chu)理。參數(shu)格式(shi),名稱不(bu)能(neng)隨意,固定的(de)。
2.3uboot啟動流程
第一階段:匯編
1>初(chu)始化硬件(CPU內部的寄存器)
2>初始化RAM,為第二階段程序準備空間
3>拷貝第(di)二階段的程序到內存空間
4>跳轉到第(di)二階段C入口
第二階段:C語言
1>初始化硬(ying)件(板級硬(ying)件設備(bei))
2>將內核和根文件系(xi)統鏡像加(jia)載到內存中(zhong)
3>執行(xing)內核(he)
3.U-BOOT移植
3.1基(ji)本步驟
1.找到(dao)相近的(de)代碼,并(bing)拷貝一(yi)份作為自己(ji)修改的(de)源碼
2.先修改源(yuan)碼,使(shi)能核心(xin)部(bu)件(uart clock ram..),能串(chuan)口輸(shu)出信(xin)息。
3.移(yi)植(zhi)修(xiu)改其他非核(he)心源碼
三.Linux內核(he)
1 Linux內核的基本(ben)組成(cheng)
a.MM內(nei)存管理
b.PM進程管(guan)理(li)
c.FS文件系統
d.DC驅動(dong)架構(gou)
e.NET網絡
f.驅(qu)動代(dai)碼(占很大部分代(dai)碼)
Linux內核是一(yi)個有文件系統,多任(ren)務管理(li),硬件抽象層2等功能的系統軟件。內核不(bu)是一(yi)個完(wan)整的操作系統
linux系統 = Linux kernel + lib + apps + GUI(圖形界面 qt window gome)
2.Linux內核的特(te)征
2.1特點
1.可裁剪,可擴展,可定制。
2.可移植性強,支持多種體系(xi)結構(gou)。
3.穩定性強,網(wang)絡功能強。
4.支持多(duo)任務多(duo)用戶(hu),資(zi)源耗(hao)費少。
2.2內核源碼(ma)目(mu)錄
git分布式 svn托管(guan) 代碼管(guan)理系統
*arch 體(ti)系結構(gou)相關代碼,各體(ti)系結構(gou)cpu
arch/arm/板子 arm體系(xi)結構 目錄(lu)都是開發板
mach-開發板名稱(cheng)
開發板相(xiang)關代碼,以前有各個板子硬(ying)件信息(xi)。
后面(mian)device tree技術出來之后,硬件(jian)信(xin)息提取出來。
boot/compressed 下面是壓縮解壓代碼(ma)(image<->zImage --mkimage--> uImage)
arch/arm/kernel/head.S是第一個(ge)被執(zhi)行文件
boot/dts 設備樹(shu)源(yuan)碼文件(jian)
.dtsi 設(she)備樹(shu)頭文件(jian) .h
.dts 設備(bei)樹(shu)源碼 .c
.dtb 被編譯過的產物
*Documentation 文檔
init 內核啟動初始化代碼 不可(ke)裁(cai)剪
lib 通用庫實現
sound 音頻(pin)驅動
block 塊設備
*drivers 設備驅動
ipc 進程間通訊
fs 文件系統
include 通用頭(tou)文件(jian)
kernel 核心代碼(ma)不可裁剪 pm
scripts 配置(zhi)編(bian)譯腳本 這些腳本用于系統源碼的配置(zhi)和編(bian)譯
mm 內存(cun)管理
3.配置編譯
1.修(xiu)改源碼目錄(lu)下(xia)頂(ding)層的Makefile
ARCH ?= arm
CROSS_COMPILE ?= arm-none-linux-gnueabi-
2.找一個與開發(fa)板類似(si)的缺(que)省(sheng)配置,參(can)考導入默(mo)認參(can)考配置
make exynos_defconfig(只(zhi)用執行一次,生成一個默認(ren)的.config)
3.執行配置命令
make menuconfig 字符界面配(pei)置菜單,需要ncureses庫
sudo apt-get install ncurses-dev
4.內(nei)核啟動流(liu)程
上電--->CPU跳到中(zhong)斷向量處執行--->加(jia)載(zai)并執行bootloader代碼--->加(jia)載(zai)內核--->
執行內核(he)---->掛載根文件系(xi)統--》運行第一個用戶空間(jian)程序 bootargs init=/linuxrc

