我有一個設備與SPI閃存存儲我想使用該閃存設備上的UBIFS文件系統作爲我的rootfs。我面臨的問題是UBI模塊在SPI模塊初始化之前初始化。因此,當UBI加載時,它不能附加到我告訴它的UBI設備上(通過內核命令行),所以沒有rootfs。以下控制檯輸出說明了這一點。Linux如何確定模塊初始化調用的順序?
我已經深入到源碼中看到init/main.c
有一個do_initcalls()
函數,它只是簡單地調用一個函數指針列表。這些函數指針指向內核中內置模塊的全部功能。這些函數指針被放置在內核二進制文件的特殊部分,所以這個順序是在編譯時選擇的。但是,我還沒有弄清楚這個訂單是如何確定的。
[ 0.482500] UBI error: ubi_init: UBI error: cannot initialize UBI, error -19
[ 0.492500] atmel_spi atmel_spi.0: Using dma0chan0 (tx) and dma0chan1 (rx) for DMA transfers
[ 0.500000] atmel_spi atmel_spi.0: Atmel SPI Controller at 0xf0000000 (irq 13)
[ 0.507500] m25p80 spi0.1: mx25l25635e (32768 Kbytes)
[ 0.512500] Creating 7 MTD partitions on "jedec_flash":
[ 0.520000] 0x000000000000-0x000000020000 : "loader"
[ 0.527500] 0x000000020000-0x000000060000 : "u-boot"
[ 0.537500] 0x000000060000-0x000000080000 : "u-boot-env"
[ 0.547500] 0x000000080000-0x000000280000 : "kernel0"
[ 0.557500] 0x000000280000-0x000000480000 : "kernel1"
[ 0.567500] 0x000000480000-0x000001240000 : "fs"
[ 0.575000] 0x000001240000-0x000002000000 : "play"
[ 0.590000] AT91SAM9 Watchdog enabled (heartbeat=15 sec, nowayout=0)
[ 0.607500] TCP cubic registered
[ 0.615000] VFS: Cannot open root device "ubi0:root0" or unknown-block(0,0)
[ 0.622500] Please append a correct "root=" boot option; here are the available partitions:
[ 0.630000] 1f00 128 mtdblock0 (driver?)
[ 0.635000] 1f01 256 mtdblock1 (driver?)
[ 0.640000] 1f02 128 mtdblock2 (driver?)
[ 0.645000] 1f03 2048 mtdblock3 (driver?)
[ 0.650000] 1f04 2048 mtdblock4 (driver?)
[ 0.655000] 1f05 14080 mtdblock5 (driver?)
[ 0.660000] 1f06 14080 mtdblock6 (driver?)
[ 0.665000] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
我被判遷移(因此),因爲儘管這可能不是需要修改源代碼,它至少需要Kbuild欺騙。另外[so]是專家的地方。我懷疑你不應該依賴於特定的命令,並且UBI驅動程序不應該嘗試訪問任何設備,直到它被告知要安裝某些東西。 – Gilles 2012-04-28 22:37:00
[LINUX:靜態鏈接模塊加載順序]的可能重複(http://stackoverflow.com/questions/5669647/linux-order-of-statically-linked-module-loading)這表明您需要確保模塊以所需的初始化順序出現在makefile的(樹)中。 – 2012-04-29 19:44:30
使用'EPROBE_DEFER'可能會有一個替代解決方案;我會檢查一下。 – 2012-05-02 15:48:42