1.操作系统内核需要和上层的应用程序打交道。当外设与计算机系统交互的时候,需要操作系统,当应用程序运行出现异常的时候,需要操作系统控制。在计算机运行时,操作系统是被信任的第三方,只有操作系统的内核可以执行特权指令。
操作系统的中断和异常是为了解决上面问题。
操作系统的系统调用则是为了解决应用程序在接受到系统的处理时,如何能够安全进行,既不影响操作系统,又可以实现应用程序的请求。
上面这个图来解释一波
最下面是外设与操作系统内核交互,当键盘敲击数据传入内核,为了防止数据过多或者处理不及时,中断控制内核里面的设备驱动,从而控制输出键盘的输入字符。
左上方是应用程序与内核的交互,正常情况下应用程序不访问内核,但是当出现异常比如说应用程序要除以0这种不符合规则的操作,这时内核就会执行。
左上方还是应用程序与内核:比如说应用程序要访问一个磁盘文件,不能直接访问硬盘,必须要通过应用程序调用系统调用接口调节函数进入内核,内核把相应的数据读取出来还给程序。
系统调用:应用程序主动向操作系统发出的服务请求。
异常:非法指令或者其他原因导致当前指令执行失败后的处理请求
中断:来自硬件设备的处理请求
下面是中断的操作,和单片机差不多,使能中断,设置中断标志,调用中断服务函数
下图是系统调用时的一些操作
上面这张图厉害了,瞬间让你明白了常说的API到底是个啥!它就是连接应用程序和内核的编程接口,用于系统调用。
程序访问通常是通过高层次的API接口,而不是直接进行系统调用!!
系统调用都有对应编号,它是在图右边内核中的系统调用表中体现!
函数调用的方式:先将需要用的参数压入堆栈,然后在需要的地方从堆栈中取出来。
系统调用:它和函数调用使用不同的堆栈,同时系统调用相比函数调用有更多的特权,他可以直接控制硬件设备。
上图是写一个程序,程序把一个文件复制出来,改一个名字放到另一个文件里面
系统把源文件生成目标文件的过程
注意:输入文件本来有,输出文件本来没有,所以他们出错退出机制不一样。
原来bootloader就是BIOS控制磁盘中的加载程序到内存,用这个加载程序加载磁盘后续的操作系统。这个加载程序Dev代码就叫BootLoader!!!
它有512个字节,真正用到的只有400多个字节,因为里面还存储了磁盘分区的顺序信息。这512个字节虽然小,但是要干很多事。有下面这些:
上图最后一句的意思就是控制权由原来的内存转变为了BIOS控制的BootLoader启动的 操作系统上面去了。
1.段机制用在加载程序BootLoader使进入保护模式的这一步中
内存中专门有一个寄存器叫GDTR,用来存储起始地址。段机制里有段选择址(里面有各个环节的优先级设置),全局描述符表,段描述符,指向全局描述符表起始地址的GDTR寄存器。
进入使能保护模式的操作:BootLoader/OS要设置CR0寄存器的第0位为0
2.BootLoader做的第二件事就是加载OS操作系统,编译完之后会生成一个很长用人的elf格式的文件。BootLoader能根据这个格式把相应的代码数据放到内存相应的位置。
机器码中foo代表一个地址。一般插在中间部分,用来完成除压栈和出栈之外的一些操作。
GCC的作用就是看、链接c和汇编。因为c语言有一些无法实现的功能
加载描述符表,加载页表,加载中断描述符表