uboot的學習前傳linux
爲何要有ubootios
uboot主要做用是啓動操做系統內核的。程序員
uboot還要負責部署整個計算機系統。shell
uboot中還要有操做flash等板子上的硬件驅動服務器
uboot還得提供一個命令行讓咱們能夠在命令行下能夠進行操做網絡
uboot就是幹以上或者更多事情的一個裸機程序而已。編輯器
計算機系統組成的三個重要部件: CPU + 外部存儲器(flash/硬盤) + 內部存儲器(內存, DDR/SDRAM/SRAM)ide
PC機的啓動過程:函數
在靜態時,BIOS程序放在norflash中,在PC機的主板上,OS放在外部存儲設備中,掉電時CPU是不工做的,掉電時內存也是無做用的。學習
在上電開始時,norflash中的bios程序,先開始運行,由於norflash中的程序上電是能夠直接運行的,這部分程序將DDR等內存進行初始化,將外部存儲設備也進行初始化,而且把外部存儲設備中的OS複製到DDR中去,而後從norflash中跳轉到DDR中去運行OS。直到啓動OS。(OS啓動後BIOS就無用了)
典型的嵌入式Linux系統的啓動過程
典型嵌入式系統的部署狀況:uboot(也就是botterloder)放在flash等外部存儲設備中(能做爲啓動設備的FLASH,就是說若是你的uboot是否放在SD卡中的,那麼你的CPU要可以支持SD卡的啓動)。OS也放在flash中,由於嵌入式設備是沒有硬盤的,硬盤可能太大了,因此也是放在了flash中,能夠把flash當作嵌入式設備的硬盤。內存也是掉電時無做用的,如今的內存可能是DDR的,CPU掉電時也是不工做的。
啓動過程:
先執行uboot(在210中是irom中固話的代碼先去初始化flash,在從flash中讀取uboot的前16KB字節到sram中去運行),因此uboot的代碼就是初始化DDR,將OS讀取到DDR中,而後跳轉到DDR中去運行OS,直到OS啓動完畢(uboot就無用了,OS啓動好後)。
總結:因此能夠看出來,PC機的啓動過程和嵌入式系統的啓動過程其實都是同樣的,只是BIOS變成uboot,硬盤變成了flash
Android的啓動過程
Android的啓動過程和linux系統(典型的嵌入式設備)的啓動過程幾乎是同樣,OS啓動以前是徹底同樣的,只是在操做系統的內核啓動後,加載根文件系統後不一樣了。
能夠認爲啓動過程分爲兩個階段:第一個階段就是uboot到OS啓動;第二個階段就是OS啓動後到rootfs(根文件系統)加載到命令行執行;Android的啓動和linux的啓動的差異在於第二階段。
如今默認的芯片都支持uboot啓動。uboot就是一個程序,一個網上的開源項目。
uboot具備可移植性的意思並非說,咱們拿到uboot代碼後直接下載到咱們開發板上就可使用,而是說uboot源代碼具備通用性,咱們不少的開發板均可以用到uboot的源代碼,在uboot源代碼的基礎上,咱們能夠進行移植,而且供咱們的開發板去使用。
uboot必須解決的一些問題
一、uboot必須自身開機直接啓動:uboot要能啓動,必須放在SOC能支持的啓動介質中才能夠,而且uboot必須對相應的硬件進行代碼的修改和移植才能夠,這些代碼都在uboot的第一階段的start.S中處理的,什麼重定位呀,什麼初始化內存呀,什麼什麼的。
二、uboot要可以引導操做系統內核的啓動,而且給內核傳參。
uboot的終極目標就是要啓動操做系統內核。
內核傳參是說,linux內核在設計的時候,是設計成能夠被傳參的,咱們的能夠在uboot中事先給linux內核一些特定的參數,咱們把這些參數放在了內存的特定位置而後傳參給linux內核,linux內核啓動後會到這個內存的特色位置讀取到uboot傳進來的參數,而後再linux內核中去解析這些參數,這些參數將被用來指導咱們linux內核的啓動過程。
三、uboot要能提供系統的部署功能
uboot必須可以被人使用借用以後,咱們完成了整個系統(uboot、kernel、rootfs)在flash上的燒錄下載工做。
之前咱們在裸機中,就是利用uboot,咱們的uboot能夠放在SD卡中,由於210支持SD卡的啓動,完了以後在uboot的命令行下,使用uboot的fastboot這個功能,將咱們的uboot,kernel,rootfs等各類鏡像燒錄到咱們開發板的iNand中,而後從iNand啓動。
四、uboot要能進行SOC級和板級的硬件管理
SOC級就是SOC的內部外設,譬如(串口,LCD控制器等)要對這些硬件能進行驅動,由於咱們在使用uboot的時候會有一個經過串口給咱們一個顯示界面,可讓咱們進行人機交互,還有咱們燒機的過程當中,咱們開發板的lcd顯示屏上也會顯示進度條,因此咱們uboot中的內容還要包含一些對硬件的驅動。板級指的就是咱們SOC外面的那些硬件咱們也要能進行管理,否則的話咱們怎麼將我要燒錄的鏡像燒錄到iNand中。讓iNand等就在SOC外面的就是咱們板級硬件。
五、uboot的生命週期:
uboot何時開始運行,何時結束運行。uboot是一個裸機程序。它不是一個操做系統,uboot是一個單線程的,它最終沉浸於一個死循環中,因此咱們用uboot 跟主機進行ping的時候,咱們能夠在uboot中用ping的命令,主機收到後,主機發包,這樣咱們uboot能接收到,就ping通了,可是咱們若是用主機直接pinguboot的時候,是不行的,由於若是咱們用主機直接給uboot發包,咱們uboot是不理會的,由於這個時候uboot並無接收到命令,由於uboot是單線程的,它還沉浸在本身的死循環中呢,這部份內容我如今理解的還淺,等到學到ping的時候,應該會理解的比較深入。
uboot由於是一個裸機程序,因此這也決定了他的生命週期,uboot一旦運行的話,就會只運行uboot,不會運行其餘的程序,OS一運行的時候,uboot就將會中止運行,uboot沒法在運行了。(OS運行時,uboot就死掉了)若是還想見到uboot咱們只能重啓系統,可是這時咱們見到的uboot是uboot的另外一生了。至關於uboot從新在咱們外部存儲設備中加載到內存中運行了一遍。
六、uboot的入口和出口
uboot的入口就是開機自動啓動。若是CPU咱們用的是SD卡啓動,那麼uboot的入口就是SD卡中,從SD卡中把uboot加載到內存中運行。若是CPU咱們用的是iNand啓動,那麼就會在iNand中把uboot加載到內存中去運行。
uboot的惟一出口就是啓動內核,它若是沒有啓動內核的話,uboot將會一直被運行,若是它啓動了內核的話,那麼uboot就死了。
uboot的工做方式:
從裸機鏡像uboot.bin提及: uboot的本質就是一個裸機程序。uboot.bin文件,在程序沒有運行的時候,uboot.bin就好好的躺在啓動介質中,當咱們程序開始運行時,uboot.bin中的程序就會加載到內存中一條一條的指令進行運行。
uboot程序實現了一個shell界面。shell不是操做系統,雖然它和linux中的終端的工做方式同樣,但它不是操做系統,操做系統能夠有shell界面,uboot也能夠有shell界面,咱們以前在裸機中也本身寫過一個簡單的shell
環境變量:環境變量就是系統的全局變量,咱們能夠經過環境變量來改變程序的運行結果,而不用編譯運行的操做。程序在運行時會讀取環境變量的值來作出相應的動做,咱們能夠經過環境變量來指導程序的運行。
uboot中的經常使用命令
uboot中的命令有些是能夠簡化的,像printenv能夠簡化成print 打印環境變量
setenv能夠簡化成set 設置環境變量。
有些命令會帶參數(格式是固定的)第一個空格以前是命令,第一個空格以後的是參數,接着每隔一個空格就是一個參數,有些命令能夠帶參數也能夠不帶參數,如help命令,當咱們不知道一個命令的名字的時候能夠在uboot中shell下輸入help便可查詢。當咱們想要一個命令的具體用法時,能夠help +這個命令的名字。
命令行中的特殊符號(單引號)
有些命令帶的參數比較長,可能帶的參數中也會存在一些空格,會誤導咱們的uboot中的程序去解析咱們的命令,因此若是咱們的命令若是帶的參數會存在空格的話,咱們就要用單引號將咱們的這個參數給引發來。
有些命令是一個命令族:意思就是命令是同樣的可是後面的參數不同,例如movi命令,就是和moviNand有關的,只在三星移植過的uboot中會有可能
uboot的第一個經常使用命令:print/printenv
不帶參數的命令,用來打印環境變量的,環境變量就是uboot中的全局變量,不一樣的是環境變量能夠保存在flash中,當咱們此次設置好了一個環境變量的值後,能夠將環境變量保存在flash中,下次程序在加載到內存中運行的時候,這個環境變量的值就是咱們上次設置好的了,而全局變量是放在內存中的數據段的,是不可能被保存住的。當程序運行結束的時候,全局變量就死掉了。沒法保存
在flash中,uboot放在flash的開始的那一塊分區中,接着環境變量又在flash中劃分了一個分區放環境變量,這個分區是緊接着uboot的。接着又在uboot的分區後面劃分了一個分區放操做系統內核OS,接着OS分區後面又在flash中劃分了一個分區放rootfs根文件系統。
在啓動的時候,從flash中的uboot想辦法將uboot放在DDR開始的地方去運行,同時也會將flash中跟uboot相關的環境變量讀取到DDR中環境變量區域(咱們劃分的),只讀取一次,從flash中的環境變量讀取到DDR中,放在uboot運行內存空間的後面。因此咱們在flash中的環境變量分區中,咱們的bootdelay這個環境變量是咱們原先的值,好比3,當咱們將這個環境變量讀取到內存中DDR中運行的時候,咱們在uboot在DDR中運行的時候,經過uboot的shell界面的setenv這個命令,setenv bootdelay 10將bootdelay這個環境變量的值改爲了10,改的只是內存中的bootdelay那一份,並無改變flash中的bootdelay那一份環境變量,而且由於內存是掉電就不會保存上一次的東西的,因此咱們要將在內存中改變的那一份環境變量保存在flash中,才能夠在下一次啓動的時候,這個環境變量的值真正的被咱們改變了,因此我要在uboot的shell界面中用saveenv這個命令,保存咱們設置的環境變量的值,將在內存中的那一份環境變量的值保存到咱們flash中,這樣下次再啓動的時候,就能夠是咱們設置的環境變量的值了。
uboot中的第二個經常使用命令:setenv/set
設置環境變量,帶參數的,setenv 環境變量的名字 環境變量要設置的值
uboot中的第三個經常使用命令:save/saveenv
不帶參數的命令,直接將咱們內存中的環境變量的值,同步保存到咱們flash中的環境變量。注意:環境變量的保存是總體的覆蓋保存。就是說,咱們save後會將內存的中的環境變量總體保存覆蓋到咱們flash中的環境變量分區的環境變量。這是由於咱們的flash設備是塊設備,寫入和讀取字節的時候,只能是一塊一塊的,因此咱們保存一個環境變量到咱們flash中,和保存一塊環境變量到咱們flash中,成本都是同樣的。
uboot中的第四個經常使用命令:網絡測試命令 ping
命令的用法就是 ping ip地址
ping的時候要注意:
一、首先要用網線將主機window的網口和開發板上的網口鏈接起來
二、設置的IP地址是咱們主機Windows的有線IP地址(本地地址),而不是無線IP地址,由於咱們板子和主機是用網線進行鏈接的。打開網絡中心,找到更改適配器設置。設置咱們window本地鏈接的IPV4,點擊裏面的使用一下IP地址,不是自動獲取(由於咱們通常上網用的是自動獲取),通常設置爲 192.168.1.10(或者20或者30都行),點子網掩碼,會自動出來。剩下的就不用管了。網關是用來上外網的,咱們暫時是用局域網來玩,DNS服務器也是用來上外網用的,暫時不用管。
三、這時候不必定能ping通,咱們要確認開發板中的uboot中的裏的幾個網絡相關的環境變量的值對不對。
ethaddr這個環境變量是網卡的地址,這個是隨便設的,沒有關係
netmask這個環境變量的值是子網掩碼,是有影響的。可是通常都不會錯,都是255.255.255.0
ipaddr這個環境變量的值是最重要最重要的,這個環境變量的值表示當前開發板的IP地址。這個地址必需要和咱們Windows中的IP地址在同一個網段。同一個網段的意思就是說,一個IP地址,如192.168.1.10 其中前三個的數必須是相同的。
因此咱們發現,咱們經過uboot中打印ipaddr這個環境變量的值,發現這個值的網段和咱們主機的網段不在同一個網段上,因此咱們要將咱們開發板的IP地址的網段設置成跟咱們主機的IP地址的網段同樣,也就是前三部分要同樣的,可是第四部分要不同,由於第四部分一個是咱們主機的地址,一個咱們開發板的地址,在同一個網段下,地址是不能相同,主機地址是10了,那麼咱們的開發板的地址就不是10了。
網段的概念:一個IP地址分爲兩個部分,一個網段,一個是網段內的主機地址,前三個數字則表示網段,後一個數字則表示網段內的主機地址。(由咱們的子網掩碼來區分,哪一部分是網段地址,哪一部分是IP地址),在咱們的子網掩碼中,若是子網掩碼是255.255.255.0的狀況下,咱們192.168.1.10 的IP地址,前三部分表示網段地址。第四部分表示咱們主機地址。
開發板和主機的ping通:
開發板運行linux的狀況下和主機Windows的ping通
開發板運行linux的狀況下和虛擬機Ubuntu的ping通
開發板運行uboot的狀況下和主機Windows的ping通
開發板運行uboot的狀況下和虛擬局Ubuntu的ping通
一、開發板運行linux的狀況下和主機Windows的ping通
(1)先將開發板刷機成linux+qt的鏡像,而後啓動進入linux命令行的終端底下
(2)在linux命令行底下使用ifconfig命令將開發板中的IP地址設置成和咱們主機的IP地址同一個網段(咱們默認就將主機的IP地址設置爲192.168.1.10,開發板的uboot或者linux的IP地址設置爲192.168.1.20,虛擬機Ubuntu的IP地址設置爲192.168.1.141)
運行啓動後,在linux的命令行下,輸入ifconfig查一下 eth0的IP地址是否是,若是不是的話咱們設置成咱們本身默認的值192.168.1.20,用ifconfig eth0 192.168.1.20設置,設置完了以後咱們在ifconfig去查詢一下eth0看是否設置好了,以後就能夠ping通了。
二、開發板運行linux的狀況下和虛擬機Ubuntu的ping通
首先要知道NAT和橋接:橋接就是外部網絡能看到咱們Windows主機和虛擬機Ubuntu的網絡都是獨立的,能看見兩臺設備。
而NAT呢,外部網絡只能看到主機Windows看不到咱們虛擬機Ubuntu,咱們虛擬機Ubuntu要想和外界網絡通訊只能經過Windows主機的網絡進行通訊,至關於虛擬機的網絡是在Windows的肚子中的,這是虛擬機是蹭了Windows的網。
因此虛擬機要想和咱們的開發板進行網絡通訊,只能進行橋接進行鏈接。否則的話若是用NAT,是至關於一臺設備的,對於網絡來講。
虛擬機要想和咱們的開發板ping通,進行網絡通訊,步驟以下,必定要記住:
第一步:虛擬機中要設置成橋接的方式,在虛擬機的設置中找到那個網絡修改的地方,選擇橋接的方式便可。
第二部:咱們虛擬機的編輯中,有一個虛擬網絡編輯器,這裏面要設置成橋接到有線網卡,由於咱們用的就是有線的ping,進行網絡通訊。默認的這個值是自動(由於咱們通常的電腦中都有兩個網卡,一個是有線網卡,一個是無線網卡,若是是自動的話,那麼通常的狀況會影響到咱們的ping通,由於自動的話會默認的去將咱們的虛擬機橋接到無線網卡上,而咱們的開發板和咱們的主機是經過有線進行鏈接的,因此是不能夠的),不能夠,咱們要進行設置,設置成ETH那個,完了點應用,點肯定就行了。
第三步:在咱們的虛擬機Ubuntu中將IP地址設置成192.168.1.141,這是咱們的虛擬機Ubuntu中的網卡IP地址。這是咱們本身默認的值(能夠直接經過/etc/network/interfaces文件設置成靜態的,也能夠直接在命令行下經過ifconfig去設置),設置好了之後在重啓網卡,在14.04版本的Ubuntu中先在命令行下輸入ifconfig eth0 down 在輸入ifconfig eth0 up 就能夠重啓網卡了,要切換到root用戶才能夠。
此時咱們在開發板linux下輸入ping命令,ping虛擬機的IP地址就能夠ping通了,在虛擬機Ubuntu的命令行下輸入ping命令,ping咱們開發板的IP地址,也是能夠ping通的,這時二者就能夠經過網絡進行通訊了,局域網
三、開發板運行uboot的狀況下和主機Windows的ping通
目前的狀況在這種狀態下ping不通,多是uboot自己的網卡驅動有些問題
四、開發板運行uboot的狀況下和虛擬局Ubuntu的ping通
這種狀況是能夠ping通的,跟運行在linux下ping通Ubuntu的方式同樣,見上面的2,這個只不過是運行在uboot的狀況去ping通,方法見上面的2。
開發板運行在uboot的狀況下能夠ping通Ubuntu,同時Ubuntu也能夠ping通開發板運行在uboot的狀況下。二者之間能夠進行局域網通訊了。
uboot中的第五個經常使用命令:tftp
一、tftp下載指令:tftp
uboot的任務就是啓動內核,爲了完成啓動內核,則必須對內核進行部署,uboot爲了可以部署內核,就須要可以從主機中將內核鏡像下載過來,燒錄到flash中,主流的方式就是fastboot和tftp(網絡下載)。
fastboot的方式是經過usb進行數據傳輸的。咱們須要在主機中裝好咱們的usb轉串口的驅動,在uboot中輸入fastboot的命令啓動fastboot,以後在主機的CMD下運行fastboot.exe這個程序進行下載咱們的鏡像到咱們的flash中,部署咱們的內核。
tftp的方式是經過網絡傳輸的的,有線網絡的傳輸。
二、tftp下載時,實際上uboot扮演的是tftp客戶端程序的角色,也就是說,咱們的鏡像文件會放在咱們主機Windows中或者Ubuntu的tftp服務器中,放在tftp服務器的下載目錄下,咱們的開發板運行在uboot中,在uboot中咱們使用tftp的命令去咱們ping通的主機的tftp服務器中的下載目錄下載便可。
可是咱們要先給咱們的主機虛擬機搭建起來tftp環境,搭建tftp服務器,這個就要看老師的那個嵌入式搭建tftp.pdf
文檔了,後續在作,如今沒有網,由於須要在網上下載軟件才能夠。(不過還好,我能夠用老師的虛擬機)
若是搭建好了,在下載以前還要檢查咱們uboot中的環境變量serverIP的值是否爲虛擬機Ubuntu中IP地址,若是不是要設置。(serverIP的意思就是咱們主機虛擬機中的tftp服務器的IP地址)以後
則能夠在uboot下輸入 tftp 加內存地址(0x30000000) 加要下載的鏡像(zImage-qt)
這時就將咱們的鏡像下載到了咱們開發板的DDR中了,注意是直接下載到了內存了。由於咱們在uboot下輸入tftp命令下載時,下載的鏡像就是下載到了咱們設定的那個內存地址中去了
gatewaip是網關地址,不知道有沒有用,但最好也進行設置,通常設置的值是網段要和咱們主機的同樣,最後一部分是.1
uboot中的第五個經常使用命令:nfs(那就不能叫作經常使用命令了)
老師沒有講,老師說這個命令在uboot中也是有的,他沒有研究過,我能夠經過網絡信息進行學習,不過如今沒網
uboot中的第六個經常使用命令:
一、SD/iNand操做指令 :movi
開發板若是使用SD/EMMC/iNand等做爲了flash,那麼咱們在uboot中就會使用movi命令去操做flash,或者用mmc命令。
使用方法可使用help movi 去查找,在uboot下。能夠知道movi命令是一個命令集。
movi write 和movi read 是一組,movi write 是從DDR中將內容寫到iNand中,movi read 是從iNand中讀取到DDR中。
movi read {u-boot | kernel} {addr} - Read data from sd/mmc
movi read 是命令格式是不會變的,後面的{}括起來的是你參數,若是{}裏面有|則表示前面和後面的兩個參數只能選擇一個,後面的那個{}中只有一個參數,則表示這個參數是必選的。
movi read rootfs {addr} [bytes(hex)] - Read rootfs data from sd/mmc by size
movi read rootfs 是命令格式,是不會變的,後面的{}裏面的表示是必需要有的參數,[]中的內容表示這個參數是可選的。
從SD卡或者iNand或者mmc等flash設備讀取rootfs到內存中的多少多少地址中去。
movi read u-boot 0x30000000 意思就是將iNand中的u-boot分區讀取到DDR的0x30000000地址中去。
uboot代碼中將iNand分紅了不少個分區,每一個分區都有他的地址範圍,和分區名,u-boot就是放uboot的分區名。
注意:uboot命令行中,無論你輸入的是什麼數字,都會當作十六進制去進行處理,無論你輸入的數字帶不帶0x,他都是帶0x的。
二、Nandflash操做指令nand
理解方法方式和movi同樣,自行學習
三、內存操做指令:mm、mw、md
內存DDR是沒有分區的,我在使用內存時要注意不要踩到別人,咱們程序員本身內心要有數。
md指令,memory display 用來顯示內存中的內容
md.b 30000000 10 以字節爲單位顯示內存空間,10表示要顯示16個字節的內存空間的內容
md.w 以2個字節爲單位的顯示內存空間
md.l 以四個字節爲單位的顯示內存空間
若是直接輸入md .b 0x30000000 會一直顯示
以後輸入md.b 0x30000000 也會一直顯示
輸入md.b 0x30000000 10 就會顯示一個16個字節的內存中的內容了
mw:寫內存,將一個內容,寫到內存中去。
mw.b 30000000 55 寫一個字節的內存空間
mw.w 寫兩個字節的內存空間
mw.l 寫四字節的內存空間
mm : 將一個塊內存修改,連續字節或者連續兩個字節的,或者連續四個字節的進行修改內存,輸入y結束
四、啓動內核的指令:bootm、go
啓動內核,在uboot中表示一個指令,若是在uboot中輸入一這個啓動內核的命令,那麼就會啓動內核,無論成功了仍是不成功,因此這條指令是一條死路,就至關於執行了這條指令,uboot的這一輩子就結束了。
bootm和go的差異:bootm指令啓動內核能夠給內核傳參數,go指令啓動內核不能給內核傳參數,go命令實際上不是專爲啓動內核設計的,go命令其實就是一個函數指針,這個函數指針指向了一個內存地址,go命令就是跳轉到那個內存地址去運行,至關於調用了這個函數指針(如:定義了一個函數指針類型的變量名爲p void (*p)(void) = ((void(*)(void))(0x30000000)) 咱們(*p)(); 就至關於去了這個地址去運行,這就是go的實現原理)。
咱們能夠經過uboot將裸機程序下載到內存中的特定地址處,完了咱們在uboot中使用go命令,也就是至關於函數指針,這個函數指針指向的內存地址就是咱們裸機程序下載到的那個內存的地址,我直接go,就至關於調用了這個函數指針,就去了那個內存地址去運行了,可讓咱們經過uboot來調試咱們的裸機程序
uboot中經常使用的環境變量:
環境變量如何參與程序的運行:
bootdelay,開機倒計時環境變量
網絡設置的環境變量:
ipaddr 是咱們開發板也就是當前uboot的本地IP地址
serverIP 是咱們開發板運行在uboot時,在uboot中經過tftp指令向咱們的主機tftp服務器下載東西時,tftp服務器的IP地址。
gatewayip 是咱們開發板也就是uboot的本地網關地址。
netmask 是子網掩碼
ethaddr 是咱們開發板的本地網卡的MAC地址
uboot中重要的兩個經常使用環境變量
一、自動運行命令設置:
bootcmd=movi read kernel 30008000; bootm 30008000
setenv bootcmd 'movi read kernel 30008000; bootm 30008000'
uboot啓動後,先倒數bootdelay秒後,若是沒有按下回車的話,就會自動執行啓動內核的命令(其實就是直接執行了bootcmd這個環境變量的值所對應的命令集(若是bootcmd在uboot中的值不是啓動內核的,而是printenv的話,就開機倒數完畢後打印環境變量了))。
二、uboot給kernel傳參:bootargs
在uboot中,咱們將bootargs這個環境變量的值設置好,咱們在bootm啓動內核時,就會自動的將咱們uboot中的bootargs中的參數值傳遞個內核。
bootargs=console=ttySAC2,115200 root=/dev/mmcblk0p2 rw init=/linuxrc rootfstype=ext3 意義解釋:
console=ttySAC2,115200 控制檯使用串口2,波特率115200.
root=/dev/mmcblk0p2 rw 根文件系統在SD卡端口0設備(iNand)第2分區,根文件系統是可讀可寫的
init=/linuxrc linux的進程1(init進程)的路徑
rootfstype=ext3 根文件系統的類型是ext3
setenv bootargs 'console=ttySAC2,115200 root=/dev/mmcblk0p2 rw init=/linuxrc rootfstype=ext3'
uboot中新建、更改、刪除一個環境變量的方法:
新建一個環境變量的方法:set 環境變量的名字 環境變量的值
更改一個環境變量的方法:set 環境變量的名字 環境變量的值
刪除一個環境變量的方法:set 環境變量的名字
uboot中對flash和DDR的管理
uboot階段flash的分區:
uboot必須存放在flash的起始地址處(有多是扇區0,有多是扇區1,這就要看咱們的SOC啓動設計了)。像210就是從扇區1開始啓動的。
一、uboot:uboot的分區的大小必需要可以放下整個uboot,通常設計uboot分區的大小是512KB或者1MkB,通常都不會大於512kb,在大了的空間就浪費了。
環境變量:環境變量的分區通常放在緊貼在uboot分區以後,大小通常者32KB就已經足夠了。
kernel:kernel分區能夠緊貼這環境變量變量的分區進行存放,通常我給這個分區的大小大概是3M到5M,
rootfs:。。。。。。。。。。。。。。。。。。。。。。都是看實際移植出來的大小進行分配。
flash的其餘地方,就是自由空間了,通常在kernel啓動起來後,自用分區用來掛載到咱們rootfs下去使用。
二、uboot階段DDR的分區:
DDR內存和flash的不一樣,是在於DDR是掉電丟失的,flash掉電能夠保存的。因此DDR的分區管理是在系統運行時開始部署的。
在linux內核啓動以前咱們要本身進行內存的分區管理,在linux內核啓動了以後,咱們就能夠不用對內存進行管理了,就能夠交給linux內核進行管理了。