main函数之seginit
1. seginit函数
seginit是用于设置每个cpu自己的GDT全局描述符表:
首先获得当前cpu的结构,然后对其中的gdt初始化,最后加载gdt寄存器。
1.1 cpuid函数
从注释中可以看出,在调用cpuid之前,必须要关闭中断。cpus表示数组的首地址,那么mycpu()表示的应该是相应的cpu在cpus中对应的地址。
1.1.2 mycpu函数
- 首先通过检查eflag寄存器来判断是否中断已经关闭。
- 然后调用lapicid()获取当前cpu的lapic id,lapicid()实现很简单,就是读取lapic空间中的ID寄存器,然后获得lapicid。
- 然后在 cpus数组中寻找和当前lapicid相同的cpus成员。cpus[i].apicid是在mpinit()函数初始化的时候被初始化的。
1.2 gdt表设置
- 第一个成员表示的是内核的代码段,大小为4G,DPL权限为系统级
- 第二个成员表示的是内核的数据段,大小为4G,DPL权限为系统级
- 第三个成员表示的是用户的代码段,大小为4G,DPL权限为用户级
- 第四个成员表示的是用户的数据段,大小为4G,DPL权限为用户级
1.3 设置gdt寄存器
最后调用lgdt加载gdt寄存器:
评论