Chinaunix首页 | 论坛 | 博客
  • 博客访问: 417107
  • 博文数量: 61
  • 博客积分: 1991
  • 博客等级: 上尉
  • 技术积分: 492
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-08 12:28
文章分类

全部博文(61)

文章存档

2011年(5)

2010年(21)

2009年(3)

2008年(4)

2007年(28)

我的朋友

分类: BSD

2007-05-09 19:32:10

用户级代码和系统级代码的界限是被由硬件提供的硬件保护工具强制划分的。内核操作是在单独的地址空间进行,这个空间是用户进程不能访问的。有些有特权的操作(如开始I/O、中断CPU)只能被内核使用。应用程序使用系统调用想操作系统请求服务。系统调用是用来让内核执行一些复杂操作(如将数据写入二级缓存)和一些简单操作(如返回当前时间)。所有系统调用都是同步的:当内核执行一个与系统调用相关的动作时应用程序不能发生动作。在系统调用返回后,内核仍可以执行一些与系统调用相关的动作。例如write这个系统调用,它将从用户进程的内存中拷贝数据到内核的缓冲,此时用户进程必须等待;但是它通常在数据真正写到磁盘之前就返回。

一个系统调用通常作为一个硬件闸来执行,它改变CPU的运行模式和当前的内存地址空间映像。在系统调用执行之前,内核会验证用户在为系统调用提供的参数。这种验证确保系统的完整性。传递到内核的参数会被拷贝到内核的地址空间,这样确保验证的参数不会被改变。系统调用的执行结果被返回到硬件寄存器中或拷贝到用户指定的内存地址。与传递到内核的参数一样,存放返回结构的地址也要被验证,以确保它是应用程序地址空间的一部分。如果内核在执行系统调用时遇到错误,它将返回一个错误码给用户。对于C语言来说,这个错误码存储在全局变量errno中,被用来执行系统调用的函数会返回-1。

用户程序与内核操作彼此独立。FreeBSD不会在用户应用程序的地址空间中存储I/O控制块和其他与操作系统相关的数据结构。每个用户级应用程序在执行时都会有一个独立的地址空间。内核会产生很多无形中与进程有关的状态,比如当一个进程运行时就会把另外一个进程挂起。

阅读(1520) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~