什么是系统调用
进程的内存空间分为用户空间和内核空间两部分,内核空间运行在特权级,用户空间运行在非特权级,并且用户空间是不能直接访问内核空间的。为此,内核向用户空间提供了有限制的访问,即系统调用。
由于系统调用是偏底层的,不同平台提供的系统调用不同,为了屏蔽系统调用的各种细节,增加通用性和跨平台性,系统又向用户进程提供了API,用户进程可以通过API来访问系统调用。
如何查看系统列表
同架构不同位数的系统,系统调用编号是不一样的。如果用户空间传递的系统调用编号和内核里的系统调用编号对不上,那问题就严重了。Linux内核在编译时会生成一个文件,arch/x86/include/generated/uapi/asm/unistd_64.h,这个文件是生成的,不是本来就有的,这个文件里面有所有系统调用的编号。在安装操作系统时或者单独安装内核和内核头文件时,这个文件会被安装在**/usr/include/asm/unistd_64.h**,libc会使用这个文件,这样用户空间传递的编号和内核里面的系统调用编号就是一致的了。
#ifndef _ASM_X86_UNISTD_64_H
#define _ASM_X86_UNISTD_64_H 1
#define __NR_read 0
#define __NR_write 1
#define __NR_open 2
#define __NR_close 3
#define __NR_stat 4
#define __NR_fstat 5
#define __NR_lstat 6
#define __NR_poll 7
#define __NR_lseek 8
#define __NR_mmap 9
#define __NR_mprotect 10
#define __NR_munmap 11
#define __NR_brk 12
#define __NR_rt_sigaction 13
#define __NR_rt_sigprocmask 14
#define __NR_rt_sigreturn 15
#define __NR_ioctl 16
#define __NR_pread64 17
...