|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
Linux系统调用( h: g' P6 ^. }+ G" q. {( X1 _! i
% k) W! V, T2 f4 k7 g) h 系统调用指操作系统提供给用户程序调用的一组“特殊”接口,用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务。
) i9 G1 x9 e! X1 s2 k& Q! g, x" ?
' X' C- [* m, J6 ? 为什么用户程序不能直接访问系统内核提供的服务呢?这是由于在Linux中,为了更好地保护内核空间,将程序的运行空间分为用户空间和内核空间(也就是常称的用户态和内核态),它们分别运行在不同的级别上,逻辑上是相互分离的。因此,用户进程通常情况下不允许访问内核数据,也无法使用内核函数,它们只能在用户空间操作用户数据,调用用户空间的函数。
" c0 T3 ?! h$ D c6 d" S% ^& |2 R. Z* r* |, z2 ?* J
但是,在有些情况下,用户空间的进程需要获得一定的系统服务(调用内核空间程序),这时操作系统就必须利用系统提供用户的“特殊接口”———系统调用规定用户进程进入内核空间的具体位置。在进行系统调用时,程序运行空间需要从用户空间进入内核空间,处理完成后再返回用户空间。
4 N% t+ {. j& p( d' S1 s5 W6 O& B/ \5 i
Linux系统调用还算精简(只有250个左右),它继承了UNIX系统调用中最基本和最有用的部分。这些系统调用按照功能逻辑大致可分为进程控制、进程间通信、文件系统控制、存储管理、网络管理、套接字控制、用户管理等几类。
) f3 o( h! \7 y* E( v, B
) c$ R+ ?, ]) P9 [2 S- [用户编程接口(API)
( p7 D8 u8 N1 P. H7 p
7 N9 _6 d* C5 x" j. D- m% d4 @2 b 前面讲到的系统调用并不直接与程序员进行交互,它仅仅是一个通过软中断机制向内核提交请求以获取内核服务的接口。实际使用中,程序员调用的通常都是用户编程接口(API)。
" A" @8 X! }* ^8 j1 }$ [$ }+ m& Z6 I4 O: L- x
例如,创建进程的API函数fork()函数对应于内核空间的sys_fork()系统调用,但并不是所有的函数都对应一个系统调用。有时,一个API函数会需要几个系统调用来共同完成函数的功能,甚至还有一些API函数不需要调用相应的系统调用(因此它所完成的不是内核提供的服务)。. z4 y/ G; O7 a3 @0 E9 C
; ~) f1 W! F' d' L. s9 n) D. i系统命令6 ~- D6 q6 O3 y% o$ O
- Y; r" q3 v! `0 Y+ f5 L
系统命令相对于API更高了一层,它实际上是一个可执行程序,它的内部引用了用户编程接口(API)来实现相应的功能,它们之间的关系如下图1:
3 R. L! H/ e/ f |1 ]/ x
% @9 ^2 w3 m% o9 ^1 B# O. v+ T
. X4 f5 G7 K a: o4 P4 u1 [
' s9 @7 m+ C, z0 Q, L) G
, [. Q- ~: X f# K' f* e8 l- U" ], v3 I1 \
6 ~# r" E- |$ Y7 L+ m# P1 Y
8 ^( }7 y! A) D/ {& s' F/ ]: f, r' S z, U5 w, M
5 t9 L$ ]) d6 u1 ?9 d4 b( H2 ^' n7 b* G( I# u
# H2 i* G( m3 s. X; _ |
|