http://www.alphway.org

系统调用 - 与内核通信

与内核通信

操作系统(内核)相当于是在应用程序和硬件之间添加了一个中间层。所以应用程序是不能够直接访问硬件设备的,只能使用内核向外提供的一组接口,这些接口让应用程序受限地访问硬件设备。我们把调用这些接口的过程叫做系统调用。

这样做的好处是:

(1)它为应用程序提供了一种硬件的抽象接口。例如你要读取文件时,不需要关心该机器使用的是机械硬盘还是固态硬盘,也不用去管该操作系统使用的是何种的文件系统,只需要调用操作系统提供的read()函数接口就好了。

(2)系统调用保证了系统的稳定性和安全性。如果没有系统调用,那么每个应用程序都可以不用向内核申请就可以访问硬件资源,如果该硬件资源正在被其它应用程序访问,那么就会出现不可预知的错误,甚至导致操作系统的崩溃。

 

应用程序接口(API)

那么大家可能就有疑问了 ,我访问磁盘文件,不是调用编程语言所提供的API去访问吗,怎么是系统调用呢。

这是因为如果某些API涉及很底层的操作,那么这些API肯定是调用系统调用来实现的,系统调用提供了对这些底层功能的操作。

其实软件开发行业,API无非是一层一层的调用累积起来的。例如JAVA的API就是构建在操作系统提供的接口之上,而各种框架的API,又构建在JAVA的API之上。

 

用户态和内核态的切换

操作系统有用户态和内核态两个概念,用户态的权限小于内核态的权限,即某些代码只能在内核态的状态下执行。

普通的用户程序运行在用户态下,而内核代码则运行在内核态下。

用户应用程序虽然可以调用系统调用,但是却无法直接执行内核代码,因为内核驻留在受保护的地址空间上,如果用户应用程序可以直接在内核的地址空间上读写的话,系统的安全性和稳定性将不复存在。简单点解释就是用户应用程序不能执行哪些超过它们权限的代码,如何可以的话,那么用户应用程序可以胡乱修改内核的地址空间,那么是非常不安全的。

所以当用户应用程序调用系统调用时,通过中断通知系统自己需要请求一个系统调用,希望系统切换到内核态代为自己执行该系统调用,然后把结果返回给自己。这样肯定是安全的,因为系统调用是系统所提供的,没理由自己执行自己写的代码会出现安全问题。当然如果内核代码有bug的话就另说了。

该文章在我的个人博客的地址:http://www.alphaway.org/post-425.html

posted @ 2016-04-13 13:08  litten007  阅读(766)  评论(0编辑  收藏  举报