カスタムCPUが原因で/ initがハングする

カスタムCPUが原因で/ initがハングする

大学プロジェクトでは、私は既存のRISC-V(rv32i)プロセッサに特権レベルを実装する任務を務め、最終目標はLinuxを実行させることでした。私のプロジェクトは複雑さのために特権的なレベルで終わり、今ではパートタイムの仕事でこのプロジェクトを完了する任務を引き受けました(非常にきれい)。

プロセッサはmsu特権レベルを持つrv32imaで、TLBを持たないsv32 MMUです。

このプロセッサはSystemCの厳密なサブセットとして実装されています。 Linuxは、シミュレートされた環境を介してブートローダを呼び出して実行されます。

たくさん勉強しました。しかし、この時点で私は助けを求めなければならないと感じました。

修正する: このシステムにはハードドライブがないことを追加することを忘れてしまったので、initramfsをシステムを実行するための実際のルートファイルシステムとして使用することをお勧めします。

私は組み込みのinitramfsを使って最小のLinuxをクロスコンパイルしています。私のinitramfsは同じツールチェーンを使用してクロスコンパイルされました。

sh私のinitramfsは、、、、およびecho他のいくつかのコンテンツのみを含む単純な静的にリンクされたビジボックスです。 これは私のものです:lsashsttymount
/dev

 crw-rw-rw- 1 root    root    5, 1 Jan 11 14:51 console
lrwxrwxrwx 1 ovsthus ovsthus   15 Jan 11 15:10 fd -> ../proc/self/fd
crw-rw-rw- 1 root    root    1, 3 Jan 11 14:52 null
drwxr-xr-x 2 ovsthus ovsthus 4096 Jan 11 15:04 pts
drwxr-xr-x 2 ovsthus ovsthus 4096 Jan 11 15:05 shm
lrwxrwxrwx 1 ovsthus ovsthus   17 Jan 11 15:09 stderr -> ../proc/self/fd/2
lrwxrwxrwx 1 ovsthus ovsthus   17 Jan 11 15:09 stdin -> ../proc/self/fd/0
lrwxrwxrwx 1 ovsthus ovsthus   17 Jan 11 15:09 stdout -> ../proc/self/fd/1

私のホストでは、これらのシンボリックリンクは黒の背景に赤です。

ここで何が必要かはまだわかりませんが、いくつかのコンソール出力から始めたいと思います。

Initramfsは、Linux initramfsドキュメントのシェルスクリプトを使用して圧縮されたcpio.gzです。

カーネルコマンドライン:console=ttySIF0 mem=512M earlycon=sbi

初期コンソールから多くの出力が得られ、ついにttySIF0コンソールに切り替えました。このコンソールも機能しているようです。カーネルにはこれに対するサポートが組み込まれています。

私のブーツがこの部分に到達すると、 Run /init as init process
状況が間違っていないか、まったく間違っていません。

私はこれを初期化しようとしました。

#!/bin/sh 
echo "some text"

しかし、何も印刷されず、しばらくしてカーネルがinitを終了しようとするとパニック状態になります。エコーの後ろにある不法な数字を追加してから、レジスタでその数字を探すACプログラムを実行してみたところ、そのあとに数字が表示されるのでRun /init as init process何かができることがわかりました。

busybox バイナリを実行すると、初期化が中断されます。 initでdevtmpfsをマウントしようとすると中断される可能性があります。

私のシステムがユーザーレベルのシステムコールを無限に実行していることがわかりますが、これが何をしたいのかわかりません。

修正する: タスクコンソールを使用してhvc起動できます/bin/sh。ここから、echo 'something'またはprintfシェルに組み込まれたコマンドを使用できます。問題ありません。
構文が正しくない場合はエラーメッセージが表示され、コマンドを誤って使用するとエラーメッセージが表示されます。ただし、mountなどlsのコマンドを使用すると、rmプログラムが中断され、コンソールが実行され続けるようです。

lsディレクトリリストを印刷しても決して返されないようです。

cd中に入ると、/devすでにinitramfs.cpioにあるファイルを除いて、フォルダがいっぱいになって見えないことがわかります。私の理論は、これがコンソールが機能しない理由であるということですconsole=ttySIF0

とにかく使用したいのですが、hvc私のシステムがコンソールにしか印刷できない場合、またはls一度だけ使用できる場合はあまり役に立ちません。

この問題を解決するには、非常に具体的なカーネル+ファイルシステムの設定が必要か、正しいブートパラメータのみが必要かわかりません。ファイルシステムのファイルと対話しないようで、追加しようとしましたが、rw何の効果もないようです。

私の現在のカーネルコマンドラインは次のとおりです。rw earlycon=sbi

役立つように、完全な(新しい)ブートログを公開します。ここではコマンドを2回
入力しました。なぜこのメッセージを受け取るのかわかりません。他の構成にはこの機能はありませんが、今は削除できません。ls
sh: Poll: function not implemented

bbl loader
              vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
                  vvvvvvvvvvvvvvvvvvvvvvvvvvvv
rrrrrrrrrrrrr       vvvvvvvvvvvvvvvvvvvvvvvvvv
rrrrrrrrrrrrrrrr      vvvvvvvvvvvvvvvvvvvvvvvv
rrrrrrrrrrrrrrrrrr    vvvvvvvvvvvvvvvvvvvvvvvv
rrrrrrrrrrrrrrrrrr    vvvvvvvvvvvvvvvvvvvvvvvv
rrrrrrrrrrrrrrrrrr    vvvvvvvvvvvvvvvvvvvvvvvv
rrrrrrrrrrrrrrrr      vvvvvvvvvvvvvvvvvvvvvv  
rrrrrrrrrrrrr       vvvvvvvvvvvvvvvvvvvvvv    
rr                vvvvvvvvvvvvvvvvvvvvvv      
rr            vvvvvvvvvvvvvvvvvvvvvvvv      rr
rrrr      vvvvvvvvvvvvvvvvvvvvvvvvvv      rrrr
rrrrrr      vvvvvvvvvvvvvvvvvvvvvv      rrrrrr
rrrrrrrr      vvvvvvvvvvvvvvvvvv      rrrrrrrr
rrrrrrrrrr      vvvvvvvvvvvvvv      rrrrrrrrrr
rrrrrrrrrrrr      vvvvvvvvvv      rrrrrrrrrrrr
rrrrrrrrrrrrrr      vvvvvv      rrrrrrrrrrrrrr
rrrrrrrrrrrrrrrr      vv      rrrrrrrrrrrrrrrr
rrrrrrrrrrrrrrrrrr          rrrrrrrrrrrrrrrrrr
rrrrrrrrrrrrrrrrrrrr      rrrrrrrrrrrrrrrrrrrr
rrrrrrrrrrrrrrrrrrrrrr  rrrrrrrrrrrrrrrrrrrrrr

       INSTRUCTION SETS WANT TO BE FREE
[    0.000000] OF: fdt: Ignoring memory range 0x80000000 - 0x80400000
[    0.000000] Linux version 5.4.0-rc5-00034-g23fdb198ae81-dirty (ovsthus@ovsthus-8943G) (gcc version 9.2.0 (GCC)) #301 Sun Jan 19 09:54:12 CET 2020
[    0.000000] earlycon: sbi0 at I/O port 0x0 (options '')
[    0.000000] printk: bootconsole [sbi0] enabled
[    0.000000] initrd not found or empty - disabling initrd
[    0.000000] Zone ranges:
[    0.000000]   Normal   [mem 0x0000000080400000-0x000000009fffffff]
[    0.000000] Movable zone start for each node
[    0.000000] Early memory node ranges
[    0.000000]   node   0: [mem 0x0000000080400000-0x000000009fffffff]
[    0.000000] Initmem setup node 0 [mem 0x0000000080400000-0x000000009fffffff]
[    0.000000] elf_hwcap is 0x1101
[    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 128778
[    0.000000] Kernel command line: rw earlycon=sbi
[    0.000000] Dentry cache hash table entries: 65536 (order: 6, 262144 bytes, linear)
[    0.000000] Inode-cache hash table entries: 32768 (order: 5, 131072 bytes, linear)
[    0.000000] Sorting __ex_table...
[    0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
[    0.000000] Memory: 511396K/520192K available (2014K kernel code, 88K rwdata, 330K rodata, 656K init, 189K bss, 8796K reserved, 0K cma-reserved)
[    0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[    0.000000] NR_IRQS: 0, nr_irqs: 0, preallocated irqs: 0
[    0.000000] plic: mapped 53 interrupts with 0 handlers for 1 contexts.
[    0.000000] riscv_timer_init_dt: Registering clocksource cpuid [0] hartid [0]
[    0.000000] clocksource: riscv_clocksource: mask: 0xffffffffffffffff max_cycles: 0x1cd42e4dffb, max_idle_ns: 881590591483 ns
[    0.000034] sched_clock: 64 bits at 1000MHz, resolution 1ns, wraps every 4398046511103ns
[    0.000300] printk: console [hvc0] enabled
[    0.000300] printk: console [hvc0] enabled
[    0.000493] printk: bootconsole [sbi0] disabled
[    0.000493] printk: bootconsole [sbi0] disabled
[    0.000753] Calibrating delay loop (skipped), value calculated using timer frequency.. 2000.00 BogoMIPS (lpj=4000000)
[    0.001039] pid_max: default: 32768 minimum: 301
[    0.001689] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes, linear)
[    0.001895] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes, linear)
[    0.007399] devtmpfs: initialized
[    0.010812] random: get_random_u32 called from bucket_table_alloc.isra.0+0x70/0x1d8 with crng_init=0
[    0.011403] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns
[    0.011637] futex hash table entries: 256 (order: -1, 3072 bytes, linear)
[    0.019014] clocksource: Switched to clocksource riscv_clocksource
[    0.295837] workingset: timestamp_bits=30 max_order=17 bucket_order=0
[    0.339655] Freeing unused kernel memory: 656K
[    0.339774] This architecture does not have kernel memory protection.
[    0.339922] Run /init as init process

BusyBox v1.31.1 (2020-01-18 13:05:03 CET) built-in shell (ash)

/ # sh: poll: Function not implemented

lsh: poll: Function not implemented 
ssh: poll: Function not implemented

bin      etc      lib      proc     run      sys      usr
dev      init     linuxrc  mnt      root     sbin     tmp

ls

どんなアドバイスも本当にありがとうございます!

関連情報