diff options
Diffstat (limited to 'docs')
| -rw-r--r-- | docs/debug/debug_slab.md | 94 | ||||
| -rw-r--r-- | docs/debug/debug_slab_1.png | bin | 0 -> 90366 bytes | |||
| -rw-r--r-- | docs/dev/dev_device.md | 23 | ||||
| -rw-r--r-- | docs/dev/dev_memory.md | 37 |
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 调试 + + + +发现卡在 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 Binary files differnew file mode 100644 index 0000000..5cb9e66 --- /dev/null +++ b/docs/debug/debug_slab_1.png 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 |
