diff options
| author | Richard Qin <richard.qin.x@gmail.com> | 2025-12-31 18:00:55 +0800 |
|---|---|---|
| committer | Richard Qin <richard.qin.x@gmail.com> | 2025-12-31 18:00:55 +0800 |
| commit | dbba25aa24f86c1f8c3a0589c82985840adc1b6b (patch) | |
| tree | 11d1d7ee552030d953db9f911d5af6e079291c47 /build/user/initcode.asm | |
| parent | 7759eef8cdac79028dd5b468bd9ce0cf1c12b162 (diff) | |
| download | lume-dbba25aa24f86c1f8c3a0589c82985840adc1b6b.tar.gz lume-dbba25aa24f86c1f8c3a0589c82985840adc1b6b.tar.xz | |
dev:Refactor Memory Management and Process Management
Diffstat (limited to 'build/user/initcode.asm')
| -rw-r--r-- | build/user/initcode.asm | 558 |
1 files changed, 414 insertions, 144 deletions
diff --git a/build/user/initcode.asm b/build/user/initcode.asm index e3a1185..c04fbab 100644 --- a/build/user/initcode.asm +++ b/build/user/initcode.asm @@ -4,212 +4,482 @@ build/user/initcode.out: file format elf64-littleriscv Disassembly of section .text: -0000000000000000 <_start>: +0000000000000000 <_Z6strlenPKc>: #include "user/user.h" -int main(); - -extern "C" void _start() +int strlen(const char *s) { - 0: 1141 addi sp,sp,-16 - 2: e406 sd ra,8(sp) - exit(main()); - 4: 004000ef jal 8 <main> + int n = 0; + while (s[n]) + 0: 00054783 lbu a5,0(a0) + 4: cf81 beqz a5,1c <_Z6strlenPKc+0x1c> + 6: 0505 addi a0,a0,1 + 8: 87aa mv a5,a0 + a: 0007c703 lbu a4,0(a5) + e: 86be mv a3,a5 + 10: 0785 addi a5,a5,1 + 12: ff65 bnez a4,a <_Z6strlenPKc+0xa> + n++; + 14: 40a6853b subw a0,a3,a0 + 18: 2505 addiw a0,a0,1 + 1a: 8082 ret + int n = 0; + 1c: 4501 li a0,0 + return n; +} + 1e: 8082 ret + +0000000000000020 <_Z5printPKc>: + while (s[n]) + 20: 00054783 lbu a5,0(a0) -0000000000000008 <main>: +void print(const char *s) +{ + 24: 85aa mv a1,a0 + while (s[n]) + 26: cf89 beqz a5,40 <_Z5printPKc+0x20> + 28: 00150693 addi a3,a0,1 + 2c: 87b6 mv a5,a3 + 2e: 0007c703 lbu a4,0(a5) + 32: 863e mv a2,a5 + 34: 0785 addi a5,a5,1 + 36: ff65 bnez a4,2e <_Z5printPKc+0xe> + n++; + 38: 9e15 subw a2,a2,a3 + 3a: 2605 addiw a2,a2,1 + write(1, s, strlen(s)); + 3c: 4505 li a0,1 + 3e: a491 j 282 <write> + int n = 0; + 40: 4601 li a2,0 + write(1, s, strlen(s)); + 42: 4505 li a0,1 + 44: ac3d j 282 <write> + +0000000000000046 <_Z9print_inti>: + +void print_int(int val) +{ + char buf[16]; + int i = 0; + if (val == 0) + 46: c159 beqz a0,cc <_Z9print_inti+0x86> +{ + 48: 7139 addi sp,sp,-64 + 4a: f822 sd s0,48(sp) + 4c: fc06 sd ra,56(sp) + 4e: f426 sd s1,40(sp) + 50: f04a sd s2,32(sp) + 52: 842a mv s0,a0 + { + print("0"); + return; + } + if (val < 0) + 54: 06054163 bltz a0,b6 <_Z9print_inti+0x70> + 58: 081c addi a5,sp,16 +{ + 5a: 873e mv a4,a5 + print("-"); + val = -val; + } + while (val > 0) + { + buf[i++] = (val % 10) + '0'; + 5c: 4629 li a2,10 + 5e: 02c466bb remw a3,s0,a2 + 62: 85ba mv a1,a4 + while (val > 0) + 64: 0705 addi a4,a4,1 + val /= 10; + 66: 02c4443b divw s0,s0,a2 + buf[i++] = (val % 10) + '0'; + 6a: 0306869b addiw a3,a3,48 + 6e: fed70fa3 sb a3,-1(a4) + while (val > 0) + 72: f475 bnez s0,5e <_Z9print_inti+0x18> + 74: 9d9d subw a1,a1,a5 + 76: 0015871b addiw a4,a1,1 + 7a: fff7059b addiw a1,a4,-1 + 7e: fff78493 addi s1,a5,-1 + 82: 1582 slli a1,a1,0x20 + 84: 94ba add s1,s1,a4 + 86: 9181 srli a1,a1,0x20 + 88: 00e78433 add s0,a5,a4 + 8c: 8c8d sub s1,s1,a1 + 8e: 00f10913 addi s2,sp,15 + } + while (i > 0) + { + char c = buf[--i]; + 92: fff44783 lbu a5,-1(s0) + write(1, &c, 1); + 96: 4605 li a2,1 + 98: 85ca mv a1,s2 + 9a: 4505 li a0,1 + while (i > 0) + 9c: 147d addi s0,s0,-1 + char c = buf[--i]; + 9e: 00f107a3 sb a5,15(sp) + write(1, &c, 1); + a2: 1e0000ef jal 282 <write> + while (i > 0) + a6: fe9416e3 bne s0,s1,92 <_Z9print_inti+0x4c> + } } + aa: 70e2 ld ra,56(sp) + ac: 7442 ld s0,48(sp) + ae: 74a2 ld s1,40(sp) + b0: 7902 ld s2,32(sp) + b2: 6121 addi sp,sp,64 + b4: 8082 ret + write(1, s, strlen(s)); + b6: 4605 li a2,1 + b8: 00000597 auipc a1,0x0 + bc: 26058593 addi a1,a1,608 # 318 <putc+0x16> + c0: 4505 li a0,1 + c2: 1c0000ef jal 282 <write> + val = -val; + c6: 4080043b negw s0,s0 + while (val > 0) + ca: b779 j 58 <_Z9print_inti+0x12> + write(1, s, strlen(s)); + cc: 4605 li a2,1 + ce: 00000597 auipc a1,0x0 + d2: 24258593 addi a1,a1,578 # 310 <putc+0xe> + d6: 4505 li a0,1 + d8: a26d j 282 <write> + +00000000000000da <_Z4passv>: + while (s[n]) + da: 00000697 auipc a3,0x0 + de: 24668693 addi a3,a3,582 # 320 <putc+0x1e> + +void pass() { print(" -> [PASS]\n"); } + e2: 87b6 mv a5,a3 + while (s[n]) + e4: 0017c703 lbu a4,1(a5) + e8: 863e mv a2,a5 + ea: 0785 addi a5,a5,1 + ec: ff65 bnez a4,e4 <_Z4passv+0xa> + n++; + ee: 9e15 subw a2,a2,a3 + write(1, s, strlen(s)); + f0: 2605 addiw a2,a2,1 + f2: 00000597 auipc a1,0x0 + f6: 22e58593 addi a1,a1,558 # 320 <putc+0x1e> + fa: 4505 li a0,1 + fc: a259 j 282 <write> + +00000000000000fe <_Z4failv>: +void fail() +{ + fe: 1141 addi sp,sp,-16 + 100: 00000697 auipc a3,0x0 + 104: 23068693 addi a3,a3,560 # 330 <putc+0x2e> + 108: e406 sd ra,8(sp) + 10a: 87b6 mv a5,a3 + while (s[n]) + 10c: 0017c703 lbu a4,1(a5) + 110: 863e mv a2,a5 + 112: 0785 addi a5,a5,1 + 114: ff65 bnez a4,10c <_Z4failv+0xe> + n++; + 116: 9e15 subw a2,a2,a3 + write(1, s, strlen(s)); + 118: 2605 addiw a2,a2,1 + 11a: 00000597 auipc a1,0x0 + 11e: 21658593 addi a1,a1,534 # 330 <putc+0x2e> + 122: 4505 li a0,1 + 124: 15e000ef jal 282 <write> + print(" -> [FAIL]\n"); + exit(1); +} + 128: 60a2 ld ra,8(sp) + exit(1); + 12a: 4505 li a0,1 +} + 12c: 0141 addi sp,sp,16 + exit(1); + 12e: aa15 j 262 <exit> + +0000000000000130 <main>: int main() { - 8: 1141 addi sp,sp,-16 - a: e406 sd ra,8(sp) + 130: 1141 addi sp,sp,-16 + print("\n=== Lume OS Full Validation ===\n"); + 132: 00000517 auipc a0,0x0 + 136: 20e50513 addi a0,a0,526 # 340 <putc+0x3e> +{ + 13a: e406 sd ra,8(sp) + 13c: e022 sd s0,0(sp) + print("\n=== Lume OS Full Validation ===\n"); + 13e: ee3ff0ef jal 20 <_Z5printPKc> + + print("[TEST 1] Write\n"); + 142: 00000517 auipc a0,0x0 + 146: 22650513 addi a0,a0,550 # 368 <putc+0x66> + 14a: ed7ff0ef jal 20 <_Z5printPKc> + print(" System call write is working."); + 14e: 00000517 auipc a0,0x0 + 152: 22a50513 addi a0,a0,554 # 378 <putc+0x76> + 156: ecbff0ef jal 20 <_Z5printPKc> +void pass() { print(" -> [PASS]\n"); } + 15a: 00000517 auipc a0,0x0 + 15e: 1c650513 addi a0,a0,454 # 320 <putc+0x1e> + 162: ebfff0ef jal 20 <_Z5printPKc> + pass(); + + print("[TEST 2] GetPID\n"); + 166: 00000517 auipc a0,0x0 + 16a: 23250513 addi a0,a0,562 # 398 <putc+0x96> + 16e: eb3ff0ef jal 20 <_Z5printPKc> + int parent_pid = getpid(); + 172: 170000ef jal 2e2 <getpid> + 176: 842a mv s0,a0 + print(" Parent PID: "); + 178: 00000517 auipc a0,0x0 + 17c: 23850513 addi a0,a0,568 # 3b0 <putc+0xae> + 180: ea1ff0ef jal 20 <_Z5printPKc> + print_int(parent_pid); + 184: 8522 mv a0,s0 + 186: ec1ff0ef jal 46 <_Z9print_inti> + if (parent_pid > 0) + 18a: 0c805563 blez s0,254 <main+0x124> +void pass() { print(" -> [PASS]\n"); } + 18e: 00000517 auipc a0,0x0 + 192: 19250513 addi a0,a0,402 # 320 <putc+0x1e> + 196: e8bff0ef jal 20 <_Z5printPKc> + pass(); + else + fail(); + + print("[TEST 3] Fork, Wait & COW\n"); + 19a: 00000517 auipc a0,0x0 + 19e: 22650513 addi a0,a0,550 # 3c0 <putc+0xbe> + 1a2: e7fff0ef jal 20 <_Z5printPKc> + int val = 100; int pid = fork(); - c: 060000ef jal 6c <fork> + 1a6: 0b4000ef jal 25a <fork> if (pid < 0) - 10: 00054f63 bltz a0,2e <main+0x26> + 1aa: 04054363 bltz a0,1f0 <main+0xc0> { - write(1, "Fork failed\n", 12); - exit(1); + print(" Fork Failed\n"); + fail(); } if (pid == 0) - 14: e905 bnez a0,44 <main+0x3c> + 1ae: e929 bnez a0,200 <main+0xd0> { - write(1, "Hello from Child!\n", 18); - 16: 4649 li a2,18 - 18: 00000597 auipc a1,0x0 - 1c: 12058593 addi a1,a1,288 # 138 <putc+0x24> - 20: 4505 li a0,1 - 22: 072000ef jal 94 <write> + print(" [Child] PID: "); + 1b0: 00000517 auipc a0,0x0 + 1b4: 24050513 addi a0,a0,576 # 3f0 <putc+0xee> + 1b8: e69ff0ef jal 20 <_Z5printPKc> + print_int(getpid()); + 1bc: 126000ef jal 2e2 <getpid> + 1c0: e87ff0ef jal 46 <_Z9print_inti> + print("\n"); + 1c4: 00000517 auipc a0,0x0 + 1c8: 23c50513 addi a0,a0,572 # 400 <putc+0xfe> + 1cc: e55ff0ef jal 20 <_Z5printPKc> + print(" [Child] Data corruption!\n"); + exit(1); + } + + val = 200; + print(" [Child] Modified val to 200. Exiting.\n"); + 1d0: 00000517 auipc a0,0x0 + 1d4: 23850513 addi a0,a0,568 # 408 <putc+0x106> + 1d8: e49ff0ef jal 20 <_Z5printPKc> exit(0); - 26: 4501 li a0,0 - 28: 04c000ef jal 74 <exit> - write(1, "Parent waiting...\n", 18); - wait(0); - write(1, "Parent: Child exited.\n", 22); + 1dc: 4501 li a0,0 + 1de: 084000ef jal 262 <exit> + print_int(val); + fail(); + } } - while (1); - 2c: a001 j 2c <main+0x24> - write(1, "Fork failed\n", 12); - 2e: 4631 li a2,12 - 30: 00000597 auipc a1,0x0 - 34: 0f058593 addi a1,a1,240 # 120 <putc+0xc> - 38: 4505 li a0,1 - 3a: 05a000ef jal 94 <write> - exit(1); - 3e: 4505 li a0,1 - 40: 034000ef jal 74 <exit> - write(1, "Parent waiting...\n", 18); - 44: 4649 li a2,18 - 46: 00000597 auipc a1,0x0 - 4a: 10a58593 addi a1,a1,266 # 150 <putc+0x3c> - 4e: 4505 li a0,1 - 50: 044000ef jal 94 <write> - wait(0); - 54: 4501 li a0,0 - 56: 026000ef jal 7c <wait> - write(1, "Parent: Child exited.\n", 22); - 5a: 4659 li a2,22 - 5c: 00000597 auipc a1,0x0 - 60: 10c58593 addi a1,a1,268 # 168 <putc+0x54> - 64: 4505 li a0,1 - 66: 02e000ef jal 94 <write> - 6a: b7c9 j 2c <main+0x24> - -000000000000006c <fork>: + print("\n=== All Tests Passed ===\n"); + 1e2: 00000517 auipc a0,0x0 + 1e6: 2ce50513 addi a0,a0,718 # 4b0 <putc+0x1ae> + 1ea: e37ff0ef jal 20 <_Z5printPKc> + while (1) + 1ee: a001 j 1ee <main+0xbe> + print(" Fork Failed\n"); + 1f0: 00000517 auipc a0,0x0 + 1f4: 1f050513 addi a0,a0,496 # 3e0 <putc+0xde> + 1f8: e29ff0ef jal 20 <_Z5printPKc> + fail(); + 1fc: f03ff0ef jal fe <_Z4failv> + print(" [Parent] Waiting for child...\n"); + 200: 00000517 auipc a0,0x0 + 204: 23850513 addi a0,a0,568 # 438 <putc+0x136> + 208: e19ff0ef jal 20 <_Z5printPKc> + int child_pid = wait(0); + 20c: 4501 li a0,0 + 20e: 05c000ef jal 26a <wait> + 212: 842a mv s0,a0 + print(" [Parent] Child "); + 214: 00000517 auipc a0,0x0 + 218: 24c50513 addi a0,a0,588 # 460 <putc+0x15e> + 21c: e05ff0ef jal 20 <_Z5printPKc> + print_int(child_pid); + 220: 8522 mv a0,s0 + 222: e25ff0ef jal 46 <_Z9print_inti> + print(" exited.\n"); + 226: 00000517 auipc a0,0x0 + 22a: 25250513 addi a0,a0,594 # 478 <putc+0x176> + 22e: df3ff0ef jal 20 <_Z5printPKc> + print(" [Parent] Check val (Expect 100): "); + 232: 00000517 auipc a0,0x0 + 236: 25650513 addi a0,a0,598 # 488 <putc+0x186> + 23a: de7ff0ef jal 20 <_Z5printPKc> + print_int(val); + 23e: 06400513 li a0,100 + 242: e05ff0ef jal 46 <_Z9print_inti> +void pass() { print(" -> [PASS]\n"); } + 246: 00000517 auipc a0,0x0 + 24a: 0da50513 addi a0,a0,218 # 320 <putc+0x1e> + 24e: dd3ff0ef jal 20 <_Z5printPKc> + 252: bf41 j 1e2 <main+0xb2> + fail(); + 254: eabff0ef jal fe <_Z4failv> + 258: b789 j 19a <main+0x6a> + +000000000000025a <fork>: name: \ li a7, SYS_ ## name; \ ecall; \ ret SYSCALL(fork) - 6c: 4889 li a7,2 - 6e: 00000073 ecall - 72: 8082 ret + 25a: 4889 li a7,2 + 25c: 00000073 ecall + 260: 8082 ret -0000000000000074 <exit>: +0000000000000262 <exit>: SYSCALL(exit) - 74: 488d li a7,3 - 76: 00000073 ecall - 7a: 8082 ret + 262: 488d li a7,3 + 264: 00000073 ecall + 268: 8082 ret -000000000000007c <wait>: +000000000000026a <wait>: SYSCALL(wait) - 7c: 4891 li a7,4 - 7e: 00000073 ecall - 82: 8082 ret + 26a: 4891 li a7,4 + 26c: 00000073 ecall + 270: 8082 ret -0000000000000084 <pipe>: +0000000000000272 <pipe>: SYSCALL(pipe) - 84: 4895 li a7,5 - 86: 00000073 ecall - 8a: 8082 ret + 272: 4895 li a7,5 + 274: 00000073 ecall + 278: 8082 ret -000000000000008c <read>: +000000000000027a <read>: SYSCALL(read) - 8c: 4899 li a7,6 - 8e: 00000073 ecall - 92: 8082 ret + 27a: 4899 li a7,6 + 27c: 00000073 ecall + 280: 8082 ret -0000000000000094 <write>: +0000000000000282 <write>: SYSCALL(write) - 94: 48c5 li a7,17 - 96: 00000073 ecall - 9a: 8082 ret + 282: 48c5 li a7,17 + 284: 00000073 ecall + 288: 8082 ret -000000000000009c <close>: +000000000000028a <close>: SYSCALL(close) - 9c: 48d9 li a7,22 - 9e: 00000073 ecall - a2: 8082 ret + 28a: 48d9 li a7,22 + 28c: 00000073 ecall + 290: 8082 ret -00000000000000a4 <kill>: +0000000000000292 <kill>: SYSCALL(kill) - a4: 489d li a7,7 - a6: 00000073 ecall - aa: 8082 ret + 292: 489d li a7,7 + 294: 00000073 ecall + 298: 8082 ret -00000000000000ac <exec>: +000000000000029a <exec>: SYSCALL(exec) - ac: 48a1 li a7,8 - ae: 00000073 ecall - b2: 8082 ret + 29a: 48a1 li a7,8 + 29c: 00000073 ecall + 2a0: 8082 ret -00000000000000b4 <open>: +00000000000002a2 <open>: SYSCALL(open) - b4: 48c1 li a7,16 - b6: 00000073 ecall - ba: 8082 ret + 2a2: 48c1 li a7,16 + 2a4: 00000073 ecall + 2a8: 8082 ret -00000000000000bc <mknod>: +00000000000002aa <mknod>: SYSCALL(mknod) - bc: 48c9 li a7,18 - be: 00000073 ecall - c2: 8082 ret + 2aa: 48c9 li a7,18 + 2ac: 00000073 ecall + 2b0: 8082 ret -00000000000000c4 <unlink>: +00000000000002b2 <unlink>: SYSCALL(unlink) - c4: 48cd li a7,19 - c6: 00000073 ecall - ca: 8082 ret + 2b2: 48cd li a7,19 + 2b4: 00000073 ecall + 2b8: 8082 ret -00000000000000cc <fstat>: +00000000000002ba <fstat>: SYSCALL(fstat) - cc: 48a5 li a7,9 - ce: 00000073 ecall - d2: 8082 ret + 2ba: 48a5 li a7,9 + 2bc: 00000073 ecall + 2c0: 8082 ret -00000000000000d4 <link>: +00000000000002c2 <link>: SYSCALL(link) - d4: 48d1 li a7,20 - d6: 00000073 ecall - da: 8082 ret + 2c2: 48d1 li a7,20 + 2c4: 00000073 ecall + 2c8: 8082 ret -00000000000000dc <mkdir>: +00000000000002ca <mkdir>: SYSCALL(mkdir) - dc: 48d5 li a7,21 - de: 00000073 ecall - e2: 8082 ret + 2ca: 48d5 li a7,21 + 2cc: 00000073 ecall + 2d0: 8082 ret -00000000000000e4 <chdir>: +00000000000002d2 <chdir>: SYSCALL(chdir) - e4: 48a9 li a7,10 - e6: 00000073 ecall - ea: 8082 ret + 2d2: 48a9 li a7,10 + 2d4: 00000073 ecall + 2d8: 8082 ret -00000000000000ec <dup>: +00000000000002da <dup>: SYSCALL(dup) - ec: 48ad li a7,11 - ee: 00000073 ecall - f2: 8082 ret + 2da: 48ad li a7,11 + 2dc: 00000073 ecall + 2e0: 8082 ret -00000000000000f4 <getpid>: +00000000000002e2 <getpid>: SYSCALL(getpid) - f4: 48b1 li a7,12 - f6: 00000073 ecall - fa: 8082 ret + 2e2: 48b1 li a7,12 + 2e4: 00000073 ecall + 2e8: 8082 ret -00000000000000fc <sbrk>: +00000000000002ea <sbrk>: SYSCALL(sbrk) - fc: 48b5 li a7,13 - fe: 00000073 ecall - 102: 8082 ret + 2ea: 48b5 li a7,13 + 2ec: 00000073 ecall + 2f0: 8082 ret -0000000000000104 <sleep>: +00000000000002f2 <sleep>: SYSCALL(sleep) - 104: 48b9 li a7,14 - 106: 00000073 ecall - 10a: 8082 ret + 2f2: 48b9 li a7,14 + 2f4: 00000073 ecall + 2f8: 8082 ret -000000000000010c <uptime>: +00000000000002fa <uptime>: SYSCALL(uptime) - 10c: 48bd li a7,15 - 10e: 00000073 ecall - 112: 8082 ret - -0000000000000114 <putc>: - 114: 4885 li a7,1 - 116: 00000073 ecall - 11a: 8082 ret + 2fa: 48bd li a7,15 + 2fc: 00000073 ecall + 300: 8082 ret + +0000000000000302 <putc>: + 302: 4885 li a7,1 + 304: 00000073 ecall + 308: 8082 ret |
