比較zImage和uImage的區別

一、vmlinuz
vmlinuz是可引導的、壓縮的內核。“vm”代表“Virtual Memory”。Linux 支持虛擬內存,不像老的操作系統比如DOS有640KB內存的限制。Linux能夠使用硬盤空間作為虛擬內存,因此得名“vm”。
vmlinuz的建立有兩種方式。一是編譯內核時通過“make zImage”創建,然后通過:“cp /usr/src/linux-2.4/arch/i386/linux/boot/zImage/boot/vmlinuz”產生。zImage適用于小內核的情況,它的存在是為了向后的兼容性。
二是內核編譯時通過命令make bzImage創建,然后通過:“cp/usr/src/linux-2.4/arch/i386/linux/boot/bzImage /boot/vmlinuz”產生。bzImage是壓縮的內核映像,需要注意,bzImage不是用bzip2壓縮的,bzImage中的bz容易引起誤解,bz表示“big zImage”。 bzImage中的b是“big”意思。 zImage(vmlinuz)和bzImage(vmlinuz)都是用gzip壓縮的。它們不僅是一個壓縮文件,而且在這兩個文件的開頭部分內嵌有 gzip解壓縮代碼。所以你不能用gunzip 或 gzip –dc解包vmlinuz。?
二、initrd-x.x.x.img
initrd是“initial ramdisk”的簡寫。initrd一般被用來臨時的引導硬件到實際內核vmlinuz能夠接管并繼續引導的狀態。
initrd映象文件是使用mkinitrd創建的。mkinitrd實用程序能夠創建initrd映象文件。這個命令是RedHat專有的。其它Linux發行版或許有相應的命令。這是個很方便的實用程序。具體情況請看幫助:man mkinitrd下面的命令創建initrd映象文件。
?最后生成的內核鏡象有兩種zImage以及uImage。其中zImage下載到目標板中后,可以直接用uboot的命令go來進行直接跳轉。這時候內核直接解壓啟動。但是無法掛載文件系統,因為go命令沒有將內核需要的相關的啟動參數傳遞給內核。傳遞啟動參數我們必須使用命令bootm來進行跳轉。Bootm命令跳轉只處理uImage的鏡象。
uboot源代碼的tools/目錄下有mkimage工具,這個工具可以用來制作不壓縮或者壓縮的多種可啟動映象文件。
mkimage在制作映象文件的時候,是在原來的可執行映象文件的前面加上一個0x40字節的頭,記錄參數所指定的信息,這樣uboot才能識別這個映象是針對哪個CPU體系結構的,哪個OS的,哪種類型,加載內存中的哪個位置, 入口點在內存的那個位置以及映象名是什么
用法如下:
./mkimage -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file...] image
-A ==> set architecture to 'arch'
-O ==> set operating system to 'os'
-T ==> set image type to 'type'
-C ==> set compression type 'comp'
-a ==> set load address to 'addr' (hex)
-e ==> set entry point to 'ep' (hex)
-n ==> set image name to 'name'
-d ==> use image data from 'datafile'
-x ==> set XIP (execute in place)
參數說明:
-A 指定CPU的體系結構:
取值 表示的體系結構
alpha Alpha?
arm A RM?
x86 Intel x86
ia64 IA64
mips MIPS
mips64 MIPS 64 Bit
ppc PowerPC
s390 IBM S390
sh SuperH
sparc SPARC
sparc64 SPARC 64 Bit
m68k MC68000


-O 指定操作系統類型,可以取以下值:
openbsd、netbsd、freebsd、4_4bsd、linux、svr4、esix、solaris、irix、sco、dell、ncr、lynxos、vxworks、psos、qnx、u-boot、rtems、artos
?-T 指定映象類型,可以取以下值:
standalone、kernel、ramdisk、multi、firmware、script、filesystem
-C 指定映象壓縮方式,可以取以下值:
none 不壓縮
gzip 用gzip的壓縮方式
bzip2 用bzip2的壓縮方式
?-a 指定映象在內存中的加載地址,映象下載到內存中時,要按照用mkimage制作映象時,這個參數所指定的地址值來下載
?-e 指定映象運行的入口點地址,這個地址就是-a參數指定的值加上0x40(因為前面有個mkimage添加的0x40個字節的頭)
-n 指定映象名
?
-d 指定制作映象的源文件
我在編譯時用到的命令如下:
# make zImage ? ? ?//生成zImage鏡象
#/usr/local/arm/k9uboot/tools/mkimage -n 'Linux 2.4.27' -A arm -O linux -T
kernel -C none -a 0x20007fc0 -e 0x20008000 -d zImage uImage
內核鏡象已經準備好了,這個時候我們就要來準備文件系統了。由于時間緣故,本人暫時采用的是其他人已經好的文件系統k9.img.gz。這個時候我們要做的是,自己寫一個簡單hello.c的程序,編譯通過后加入到該文件系統中,然后下載到目標板中運行。
先編寫hello.c;
編譯:
#/usr/local/arm/2.95.3/bin/arm-linux-gcc ?–o start-hello hello.c
編譯后生成可執行文件start-hello
下面我們就必須把該執行文件加入到文件系統中去,步驟如下:
#gunzip ?k9.img.gz ? ? ? ? ? ? ? ? ? ? //解壓縮
#mount –o loop k9.img ?/mnt/new_disk ? ?//掛載
#cp start-hello ?/mnt/new_disk ? ? ? ? ? //將文件拷貝到文件系統中
#cd ?/mnt/new_disk
#umount /mnt/new_disk ? ? ? ? ? ? ? ? //卸載
#gzip –c –v9 k9.img > k9.img.gz ? ? ? ? ?//壓縮 生成最終的文件系統
下面我們就要下載內核以及準備好文件系統了,這邊先說明我的內存分配情況如下:
Flash:
0x10000000 ――― 0x10020000 ? ? boot
0x10020000 ――― 0x10040000 ? ? uboot
0x10040000 ――― 0x10060000 ? ? uboot env
0x10060000 ――― 0x10200000 ? ? kernel
0x10200000 ――― 0x11000000 ? ? ramdisk
?
Sdram:
0x20007fc0 ――― 0x20a00000 ? ? kernel
0x20a00000 ――― ? ? ? ? ? ? ? ?ramdisk
?Loadb ?通過串口下載數據到ram中
cp.b ? ?拷貝ram中的數據到flash中。
?將kernel以及文件系統ramdisk下載完畢之后,我們還需要設置uboot的環境變量,這樣uboot才能夠在上電啟動的時候啟動內核等操作。環境變量設置如下:
Set cpfltoram cp.b 10200000 20a00000 18ffff ? ? ? ? ? ?//拷貝文件系統到ram中
Set boot bootm 20007fc0 ? ? ? ? ? ? ? ? ? ? ? ? ? ?//啟動kernel
Set bootcmd run cpfltoker\;run cpfltoram\;run boot ? ? ? //uboot復位的執行指令
?Set cpfltoker cp.b 10060000 20007fc0 f4fff ? ? ? ? ? ? //拷貝內核到ram中
Set bootargs root=/dev/ram rw initrd=0x20a00000,4M init=/linuxrc console=ttyS0,11520
0,mem=32m ? ?//uboot傳遞給內核的啟動參數
對于Linux內核,編譯可以生成不同格式的映像文件,例如:
# make zImage
# make uImage
? ? zImage是ARM Linux常用的一種壓縮映像文件,uImage是U-boot專用的映像文件,它是在zImage之前加上一個長度為0x40的“頭”,說明這個映像文件的類型、加載位置、生成時間、大小等信息。換句話說,如果直接從uImage的0x40位置開始執行,zImage和uImage沒有任何區別。另外,Linux2.4內核不支持uImage,Linux2.6內核加入了很多對嵌入式系統的支持,但是uImage的生成也需要設置。
vmlinux ?編譯出來的最原始的內核文件,未壓縮。
zImage ? 是vmlinux經過gzip壓縮后的文件。
bzImage bz表示“big zImage”,不是用bzip2壓縮的。兩者的不同之處在于,zImage解壓縮內核到低端內存(第一個640K),bzImage解壓縮內核到高端內存(1M以上)。如果內核比較小,那么采用zImage或bzImage都行,如果比較大應該用bzImage。
uImage ? U-boot專用的映像文件,它是在zImage之前加上一個長度為0x40的tag。
vmlinuz ?是bzImage/zImage文件的拷貝或指向bzImage/zImage的鏈接。
initrd ? 是“initial ramdisk”的簡寫。一般被用來臨時的引導硬件到實際內核vmlinuz能夠接管并繼續引導的狀態。
vmlinux是內核文件,
zImage是一般情況下默認的壓縮內核映像文件,壓縮vmlinux,加上一段解壓啟動代碼得到,只能從0X0地址運行。
bzImage在uClinux中很少見到。
uImage是u-boot使用bootm命令引導的Linux壓縮內核映像文件格式,
使用工具mkimage對普通的壓縮內核映像文件(zImage)加工而得。可以由bootm命令從任意地址解壓啟動內核。
由于bootloader一般要占用0X0地址,所以,uImage相比zImage的好處就是可以和bootloader共存。
制作uImage的mkimage軟件,如果uClinux-dist有的話,一般放在uClinux-dist的tools目錄中。

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

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

相關文章

編譯faac錯誤分析

編譯faac時遇到了以下的編譯錯誤: /home/xuxuequan/Ingenicwork/toolchain/mips-gcc472-glibc216-32bit/mips-linux-gnu/libc/usr/include/string.h:365:26: error:ambiguates old declaration const char* strcasestr(const char*, const char*) 解決方案&#x…

gcc與g++的區別

一:gcc與g比較 編譯c/c代碼的時候,有人用gcc,有人用g,于是各種說法都來了,譬如c代碼用gcc,而 c代碼用g,或者說編譯用gcc,鏈接用g,一時也不知哪個說法正確,如果…

交叉編譯openssl不修改Makefile的方法

網上流傳的方法都是要修改Makefile的cc值&#xff0c;我來說個不用修改的方法作者&#xff1a;帥得不敢出門 C哈哈堂<31843264>openssl 下載http://www.openssl.org/source/tar -xvf openssl-1.0.1c.tar.gzcd openssl-1.0.1c/CCarm-linux-gcc ./config no-asm shared -…

編譯boa過程記錄

boa是比較老的HTTP的本地Server&#xff0c;本文是針對0.94.13版本的編譯過程做出記錄 1.下載boa的程序包&#xff0c;本文的編譯是針對misp平臺的交叉編譯 2.在編譯之前&#xff0c;需要針對產品的文件系統和修改編譯時可能遇到的錯誤&#xff0c;修改相關的文件。 &#xff…

/dev/null 21 的作用

shell中可能經常能看到&#xff1a;>/dev/null 2>&1命令的結果可以通過%>的形式來定義輸出/dev/null 代表空設備文件> 代表重定向到哪里&#xff0c;例如&#xff1a;echo "123" > /home/123.txt1 表示stdout標準輸出&#xff0c;系統默認值是1&a…

移植wpa_supplicant 2.2問題

1.編譯libnl1.1問題 In file included from addr.c:28:0: ../include/netlink-local.h: In function __str2type: ../include/netlink-local.h:218:11: error: ULONG_MAX undeclared (first use in this function) ../include/netlink-local.h:218:11: note: each undeclared …

wpa_supplicant與wpa_cli之間通信過程

wpa_supplicant編譯&#xff1a; 1. wpa_supplicant/Android.mk : -- wpa_cli -- wpa_supplicant -- libwpa_client.so 2. hostapd/Android.mk : -- hostapd_cli -- hostapd 從通信層次上劃分&#xff0c;wpa_supplicant提供向上的控制接口 control interface&#xff0c;用于與…

Linux內核驅動之GPIO子系統(一)GPIO的使用

一 概述 Linux內核中gpio是最簡單&#xff0c;最常用的資源(和 interrupt ,dma,timer一樣)驅動程序&#xff0c;應用程序都能夠通過相應的接口使用gpio&#xff0c;gpio使用0&#xff5e;MAX_INT之間的整數標識&#xff0c;不能使用負數,gpio與硬件體系密切相關的,不過linux有一…

gpio_direction_output 與 gpio_set_value

gpio_set_value&#xff08;port_num,0/1&#xff09; 一般只是在這個GPIO口的寄存器上寫上某個值&#xff0c;至于這個端口是否設置為輸出&#xff0c;它就管不了&#xff01; 而gpio_direction_output &#xff08;port_num,0/1)&#xff0c;在某個GPIO口寫上某個值之后&…

內核ko模塊strip使用

編譯一個內核時&#xff0c;習慣性的在install目標下加了命令&#xff1a; $(STRIP) --strip-all --remove-section.note --remove-section.comment test.ko 結果在insmod test.ko時出現錯誤&#xff1a; test: module has no symbols (stripped?) .................. 上…

ubuntu下修復U盤只讀問題

1.通過mount指令查看u盤掛載的實際設備 /dev/sdb1 on /media/xuxuequan/0BEB-331A type vfat (rw,nosuid,nodev,uid1000,gid1000,shortnamemixed,dmask0077,utf81,showexec,flush,uhelperudisks2) 2.umount掛載點 umount /media/xuxuequan/0BEB-331A 3.fsck修復u盤設備 s…

mkfs.jffs2參數詳解

實例&#xff1a;mkfs.jffs2 -r rootfs -o rootfs.jffs2 -e 0x4000 --pad0x1000000 -s 0x200 -n mkfs.jffs2: Usage: mkfs.jffs2 [OPTIONS] Make a JFFS2 file system image from an existing directory tree Options: -p, --pad[SIZE] 用16進制來表示所要輸出檔案的大小&…

關于c語言字符串函數和一些內存函數的的簡介

關于c語言字符串函數和一些內存函數的的簡介 求字符串長度的函數 strlen函數介紹![在這里插入圖片描述](https://img-blog.csdnimg.cn/20190301142458376.jpg)注模擬實現 . [1 ]計數器方式 因為strlen 是求字符串長度的函數&#xff0c;所以不能改變字符串本身&#xff0c;所…

君正T20平臺生成jffs2格式rootfs

基于系統升級的考慮&#xff0c;這兩天在君正T20平臺上折騰如何生成jffs2 格式的rootfs。詳細的過程如下&#xff1a; 1.修改uboot中的分區參數&#xff1a; 修改為rootfs格式為jffs2的&#xff0c;且適當擴大rootfs分區大小。&#xff08;因jffs2的壓縮比不如只讀的squashfs…

用結構體寫一個簡單的通訊錄

一個簡單的通訊錄 通訊錄應該具備簡單的一些功能 1 增添聯系人 2 刪除聯系人 3 查找聯系人 4 修改聯系人 5 按名字給聯系人排序 6 查看通訊錄 除此之外&#xff0c;應該在實現上還應該具備一些其他的功能函數 比如 初始化通訊錄 這些都是功能函數&#xff0c;而整個函數入口應…

jffs2 啟動的常見的問題

Q&#xff1a;在啟動過程中出現at91sam user.warn kernel: Empty flash at 0x00f0fffc ends at 0x00f10000問題 A&#xff1a;在mkfs.jffs2的時候&#xff0c;加上-e 0x20000指定擦除塊的大小。-e是指定擦除塊的大小&#xff0c;我們使用的nandflash的塊大小為128K字節&#xf…

c動態內存管理

動態內存管理 我們之前要開辟內存用的方法都是定義變量&#xff0c;比如 但是上述開辟內存的方法有兩個特點 1空間開辟大小是固定的 2數組在申明的時候&#xff0c;必須指定數組的長度&#xff0c;它所需要的內存在編譯時分配 malloc和free c中提供一個動態內存開辟函數 這…

JFFS2文件系統掛載過程優化的分析報告

一 問題描述 在上電啟動優化中發現Linux系統下掛載JFFS2文件系統耗時較長&#xff0c;以128M的NOR FLASH為例&#xff0c;用時接近20秒。后續單板的FLASH容量為256M&#xff0c;時間會更長。如此長的掛載時間&#xff0c;會大增加系統的上電啟動時間。希望能對mount功能或JFFS…

右移函數(字符串,數組)

右移函數 以上是數組右移&#xff0c;將int換成char 把數組內容改成字符串就行。

關于jffs2文件系統如何掉電保護

JFFS2 是將節點信息保存在內存中 Flash上日志型文件系統的資料&#xff0c;了解到傳統的基于閃存轉換層&#xff08;FLT&#xff09;的文件系統存在的主要問題&#xff1a; 1. 效率低。因為每次都要把要修改的數據所在擦寫塊放入內存&#xff0c;產生了許多不必要的讀操作&…