Xv6内核分析(四)

gewenbin
gewenbin
gewenbin
188
文章
15
评论
2020年12月20日16:49:23 评论 392

从核运行过程分析

1. entryother.S

从核的启动代码在entryother.S中,大致的流程和主核启动一样,主要包括:

  • 设置cpu进入32位保护模式。
  • 开启分页部件,在boot启动阶段,和主核启动时一样用的是4MB的页大小。
  • 最后设置当前cpu的内核栈指针,然后跳到mpenter()C函数中运行。

Xv6内核分析(四)

stat-4、start-8、start-12中的内容是在startothers函数中设置的。

2. mpenter函数

Xv6内核分析(四)

前三个初始化函数和主核初始化时是一样的,分别为:

  • 更新从核的CR3页目录基址寄存器。
  • 更新当前cpu核新的GDT全局描述符表。
  • 初始化当前cpu核的lapic。
  • 调用mpmain,这是每个核启动中最后调用的函数。

3. mpmain函数

Xv6内核分析(四)

  • 首先打印当前cpuid。
  • 然后加载idt中断描述符表,这个表是在主核启动的时候初始化的。

idtr寄存器的结构如下:

Xv6内核分析(四)

  • 将当前核的cpu结构中的started设置为1,这是通过一个原子指令xchg来实现的。当执行完这条语句后,之前在主核中startothers函数中最后一直轮询的while(c->started == 0);就会返回。
  • 调用scheduler函数进行调度。

4. 系统调度

scheduler函数首先打开当前核的中断,然后寻找状态为RUNNABLE的进程运行,如果找不到,则一直循环寻找,直到找到为止。可以看出,在xv6中没有idle线程。。。。。

注意,这里应该只有一个核是能获得ptable.lock锁的,在这之后的cpu核运行scheduler会循环在获取lock锁上。

Xv6内核分析(四)

gewenbin
  • 本文由 发表于 2020年12月20日16:49:23
  • 转载请务必保留本文链接:http://www.databusworld.cn/9405.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: