diff --git "a/docs/riscv/\345\237\272\344\272\216EDK2 UEFI\345\233\272\344\273\266\345\222\214GRUB\350\277\233\350\241\214\345\220\257\345\212\250\347\232\204\350\277\233\345\272\246.md" "b/docs/riscv/\345\237\272\344\272\216EDK2 UEFI\345\233\272\344\273\266\345\222\214GRUB\350\277\233\350\241\214\345\220\257\345\212\250\347\232\204\350\277\233\345\272\246.md" new file mode 100644 index 0000000000000000000000000000000000000000..d524329c7d3502ab1b5c7a6f6b2bd8c727508901 --- /dev/null +++ "b/docs/riscv/\345\237\272\344\272\216EDK2 UEFI\345\233\272\344\273\266\345\222\214GRUB\350\277\233\350\241\214\345\220\257\345\212\250\347\232\204\350\277\233\345\272\246.md" @@ -0,0 +1,113 @@ +## 2025/6/30 当前进度: +启动环境:QEMU Risc-V 10.0.0 + +启动链:EDK2(Risc-V配置下有内嵌OpenSBI)-(OK)-> GRUB -(FAIL)-> Linux Kernel + +目前已完成从EDK2到GRUB的启动,但从GRUB到OC内核的启动失败。在更换到官方版本Linux 6.14.6(并自己编译的)时,仍然有问题。 + +编译命令: +`make ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- KCFLAGS="-march=rv64gc_zicsr_zihintpause" -j $(nproc)` + +配置文件已上传:[.config](./.config) + +[下载内核](https://git.opencloudos.tech/sources-stream/kernel/kernel-6.6.68-20.tar.gz/sha512/3822d9e70f5db2ce56affe14595ec38dc414aed2bc82424ddf6db4734f04bbb0ff85eeaa9b038949d3ea64688220cee3b4c266ddfde1875647ee6c2b507613f8/kernel-6.6.68-20.tar.gz) + +### 2025/7/1 更新: +using official opencloud-os: +e36ba2196c18aeddd030f1c0301f5ce5568fde16ca7133022252cea380aacf8b + +using original kernel: +6f902f5172d400275ba534b597c3710dabf7309802b48f5b6f249f6d18c8a012 + +我自己后续在`https://github.com/AII-SDU/rv-sp-test-mod`下的环境中进行了测试,发现操作系统内核无论是opencloud os内核,还是原版的linux内核,都可以运行。 + +因此**排除**操作系统内部错误。 + +当前排除范围被进一步缩小为: +·QEMU自身问题(我可能需要build一份risc-v虚拟机,需要运行在windows11 x86_64平台) +·EDK2问题(当前正在排查) + + +## 当前错误: + +来自内核文件的:mm/memblock,符号:memblock_alloc_try_nid + +所有前缀`\[ DEBUG \]`的输出用代码行均为自己手动加入,以显示错误。 + +``` +void * __init memblock_alloc_try_nid( + phys_addr_t size, phys_addr_t align, + phys_addr_t min_addr, phys_addr_t max_addr, + int nid) +{ + void *ptr; + + memblock_dbg("%s: %llu bytes align=0x%llx nid=%d from=%pa max_addr=%pa %pS\n", + __func__, (u64)size, (u64)align, nid, &min_addr, + &max_addr, (void *)_RET_IP_); + ptr = memblock_alloc_internal(size, align, + min_addr, max_addr, nid, false); + + pr_info("[ DEBUG ] Page offset as: %llx\n", &kernel_map.page_offset); + + if (ptr) { + memblock_dbg("[ DEBUG ] ptr is: %llx now", ptr); + memset(ptr, 0, size); + } + + return ptr; +} +``` + +在GRUB中,启动了`earlycon=uart8250,mmio,0x10000000`,该代码输出: + +``` +[ 0.000000] memblock_alloc_try_nid: 41156 bytes align=0x8 nid=-1 from=0x0000000000000000 max_addr=0x0000000000000000 early_init_dt_alloc_memory_arch+0x36/0x60 +[ 0.000000] memblock_reserve: [0x000000027fc00f38-0x000000027fc0affb] memblock_alloc_range_nid+0xb0/0x12e +[ 0.000000] [ DEBUG ] Page offset as: ffffffff8105b998 +[ 0.000000] [ DEBUG ] ptr is: ff600001ffc00f38 now +``` + +并随后导致: +``` +[ 0.000000] Unable to handle kernel paging request at virtual address ff600001ffc00f38 +[ 0.000000] Oops [#1] +[ 0.000000] Modules linked in: +[ 0.000000] CPU: 0 PID: 0 Comm: swapper Not tainted 6.6.68 #17 +[ 0.000000] Hardware name: riscv-virtio,qemu (DT) +[ 0.000000] epc : __memset+0x80/0x100 +[ 0.000000] ra : memblock_alloc_try_nid+0xa8/0xba +[ 0.000000] epc : ffffffff80901e40 ra : ffffffff80a14fac sp : ffffffff81403d30 +[ 0.000000] gp : ffffffff815092b8 tp : ffffffff8140cd40 t0 : ff600001ffc00ef8 +[ 0.000000] t1 : 0000000000000077 t2 : 6630306366663130 s0 : ffffffff81403d70 +[ 0.000000] s1 : ff600001ffc00f38 a0 : ff600001ffc00f38 a1 : 0000000000000000 +[ 0.000000] a2 : 000000000000a0c4 a3 : ff600001ffc0aff8 a4 : 0000000000000020 +[ 0.000000] a5 : ffffffff80901e40 a6 : ffffffff814168b0 a7 : 0000000000000030 +[ 0.000000] s2 : 000000000000a0c4 s3 : ffffffffffffffff s4 : ffffffff8150c000 +[ 0.000000] s5 : ffffffff80a34098 s6 : 0000000000000000 s7 : 0000000278000000 +[ 0.000000] s8 : 000000027eaec918 s9 : 0000000000001c6b s10: ffffffffffffffff +[ 0.000000] s11: 000000027e0f3640 t3 : ffffffff8152272e t4 : ffffffff8152272e +[ 0.000000] t5 : ffffffff81522708 t6 : ffffffff81403b58 +[ 0.000000] status: 0000000200000100 badaddr: ff600001ffc00f38 cause: 000000000000000f +[ 0.000000] [] __memset+0x80/0x100 +[ 0.000000] [] early_init_dt_alloc_memory_arch+0x36/0x60 +[ 0.000000] [] __unflatten_device_tree+0x52/0x114 +[ 0.000000] [] unflatten_device_tree+0x2e/0x44 +[ 0.000000] [] setup_arch+0x150/0x5ee +[ 0.000000] [] start_kernel+0x84/0x798 +[ 0.000000] Code: bc23 00b2 b023 02b2 b423 02b2 b823 02b2 bc23 02b2 (b023) 04b2 +[ 0.000000] ---[ end trace 0000000000000000 ]--- +[ 0.000000] Kernel panic - not syncing: Attempted to kill the idle task! +[ 0.000000] ---[ end Kernel panic - not syncing: Attempted to kill the idle task! ]--- +``` + +## 2025/7/7 最新消息: + +现在已**可以正确进入内核和文件系统**。在文件系统方面,已**放弃使用Busybox,转向systemd文件系统**。 + +目前正在基于文件系统,制作稳定的发行版。当前进度: +- utils(已加入bash和nano,正在进行) +- 内置一个RISC-V架构下的GCC编译器(正在进行) +- 内置一个解压包体文件 +- 内置一个yum/dnf包体管理器(尚未开始) +- 内置安装器(尚未开始)