私はSPIフラッシュ記憶装置を持っています私はrootfsとしてそのフラッシュ装置にUBIFSファイルシステムを使用したいと思います。私が直面している問題は、SPIモジュールが初期化される前にUBIモジュールが初期化されることです。このため、UBIがロードされるとき、UBIデバイスに(カーネルコマンドラインを介して)それを伝えることができないので、rootfsはありません。以下のコンソール出力はこれを示しています。Linuxはモジュールのinit呼び出しの順序をどのように決定しますか?
init/main.c
には、単に関数ポインタのリストを呼び出すdo_initcalls()
関数があることがわかりました。これらの関数ポインタは、カーネルに組み込まれているモジュールのすべてのmodule_init()
関数を指しています。これらの関数ポインタは、カーネルバイナリの特別なセクションに置かれるため、この順序はコンパイル時に選択されます。しかし、私はまだその秩序がどのように決定されたかを考え出していない。
[ 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
[LINUX:静的にリンクされたモジュールの読み込みの順序](http://stackoverflow.com/questions/5669647/linux-order-of-statically-linked-module-loading)は、あなたがモジュールを確実にする必要があることを示唆しています必要な初期化順序でmakefileの(ツリーの)ツリーに現れます。 –
'EPROBE_DEFER'を使って問題を解決する別の方法があるかもしれません。私はそれを調べるでしょう。 –