您的位置:首页 > 运维架构 > Linux

linux-系统调用02-系统调用与C库函数的区别

2015-11-29 15:51 831 查看

系统调用与C库函数的区别

操作系统的核心是内核,内核控制系统的软硬件资源。必要时分配硬件,需要时执行软件。通过系统调用访问内核,获取想要的资源。

1系统调用分类:(内核4大模块)

<1>.内存管理 (cat /proc/meminfo)

<2>.设备管理(字符,块,网络)

<3>.文件系统管理(ext2,ext3,vfat,iso9660等)

<4>.进程管理(ps)

<1>.内存管理

负责内存管理,物理内存管理、虚拟内存(交换分区)的创建以及管理。

例如:

查看内存状况:Cat /proc/meminfo

查看共享内存:Ipcs -m

常用的内存访问方面系统调用:

brk、mlock、mlockall、mmap、mprotect、mremap、msync、munlock、munlockall、munmap等

<2>.设备管理

内核的硬件管理。

常用的设备访问方面系统调用:

Access、chmod、chown、close、dup、fcntl、fstat、ioctl、link、lseek、mknod、open、read、write等。

<3>.文件系统管理(几乎支持所有常见文件系统)

在各种文件系统之上,linux实现了一种虚拟文件系统,通过这种虚拟文件系统与每一种文件系统交互,提供标准接口。

常用的文件系统访问方面系统调用:

chdir、chroot、flock、statfs、getcwd、mkdir、rmdir、symlink、umask、mount、swapon、swapoff等。

<4>.进程管理

把程序以进程的方式来管理。

常用的进程管理方面系统调用:

Acct、capget、capset、clone、execve、exit、fork、getgid、getgrp、getppid、getpriority、getuid、kill、nice、vfork等。

2 关于man手册

man 2 exit ===》2用于查看系统调用

man 3 exit ===》3用于查看C库函数

3 系统调用、POSIX、C库、内核函数

<1>.系统调用和POSIX

系统调用是内核和用户应用程序之间的沟通桥梁,是用户应用程序访问内核的入口点。

在UNIX世界里,最通用的操作系统API基于POSIX(Portable Operating System Interface of UNIX,可移植操作系统接口)标准。UNIX于20世纪70年代诞生于Bell lab,

后来很多商业厂家意识到UNIX的价值,也纷纷以System V或BSD为基础来开发自己的UNIX,较著名的有Sun OS、AIX、VMS等。各厂家对UNIX的开发各自为政,UNIX的版本相当混乱,给软件的可移植性带来很大困难,为结束这种局面,IEEE制订了POSIX标准,提高UNIX环境下应用程序的可移植性。

然而,POSIX并不局限于UNIX。Linux兼容于POSIX标准,提供了根据POSIX而定义的API函数。这些API函数和系统调用之间有着直接的关系,一个API函数可以由一个系统调用实现,也可以通过调用多个系统调用来实现,还可以完全不使用任何系统调用。

<2>.系统调用和C库(如下图所示)

操作系统API通常都以C库的方式提供,Linux也是如此。

情况1:

一对一:系统调用与其C库封装函数的名称常常相同,比如,read系统调用在C库中的封装函数即为read函数。

情况2:

多对一。比如malloc函数和free函数都是通过brk系统调用来扩大或缩小进程的堆栈。

execl、execlp、execle、execv、execvp和execve函数都是通过execve系统调用来执行一个可执行文件。

情况3:

一对多:一个函数调用多个系统调用。(printf)

情况4:

一对0:不依赖于任何系统调用,比如strcpy函数(复制字符串)和atoi函数(转换ASCII为整数),不需要向内核请求任何服务。

下面图片来自于网络:



(4)系统调用和内核函数。

内核函数与C库函数的区别仅仅是内核函数在内核实现,遵守内核编程的规则。用户应用程序通过系统调用进入内核后,会执行各个系统调用对应的内核函数,即系统调用服务例程,比如系统调用getpid的服务例程是内核函数sys_getpid。

4 系统调用表

/linux-3.0/arch/arm/kernel/calls.S

5系统调用号

/linux-3.0/include/asm-generic/unistd.h

例如unistd.h中的片段:

/* fs/ioctl.c */:

#define __NR_ioctl 29
__SC_COMP(__NR_ioctl, sys_ioctl, compat_sys_ioctl)


6 系统调用服务例程

/linux-3.0/include/linux/syscalls.h

asmlinkage long sys_gettid(void);

注:函数定义中必须添加asmlinkage标记,通知编译器仅从堆栈中获取该函数的参数。《汇编语言程序设计》书中提到,关于函数传递参数三种方式:

1.堆栈(c语言的方式)

2.全局变量(汇编中)

3.寄存器

通过系统调用号,相对于系统调用表,找到相应的系统调用服务程序。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: