summaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
authorRichard Qin <richard.qin.x@gmail.com>2026-01-03 02:19:57 +0800
committerRichard Qin <richard.qin.x@gmail.com>2026-01-03 02:19:57 +0800
commit210025560c80b48af4875af199f183ad709e3bf0 (patch)
treeeb11aeb7b641187f207e3b572c5184cf3526b463 /docs
parentbde87490d61135dcaa94d9b1489ff6c39876d169 (diff)
parent10614e04929a6d109a5e90524e446b637aaf0c13 (diff)
downloadlume-210025560c80b48af4875af199f183ad709e3bf0.tar.gz
lume-210025560c80b48af4875af199f183ad709e3bf0.tar.xz
Merge pull request #4 from Richard-Qin-001/dev/shell
Rebuilt the system's underlying structure; it is now stable enough to merge. The system now supports a read-only file system and has a simple shell implemented.
Diffstat (limited to 'docs')
-rw-r--r--docs/debug/debug_slab.md94
-rw-r--r--docs/debug/debug_slab_1.pngbin0 -> 90366 bytes
-rw-r--r--docs/dev/dev_device.md23
-rw-r--r--docs/dev/dev_memory.md37
4 files changed, 154 insertions, 0 deletions
diff --git a/docs/debug/debug_slab.md b/docs/debug/debug_slab.md
new file mode 100644
index 0000000..b64dca8
--- /dev/null
+++ b/docs/debug/debug_slab.md
@@ -0,0 +1,94 @@
+# Debug
+
+发现user_init加载之后无法正常跳转到shell
+
+检查fork
+
+添加调试信息
+```cxx
+printf("fork start\n");
+int pid = fork();
+printf("fork suceess, pid=%i\n", pid);
+```
+正常打印,fork()没有问题
+
+尝试在 'exec(sh_path, argv);' 前后添加调试信息
+
+该代码之前有输出,之后无输出
+
+尝试解决exec.cc的问题
+
+在exec()函数开头处添加调试信息
+
+```CXX
+ Drivers::uart_puts("Enter Exec\n");
+ // Get Inode
+ Inode *raw_ip = VFS::namei(path);
+ if (!raw_ip)
+ return -1;
+ InodeGuard iguard(raw_ip);
+```
+
+没有输出
+
+怀疑是系统注册的问题,但不可能,因为在实现shell之前的简易测试程序证明系统调用没有问题
+
+尝试 GDB 调试
+
+![alt text](debug_slab_1.png)
+
+发现卡在 sret 返回的部分,跳转的地址没有问题,但是卡死,说明CPU没有跑飞,可能遇到了死循环
+
+检查sys_exec()
+
+通过在每行代码前后添加打印调试信息,发现问题出在这行代码:
+```cxx
+ kargv.args[i] = (char *)Slab::kmalloc(KernelArgv::MAX_ARG_LEN);
+```
+这行代码之后的打印信息没有输出,说明这里一直在执行!
+
+检查Slab
+
+像之前一样通过在每行代码前后添加打印调试信息,发现问题出在这里:
+```cxx
+for (uint i = 0; i < c->obj_count_per_slab - 1; i++)
+ {
+ // The content of the i-th object is i+1
+ uint16 *ptr = (uint16 *)(base + i * c->obj_size);
+ *ptr = i + 1;
+ }
+```
+这段代码之前的信息可以输出,之后的不能输出,说明这里出问题了
+
+在循环内部打印信息,发现调试信息刷屏
+
+证明了在GDB里面看到的消息,并不是CPU跑到了某些神秘地址,而是一直卡在这个死循环!
+
+这里出现了死循环,说明这里循环终止条件出了问题,根本原因需要排查
+
+可能是错误的计算,导致这里成了ull的最大值,即使在 3 GHz CPU 上跑空循环,跑满 unsigned long long 最大值次数也需要 近千年。
+
+怀疑之前这个值是0
+
+添加代码:
+```cxx
+ if (c->obj_count_per_slab == 0)
+ Drivers::uart_puts("it is 0");
+```
+证明猜测正确
+
+这里检查发现这个值确实是0,但它为什么能是0呢?
+
+可能是初始化的问题????
+
+检查系统初始化main.cc
+
+发现Slab确实没有初始化,导致c->obj_count_per_slab这个值一直是0!
+
+初始化!
+
+正常加载shell
+
+说明 ELF 加载,只读 FAT32 文件系统 正常实现
+
+该bug解决 \ No newline at end of file
diff --git a/docs/debug/debug_slab_1.png b/docs/debug/debug_slab_1.png
new file mode 100644
index 0000000..5cb9e66
--- /dev/null
+++ b/docs/debug/debug_slab_1.png
Binary files differ
diff --git a/docs/dev/dev_device.md b/docs/dev/dev_device.md
new file mode 100644
index 0000000..1eb6462
--- /dev/null
+++ b/docs/dev/dev_device.md
@@ -0,0 +1,23 @@
+# Dev log
+## **3.Device Model & HAL:**
+* Interrupt Controller: PLIC:
+
+ * Implement the PLIC (Platform-Level Interrupt Controller) driver.
+
+ * Set the PLIC priority threshold and enable bits during the start() phase.
+
+ * Dispatch Cause 9 (External Interrupt) in kerneltrap/usertrap.
+
+* Character Device: Interrupt-Driven Console:
+
+ * Implement a Ring Buffer. uart_putc returns immediately after writing to the buffer.
+
+ * UART transmit interrupt: triggers when the serial port is idle, the ISR takes data from the Ring Buffer and writes it to the register.
+
+ * UART receive interrupt: triggers when a key is pressed, the ISR reads the character and wakes up the process waiting to read.
+
+* Block Device: VirtIO-Blk:
+
+ * Implement a block device driver for the PCI or MMIO transport layer according to the VirtIO 2.0 standard.
+
+ * DMA: Use the Buddy System to allocate contiguous memory as the descriptor table for the Virtqueue. \ No newline at end of file
diff --git a/docs/dev/dev_memory.md b/docs/dev/dev_memory.md
new file mode 100644
index 0000000..f05e336
--- /dev/null
+++ b/docs/dev/dev_memory.md
@@ -0,0 +1,37 @@
+# Dev log
+## **1. Process Management:**
+The core architecture has been upgraded from a simple single queue to a Per-CPU scheduler, supporting multi-core concurrency.
+
+* Process lifecycle: A complete process state machine has been implemented, including UNUSED, RUNNABLE, RUNNING, SLEEPING, and ZOMBIE states.
+
+* Core operations:
+ * fork(): process cloning, supporting COW (copy-on-write) isolation of memory space between parent and child processes.
+ * exit(): process termination and resource cleanup.
+ * wait(): parent process waits for child process to exit.
+ * sleep()/wakeup(): channel-based sleep and wakeup mechanism.
+
+* Scheduling algorithm:
+ * O(1) priority scheduling has been implemented (supporting 4 priority queues).
+
+ * Per-CPU RunQueue: each CPU has its own independent run queue.
+
+ * Supports Work Stealing: idle CPUs can fetch tasks from other CPUs’ queues.
+
+## **2. Memory Management:**
+A complete virtual and physical memory management system has been implemented.
+
+* Physical Memory (PMM): Implements the Buddy System, supporting memory allocation and deallocation in $2^n$ pages.
+
+* Virtual Memory (VM): Based on RISC-V Sv39 paging mode. Provides secure data copying from user space to kernel space (copyin).
+
+* COW (Copy-On-Write): During fork, only page table entries are copied and pages are set to read-only; writes trigger page faults for physical copy, greatly improving process creation efficiency.
+
+* Kernel heap: Implements a Slab Allocator, providing efficient allocation of small objects (such as struct Proc).
+
+## **3. Synchronization:**
+
+* Spinlock: Used to protect very short critical sections (e.g., scheduler lock, PMM lock), supports disabling interrupts to prevent deadlocks.
+
+* Mutex (sleeping lock): Used for long critical sections (e.g., file I/O), allowing sleep while holding the lock.
+
+* Lock Handoff: Implements a complex lock handoff mechanism in the scheduler to ensure atomicity of context switches. \ No newline at end of file