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

系统调用与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为整数),不需要向内核请求任何服务。

下面图片来自于网络:
linux-系统调用02-系统调用与C库函数的区别_第1张图片

(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.寄存器

通过系统调用号,相对于系统调用表,找到相应的系统调用服务程序。

你可能感兴趣的:([,linux基础,])