Ucore_lab4相关
- 实验指导书:https://learningos.github.io/ucore_os_webdocs/lab4/lab4_3_1_lab_steps.html
- 优秀的博客:https://kiprey.github.io/2020/08/uCore-4/
内核线程管理
关键结构:
struct proc_struct {
    enum proc_state state; // Process state
    int pid; // Process ID
    int runs; // the running times of Proces
    uintptr_t kstack; // Process kernel stack
    volatile bool need_resched; // need to be rescheduled to release CPU?
    struct proc_struct *parent; // the parent process
    struct mm_struct *mm; // Process's memory management field
    struct context context; // Switch here to run process
    struct trapframe *tf; // Trap frame for current interrupt
    uintptr_t cr3; // the base addr of Page Directroy Table(PDT)
    uint32_t flags; // Process flag
    char name[PROC_NAME_LEN + 1]; // Process name
    list_entry_t list_link; // Process link list
    list_entry_t hash_link; // Process hash list
};
熟悉第一个线程第二个线程的创建以及简单调度。
该实验的总体流程就是创建第一个二个线程,然后调度到第二个线程执行一个打印函数然后释放资源。
kstack: 每个线程都有一个内核栈,并且位于内核地址空间的不同位置。对于内核线程,该栈就是运行时的程序使用的栈;而对于普通进程,该栈是发生特权级改变的时候使保存被打断的硬件信息用的栈。后续可进一步看出所有内核线程的内核虚地址空间(也包括物理地址空间)是相同的。
所有内核线程直接使用共同的 ucore 内核内存空间,这些内核线程都应该是从属于同一个唯一的“大内核进程”—uCore 内核。
实验一到三完成了 中断 物理内存管理 虚拟内存管理的工作。
内核线程共享所有内核空间,并没有用到mm_struct。
内核线程使用kmalloc 对于kstack 的分配应该是以直接分配page的。
If kmalloc is asked for objects of PAGE_SIZE or larger, it calls
__get_free_pages directly so that it can return page-aligned blocks
and keeps a linked list of such pages and their orders. These
objects are detected in kfree() by their page alignment.
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号