Xv6内核分析(三.4)

gewenbin
gewenbin
gewenbin
188
文章
15
评论
2020年12月20日16:02:51 评论 468

main函数之seginit

1. seginit函数

seginit是用于设置每个cpu自己的GDT全局描述符表:

Xv6内核分析(三.4)

首先获得当前cpu的结构,然后对其中的gdt初始化,最后加载gdt寄存器。

1.1 cpuid函数

Xv6内核分析(三.4)

从注释中可以看出,在调用cpuid之前,必须要关闭中断。cpus表示数组的首地址,那么mycpu()表示的应该是相应的cpu在cpus中对应的地址。

1.1.2 mycpu函数

Xv6内核分析(三.4)

  • 首先通过检查eflag寄存器来判断是否中断已经关闭。
  • 然后调用lapicid()获取当前cpu的lapic id,lapicid()实现很简单,就是读取lapic空间中的ID寄存器,然后获得lapicid。
  • 然后在 cpus数组中寻找和当前lapicid相同的cpus成员。cpus[i].apicid是在mpinit()函数初始化的时候被初始化的。

1.2 gdt表设置

Xv6内核分析(三.4)

  • 第一个成员表示的是内核的代码段,大小为4G,DPL权限为系统级
  • 第二个成员表示的是内核的数据段,大小为4G,DPL权限为系统级
  • 第三个成员表示的是用户的代码段,大小为4G,DPL权限为用户级
  • 第四个成员表示的是用户的数据段,大小为4G,DPL权限为用户级

1.3 设置gdt寄存器

最后调用lgdt加载gdt寄存器:

Xv6内核分析(三.4)

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

发表评论

匿名网友 填写信息

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