사용자 정의 CPU로 인해/init가 멈춤

사용자 정의 CPU로 인해/init가 멈춤

대학 프로젝트에서 저는 기존 RISC-V(rv32i) 프로세서에 권한 수준을 구현하는 임무를 맡았으며, 최종 목표는 Linux를 실행하게 만드는 것이었습니다. 내 프로젝트는 복잡성으로 인해 특권적인 수준으로 끝났고 이제는 파트타임 직업으로 이 프로젝트를 완료하는 임무를 맡게 되었습니다(매우 깔끔함).

이제 프로세서는 msu 권한 수준이 있는 rv32ima이고 TLB가 없는 sv32 MMU입니다.

이 프로세서는 SystemC의 엄격한 하위 집합으로 구현됩니다. Linux는 시뮬레이션된 환경을 통해 부트로더를 호출하여 실행됩니다.

나는 많은 것을 연구했습니다. 하지만 이 시점에서 나는 도움을 구해야 한다고 느꼈다.

고쳐 쓰다: 이 시스템에는 하드 드라이브가 없다는 점을 추가하는 것을 잊어버렸으므로 initramfs를 시스템을 실행하기 위한 실제 루트 파일 시스템으로 사용하는 것이 좋습니다.

저는 내장된 initramfs를 사용하여 최소 Linux를 크로스 컴파일하고 있습니다. 내 initramfs는 동일한 툴체인을 사용하여 크로스 컴파일되었습니다.

sh내 initramfs는 , echo, ls, ashstty기타 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셸에 내장된 명령을 사용할 수 있습니다. 문제가 없습니다.
구문이 잘못되면 오류 메시지가 표시되고, 명령을 잘못 사용하면 오류 메시지가 표시됩니다. 그러나 mountls의 명령을 사용하면 rm프로그램이 중단되고 콘솔이 계속 실행되는 것 같습니다.

ls디렉토리 목록을 인쇄하지만 결코 반환되지 않는 것 같습니다.

cd안으로 들어가면 /dev이미 initramfs.cpio에 있는 파일을 제외하고는 폴더가 채워져 보이지 않는 것을 볼 수 있습니다. 내 이론은 이것이 콘솔이 작동하지 않는 이유라는 것입니다console=ttySIF0

어쨌든 사용하고 싶지만 hvc내 시스템이 콘솔로만 인쇄할 수 있거나 ls한 번만 사용할 수 있다면 그다지 유용하지 않습니다.

이 문제를 해결하기 위해 매우 구체적인 커널 + 파일 시스템 구성이 필요한지, 아니면 올바른 부팅 매개변수만 필요한지 잘 모르겠습니다. 파일 시스템의 파일과 상호 작용하지 않는 것 같아서 추가를 시도했지만 rw아무런 효과가 없는 것 같습니다.

내 현재 커널 명령줄은 다음과 같습니다.rw earlycon=sbi

도움이 될 수 있도록 전체 (새) 부팅 로그를 게시하겠습니다. 여기서는 명령을 두 번
입력했습니다 . 왜 이 메시지를 받는지 모르겠습니다 . 다른 구성에는 이 기능이 없지만 지금은 제거할 수 없습니다.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

어떤 조언이라도 정말 감사하겠습니다!

관련 정보