問題還沒有解決,記錄一下吧。
一網友發來郵件求助,說是移植的u-boot啟動不了核心,是2013.7版本的,移植到s5pv210上的。我之前移植的2013.1版本的沒有問題的。
一開始覺得不是什麼事,從以下幾個方面查了:
a.傳引數 機器碼
b.記憶體初始化
c.檢查拷貝到記憶體中的kernel是否完整
但是發現問題不是那麼回事,上邊的都排查過也沒有找到問題所在,這個看來不是老生常談的問題了。值得記錄一下。
再深入的查詢原因:
1.發現用bootm啟動uimage能到這一步:
[ver130807-tiny210v3]# fatload mmc 1 20000000 uimage
reading uimage
4816856 bytes read in 259 ms (17.7 mib/s)
[ver130807-tiny210v3]# bootm 20000000
## booting kernel from legacy image at 20000000 ...
image name: linux-3.0.8-friendlyarm
image type: arm linux kernel image (uncompressed)
data size: 4816792 bytes = 4.6 mib
load address: 20008000
entry point: 20008000
verifying checksum ... ok
loading kernel image ... ok
starting kernel ...
2.用go直接把zimage當成裸機程式來啟動也啟動不了
[ver130807-tiny210v3]# fatload mmc 1 20000000 zimage
reading zimage
4816792 bytes read in 250 ms (18.4 mib/s)
[ver130807-tiny210v3]# go 20000000
核心是一句都沒有列印出來,一般情況下會出現:
uncompressing linux... done, booting the kernel.
用crc32檢視拷貝到記憶體中的資料是沒有問題的,這個問題有點玄乎了。
3.用go啟動image
[ver130807-tiny210v3]# fatload mmc 1 21000000 image
reading image
9560164 bytes read in 463 ms (19.7 mib/s)
[ver130807-tiny210v3]# go 21000000
還是不行的。
說明問題是出在了:zimage還沒有解壓,這個屬於前期的問題。
那麼要從以下幾個方面來看了:
1.可能出在kernel原始資料跟解壓後的資料有重疊
[ver130807-tiny210v3]# fatload mmc 1 22000000 uimage檢視一下bdinfo:reading uimage
4816856 bytes read in 256 ms (17.9 mib/s)
[ver130807-tiny210v3]# bootm 22000000
## booting kernel from legacy image at 22000000 ...
image name: linux-3.0.8-friendlyarm
image type: arm linux kernel image (uncompressed)
data size: 4816792 bytes = 4.6 mib
load address: 20008000
entry point: 20008000
verifying checksum ... ok
loading kernel image ... ok
starting kernel ...
a.不能啟動的u-boot
[ver130807-tiny210v3]# bdinfo
arch_number = 0x00000998
boot_params = 0x20000100
dram bank = 0x00000000
-> start = 0x20000000
-> size = 0x20000000
eth0name = dm9000
ethaddr = 00:40:5c:26:0a:5b
current eth = dm9000
ip_addr = 192.168.1.230
baudrate = 115200 bps
tlb addr = 0x3fff0000
relocaddr = 0x3ff7d000
reloc off = 0x1c17d000
irq_sp = 0x3fe94f40
sp start = 0x3fe94f30
fb base = 0x00000000
[ver130807-tiny210v3]#
b.能啟動的uboot
[ver130913-tiny210v2]# bdinfo
arch_number = 0x00000998
boot_params = 0x20000100
dram bank = 0x00000000
-> start = 0x20000000
-> size = 0x20000000
ethaddr = 00:40:5c:26:0a:5b
ip_addr = 192.168.1.230
baudrate = 115200 bps
tlb addr = 0x3fff0000
relocaddr = 0x3ff7c000
reloc off = 0x1c17c000
irq_sp = 0x3fe93f68
sp start = 0x3fe93f58
fb base = 0x00000000
[ver130913-tiny210v2]#
對比發現relocaddr reloc off irq_sq"sp start"是不同的。
[ver130807-tiny210v3]# fatload mmc 1 21000000 zimage
reading zimage
4816792 bytes read in 277 ms (16.6 mib/s)
[ver130807-tiny210v3]# go 21000000
starting kernel ...
找到這裡《移植u-boot-2011.03到s3c2440(utu2440)的方法與步驟###4.支援核心啟動》《starting kernel ... 核心啟動停止問題》《linux啟動流程分析(3)---核心解壓縮過程》《bootm後停在starting kernel》不過都沒有解決問題。
看上上邊幾篇文章,發現自己對kernel的啟動過程的理解不是完全對的,特別是《
linux啟動流程分析(3)---核心解壓縮過程
》中提到的在最前邊的是head.s,而後才是解壓程式。
再理一下思緒,引導裸機程式是可以的,啟動核心不可以,那麼要轉到最基本要求了:
在呼叫核心映象前,u-boot必須使cpu具備以下的條件:
1. cpu 暫存器的設定:
r0=0;
r1=machine id(即machine type number,定義在
linux/arch/arm/tools/mach-types);
r2=核心標記列表在 ram 中起始基位址;
2. cpu 模式:
必須禁止中斷(irqs和fiqs);
cpu 必須 svc 模式;
3. cache 和 mmu 的設定:
指令 cache 可以開啟也可以關閉;
資料 cache 必須關閉;
這幾條**都可以看到,但是檢測有沒有達到這個要求就有點難度了。最後可以借助j-link像《linux核心啟動時r2的值來歷》一樣檢視。還有一種除錯方案是在核心中新增彙編列印**,在啟動時head.s時就列印,檢視卡到**去了。
u boot引導核心及引數傳導
uboot實現了傳遞dtb的功能,define config of libfdt使能裝置樹 i.mx6ul實現方式 if defined config sys boot nand define config extra env settings config mfg env settings pan...
UBOOT引導Linux核心及向核心傳遞引數的方式
一直以來沒有想過有什麼好的辦法通過暫存器向核心傳遞引數,直到今天讀uboot的實現方式。在uboot中,引導核心最常用的方法是bootm命令,bootm命令可以引導 uboot格式 的核心。先花點時間了解一下什麼是 uboot格式 的核心吧 用uboot自帶的mkimage命令生成的核心稱為 ubo...
UBOOT引導Linux核心及向核心傳遞引數的方式
一直以來沒有想過有什麼好的辦法通過暫存器向核心傳遞引數,直到今天讀uboot的實現方式。在uboot中,引導核心最常用的方法是bootm命令,bootm命令可以引導 uboot格式 的核心。先花點時間了解一下什麼是 uboot格式 的核心吧 用uboot自帶的mkimage命令生成的核心稱為 ubo...