码迷,mamicode.com
首页 > 其他好文 > 详细

基础知识

时间:2015-06-06 23:27:20      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:

参考资料:程序员的自我修养

     系统调用执行过程

 

计算机系统可以分为若干层,硬件层(Hardware)、操作系统内核层(Operating System Kernel)、运行库层(Runtime Library)、应用层(Web Browser, Image View etc.)。位于最底下的一层是硬件,它为操作系统内核提供接口,驱动硬件的程序(也就是驱动程序)往往是由硬件厂商完成的(操作系统开发者为硬件生产厂商提供了一系列接口和框架)。操作系统内核层对于硬件层来说是硬件接口的使用者,而对于运行库层来说,它是系统调用接口的提供者。系统调用接口在实现中往往以软件中断的方式提供,Linux中0x80号中断作为系统调用接口,Windows使用0x2E号中断作为系统调用接口。应用程序编程接口的提供者是运行库,什么样的运行库提供什么样的API。Linux下的Glibc库提供POSIX的API;Windows的运行库提供Windows API。

系统调用:系统调用的执行需要一个用户空间到内核空间的状态转换,不同的平台具有不同的指令可以完成这种转换,这种指令也被称作操作系统陷入(operating system trap)指令。 Linux通过软中断来实现这种陷入,具体对于X86架构来说,是软中断0x80,也即int $0x80汇编指令。软中断和我们常说的中断(硬件中断)不同之处在于-它由软件指令触发而并非由硬件外设引发。int 0x80指令被封装在C库中,对于用户应用来说,基于可移植性的考虑,不应该直接调用int $0x80指令。陷入指令的平台依赖性,也正是系统调用需要在C库进行封装的原因之一。 通过软中断0x80,系统会跳转到一个预设的内核空间地址,它指向了系统调用处理程序(不要和系统调用服务例程相混淆),即在arch/i386/kernel/entry.S文件中使用汇编语言编写的system_call函数。很显然,所有的系统调用都会统一跳转到这个地址进而执行system_call函数。软中断指令int 0x80执行时,系统调用号会被放入eax寄存器,同时,sys_call_table每一项占用4个字节。这样,system_call函数可以读取eax寄存器获得当前系统调用的系统调用号,将其乘以4生成偏移地址,然后以sys_call_table为基址,基址加上偏移地址所指向的内容即是应该执行的系统调用服务例程的地址。

为了提高CPU的利用率,需要对进程进行适当的调度。进程调度可以分为抢占式和非抢占式两种。常见的算法有:FIFO、SJF、轮转法。

为了提高内存的利用率,需要通过某种方法将内存分配给多个进程使用。直接在物理地址上分配主要有三个问题:1、地址空间不隔离;2、内存使用效率低;3、程序运行的地址不稳定。常见的内存管理的方法有段式、页式、段页式。

基础知识

标签:

原文地址:http://www.cnblogs.com/navitmin-home/p/4557410.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!