u-boot,linux,文件系统移植笔记1
今天把u-boot,linux,yaffs2文件系統(tǒng)的移植全部搞定了,在我的mini2440板子上跑起來(lái)了,呵呵,興奮啊!現(xiàn)在回頭看看自己花了這么長(zhǎng)時(shí)間所作的工作,結(jié)論就是,只要堅(jiān)持下去就一定會(huì)成功的。
下面就把我移植過(guò)程中的步驟記錄下來(lái),留著以后看看,也許還會(huì)用到的。
先是u-boot部分:
我用的是
?????? 開(kāi)發(fā)環(huán)境:fedora 14
???????????????????????????? 開(kāi)發(fā)板:mini2440? 256M NandFlash?? 64M SDRAM
???????????????????????????? 交叉編譯器:arm-linux-gcc 4.4.3
???????????????????????????? BusyBox版本:busybox-1.7.0
??????????????????????????? ?yaffs制作工具:mkyaffsimage
??????????????????????????? yaffs2制作工具:mkyaffs2image(適合64M)、mkyaffs2image-128(適合128M以上,我的256M的用這個(gè))
對(duì)于u-boot的修改有很多,參考了韋東山大神寫(xiě)的那本《嵌入式Linux應(yīng)用開(kāi)發(fā)完全手冊(cè)》一步步做的,建議這部分大家也都自己動(dòng)手做做,會(huì)有不少收獲,對(duì)于那種文件的樹(shù)形結(jié)構(gòu)分布,程序設(shè)計(jì)的能力都會(huì)有很大的提高。
當(dāng)u-boot移植能夠在板子跑了,在看下面內(nèi)容:
我一直困惑在MTD那部分,對(duì)于NAND flash分區(qū)那一直不是很清楚,先看我現(xiàn)在的mtd分區(qū):
Creating 3 MTD partitions on "NAND 256MiB 3,3V 8-bit":
0x000000000000-0x000000500000 : "kernel"
0x000000500000-0x000000d00000 : "jffs2"
0x000000d00000-0x000010000000 : "yaffs"
我創(chuàng)建了3的分區(qū),分別作為 uImage,jffs2,yaffs2文件存放的地址,在u-boot運(yùn)行后,使用tftp下載kernel及文件系統(tǒng)到內(nèi)存,接著寫(xiě)入flash中,具體如下:
tftp 0x31000000 uImage
nand erase 0 0x500000
nand write.jffs2 0x31000000 0 0x300000
要注意的是,這里寫(xiě)到flash中的地址對(duì)應(yīng)著我們的MTD分區(qū)表地址,我的0地址處存放的是kernel,所以下載到0地址處。
static struct mtd_partition friendly_arm_default_nand_part[] = { ?
[0] = { ? .name = "supervivi", ? .size = 0x00040000, ? .offset = 0, ?}, ?
[1] = { ? .name = "param", ? .offset = 0x00040000, ? .size = 0x00020000, ?},
?[2] = { ? .name = "Kernel", ? .offset = 0x00060000, ? .size = 0x00500000, ?}, ?
[3] = { ? .name = "root", ? .offset = 0x00560000, ? .size = 1024 * 1024 * 1024,??},
?[4] = { ? .name = "nand", ? .offset = 0x00000000, ? .size = 1024 * 1024 * 1024,??}
};
這是之前的mtd分區(qū),修改后如下:(在 arch/arm/mach-s3c2440/mach-mini2440.c中)
static struct mtd_partition friendly_arm_default_nand_part[] = { ?
[0] = { ? .name = "kernel", ? .size = 0x00050000, ? .offset = 0, ?}, ?
[1] = { ? .name = "jaffs", ? .offset = MTDPART_OFS_APPEND, ? .size = 0x00080000, ?},
?[2] = { ? .name = "yaffs", ? .offset = MTDPART_OFS_APPEND, ? .size = MTDPART_SIZ_FULL, ?
}
};
當(dāng)然在寫(xiě)入flash之前最后先下載到內(nèi)存里跑一下,看能否運(yùn)行,不然來(lái)回擦除flash太費(fèi)事,而且也有損于它。
使用:
tftp 0x32000000 uImage bootm 0x32000000
看看能不能打印出這句:
Creating 3 MTD partitions on "NAND 256MiB 3,3V 8-bit":
0x000000000000-0x000000500000 : "kernel"
0x000000500000-0x000000d00000 : "jffs2"
0x000000d00000-0x000010000000 : "yaffs"
如果可以那說(shuō)明這一步實(shí)現(xiàn)了。由于開(kāi)發(fā)板上還沒(méi)有寫(xiě)入文件系統(tǒng),也沒(méi)有設(shè)置nfs掛接網(wǎng)絡(luò)文件系統(tǒng),所以內(nèi)核啟動(dòng)后還會(huì)出現(xiàn)panic信息。不急, 我們下一步來(lái)解決它。 在這之前,先解釋一下幾個(gè)概念:
1.uImage
使用 make uImage編譯 我們編譯linux結(jié)束后會(huì)在arch/arm/boot/目錄下生成zImage,uImage內(nèi)核文件,這有什么區(qū)別呢? 之前一直沒(méi)有去研究他們,現(xiàn)在明白了,簡(jiǎn)單的說(shuō)一下區(qū)別: ?uImage是U-boot專用的映像文件,它是在zImage之前加上一個(gè)長(zhǎng)度為0x40的tag。vmlinuz是bzImage/zImage文件的拷貝或指向bzImage/zImage的 鏈接。initrd是“initialramdisk”的簡(jiǎn)寫(xiě)。一般被用來(lái)臨時(shí)的引導(dǎo)硬件到實(shí)際內(nèi)核vmlinuz能夠接管并繼續(xù)引導(dǎo)的狀態(tài)。 vmlinux是內(nèi)核文件,zImage是一般情況下默認(rèn)的壓縮內(nèi)核映像文件,壓縮vmlinux,加上一段解壓?jiǎn)?dòng)代碼得到,只能從0X0地址運(yùn)行。 uImage是u-boot使用bootm命令引導(dǎo)的Linux壓縮內(nèi)核映像文件格式,使用工具mkimage對(duì)普通的壓縮內(nèi)核映像文件(zImage)加工而得。 可以由bootm命令從任意地址解壓?jiǎn)?dòng)內(nèi)核。由于bootloader一般要占用0X0地址,所以,uImage相比zImage的好處就是可以和bootloader共存。 當(dāng)我們使用ls -l 查看這兩個(gè)文件大小時(shí)會(huì)發(fā)現(xiàn),uImage比zImage大了64字節(jié),也就是多了0x40長(zhǎng)度的tag.
2.bootm
下載到內(nèi)存后,使用bootm引導(dǎo)uImage,那為什么不用go命令呢? 原因是,我們上面所說(shuō)的多出64字節(jié)的uImage,bootm你可以把它理解為專為它引導(dǎo)的命令。go命令是用來(lái)跳轉(zhuǎn)的二進(jìn)制可執(zhí)行文件的命令。這些,我們 在mini2440裸機(jī)開(kāi)發(fā)那想必大多數(shù)人都接觸過(guò),不再細(xì)說(shuō)了!
3.MTDPART_OFS_APPEND
是代表著接著上一個(gè)分區(qū)地址向下分區(qū),offset偏移。
4.MTDPART_SIZ_FULL flash
分區(qū)剩下的所有大小空間都分配出去。
?接著上面說(shuō)的,寫(xiě)入flash后,保存引導(dǎo)參數(shù)。我這里是在u-boot中代碼固定的。
#define CONFIG_BOOTDELAY?5
#define CONFIG_BOOTARGS??? ?"noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0"
#define CONFIG_ETHADDR???? 08:00:3e:26:0a:5b
#define CONFIG_NETMASK????? 255.255.255.0
#define CONFIG_IPADDR??192.168.1.230
#define CONFIG_SERVERIP??192.168.1.10 /*#define CONFIG_BOOTFILE?"elinos-lart" */
#define CONFIG_BOOTCOMMAND?"nboot 0x31000000 0 0; bootm 0x31000000"
這樣開(kāi)機(jī)后,不打斷便可進(jìn)入kernel。
下一節(jié)介紹文件系統(tǒng)部分!
轉(zhuǎn)載于:https://www.cnblogs.com/my-life/p/3486073.html
總結(jié)
以上是生活随笔為你收集整理的u-boot,linux,文件系统移植笔记1的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Visual C++ 基础数据类型的转换
- 下一篇: PHP在线支付