vak: (Default)
[personal profile] vak
Вот как надо симуляторы писать. Весь процессор RISC-V уложился в 400 строчек кода на Си. Смотрите функцию MiniRV32IMAStep() в файле mini-rv32ima.h. Вся периферия заняла ещё 250 строчек кода. На всей этой халабуде запускается Линукс. В минимальной конфигурации и без виртуальной памяти, но тем не менее реальное ядро Линукса версии 5.18. Удивительная вещь.

Проект на Гитхабе: https://github.com/cnlohr/mini-rv32ima

Стартуем Линукс. Работает на линуксе или на маке. Предварительно убедитесь, что у вас установлен Си-компилятор.
$ git clone https://github.com/cnlohr/mini-rv32ima.git
[...]
$ cd mini-rv32ima
$ make testdlimage
[...]
./mini-rv32ima -f DownloadedImage
[ 0.000000] Linux version 5.18.0 (cnlohr@cnlohr-1520) (riscv32-buildroot-linux-uclibc-gcc.br_real (Buildroot -g91b88fa1) 10.3.0, GNU ld (GNU Binutils) 2.37) #7 Sun Nov 27 07:07:08 EST 2022
[ 0.000000] Machine model: riscv-minimal-nommu,qemu
[ 0.000000] earlycon: uart8250 at MMIO 0x10000000 (options '1000000')
[ 0.000000] printk: bootconsole [uart8250] enabled
[ 0.000000] Zone ranges:
[ 0.000000] Normal [mem 0x0000000080000000-0x0000000083ffefff]
[ 0.000000] Movable zone start for each node
[ 0.000000] Early memory node ranges
[ 0.000000] node 0: [mem 0x0000000080000000-0x0000000083ffefff]
[ 0.000000] Initmem setup node 0 [mem 0x0000000080000000-0x0000000083ffefff]
[ 0.000000] riscv: base ISA extensions aim
[ 0.000000] riscv: ELF capabilities aim
[ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 16255
[ 0.000000] Kernel command line: earlycon=uart8250,mmio,0x10000000,1000000 console=ttyS0
[ 0.000000] Dentry cache hash table entries: 8192 (order: 3, 32768 bytes, linear)
[ 0.000000] Inode-cache hash table entries: 4096 (order: 2, 16384 bytes, linear)
[ 0.000000] Sorting __ex_table...
[ 0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
[ 0.000000] Memory: 61936K/65532K available (1346K kernel code, 271K rwdata, 149K rodata, 1105K init, 108K bss, 3596K reserved, 0K cma-reserved)
[ 0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
[ 0.000000] riscv-intc: 32 local interrupts mapped
[ 0.000000] clint: clint@11000000: timer running at 1000000 Hz
[ 0.000000] clocksource: clint_clocksource: mask: 0xffffffffffffffff max_cycles: 0x1d854df40, max_idle_ns: 3526361616960 ns
[ 0.000000] sched_clock: 64 bits at 1000kHz, resolution 1000ns, wraps every 2199023255500ns
[ 0.000561] Console: colour dummy device 80x25
[ 0.000788] Calibrating delay loop (skipped), value calculated using timer frequency.. 2.00 BogoMIPS (lpj=4000)
[ 0.001130] pid_max: default: 4096 minimum: 301
[ 0.001424] Mount-cache hash table entries: 1024 (order: 0, 4096 bytes, linear)
[ 0.001701] Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes, linear)
[ 0.004787] devtmpfs: initialized
[ 0.009819] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns
[ 0.010165] futex hash table entries: 16 (order: -5, 192 bytes, linear)
[ 0.024223] clocksource: Switched to clocksource clint_clocksource
[ 0.068572] workingset: timestamp_bits=30 max_order=14 bucket_order=0
[ 0.110245] Serial: 8250/16550 driver, 1 ports, IRQ sharing disabled
[ 0.112745] printk: console [ttyS0] disabled
[ 0.112968] 10000000.uart: ttyS0 at MMIO 0x10000000 (irq = 0, base_baud = 1048576) is a XR16850
[ 0.113313] printk: console [ttyS0] enabled
[ 0.113313] printk: console [ttyS0] enabled
[ 0.113595] printk: bootconsole [uart8250] disabled
[ 0.113595] printk: bootconsole [uart8250] disabled
[ 0.158521] Freeing unused kernel image (initmem) memory: 1104K
[ 0.158744] This architecture does not have kernel memory protection.
[ 0.159003] Run /init as init process

Welcome to Buildroot
buildroot login: root
Jan 1 00:00:02 login[27]: root login on 'console'
~ # uname -a
Linux buildroot 5.18.0 #7 Sun Nov 27 07:07:08 EST 2022 riscv32 GNU/Linux
~ # free
total used free shared buff/cache available
Mem: 63040 2784 58460 0 1796 56960
~ # ps
PID USER TIME COMMAND
1 root 0:00 init
2 root 0:00 [kthreadd]
3 root 0:00 [kworker/0:0-eve]
4 root 0:00 [kworker/0:0H]
5 root 0:00 [kworker/u2:0-ev]
6 root 0:00 [mm_percpu_wq]
7 root 0:00 [ksoftirqd/0]
8 root 0:00 [kdevtmpfs]
9 root 0:00 [writeback]
10 root 0:00 [kworker/u2:1-ev]
11 root 0:00 [kswapd0]
12 root 0:00 [kworker/0:1-eve]
13 root 0:00 [kworker/u2:2-ev]
27 root 0:00 -sh
30 root 0:00 ps
~ # ls -l /
total 4
drwxr-xr-x 2 root root 0 Nov 27 2022 bin
drwxr-xr-x 4 root root 0 Jan 1 00:00 dev
drwxr-xr-x 5 root root 0 Nov 27 2022 etc
-rwxr-xr-x 1 root root 462 Nov 27 2022 init
drwxr-xr-x 2 root root 0 Nov 27 2022 lib
lrwxrwxrwx 1 root root 3 Nov 27 2022 lib32 -> lib
lrwxrwxrwx 1 root root 11 Nov 27 2022 linuxrc -> bin/busybox
drwxr-xr-x 2 root root 0 Nov 27 2022 media
drwxr-xr-x 2 root root 0 Nov 27 2022 mnt
drwxr-xr-x 2 root root 0 Nov 27 2022 opt
dr-xr-xr-x 49 root root 0 Jan 1 00:00 proc
drwx------ 2 root root 0 Jan 1 00:00 root
drwxr-xr-x 3 root root 0 Jan 1 00:00 run
drwxr-xr-x 2 root root 0 Nov 27 2022 sbin
dr-xr-xr-x 10 root root 0 Jan 1 00:00 sys
drwxrwxrwt 2 root root 0 Jan 1 00:00 tmp
drwxr-xr-x 6 root root 0 Nov 27 2022 usr
drwxr-xr-x 4 root root 0 Nov 27 2022 var
~ # _

Date: 2023-03-22 06:56 (UTC)
x86128: (Default)
From: [personal profile] x86128
Красота какая!

Date: 2023-03-22 07:09 (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi

Красиво. Но так нудно. Старинный стиль. default: trap = (2+1);

Date: 2023-03-22 17:31 (UTC)
From: [personal profile] iyak2
Забэкапил!

Date: 2023-09-12 05:27 (UTC)
fenikso: (Default)
From: [personal profile] fenikso
Супер! :)