Linux内核中系统调用详解_第1页
Linux内核中系统调用详解_第2页
Linux内核中系统调用详解_第3页
Linux内核中系统调用详解_第4页
Linux内核中系统调用详解_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第第页Linux内核中系统调用详解什么是系统调用?

(Linux)内核中设置了一组用于实现各种系统功能的子程序,称为系统调用。用户可以通过系统调用命令在自己的应用程序中调用它们。从某种角度来看,系统调用和普通的函数调用非常相似。区别仅仅在于,系统调用由(操作系统)核心提供,运行于核心态;而普通的函数调用由函数库或用户自己提供,运行于用户态。

随Linux核心还提供了一些(C语言)函数库,这些库对系统调用进行了一些包装和扩展,因为这些库函数与系统调用的关系非常紧密,所以习惯上把这些函数也称为系统调用。

为什么要用系统调用?

实际上,很多已经被我们习以为常的C语言标准函数,在Linux平台上的实现都是靠系统调用完成的,所以如果想对系统底层的原理作深入的了解,掌握各种系统调用是初步的要求。进一步,若想成为一名Linux下(编程)高手,也就是我们常说的Hacker,其标志之一也是能对各种系统调用有透彻的了解。

即使除去上面的原因,在平常的编程中你也会发现,在很多情况下,系统调用是实现你的想法的简洁有效的途径,所以有可能的话应该尽量多掌握一些系统调用,这会对你的程序设计过程带来意想不到的帮助。

系统调用是怎么工作的?

一般的,进程是不能访问内核的。它不能访问内核所占内存空间也不能调用内核函数。(CPU)(硬件)决定了这些(这就是为什么它被称作"保护模式")。系统调用是这些规则的一个例外。其原理是进程先用适当的值填充(寄存器),然后调用一个特殊的指令,这个指令会跳到一个事先定义的内核中的一个位置(当然,这个位置是用户进程可读但是不可写的)。在(Intel)CPU中,这个由中断0x80实现。硬件知道一旦你跳到这个位置,你就不是在限制模式下运行的用户,而是作为操作系统的内核--所以你就可以为所欲为。

进程可以跳转到的内核位置叫做sysem_call。这个过程检查系统调用号,这个号码告诉内核进程请求哪种服务。然后,它查看系统调用表(sys_call_table)找到所调用的内核函数入口地址。接着,就调用函数,等返回后,做一些系统检查,最后返回到进程(或到其他进程,如果这个进程时间用尽)。

具体过程如下图所示:

如何使用系统调用?

先来看一个例子:

这是因为在(ti)me.h中实际上已经用库函数的形式实现了time这个系统调用,替我们省掉了调用_syscall1宏展开得到函数原型这一步。

大多数系统调用都在各种C语言函数库中有所实现,所以在一般情况下,我们都可以像调用普通的库函数那样调用系统调用,只在极个别的情况下,我们才有机会用到_syscall*()这几个宏。

调用性能问题

系统调用需要从用户空间陷入内核空间,处理完后,又需要返回用户空间。其中除了系统调用服务例程的实际耗时外,陷入/返回过程和系统调用处理程序(查系统调用表、存储恢复用户现场)也需要花销一些时间,这些时间加起来就是一个系统调用的响应速度。系统调用不比别的用户程序,它对性能要求很苛刻,因为它需要陷入内核执行,所以和其他内核程序一样要求代码简洁、执行迅速。幸好Linux具有令人难以置信的上下文切换速度,使得其进出内核都被优化得简洁高效;同时所有Linux系统调用处理程序和每个系统调用本身也都非常简洁。

绝大多数情况下,Linux系统调用性能是可以接受的,但是对于一些对性能要求非常高的应用来说,它们虽然希望利用系统调用的服务,但却希望加快相应速度,避免陷入/返回和系统调用处理程序带来的花销,因此采用由内核直接调用系统调用服务例程,最好的例子就HTTPD——它为了避免上述开销,从内核调用socket等系统调用服务例程。

Linux系统调用列表

·进程控制

f(or)k创建一个新进程

clone按指定条件创建子进程

execve运行可执行文件

exit中止进程

_exit立即中止当前进程

getdtablesize进程所能打开的最大文件数

getpgid获取指定进程组标识号

setpgid设置指定进程组标志号

getpgrp获取当前进程组标识号

setpgrp设置当前进程组标志号

get(pi)d获取进程标识号

getppid获取父进程标识号

getpriority获取调度优先级

setpriority设置调度优先级

modify_ldt读写进程的本地描述表

nanosleep使进程睡眠指定的时间

n(ic)e改变分时进程的优先级

pause挂起进程,等待(信号)

pe(rs)onality设置进程运行域

prctl对进程进行特定操作

ptrace进程跟踪

sched_get_priority_max取得静态优先级的上限

sched_get_priority_min取得静态优先级的下限

sched_getpa(ram)取得进程的调度参数

sched_getscheduler取得指定进程的调度策略

sched_rr_get_interval取得按RR(算法)调度的实时进程的时间片长度

sched_setparam设置进程的调度参数

sched_setscheduler设置指定进程的调度策略和参数

sched_yield进程主动让出(处理器),并将自己等候调度队列队尾

vfork创建一个子进程,以供执行新程序,常与execve等同时使用

w(ai)t等待子进程终止

wait3参见wait

waitpid等待指定子进程终止

wait4参见waitpid

capget获取进程权限

capset设置进程权限

getsid获取会晤标识号

setsid设置会晤标识号

·文件系统控制

1.文件读写操作

fcntl文件控制

open打开文件

creat创建新文件

close关闭文件描述字

re(ad)读文件

wri(te)写文件

readv从文件读入数据到缓冲数组中

writev将缓冲数组里的数据写入文件

pread对文件随机读

pwrite对文件随机写

lseek移动文件指针

_llseek在64位地址空间里移动文件指针

dup复制已打开的文件描述字

dup2按指定条件复制文件描述字

flock文件加/解锁

pollI/O多路转换

truncate截断文件

ftruncate参见truncate

umask设置文件权限掩码

fsync把文件在内存中的部分写回磁盘

2.文件系统操作

(ac)cess确定文件的可存取性

chdir改变当前工作目录

fchdir参见chdir

chmod改变文件方式

fchmod参见chmod

chown改变文件的属主或用户组

fchown参见chown

lchown参见chown

chroot改变根目录

stat取文件状态信息

lstat参见stat

fstat参见stat

statfs取文件系统信息

fstatfs参见statfs

readdir读取目录项

getdents读取目录项

mkdir创建目录

mknod创建索引节点

rmdir删除目录

rename文件改名

link创建链接

symlink创建符号链接

unlink删除链接

readlink读符号链接的值

mount安装文件系统

umount卸下文件系统

ustat取文件系统信息

utime改变文件的访问修改时间

utimes参见utime

quotactl控制磁盘配额

·系统控制

ioctlI/O总控制函数

_sysctl读/写系统参数

acct启用或禁止进程记账

getrlimit获取系统资源上限

setrlimit设置系统资源上限

getrusage获取系统资源使用情况

uselib选择要使用的二进制函数库

ioperm设置(端口)I/O权限

iopl改变进程I/O权限级别

outb低级端口操作

reboot重新启动

swapon打开交换文件和设备

swapoff关闭交换文件和设备

bdflush控制bdflush守护进程

sysfs取核心支持的文件系统类型

sysinfo取得系统信息

adjtimex调整系统(时钟)

al(arm)设置进程的闹钟

getitimer获取计时器值

setitimer设置计时器值

gettimeofday取时间和时区

settimeofday设置时间和时区

stime设置系统日期和时间

time取得系统时间

times取进程运行时间

uname获取当前UNIX系统的名称、版本和主机等信息

vhangup挂起当前终端

nfsservctl对NFS守护进程进行控制

vm86进入(模拟)8086模式

create_module创建可装载的模块项

delete_module删除可装载的模块项

init_module初始化模块

query_module查询模块信息

*get_kernel_syms取得核心符号,已被query_module代替

·内存管理

brk改变数据段空间的分配

sbrk参见brk

mlock内存页面加锁

munlock内存页面解锁

mlockall调用进程所有内存页面加锁

munlockall调用进程所有内存页面解锁

mmap映射虚拟内存页

munmap去除内存页映射

mremap重新映射虚拟内存地址

msync将映射内存中的数据写回磁盘

mprotect设置内存映像保护

getpagesize获取页面大小

sync将内存缓冲区数据写回硬盘

cacheflush将指定缓冲区中的内容写回磁盘

·(网络)管理

getdomainname取域名

setdomainname设置域名

gethostid获取主机标识号

sethostid设置主机标识号

gethostname获取本主机名称

sethostname设置主机名称

·socket控制

socketcallsocket系统调用

socket建立socket

bind绑定socket到端口

connect连接远程主机

accept响应socket连接请求

send通过socket发送信息

sendto发送UDP信息

sendmsg参见send

recv通过socket接收信息

recvfrom接收UDP信息

recvmsg参见recv

listen监听socket端口

select对多路同步I/O进行轮询

shutdown关闭socket上的连接

getsockname取得本地socket名字

getpeername获取(通信)对方的socket名字

getsockopt取端口设置

setsockopt设置端口参数

sendfile在文件或端口间传输数据

socketpair创建一对已联接的无名socket

·用户管理

getuid获取用户标识号

setuid设置用户标志号

getgid获取组标识号

setgid设置组标志号

getegid获取有效组标识号

setegid设置有效组标识号

geteuid获取有效用户标识号

seteuid设置有效用户标识号

setregid分别设置真实和有效的的组标识号

setreuid分别设置真实和有效的用户标识号

getresgid分别获取真实的,有效的和保存过的组标识号

setresgid分别设置真实的,有效的和保存过的组标识号

getresuid分别获取真实的,有效的和保存过的用户标识号

setresuid分别设置真实的,有效的和保存过的用户标识号

se(tf)sgid设置文件系统检查时使用的组标识号

setfsuid设置文件系统检查时使用的用户标识号

getgroups获取后补组标志清单

setgroups设置后补组标志清单

·进程间通信

ipc进程间通信总控制调用

信号

sigaction设置对指定信号的处理方法

sigprocmask根据参数对信号集中的信号执行阻塞/解除阻塞等

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论