操作系统API的实现原理
操作系统也是一个进程,用户程序调用了API,不是跟函数调用一样吧,我觉得应该是转到了操作系统。如果是转到操作系统执行,这个用户程序调用操作系统是如何实现的?
另外,操作系统是一个进程,其中包含了进程调度功能,他能调度其他用户进程。可是谁来调度执行操作系统呢?
嗯,操作系统并没有单独的进程,其代码是在用户程序运行的过程,间隙中执行或许还有其他地方。
如,系统调用、进程切换、外部的一个中断信号到达等
“操作系统运行起来以后,假如说操作系统调度用户程序A执行,用户程序A运行过程中调用操作系统接口(API),例如exit函数(结束进程),这时必须从用户程序切换到操作系统吧,我的问题是从用户程序A切换到操作系统是如何实现的,也就是exit的实现原理。”新年祝福网页
这个通常是通过中断,你所描述的情况是系统调用,它通常是通过软件中断实现的。
另外关于调度程序何时执行的问题,系统通常是以时间片作为进行的执行时间单位。这个时间片的划分是通常CPU的字时器硬件来实现,在时间片完成时会产生系统中断,然后调试程序就会在这个时间点执行调度程序!需要说明的是这只是调度程序执行点的一中情况。如果某进程主动放充CPU、执行了一个异步的阻塞调用都会引发调试,对于可抢占内核,任何的一个外部事件中断都会引发调度程序的执行。
呵呵,大概就这样吧!可信部分,但不可将我说的作为任何的判断标准,因为我也是新手,有错难免,还望指出……
操作系统是进程?这是谁告诉你的?
系统调用,在Windows下:32位有int 2eh,sysenter,进入内核进行系统调用,在内核中的地址是由”模式指定寄存器“决定的(具体涉及到CPU架构的知识,你应该看看《Intel开发者手册》(卷三),学习下保护模式),64位是syscall。
进入内核的都是同一个地址,eax代表了函数的索引,然后在内核中复制参数,在内核中开始执行。
仅针对Windows平台.
在用户模式下调用系统API时,最开始是调用ntdll.dll中的存根函数,而在ntdll.dll的存根函数中会利用处理器的陷阱进制(int 2E)切换到内核模式下,在内核模式下,系统服务的分发函数KiSystemService获得执行权,根据服务ID从SSDT中查找要调用的服务函数地址和参数。