实验楼:实验报告:https://www.shiyanlou.com/courses/reports/1356557/
关于系统调用:https://www.cnblogs.com/yiyide266/p/5538079.html
head.s初始化了GDT,IDT表。
Linux中,main函数初始化完了其他参数后,就会打开shell。shell也是一个程序,但不会终止。
获取命令,执行命令。
图形化界面的实现就是利用了消息处理机制。
操作系统是怎样调用硬件的?实质上就是C语言的程序再加上C语言中一些重要的函数比如(printf)等等。
应用程序与操作系统的接口也是这样。
这样的C语言程序称为系统调用。系统调用就是操作系统的接口。
printf是包装的write,write是真正的系统调用。
本课程不要求你背会所有的接口,但是要求你知道怎么查有哪些接口。(->POSIX)
有这样一个疑问:操作系统和应用程序的代码都在内存中,应用程序如果要想直接访问操作系统为什么不直接去访问操作系统所在的内存空间?
第一个问题:怎么才可以控制应用程序不能随意的jmp
第二个问题:既然不能jmp,那怎么访问操作系统?
不能随意的jmp,是硬件控制的。
硬件把内存分割为用户态和核心态。
是靠段寄存器(如CS)来控制。
DPL(目的特权级别),CPL(当前(current)特权级别)
存放在GDT表中。
head.s在初始化的时候,就把GDT表置为了0
只有当前特权级别小于目的特权级别时才可以访问。
当系统初始化完了后,就会到用户态执行,此时CS为段寄存器,就会把CS的CPL置成3.
每一次jmp,mov都要访问GDT表,因为会访问段寄存器。
回答问题2:
中断是进入系统内核的唯一方法。
表面上是open函数,(open函数为系统调用函数),其实里面还包含了int 0x80中断指令,才能进入内核。进入内核后再做中断处理程序返回给用户态。
系统调用是由宏来展开的。
是IDT表