使用自定义 CPU 卡在 /init 上

使用自定义 CPU 卡在 /init 上

在一个大学项目中,我的任务是在现有 RISC-V (rv32i) 处理器上实现特权级别,最终目标是让它运行 Linux。由于复杂性,我的项目以特权级别结束,现在我的任务是将其作为我的兼职工作完成(非常整洁)。

该处理器现在是具有 msu 特权级别的 rv32ima 和不带 TLB 的 sv32 MMU。

该处理器是在 SystemC 的严格子集中实现的。 Linux是通过模拟环境调用bootloader来运行的。

我已经研究了很多。然而,此时我觉得我被迫寻求帮助。

更新: 忘记补充一点,这个系统上没有硬盘驱动器,所以我们的想法是使用 initramfs 作为真正的根文件系统来运行系统。

我使用内置的 initramfs 交叉编译我的最小 Linux。我的 initramfs 是使用相同的工具链交叉编译的。

我的 initramfs 是一个简单的静态链接的 busybox,仅包含 shecholsashsttymount其他一些内容。
这是我的/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 文档中的 shell 脚本压缩的 cpio.gz。

内核命令行:console=ttySIF0 mem=512M earlycon=sbi

我从早期控制台获得了大量输出,最后它切换到 ttySIF0 控制台,这似乎也有效,内核内置了对它的支持。

当我的靴子到达这部分时: Run /init as init process
事情开始出错,或者根本不出错。

我尝试将其作为我的初始化:

#!/bin/sh 
echo "some text"

但什么也没有打印出来,一段时间后,内核因试图杀死 init 而发生恐慌。我尝试执行 ac 程序,该程序只是在 echo 之后添加一个不太可能的数字,然后在寄存器中查找该数字,并且该数字确实出现在之后,Run /init as init process所以我知道它可以做一些事情。

运行任何 busybox 二进制文件都会导致其卡在 init 上。尝试从 init 挂载 devtmpfs 也会导致它被卡住。

我可以看到我的系统正在无限期地运行用户级系统调用,但我不知道它想做什么。

更新: 我能够使用 操作控制台hvc并启动到/bin/sh.从这里我可以使用类似echo 'something'或的命令printf,只要它们内置于 shell 中,就没有问题。
如果我的语法错误,我会收到错误消息,如果我误用命令,它会给我错误消息。但如果我使用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

我非常感谢任何建议!

相关内容