bootsect.s 加载操作系统,bootsect.s 跳转至setup.s
setup.s 进入保护模式,setup.s 跳转至head.s
head.s 初始化gdt表,head.s跳转至main.s
main.s 空闲内存初始化,清楚哪些内存已使用,哪些内存未分配
mem_init。
系统调用
内核态,用户态。
CRL为0是内核态,为3是用户态。
CRL与DS最低俩位DPL比较,DPL >= CPL则进入内核态。
main函数(蓝色部分)使用了系统调用,操作系统会拿出cs:ip的最低俩位,0表示内核态,3表示用户态。与DS的最低俩位进行比较,DPL >= CPL则进入内核态,否则被拒绝。进入内核态时,会发生中断,中断指令int将DPL置为3。
int 0x80进入,根据想调用的系统编号,选择相应的系统调用
传参,内嵌汇编。输入_NR_write 给eax,后三个参数分别给ebx、ecx、edx.
eax、ebx、ecx、edxint 0x80将DPL置为3,DPL >= CPL,可以进入内核态
用int 0x80,将DPL置为3,设置系统调用参数,才能使用内核态系统调用。处于安全考虑不可以直接跳转。
网友评论