大学プロジェクトでは、私は既存のRISC-V(rv32i)プロセッサに特権レベルを実装する任務を務め、最終目標はLinuxを実行させることでした。私のプロジェクトは複雑さのために特権的なレベルで終わり、今ではパートタイムの仕事でこのプロジェクトを完了する任務を引き受けました(非常にきれい)。
プロセッサはmsu特権レベルを持つrv32imaで、TLBを持たないsv32 MMUです。
このプロセッサはSystemCの厳密なサブセットとして実装されています。 Linuxは、シミュレートされた環境を介してブートローダを呼び出して実行されます。
たくさん勉強しました。しかし、この時点で私は助けを求めなければならないと感じました。
修正する: このシステムにはハードドライブがないことを追加することを忘れてしまったので、initramfsをシステムを実行するための実際のルートファイルシステムとして使用することをお勧めします。
私は組み込みのinitramfsを使って最小のLinuxをクロスコンパイルしています。私のinitramfsは同じツールチェーンを使用してクロスコンパイルされました。
sh
私のinitramfsは、、、、およびecho
他のいくつかのコンテンツのみを含む単純な静的にリンクされたビジボックスです。 これは私のものです:ls
ash
stty
mount
/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
どんなアドバイスも本当にありがとうございます!