記錄u boot不能引導核心的解決過程

2021-06-20 04:02:18 字數 4514 閱讀 5650

問題還沒有解決,記錄一下吧。

一網友發來郵件求助,說是移植的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

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 ...

檢視一下bdinfo:

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...