从零开始的ZYNQ学习(基于矿卡EBAZ4205)(二)
前情提要:從零開始的ZYNQ學習(基于礦卡EBAZ4205)(一)
文章目錄
- 0. 聲明
- 6. 基于Petalinux的鏡像構建、驗證和燒錄
- 6.1 Petalinux介紹
- 6.2 在Ubuntu中安裝Petalinux
- (1)安裝包下載
- (2)參考手冊下載
- (3)虛擬機環境搭建
- (4)安裝依賴包
- (5)安裝Petalinux
- (6)安裝驗證
- 6.3 網口、TF卡的適配和Vivado工程修改
- (1)電路修改
- (2)修改ZYNQ7的IP核配置
- (3)修改塊設計
- (4)綜合、實現和比特流生成
- 6.4 Petalinux工程構建過程
- (1)準備工作
- (2)創建Petalinux工程
- (3)配置Petalinux工程
- ·1)從hdf文件初始化工程
- ·2)修改Petalinux工程配置
- ·3)修改Uboot配置(可選)
- (4)編譯Petalinux工程
- (5)生成啟動鏡像
- (6)使用TF卡啟動方式驗證鏡像
- 6.5 將啟動鏡像固化到NAND Flash
- (1)生成啟動鏡像
- (2)使用Xilinx SDK燒錄鏡像
- (3)擴展:通過串口燒錄image.ub
- 6.6 相關知識
- (1)從image.ub文件到FIT
- (2)RAMDisk Filesystem
- 參考資料
- 1. 相關信息
- 2. 參考描述
0. 聲明
本文由長春理工大學電子信息工程學院C&I實驗室所有,已獲得原作者發布授權。轉載請注明出處。
本文編寫過程中參考了很多前輩的記錄,在此表示感謝,已將所有參考項列于文末。
當前版本R1.0(預發布)。
作者聯系方式:E-mail: WindForest@yeah.net
6. 基于Petalinux的鏡像構建、驗證和燒錄
網上有大佬前輩從源碼構建了礦卡可用的鏡像,參見zynq[2] Linux from scratch,實在是太詳細了,因此不再重復(實際上是我太懶不想去做)。本章嘗試使用官方提供的Petalinux工具生成啟動鏡像,使用TF卡啟動方式驗證鏡像的正確性,并將其燒錄到NAND Flash中。
本章涉及到的外設有:DDR、UART1、TF、NET0。
6.1 Petalinux介紹
PetaLinux 是一種嵌入式Linux軟件開發套件(SDK),主要用于XILINX FPGA基片上系統設計。由于其采用Buildroot構建系統,因此可以在簡單的配置下,一步生成所需要的bootloader、kernel、rootfs鏡像以及應用軟件庫。
Petalinux由Xilinx官方提供,對于不同版本的Vivado,Petalinux也有對應的版本,安裝時需注意選擇和區分。
6.2 在Ubuntu中安裝Petalinux
這里必須得意一下,安裝流程我曾經在CSDN上寫過,慶幸于使用的同樣是Markdown語言,我可以輕松將那些文字和圖片拷貝過來,哈哈。
對于使用流程來說,大部分人可能還是比較喜歡Windows環境,而且因為本機安裝的是Windows,而計算機硬件的資源又有限,所以在虛擬機中運行XILINX所有的開發工具不太方便。在參考了大部分開發環境搭建方式后,個人覺得“在Windows下使用Vivado生成板級描述文件,傳到虛擬機中使用Petalinux生成燒錄鏡像,再使用Windows下的SDK進行燒寫”的開發方式是在本地計算機資源有限的情況下比較容易被接受的。
安裝準備包括安裝文件和參考文件。
(1)安裝包下載
安裝文件的名稱是petalinux-v2017.4-final-installer.run,官方網站可以下載,頁面鏈接:
XILINX下載頁-petalinux存檔
安裝包選擇其中MD5值為9b406fa5cc732da52944b3ce6718e19d的7.86GB的單文件。
(2)參考手冊下載
UG1144是非常實用的手冊,該用戶指南中介紹了Petalinux的一切官方讓你知道的。上圖中的右側,點擊 Petalinux工具文檔 項,在頁面中找到 《UG1144 - PetaLinux 工具文檔:參考指南 (中文版) (v2019.1)》 文檔下載之(當然你照著這篇文章安裝的話可以不用參考此指南)。
可能你想問,我安裝的是2017.4版本的Petalinux,為什么這里要下載的是2019.1版本的呢?因為截至目前,官網中只有這個版本的UG1144是中文的,讀起來比較順暢,而且與2017.4版本在大體描述上相差不大(…也許吧)。
(3)虛擬機環境搭建
搭建過程網上有的是說明,在此只說一下硬盤空間分配的問題,我把我目前安裝完之后的情況告訴你,在Ubuntu采用最小安裝、移除無關組件、安裝必要組件、安裝vmware-tool、保存安裝文件和安裝完之后的文件的情況下,硬盤占用小于30GB。
注意,這個版本的Petalinux推薦使用Ubuntu16.04.6LTS進行安裝,因為其它版本的Ubuntu對它的支持可能不是很好,會出問題,比如在Ubuntu18.04中,安裝后執行settings.sh后會出現下圖所示錯誤、以及使用petalinux-build命令編譯的時候會出現“需要支持en_US.UTF8”等問題,而在Ubuntu16.04中是正常的。比如:
(4)安裝依賴包
《UG1144 - PetaLinux 工具文檔:參考指南 (中文版) (v2019.1)》文檔對Ubuntu下依賴包的配置描述不完全適用于2017.4版本的Petalinux。Petalinux2017.4的依賴包如下,直接復制粘貼運行就行了(其中有可能安裝時會重復,但是無關緊要),安裝時注意保持網絡暢通:
sudo apt install make net-tools libncurses-dev libncurses-dev zlib1g:i386 flex libssl-dev bison libselinux1 gnupg wget diffstat chrpath socat xterm autoconf libtool tftpd unzip texinfo zlib1g-dev gcc-multilib build-essential gzip pax screen gawk tofrodos xvfb python git libsdl1.2-dev libglib2.0-dev(5)安裝Petalinux
首先要注意此程序不能在root權限下安裝,比如運行前加“sudo”是不行的,它會提示并且運行不下去。
在運行時如果不指定安裝的目錄,會安裝到安裝文件所在目錄下,而且還不會自動新建文件夾,如果安裝到opt之類的目錄,記得把目錄權限改成rwxr-xr-x(755),不然等上十幾分鐘之后安裝不了心情是很崩潰的。
./petalinux-v2017.4-final-installer.run /安裝位置安裝流程大致為:對安裝包校驗->解壓文件->確認3個協議->(安裝目錄提示——如果沒有指明目錄的話)->完成安裝。
(6)安裝驗證
首先進入到安裝目錄下執行:
source settings.sh而后在終端中輸入 petalinux- 并按兩次TAB鍵,如果出現命令補全提示,那么就是OK了。
如果這臺虛擬機只用來開發Petalinux,那么可以把source語句寫入到.bashrc文件中,這樣在每次啟動終端的時候都會自動加載了。
即在~/.bashrc文件最后增加如下語句:
source /petalinux安裝路徑/settings.sh那這些petalinux命令是用來干嘛的呢?參考手冊中13頁中的說明如下:
至此,Petalinux2017.4在Ubuntu16.04下的環境配置完成。
6.3 網口、TF卡的適配和Vivado工程修改
(1)電路修改
在使用Etron的DRAM版本的礦卡上,建議斷開R1485電阻并焊接C377、C380電容(22pF)和Y3晶振(25.000MHz)為IP101GA提供時鐘信號,否則在U-Boot和Linux下網絡功能將不可用。具體說明參見4.6-(1)小節。
注:為方便本章后續調試,建議修改R2584和R2577電阻接法,使用開關選擇啟動引腳MIO[5]為高電平或低電平,進而實現TF卡啟動方式和NAND啟動方式的切換。
若采用上圖焊接方法,確認無誤后切記固定,防止外力導致電阻焊盤脫落!
(2)修改ZYNQ7的IP核配置
Vivado工程的修改緊接著5.4-(2)小節進行,TF卡可用于內核鏡像的快速驗證,網口則是Linux開發的必備接口。
在ZYNQ配置界面“MIO Configuration”中,繼續勾選“ENET 0”和“SD 0”:
其中,ENET 0的IO選擇EMIO,因為在PS_MIO[16:27]中,MIO[24]和MIO[25]已經被UART1占用了。SD 0的IO保持默認,其CD、WP和Power均不需選擇,因為礦卡上未做引出。
注:因為SD 0僅引出了數據/時鐘引腳,故不支持插拔檢測。例如從NAND啟動后再插入TF卡,不會自動生成設備節點;在TF卡空閑狀態下帶電拔出后重新插入不一定會影響后續讀寫等。
解釋:在ZYNQ中,EMIO是指從PL端引出的PS端口,與此相對的MIO是在PS內部集成,功能固定的具有復用功能的引腳。
在“Clock Configuration”中,設置ENET 0為百兆速度:
接著,把之前裸機調試時精簡掉的選項增加上(注:暫不清楚是否有必要):
最后,增加一個TTC模塊,Linux需要它:
(3)修改塊設計
因為礦卡的網口通過EMIO引出,因此需手動分配這些引腳。另外,由于IP101GA是千兆網卡,查看原理圖可知,其TXD和RXD共有8個,而在百兆網卡使用的MII接口中,TXD和RXD僅有4個,故需顯式地增加兩個Concat模塊將8位轉為4位,否則多余的引腳引出但未分配IO,最后生成比特流文件時會報錯。
注:在ZYNQ的Block Design中,Concat IP可用于將分離的線拼接成單一線輸出,相當于Verilog描述的拼接操作。其輸入端口數和位寬均可配置。在其它參考設計中,有使用Slice模塊代替下圖中xlconcat_1模塊的,其最終實現效果與下圖所示一致。
增加IP核的操作與增加ZYNQ7的IP核操作相同。
最后將這些器件按照下圖所示連接起來:
注:可通過右鍵端口->“Make External”做端口引出;通過右鍵端口->“Disconnect Pin”取消引出。
(4)綜合、實現和比特流生成
點擊左側邊欄“Run Synthesis(運行綜合)”,綜合過程中會彈出關于數據位寬的警告,此處忽略:
而后點擊“Open Synthesized Design(打開綜合設計)”對網口的引腳進行分配,在彈出的框中點“Define Target”
點擊以生成引腳約束文件:
點擊“Create File”,并輸入文件名:
在“Source(資源)”視窗中打開該引腳約束文件:
并在編輯器中輸入下列約束:
此處EMIO的設計流程大致為:將設計圖中的端口名與PL端擴展IO建立對應關系,并對這些擴展IO的基本屬性和狀態進行設置即可。
Ctrl+S保存,此時效果如下:
直接點擊左側邊欄的“Generate Bitstream(生成比特流)”,一鍵完成綜合、實現和比特流生成。
注:這里點擊“Generate Bitstream”只是為了方便,Petalinux構建過程中將基于hdf文件自動生成FSBL和需要的比特流文件。
6.4 Petalinux工程構建過程
(1)準備工作
接續上一步,Petalinux需要Vivado生成的硬件描述文件(*.hdf)作為生成鏡像的配置依據,且可自動生成FSBL和比特流文件。因此SDK中只需要建立前文中適配礦卡的下載用FSBL即可。
(2)創建Petalinux工程
恭喜你走到這一步!接下來我們轉到Ubuntu平臺,開始激動人心的Petalinux工程!
注意:這里假設你已經安裝好了Petalinux2017.4環境。
注意:請確保每一次打開Terminal運行“petalinux-xxx”命令之前,總是執行了“source settings.sh”操作。每次打開Terminal都需重新進行該操作。
說明:本文示例目錄在/home/wind/下(我的用戶名為wind),后續示例基于此路徑。
在當前用戶目錄下打開Terminal,執行:
petalinux-create --type project --template zynq --name EBAZ4205-linux即可在當前目錄下建立一個名為EBAZ4205-linux、面向ZYNQ的空白Petalinux工程。
(3)配置Petalinux工程
·1)從hdf文件初始化工程
將Vivado中導出的硬件描述文件(*.hdf)拷貝到Petalinux工程目錄下,并在工程目錄執行:
petalinux-config --get-hw-description=./即可完成工程的初始化。
·2)修改Petalinux工程配置
在工程目錄下執行:
petalinux-config進入Petalinux的配置菜單,并做以下修改:
注:在“Linux Components Selection”項中我們可以看到其中默認已經勾選了自動生成FSBL。
修改“Subsystem AUTO Hardware Settings(子系統自動硬件設置)”->“Advance bootable images storage Settings(高級啟動鏡像存儲設置)”->“boot image settings(啟動鏡像設置)”->“image storage media(鏡像存儲介質)”,如果需要從NAND Flash啟動,請選擇“primary flash(Flash優先)”,如果需要從TF卡啟動,請選擇“primary sd(SD優先)”;
注:在此修改過程中可注意到,啟動鏡像名(默認為BOOT.BIN)在此處修改。
修改“Subsystem AUTO Hardware Settings(子系統自動硬件設置)”->“Advance bootable images storage Settings(高級啟動鏡像存儲設置)”->“kernel image settings(內核鏡像設置)”->“image storage media(鏡像存儲介質)”,如果需要從NAND Flash啟動,請選擇“primary flash(Flash優先)”,如果需要從TF卡啟動,請選擇“primary sd(SD優先)”;
注:在此修改過程中可注意到,Uboot載入的鏡像名(默認為image.ub)在此處修改。
修改“u-boot Configuration”->“netboot offset”項的值為0x08000000;
注:該值為Uboot將鏡像加載到的內存地址,默認為0x10000000,即256MiB,然而礦卡采用的DDR3是單片的256MiB顆粒,如果保持默認值,會在啟動時出現以下提示:
...... Loading Kernel Image ... OK Loading Ramdisk to 07a8a000, end 07fff726 ... OK ERROR: image is not a fdt - must RESET the board to recover. FDT creation failed! hanging...### ERROR ### Please RESET the board ###建議修改“Image Packaging Configuration(鏡像打包配置)”,取消選擇“Copy final images to tftpboot(拷貝最終鏡像到tftp啟動目錄)”,這可以消除掉編譯結束后的惱人提示,讓結果展示的更加完美一點>v<;
建議修改“Image Packaging Configuration(鏡像打包配置)”->“Root filesystem type(根文件系統類型)”為“INITRAMFS”,這將使本章進行的更加順利,并降低學習難度。
注:不要因為從TF卡啟動而將此項選擇為“SD Card”,否則默認將從TF卡的第二分區啟動根文件系統,而本章還沒進行到“制作、構建和移植根文件系統”那一步。
而后保存并退出,等待命令完成。
·3)修改Uboot配置(可選)
在工程目錄下執行:
petalinux-config -c u-boot進入Uboot的配置菜單,并可做以下修改:
建議修改“delay in seconds before automatically booting”為2(秒),減少系統啟動時間,從而提高調試效率;
建議使能“Networking support”項,以便于網絡調試;
建議在“Command line interface”->“Network commands”中,增加對tftp相關命令和ping命令的支持,以便于網絡調試;
可以修改“Command line interface”->“Shell prompt”為自己喜歡的字符。
而后保存并退出,等待命令完成。
(4)編譯Petalinux工程
在工程目錄下執行:
petalinux-build有記錄如此說:二次修改后可使用:
petalinux-build -x mrproper -f清除編譯緩存以防止出現修改不生效的情況。
注意:此命令會重置整個工程目錄,petalinux-config需要重新讀取hdf文件,但u-boot等的配置文件不會被重置。
注:作者在首次編譯通過后,使用該命令清除緩存,再次編譯出現了不通過的情況,不知何故。
編譯可能需要幾十分鐘(取決于計算機配置),編譯完成后,在./images/linux/下存放著生成的鏡像文件。
(5)生成啟動鏡像
在工程目錄下執行:
cd ./images/linux/ petalinux-package --boot --format BIN --fsbl zynq_fsbl.elf --fpga ZYNQ7010_wrapper.bit --u-boot即可在當前目錄下生成BOOT.BIN和image.ub兩個文件,其中BOOT.BIN=FSBL+bitstream+SSBL(U-Boot);image.ub=dtb+kernel+rootfs。
注:如果./images/linux/下已經存在BOOT.BIN和image.ub文件,則需在上述命令末尾增加“–force”以執行覆蓋,否則會出現失敗提示。
(6)使用TF卡啟動方式驗證鏡像
取一張TF卡,格式化為FAT或FAT32,將上一步生成的BOOT.BIN和image.ub保存其中。插入到礦卡的TF卡槽中,并設置礦卡為SD啟動方式。連接調試串口到計算機并在終端中打開,礦卡上電即可看到輸出。默認的用戶名和密碼均為“root”。
注:需從TF卡啟動時,請確保Petalinux工程配置中“image storage media(鏡像存儲介質)”設置為“primary sd(SD優先)”,修改后需重新編譯并生成鏡像。詳見6.4-(3)-2)章節。
6.5 將啟動鏡像固化到NAND Flash
(1)生成啟動鏡像
首先,為了使Petalinux構建出從NAND啟動的鏡像,需確保Petalinux工程配置中“image storage media(鏡像存儲介質)”設置為“primary flash(Flash優先)”。詳見6.4-(3)-2)章節。
注:如果將TF卡啟動鏡像的BOOT.BIN下載到NAND,其Uboot依然會嘗試從MMC加載,縱使SD卡存在且存有有效鏡像,這也不是我們希望的。
TF和NAND啟動方式最大的不同在于,前者使用的啟動命令:
fatload mmc SD器件號[0,1] 內存載入地址 鏡像名稱是基于文件名的,因為文件系統的存在,文件的存儲位置顯得不那么重要。但在NAND啟動方式中,Uboot使用的:
nand read 內存載入地址 存儲起始地址 數據長度則是基于地址的拷貝。因此,我們需要對Uboot分區做一些調整。
在這里我們不妨貼出兩種啟動方式下的Uboot啟動指令,在Uboot命令行執行:
printenv即可打印當前Uboot環境設置,它們有點多,因此我只摘抄了默認啟動指令部分。
SD啟動方式的啟動指令如下:
bootcmd=run default_bootcmd default_bootcmd=run cp_kernel2ram && bootm ${netstart} cp_kernel2ram=mmcinfo && fatload mmc 0 0x8000000 image.ub netstart=0x8000000NAND啟動方式的啟動指令如下:
bootcmd=run default_bootcmd default_bootcmd=run cp_kernel2ram && bootm ${netstart} cp_kernel2ram=nand read ${netstart} ${kernelstart} ${kernelsize} netstart=0x08000000 kernelstart=0x300000 kernelsize=0xa00000這里的具體設置與后文匹配。
在工程目錄下執行:
petalinux-config進入Petalinux工程配置,修改“Subsystem AUTO Hardware Settings(子系統自動硬件設置)”->“Flash Settings(Flash設置)”為下圖所示的參數:
注:這些參數取決于生成的鏡像的大小,上面的設置留出了一部分余量。
而后執行編譯和打包,重新生成BOOT.BIN和image.ub文件,具體過程如前文所述。
(2)使用Xilinx SDK燒錄鏡像
打開Xilinx SDK的下載界面,連接好礦卡的JTAG、串口線和供電。首先燒錄BOOT.BIN,注意BOOT.BIN的偏移為0:
而后再下載image.ub,將該文件重命名為*.bin,因為SDK的下載器只認.mcs和.bin類型的文件。另外別忘了設置下載偏移:
確保礦卡為NAND啟動方式。連接調試串口到計算機并在終端中打開,礦卡重新上電即可看到輸出。默認的用戶名和密碼均為“root”。
注:Uboot啟動時打印:
*** Warning - bad CRC, using default environment表示從bootenv空間(前文分配的0x2E0000~0x300000)讀取的數據的CRC校驗不正確,這是因為首次下載時該區域中沒有有效內容,只需在Uboot命令行中執行一次:
saveenv保存啟動環境配置到指定分區即可消除該警告。
(3)擴展:通過串口燒錄image.ub
在已經有Uboot的情況下,可使用Uboot本身提供的讀寫命令燒錄鏡像,這里用此方式嘗試一下吧!這里使用的終端軟件為SecureCRT V8.5.3。
在Uboot命令行執行:
mw.b 0x800000 ff 0xA00000 #將內存中8MiB~18MiB的空間全部填充0xFF loadb 0x800000 #使用Kermit傳輸,向0x800000地址寫入二進制數據而后選擇“傳輸”->“發送Kermit(K)…”,找到image.ub文件并發送(下圖中發送的是之前改名之后的image.bin):
發送有點慢,它的速度還是很穩定的,所以剩余時間也基本是它顯示的時長,趁著它下載,起來走動走動休息一下吧!
完成后依次執行以下命令將內存中的鏡像拷貝到NAND中:
nand erase 0x300000 0xA00000 #擦除NAND Flash中3MiB~13MiB的空間 nand write 0x800000 0x300000 0xA00000 #將內存中的數據寫入到NAND Flash整個過程的打印如下:
而后重新上電即可。
6.6 相關知識
(1)從image.ub文件到FIT
如果你有過嵌入式開發經驗,一定見過許多種不同的啟動鏡像結構,例如海思的uboot+kernel(with dtb)+rootfs的形式、全志的u-boot spl+u-boot+dtb+kernel+rootfs的形式等等,更別說從網絡啟動以及眾多的文件系統類型。但是Petalinux中使用的image.ub是什么?
還記得Petalinux的編譯過程嗎?我覺得大部分人都會在第一次編譯的時候興奮地盯著屏幕看完這一整個過程的。你會發現petalinux-build命令的執行過程中依然包含了對u-boot和kernel的單獨編譯,在工程目錄下的./images/linux/下生成的文件也證實了這一點。另外,在配置Petalinux的時候,有指定啟動鏡像名稱的設置項。好吧,不賣關子了,餡兒都快漏出來了,image.ub是由mkimage命令生成的鏡像,是一種打包文件。(Linux中“打包”的想法真是很常見呢!)
在Terminal中運行如下命令:
mkimage -l image.ub可查看某次生成的image.ub的文件組織結構如下:
FIT description: U-Boot fitImage for plnx_arm kernel Created: Sat Nov 7 14:30:08 2020Image 0 (kernel@0)Description: Linux KernelCreated: Sat Nov 7 14:30:08 2020Type: Kernel ImageCompression: uncompressedData Size: 3745696 Bytes = 3657.91 kB = 3.57 MBArchitecture: ARMOS: LinuxLoad Address: 0x00008000Entry Point: 0x00008000Hash algo: sha1Hash value: bacb21fcc869a66f89282c1445a1bf233792c66fImage 1 (fdt@0)Description: Flattened Device Tree blobCreated: Sat Nov 7 14:30:08 2020Type: Flat Device TreeCompression: uncompressedData Size: 13641 Bytes = 13.32 kB = 0.01 MBArchitecture: ARMHash algo: sha1Hash value: 4df8b976010f034a10f63072b61051413c6ed443Image 2 (ramdisk@0)Description: ramdiskCreated: Sat Nov 7 14:30:08 2020Type: RAMDisk ImageCompression: uncompressedData Size: 5723987 Bytes = 5589.83 kB = 5.46 MBArchitecture: ARMOS: LinuxLoad Address: unavailableEntry Point: unavailableHash algo: sha1Hash value: 726dbb5b6575cdf601e6ad4973507afcd1f68b79Default Configuration: 'conf@1'Configuration 0 (conf@1)Description: Boot Linux kernel with FDT blob + ramdiskKernel: kernel@0Init Ramdisk: ramdisk@0FDT: fdt@0Configuration 1 (conf@2)Description: Boot Linux kernel with FDT blobKernel: kernel@0FDT: fdt@0從上述信息中,我們可以發現,在所生成的image.ub中,打包了Kernel鏡像、FDT設備樹、一個RAMDisk鏡像和兩份配置,一份啟動到RAMDisk,另一份則僅啟動到Kernel。
在早期的Uboot鏡像格式中,Kernel(±dtb)被包裝成uImage的形式,即在二進制文件前增加一個文件頭,用以說明壓縮格式、鏡像類型等。隨著FDT(Flattened Device Tree,扁平設備樹)在ARM中逐漸普及,為了達成“同一內核”的目標,Uboot設計了一種全新的鏡像格式,即FIT uImage,FIT即Flattened Image Tree(扁平鏡像樹)。FIT格式可以在一個文件中包含多個鏡像和配置,這樣同一份鏡像文件就可以適配多個平臺。
FIT鏡像的使用依賴其中保存的配置項,使用非默認配置項可使用如下Uboot命令(其中#和@必須有,配置號參照上面的文件結構):
bootm 鏡像所在內存地址#conf@配置號具體的內容可參見這篇博文:u-boot FIT image介紹
(2)RAMDisk Filesystem
我們在配置Petalinux的時候選擇的根文件系統類型為“INITRAMFS”,還記得嗎?這種文件系統在啟動時加載到內存,因為其運行基于內存,因此讀寫速度很快,但它是一個只讀文件系統。因此想要將礦卡作為開發板,則最好的方法還是使用可讀寫的文件系統管理存儲器。
當然我不打算在這章嘗試使用NAND常用的yaffs2或者TF卡常用的ext4,那是后面章節要做的事情,我只是想稍微了解一下RAMFS,并記錄下來而已。
“Initramfs”背后似乎隱藏著一個龐大的故事個長長的時間線。在了解Initramfs之前,我們要首先了解Initrd(Init RAM Disk,初始化RAM磁盤)。Initrd是一個在系統引導過程中掛載的、以磁盤結構存儲在內存中的臨時根文件系統,用來支持兩階段的引導過程。Initrd中包含必要的工具和腳本,用于在將控制權交給根文件系統上的init應用程序之前掛載所需的文件系統。Linux內核在此根磁盤上觸發安裝腳本(通常稱為 linuxrc,但該名稱不是必需的),此腳本的工作是準備系統、切換到真正的根文件系統,然后調用init。
雖然在一些情況下使用Initrd是必要的,但是它有一些缺點:
- Initrd是一個完整的塊設備,他需要整個文件系統的開銷,它有一個固定的大小。選擇的Initrd太小了,所需要的腳本不適用;過大的話則會浪費內存。
- 因為它是一個真實的、 靜態的設備,它消耗 Linux 內核中的緩存內存和易于使用的文件(如分頁),這使得 Initrd 有更大的內存消耗。
Initramfs 的誕生就是為了解決這些問題。Initramfs基于tmpfs,使用cpio進行歸檔,通過gzip進行壓縮,它不是一個單獨的塊設備,所以沒有緩存和額外的開銷。
更多的介紹來源已放在文末參考資料列表中。
參考資料
本文編寫過程中參考的所有資料均列在下方。本文若與任何列表之外的文章、博客、視頻、教程等描述相同或相似則純屬巧合。
另在此處再次對以下資料的作者們表示感謝。
1. 相關信息
2. 參考描述
————2020-11-17 @燕衛博————
總結
以上是生活随笔為你收集整理的从零开始的ZYNQ学习(基于矿卡EBAZ4205)(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【论文阅读笔记】Ocean: 目标感知的
- 下一篇: 【Cloudaily】3.15五招教你辨