대학 프로젝트에서 저는 기존 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
도움이 될 수 있도록 전체 (새) 부팅 로그를 게시하겠습니다. 여기서는 명령을 두 번
입력했습니다 . 왜 이 메시지를 받는지 모르겠습니다 . 다른 구성에는 이 기능이 없지만 지금은 제거할 수 없습니다.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
어떤 조언이라도 정말 감사하겠습니다!