1:uboot引導linux核心及向核心傳遞引數的方式
一直以來沒有想過有什麼好的辦法通過暫存器向核心傳遞引數,直到今天讀uboot的實現方式。
在uboot中,引導核心最常用的方法是bootm命令,bootm命令可以引導「uboot格式」的核心。先花點時間了解一下什麼是「uboot格式」的核心吧:用uboot自帶的mkimage命令生成的核心稱為"uboot"格式的核心。以下面這條命令為例:
mkimage -n "kernel 2.4.18" -a arm -o linux -t kernel -c none -a 30007fc0 -e 30008000 -d 4020.bin vmlinux-2.4.18.img
其中與核心引導最密切的是-e 30008000,也就是核心的入口位址。其它引數可以參考幫助資訊。其它uboot格式的核心與原來相比,只是進行(可選)了壓縮,並在前面加了乙個0x40大小的頭。這個頭里放了核心的位置(0x30007fc0)和入口位址(0x30008000)和其它資訊。
bootm命令執行時,先對頭部資訊等進行校驗,然後把頭資訊放到乙個結構裡面。最後根據核心型別呼叫相應的啟動函式。對於linux而言就是do_bootm_linux,在啟動函式裡面,有這麼乙個操作:thekernel = (void (*)(int, int, uint))ntohl(hdr->ih_ep);,這是最關鍵的乙個操作,將核心的入口位址0x30008000賦給了thekernel,在啟動函式的最後,使用thekernel (0, bd->bi_arch_number, bd->bi_boot_params);啟動核心。
根據傳參規範,三個變數分別用r0,r1,r2傳給核心,這樣就巧妙地利用了函式指標進行了引數傳遞,實在是精妙!
上面講完了核心的引導及傳參,需要引起注意的就是在使用mkimage命令生成核心時,-e後面的位址要比-a後面的位址偏移0x40,原因很簡單,就不在細說了。
2 mkimage的用法
mkimage的用法
bootm命令是用來引導經過u-boot的工具mkimage打包後的kernel image的,什麼叫做經過u-boot的工具mkimage打包後的kernel image,這個就要看mkimage的**,看看它做了些什麼,雖然我很希望大家不要偷懶,認真地去看看,但是我知道還是有很多人懶得去做這件,那麼我就j將分析mkimage**後得到的總結告訴大家,mkimage做了些什麼,怎麼用這個工具。
mkimage的用法
uboot源**的tools/目錄下有mkimage工具,這個工具可以用來製作不壓縮或者壓縮的多種可啟動映象檔案。
mkimage在製作映象檔案的時候,是在原來的可執行映象檔案的前面加上乙個0x40位元組的頭,記錄引數所指定的資訊,這樣uboot才能識別這個映象是針對哪個cpu體系結構的,哪個os的,哪種型別,載入記憶體中的哪個位置, 入口點在記憶體的那個位置以及映象名是什麼
root@glym:/tftpboot# ./mkimage
usage: ./mkimage -l image
-l ==> list image header information
./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的壓縮方式
-e 指定映象執行的入口點位址,這個位址就是-a引數指定的值加上0x40(因為前面?......
mkimage是怎樣把核心製作成uboot格式的
1 uboot引導linux核心及向核心傳遞引數的方式 一直以來沒有想過有什麼好的辦法通過暫存器向核心傳遞引數,直到今天讀uboot的實現方式。在uboot中,引導核心最常用的方法是bootm命令,bootm命令可以引導 uboot格式 的核心。先花點時間了解一下什麼是 uboot格式 的核心吧 用...
製作手札 RPG是怎樣做成的 一
自從我們的第乙個正式電腦遊戲 衝擊 完成之後,已經有很長一段時間沒有碰這方面的東西了,不過在我心中好象一直在期盼著什麼東西 目睹著當今五彩繽紛的遊戲世界和國產遊戲的尷尬境地,我忽然有一種莫名的衝動,做遊戲的衝動。也許是以前有過這方面的經驗或者說是教訓吧!我知道應該先讓自己冷靜下來,仔細的想一想我到底...
製作手札 RPG是怎樣做成的 三
三月二十九日 至四月一日 場景顯示及行走系統 如果說 訊息處理 是整個程式的核心!那麼 場景顯示及行走系統 就是整個遊戲的核心。因為作為rpg遊戲,其所有事件的發生幾乎都是和場景有關,例如 不同的地方會碰到不同的敵人 與不同的人對話得知不同的事情 在特定的地點才能找到寶物等等,所有的這一切都說明 場...