From f3c8918b13a5226f53e7870d60436f812e5d9015 Mon Sep 17 00:00:00 2001 From: Richard Qin Date: Sun, 28 Dec 2025 01:48:50 +0800 Subject: feat(user): add user-space build system and init process to test fork/wait --- build/user/initcode.asm | 215 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 215 insertions(+) create mode 100644 build/user/initcode.asm (limited to 'build/user/initcode.asm') diff --git a/build/user/initcode.asm b/build/user/initcode.asm new file mode 100644 index 0000000..e3a1185 --- /dev/null +++ b/build/user/initcode.asm @@ -0,0 +1,215 @@ + +build/user/initcode.out: file format elf64-littleriscv + + +Disassembly of section .text: + +0000000000000000 <_start>: +#include "user/user.h" + +int main(); + +extern "C" void _start() +{ + 0: 1141 addi sp,sp,-16 + 2: e406 sd ra,8(sp) + exit(main()); + 4: 004000ef jal 8
+ +0000000000000008
: +} + +int main() +{ + 8: 1141 addi sp,sp,-16 + a: e406 sd ra,8(sp) + int pid = fork(); + c: 060000ef jal 6c + + if (pid < 0) + 10: 00054f63 bltz a0,2e + { + write(1, "Fork failed\n", 12); + exit(1); + } + + if (pid == 0) + 14: e905 bnez a0,44 + { + write(1, "Hello from Child!\n", 18); + 16: 4649 li a2,18 + 18: 00000597 auipc a1,0x0 + 1c: 12058593 addi a1,a1,288 # 138 + 20: 4505 li a0,1 + 22: 072000ef jal 94 + exit(0); + 26: 4501 li a0,0 + 28: 04c000ef jal 74 + write(1, "Parent waiting...\n", 18); + wait(0); + write(1, "Parent: Child exited.\n", 22); + } + + while (1); + 2c: a001 j 2c + write(1, "Fork failed\n", 12); + 2e: 4631 li a2,12 + 30: 00000597 auipc a1,0x0 + 34: 0f058593 addi a1,a1,240 # 120 + 38: 4505 li a0,1 + 3a: 05a000ef jal 94 + exit(1); + 3e: 4505 li a0,1 + 40: 034000ef jal 74 + write(1, "Parent waiting...\n", 18); + 44: 4649 li a2,18 + 46: 00000597 auipc a1,0x0 + 4a: 10a58593 addi a1,a1,266 # 150 + 4e: 4505 li a0,1 + 50: 044000ef jal 94 + wait(0); + 54: 4501 li a0,0 + 56: 026000ef jal 7c + write(1, "Parent: Child exited.\n", 22); + 5a: 4659 li a2,22 + 5c: 00000597 auipc a1,0x0 + 60: 10c58593 addi a1,a1,268 # 168 + 64: 4505 li a0,1 + 66: 02e000ef jal 94 + 6a: b7c9 j 2c + +000000000000006c : + name: \ + li a7, SYS_ ## name; \ + ecall; \ + ret + +SYSCALL(fork) + 6c: 4889 li a7,2 + 6e: 00000073 ecall + 72: 8082 ret + +0000000000000074 : +SYSCALL(exit) + 74: 488d li a7,3 + 76: 00000073 ecall + 7a: 8082 ret + +000000000000007c : +SYSCALL(wait) + 7c: 4891 li a7,4 + 7e: 00000073 ecall + 82: 8082 ret + +0000000000000084 : +SYSCALL(pipe) + 84: 4895 li a7,5 + 86: 00000073 ecall + 8a: 8082 ret + +000000000000008c : +SYSCALL(read) + 8c: 4899 li a7,6 + 8e: 00000073 ecall + 92: 8082 ret + +0000000000000094 : +SYSCALL(write) + 94: 48c5 li a7,17 + 96: 00000073 ecall + 9a: 8082 ret + +000000000000009c : +SYSCALL(close) + 9c: 48d9 li a7,22 + 9e: 00000073 ecall + a2: 8082 ret + +00000000000000a4 : +SYSCALL(kill) + a4: 489d li a7,7 + a6: 00000073 ecall + aa: 8082 ret + +00000000000000ac : +SYSCALL(exec) + ac: 48a1 li a7,8 + ae: 00000073 ecall + b2: 8082 ret + +00000000000000b4 : +SYSCALL(open) + b4: 48c1 li a7,16 + b6: 00000073 ecall + ba: 8082 ret + +00000000000000bc : +SYSCALL(mknod) + bc: 48c9 li a7,18 + be: 00000073 ecall + c2: 8082 ret + +00000000000000c4 : +SYSCALL(unlink) + c4: 48cd li a7,19 + c6: 00000073 ecall + ca: 8082 ret + +00000000000000cc : +SYSCALL(fstat) + cc: 48a5 li a7,9 + ce: 00000073 ecall + d2: 8082 ret + +00000000000000d4 : +SYSCALL(link) + d4: 48d1 li a7,20 + d6: 00000073 ecall + da: 8082 ret + +00000000000000dc : +SYSCALL(mkdir) + dc: 48d5 li a7,21 + de: 00000073 ecall + e2: 8082 ret + +00000000000000e4 : +SYSCALL(chdir) + e4: 48a9 li a7,10 + e6: 00000073 ecall + ea: 8082 ret + +00000000000000ec : +SYSCALL(dup) + ec: 48ad li a7,11 + ee: 00000073 ecall + f2: 8082 ret + +00000000000000f4 : +SYSCALL(getpid) + f4: 48b1 li a7,12 + f6: 00000073 ecall + fa: 8082 ret + +00000000000000fc : +SYSCALL(sbrk) + fc: 48b5 li a7,13 + fe: 00000073 ecall + 102: 8082 ret + +0000000000000104 : +SYSCALL(sleep) + 104: 48b9 li a7,14 + 106: 00000073 ecall + 10a: 8082 ret + +000000000000010c : +SYSCALL(uptime) + 10c: 48bd li a7,15 + 10e: 00000073 ecall + 112: 8082 ret + +0000000000000114 : + 114: 4885 li a7,1 + 116: 00000073 ecall + 11a: 8082 ret -- cgit v1.2.3