代码的总体的逻辑:
首先时在 GDT表中添加 系统调用门 的描述符。
然后是 在汇编中实现关于 系统调用门描述符指向的函数。
然后是 使用C语言实现 在屏幕上显示字符。
然后将调用 汇编语言的SYSTEM_CALL 的函数专门封装一个函数
然后在 任务中调用 系统调用的时候,会从特权级3的栈,切换到特权级0的栈,还需要手动的 压入三个参数,3个参数是在 SYSTEM_CALL 的GDT表中指定的。
这里需要一张图
这张图不是很理解。
这是一张对比图:
系统调用VS切换特权级的图。
调用 do_syscall 是不是在模仿 C的函数调用
然后是在汇编中对 系统调用前的 寄存器状态压栈
然后是在汇编中,切换内核的数据段。
然后是在汇编中,系统调用完之后,进行 寄存器的出栈。
然后在调用 do_syscalll 之前还要手动的 压入栈中三个参数,这三个参数是从 已经有的栈中取的。
然后在调用完do_syscall 之后,还要手动的释放一下。
整个 系统调用完之后,还需要,进行 返回。