从核运行过程分析
1. entryother.S
从核的启动代码在entryother.S中,大致的流程和主核启动一样,主要包括:
stat-4、start-8、start-12中的内容是在startothers函数中设置的。
2. mpenter函数
前三个初始化函数和主核初始化时是一样的,分别为:
- 更新从核的CR3页目录基址寄存器。
- 更新当前cpu核新的GDT全局描述符表。
- 初始化当前cpu核的lapic。
- 调用mpmain,这是每个核启动中最后调用的函数。
3. mpmain函数
- 首先打印当前cpuid。
- 然后加载idt中断描述符表,这个表是在主核启动的时候初始化的。
idtr寄存器的结构如下:
- 将当前核的cpu结构中的started设置为1,这是通过一个原子指令xchg来实现的。当执行完这条语句后,之前在主核中startothers函数中最后一直轮询的while(c->started == 0);就会返回。
- 调用scheduler函数进行调度。
4. 系统调度
scheduler函数首先打开当前核的中断,然后寻找状态为RUNNABLE的进程运行,如果找不到,则一直循环寻找,直到找到为止。可以看出,在xv6中没有idle线程。。。。。
注意,这里应该只有一个核是能获得ptable.lock锁的,在这之后的cpu核运行scheduler会循环在获取lock锁上。
评论