linux-系统调用过程

调用过程:

用户空间->内核空间

INT 0x80(封装在C库函数中) -->system_call(系统调用处理程序)-->系统调用服务例程 -->内核程序

系统调用时通过软中断指令INT 0x80实现的,这条指令会让系统跳转到一个预先设置好的内核地址,指向系统调用处理程序system_call。

系统调用服务例程是对一个具体的系统调用的内核实现函数。执行任何系统调用,都需要先调用C库中的函数,触发INT 0x80中断,跳转到系统调用处理程序,从而通过系统调用号查找系统调用表sys_call_table[__NR_syscall_max+1]。主要可以看

<unistd_32.h>

#ifndef _ASM_X86_UNISTD_32_H
#define _ASM_X86_UNISTD_32_H

/*
 * This file contains the system call numbers.
 */

#define __NR_restart_syscall      0
#define __NR_exit		  1
#define __NR_fork		  2
#define __NR_read		  3
#define __NR_write		  4
#define __NR_open		  5
#define __NR_close		  6
#define __NR_waitpid		  7
#define __NR_creat		  8
#define __NR_link		  9
#define __NR_unlink		 10
#define __NR_execve		 11
#define __NR_chdir		 12
#define __NR_time		 13
#define __NR_mknod		 14
#define __NR_chmod		 15
#define __NR_lchown		 16
#define __NR_break		 17
#define __NR_oldstat		 18
#define __NR_lseek		 19
#define __NR_getpid		 20
#define __NR_mount		 21
#define __NR_umount		 22
#define __NR_setuid		 23
#define __NR_getuid		 24
#define __NR_stime		 25
#define __NR_ptrace		 26
#define __NR_alarm		 27
#define __NR_oldfstat		 28
#define __NR_pause		 29
#define __NR_utime		 30
#define __NR_stty		 31
#define __NR_gtty		 32
#define __NR_access		 33
#define __NR_nice		 34
#define __NR_ftime		 35
#define __NR_sync		 36
#define __NR_kill		 37
#define __NR_rename		 38
#define __NR_mkdir		 39
#define __NR_rmdir		 40
#define __NR_dup		 41
#define __NR_pipe		 42
#define __NR_times		 43
#define __NR_prof		 44
#define __NR_brk		 45
#define __NR_setgid		 46
#define __NR_getgid		 47
#define __NR_signal		 48
#define __NR_geteuid		 49
#define __NR_getegid		 50
#define __NR_acct		 51
#define __NR_umount2		 52
#define __NR_lock		 53
#define __NR_ioctl		 54
#define __NR_fcntl		 55
#define __NR_mpx		 56
#define __NR_setpgid		 57
#define __NR_ulimit		 58
#define __NR_oldolduname	 59
#define __NR_umask		 60
#define __NR_chroot		 61
#define __NR_ustat		 62
#define __NR_dup2		 63
#define __NR_getppid		 64
#define __NR_getpgrp		 65
#define __NR_setsid		 66
#define __NR_sigaction		 67
#define __NR_sgetmask		 68
#define __NR_ssetmask		 69
#define __NR_setreuid		 70
#define __NR_setregid		 71
#define __NR_sigsuspend		 72
#define __NR_sigpending		 73
#define __NR_sethostname	 74
#define __NR_setrlimit		 75
#define __NR_getrlimit		 76   /* Back compatible 2Gig limited rlimit */
#define __NR_getrusage		 77
#define __NR_gettimeofday	 78
#define __NR_settimeofday	 79
#define __NR_getgroups		 80
#define __NR_setgroups		 81
#define __NR_select		 82
#define __NR_symlink		 83
#define __NR_oldlstat		 84
#define __NR_readlink		 85
#define __NR_uselib		 86
#define __NR_swapon		 87
#define __NR_reboot		 88
#define __NR_readdir		 89
#define __NR_mmap		 90
#define __NR_munmap		 91
#define __NR_truncate		 92
#define __NR_ftruncate		 93
#define __NR_fchmod		 94
#define __NR_fchown		 95
#define __NR_getpriority	 96
#define __NR_setpriority	 97
#define __NR_profil		 98
#define __NR_statfs		 99
#define __NR_fstatfs		100
#define __NR_ioperm		101
#define __NR_socketcall		102
#define __NR_syslog		103
#define __NR_setitimer		104
#define __NR_getitimer		105
#define __NR_stat		106
#define __NR_lstat		107
#define __NR_fstat		108
#define __NR_olduname		109
#define __NR_iopl		110
#define __NR_vhangup		111
#define __NR_idle		112
#define __NR_vm86old		113
#define __NR_wait4		114
#define __NR_swapoff		115
#define __NR_sysinfo		116
#define __NR_ipc		117
#define __NR_fsync		118
#define __NR_sigreturn		119
#define __NR_clone		120
#define __NR_setdomainname	121
#define __NR_uname		122
#define __NR_modify_ldt		123
#define __NR_adjtimex		124
#define __NR_mprotect		125
#define __NR_sigprocmask	126
#define __NR_create_module	127
#define __NR_init_module	128
#define __NR_delete_module	129
#define __NR_get_kernel_syms	130
#define __NR_quotactl		131
#define __NR_getpgid		132
#define __NR_fchdir		133
#define __NR_bdflush		134
#define __NR_sysfs		135
#define __NR_personality	136
#define __NR_afs_syscall	137 /* Syscall for Andrew File System */
#define __NR_setfsuid		138
#define __NR_setfsgid		139
#define __NR__llseek		140
#define __NR_getdents		141
#define __NR__newselect		142
#define __NR_flock		143
#define __NR_msync		144
#define __NR_readv		145
#define __NR_writev		146
#define __NR_getsid		147
#define __NR_fdatasync		148
#define __NR__sysctl		149
#define __NR_mlock		150
#define __NR_munlock		151
#define __NR_mlockall		152
#define __NR_munlockall		153
#define __NR_sched_setparam		154
#define __NR_sched_getparam		155
#define __NR_sched_setscheduler		156
#define __NR_sched_getscheduler		157
#define __NR_sched_yield		158
#define __NR_sched_get_priority_max	159
#define __NR_sched_get_priority_min	160
#define __NR_sched_rr_get_interval	161
#define __NR_nanosleep		162
#define __NR_mremap		163
#define __NR_setresuid		164
#define __NR_getresuid		165
#define __NR_vm86		166
#define __NR_query_module	167
#define __NR_poll		168
#define __NR_nfsservctl		169
#define __NR_setresgid		170
#define __NR_getresgid		171
#define __NR_prctl              172
#define __NR_rt_sigreturn	173
#define __NR_rt_sigaction	174
#define __NR_rt_sigprocmask	175
#define __NR_rt_sigpending	176
#define __NR_rt_sigtimedwait	177
#define __NR_rt_sigqueueinfo	178
#define __NR_rt_sigsuspend	179
#define __NR_pread64		180
#define __NR_pwrite64		181
#define __NR_chown		182
#define __NR_getcwd		183
#define __NR_capget		184
#define __NR_capset		185
#define __NR_sigaltstack	186
#define __NR_sendfile		187
#define __NR_getpmsg		188	/* some people actually want streams */
#define __NR_putpmsg		189	/* some people actually want streams */
#define __NR_vfork		190
#define __NR_ugetrlimit		191	/* SuS compliant getrlimit */
#define __NR_mmap2		192
#define __NR_truncate64		193
#define __NR_ftruncate64	194
#define __NR_stat64		195
#define __NR_lstat64		196
#define __NR_fstat64		197
#define __NR_lchown32		198
#define __NR_getuid32		199
#define __NR_getgid32		200
#define __NR_geteuid32		201
#define __NR_getegid32		202
#define __NR_setreuid32		203
#define __NR_setregid32		204
#define __NR_getgroups32	205
#define __NR_setgroups32	206
#define __NR_fchown32		207
#define __NR_setresuid32	208
#define __NR_getresuid32	209
#define __NR_setresgid32	210
#define __NR_getresgid32	211
#define __NR_chown32		212
#define __NR_setuid32		213
#define __NR_setgid32		214
#define __NR_setfsuid32		215
#define __NR_setfsgid32		216
#define __NR_pivot_root		217
#define __NR_mincore		218
#define __NR_madvise		219
#define __NR_madvise1		219	/* delete when C lib stub is removed */
#define __NR_getdents64		220
#define __NR_fcntl64		221
/* 223 is unused */
#define __NR_gettid		224
#define __NR_readahead		225
#define __NR_setxattr		226
#define __NR_lsetxattr		227
#define __NR_fsetxattr		228
#define __NR_getxattr		229
#define __NR_lgetxattr		230
#define __NR_fgetxattr		231
#define __NR_listxattr		232
#define __NR_llistxattr		233
#define __NR_flistxattr		234
#define __NR_removexattr	235
#define __NR_lremovexattr	236
#define __NR_fremovexattr	237
#define __NR_tkill		238
#define __NR_sendfile64		239
#define __NR_futex		240
#define __NR_sched_setaffinity	241
#define __NR_sched_getaffinity	242
#define __NR_set_thread_area	243
#define __NR_get_thread_area	244
#define __NR_io_setup		245
#define __NR_io_destroy		246
#define __NR_io_getevents	247
#define __NR_io_submit		248
#define __NR_io_cancel		249
#define __NR_fadvise64		250
/* 251 is available for reuse (was briefly sys_set_zone_reclaim) */
#define __NR_exit_group		252
#define __NR_lookup_dcookie	253
#define __NR_epoll_create	254
#define __NR_epoll_ctl		255
#define __NR_epoll_wait		256
#define __NR_remap_file_pages	257
#define __NR_set_tid_address	258
#define __NR_timer_create	259
#define __NR_timer_settime	(__NR_timer_create+1)
#define __NR_timer_gettime	(__NR_timer_create+2)
#define __NR_timer_getoverrun	(__NR_timer_create+3)
#define __NR_timer_delete	(__NR_timer_create+4)
#define __NR_clock_settime	(__NR_timer_create+5)
#define __NR_clock_gettime	(__NR_timer_create+6)
#define __NR_clock_getres	(__NR_timer_create+7)
#define __NR_clock_nanosleep	(__NR_timer_create+8)
#define __NR_statfs64		268
#define __NR_fstatfs64		269
#define __NR_tgkill		270
#define __NR_utimes		271
#define __NR_fadvise64_64	272
#define __NR_vserver		273
#define __NR_mbind		274
#define __NR_get_mempolicy	275
#define __NR_set_mempolicy	276
#define __NR_mq_open 		277
#define __NR_mq_unlink		(__NR_mq_open+1)
#define __NR_mq_timedsend	(__NR_mq_open+2)
#define __NR_mq_timedreceive	(__NR_mq_open+3)
#define __NR_mq_notify		(__NR_mq_open+4)
#define __NR_mq_getsetattr	(__NR_mq_open+5)
#define __NR_kexec_load		283
#define __NR_waitid		284
/* #define __NR_sys_setaltroot	285 */
#define __NR_add_key		286
#define __NR_request_key	287
#define __NR_keyctl		288
#define __NR_ioprio_set		289
#define __NR_ioprio_get		290
#define __NR_inotify_init	291
#define __NR_inotify_add_watch	292
#define __NR_inotify_rm_watch	293
#define __NR_migrate_pages	294
#define __NR_openat		295
#define __NR_mkdirat		296
#define __NR_mknodat		297
#define __NR_fchownat		298
#define __NR_futimesat		299
#define __NR_fstatat64		300
#define __NR_unlinkat		301
#define __NR_renameat		302
#define __NR_linkat		303
#define __NR_symlinkat		304
#define __NR_readlinkat		305
#define __NR_fchmodat		306
#define __NR_faccessat		307
#define __NR_pselect6		308
#define __NR_ppoll		309
#define __NR_unshare		310
#define __NR_set_robust_list	311
#define __NR_get_robust_list	312
#define __NR_splice		313
#define __NR_sync_file_range	314
#define __NR_tee		315
#define __NR_vmsplice		316
#define __NR_move_pages		317
#define __NR_getcpu		318
#define __NR_epoll_pwait	319
#define __NR_utimensat		320
#define __NR_signalfd		321
#define __NR_timerfd_create	322
#define __NR_eventfd		323
#define __NR_fallocate		324
#define __NR_timerfd_settime	325
#define __NR_timerfd_gettime	326
#define __NR_signalfd4		327
#define __NR_eventfd2		328
#define __NR_epoll_create1	329
#define __NR_dup3		330
#define __NR_pipe2		331
#define __NR_inotify_init1	332
#define __NR_preadv		333
#define __NR_pwritev		334
#define __NR_rt_tgsigqueueinfo	335
#define __NR_perf_event_open	336
#define __NR_recvmmsg		337

#ifdef __KERNEL__

#define NR_syscalls 338

#define __ARCH_WANT_IPC_PARSE_VERSION
#define __ARCH_WANT_OLD_READDIR
#define __ARCH_WANT_OLD_STAT
#define __ARCH_WANT_STAT64
#define __ARCH_WANT_SYS_ALARM
#define __ARCH_WANT_SYS_GETHOSTNAME
#define __ARCH_WANT_SYS_IPC
#define __ARCH_WANT_SYS_PAUSE
#define __ARCH_WANT_SYS_SGETMASK
#define __ARCH_WANT_SYS_SIGNAL
#define __ARCH_WANT_SYS_TIME
#define __ARCH_WANT_SYS_UTIME
#define __ARCH_WANT_SYS_WAITPID
#define __ARCH_WANT_SYS_SOCKETCALL
#define __ARCH_WANT_SYS_FADVISE64
#define __ARCH_WANT_SYS_GETPGRP
#define __ARCH_WANT_SYS_LLSEEK
#define __ARCH_WANT_SYS_NICE
#define __ARCH_WANT_SYS_OLD_GETRLIMIT
#define __ARCH_WANT_SYS_OLD_UNAME
#define __ARCH_WANT_SYS_OLD_MMAP
#define __ARCH_WANT_SYS_OLD_SELECT
#define __ARCH_WANT_SYS_OLDUMOUNT
#define __ARCH_WANT_SYS_SIGPENDING
#define __ARCH_WANT_SYS_SIGPROCMASK
#define __ARCH_WANT_SYS_RT_SIGACTION
#define __ARCH_WANT_SYS_RT_SIGSUSPEND

/*
 * "Conditional" syscalls
 *
 * What we want is __attribute__((weak,alias("sys_ni_syscall"))),
 * but it doesn't work on all toolchains, so we just do it by hand
 */
#ifndef cond_syscall
#define cond_syscall(x) asm(".weak\t" #x "\n\t.set\t" #x ",sys_ni_syscall")
#endif

#endif /* __KERNEL__ */
#endif /* _ASM_X86_UNISTD_32_H */

<unistd_64.h>

#define __NR_read				0
__SYSCALL(__NR_read, sys_read)
#define __NR_write				1
__SYSCALL(__NR_write, sys_write)
#define __NR_open				2
__SYSCALL(__NR_open, sys_open)
#define __NR_close				3
__SYSCALL(__NR_close, sys_close)
#define __NR_stat				4
__SYSCALL(__NR_stat, sys_newstat)
#define __NR_fstat				5
__SYSCALL(__NR_fstat, sys_newfstat)
#define __NR_lstat				6
__SYSCALL(__NR_lstat, sys_newlstat)
#define __NR_poll				7
__SYSCALL(__NR_poll, sys_poll)

#define __NR_lseek				8
__SYSCALL(__NR_lseek, sys_lseek)
#define __NR_mmap				9
__SYSCALL(__NR_mmap, sys_mmap)
#define __NR_mprotect				10
__SYSCALL(__NR_mprotect, sys_mprotect)
#define __NR_munmap				11
__SYSCALL(__NR_munmap, sys_munmap)
#define __NR_brk				12
__SYSCALL(__NR_brk, sys_brk)
#define __NR_rt_sigaction			13
__SYSCALL(__NR_rt_sigaction, sys_rt_sigaction)
#define __NR_rt_sigprocmask			14
__SYSCALL(__NR_rt_sigprocmask, sys_rt_sigprocmask)
#define __NR_rt_sigreturn			15
__SYSCALL(__NR_rt_sigreturn, stub_rt_sigreturn)

#define __NR_ioctl				16
__SYSCALL(__NR_ioctl, sys_ioctl)
#define __NR_pread64				17
__SYSCALL(__NR_pread64, sys_pread64)
#define __NR_pwrite64				18
__SYSCALL(__NR_pwrite64, sys_pwrite64)
#define __NR_readv				19
__SYSCALL(__NR_readv, sys_readv)
#define __NR_writev				20
__SYSCALL(__NR_writev, sys_writev)
#define __NR_access				21
__SYSCALL(__NR_access, sys_access)
#define __NR_pipe				22
__SYSCALL(__NR_pipe, sys_pipe)
#define __NR_select				23
__SYSCALL(__NR_select, sys_select)

#define __NR_sched_yield			24
__SYSCALL(__NR_sched_yield, sys_sched_yield)
#define __NR_mremap				25
__SYSCALL(__NR_mremap, sys_mremap)
#define __NR_msync				26
__SYSCALL(__NR_msync, sys_msync)
#define __NR_mincore				27
__SYSCALL(__NR_mincore, sys_mincore)
#define __NR_madvise				28
__SYSCALL(__NR_madvise, sys_madvise)
#define __NR_shmget				29
__SYSCALL(__NR_shmget, sys_shmget)
#define __NR_shmat				30
__SYSCALL(__NR_shmat, sys_shmat)
#define __NR_shmctl				31
__SYSCALL(__NR_shmctl, sys_shmctl)

#define __NR_dup				32
__SYSCALL(__NR_dup, sys_dup)
#define __NR_dup2				33
__SYSCALL(__NR_dup2, sys_dup2)
#define __NR_pause				34
__SYSCALL(__NR_pause, sys_pause)
#define __NR_nanosleep				35
__SYSCALL(__NR_nanosleep, sys_nanosleep)
#define __NR_getitimer				36
__SYSCALL(__NR_getitimer, sys_getitimer)
#define __NR_alarm				37
__SYSCALL(__NR_alarm, sys_alarm)
#define __NR_setitimer				38
__SYSCALL(__NR_setitimer, sys_setitimer)
#define __NR_getpid				39
__SYSCALL(__NR_getpid, sys_getpid)

#define __NR_sendfile				40
__SYSCALL(__NR_sendfile, sys_sendfile64)
#define __NR_socket				41
__SYSCALL(__NR_socket, sys_socket)
#define __NR_connect				42
__SYSCALL(__NR_connect, sys_connect)
#define __NR_accept				43
__SYSCALL(__NR_accept, sys_accept)
#define __NR_sendto				44
__SYSCALL(__NR_sendto, sys_sendto)
#define __NR_recvfrom				45
__SYSCALL(__NR_recvfrom, sys_recvfrom)
#define __NR_sendmsg				46
__SYSCALL(__NR_sendmsg, sys_sendmsg)
#define __NR_recvmsg				47
__SYSCALL(__NR_recvmsg, sys_recvmsg)

#define __NR_shutdown				48
__SYSCALL(__NR_shutdown, sys_shutdown)
#define __NR_bind				49
__SYSCALL(__NR_bind, sys_bind)
#define __NR_listen				50
__SYSCALL(__NR_listen, sys_listen)
#define __NR_getsockname			51
__SYSCALL(__NR_getsockname, sys_getsockname)
#define __NR_getpeername			52
__SYSCALL(__NR_getpeername, sys_getpeername)
#define __NR_socketpair				53
__SYSCALL(__NR_socketpair, sys_socketpair)
#define __NR_setsockopt				54
__SYSCALL(__NR_setsockopt, sys_setsockopt)
#define __NR_getsockopt				55
__SYSCALL(__NR_getsockopt, sys_getsockopt)

#define __NR_clone				56
__SYSCALL(__NR_clone, stub_clone)
#define __NR_fork				57
__SYSCALL(__NR_fork, stub_fork)
#define __NR_vfork				58
__SYSCALL(__NR_vfork, stub_vfork)
#define __NR_execve				59
__SYSCALL(__NR_execve, stub_execve)
#define __NR_exit				60
__SYSCALL(__NR_exit, sys_exit)
#define __NR_wait4				61
__SYSCALL(__NR_wait4, sys_wait4)
#define __NR_kill				62
__SYSCALL(__NR_kill, sys_kill)
#define __NR_uname				63
__SYSCALL(__NR_uname, sys_newuname)

#define __NR_semget				64
__SYSCALL(__NR_semget, sys_semget)
#define __NR_semop				65
__SYSCALL(__NR_semop, sys_semop)
#define __NR_semctl				66
__SYSCALL(__NR_semctl, sys_semctl)
#define __NR_shmdt				67
__SYSCALL(__NR_shmdt, sys_shmdt)
#define __NR_msgget				68
__SYSCALL(__NR_msgget, sys_msgget)
#define __NR_msgsnd				69
__SYSCALL(__NR_msgsnd, sys_msgsnd)
#define __NR_msgrcv				70
__SYSCALL(__NR_msgrcv, sys_msgrcv)
#define __NR_msgctl				71
__SYSCALL(__NR_msgctl, sys_msgctl)

#define __NR_fcntl				72
__SYSCALL(__NR_fcntl, sys_fcntl)
#define __NR_flock				73
__SYSCALL(__NR_flock, sys_flock)
#define __NR_fsync				74
__SYSCALL(__NR_fsync, sys_fsync)
#define __NR_fdatasync				75
__SYSCALL(__NR_fdatasync, sys_fdatasync)
#define __NR_truncate				76
__SYSCALL(__NR_truncate, sys_truncate)
#define __NR_ftruncate				77
__SYSCALL(__NR_ftruncate, sys_ftruncate)
#define __NR_getdents				78
__SYSCALL(__NR_getdents, sys_getdents)
#define __NR_getcwd				79
__SYSCALL(__NR_getcwd, sys_getcwd)

#define __NR_chdir				80
__SYSCALL(__NR_chdir, sys_chdir)
#define __NR_fchdir				81
__SYSCALL(__NR_fchdir, sys_fchdir)
#define __NR_rename				82
__SYSCALL(__NR_rename, sys_rename)
#define __NR_mkdir				83
__SYSCALL(__NR_mkdir, sys_mkdir)
#define __NR_rmdir				84
__SYSCALL(__NR_rmdir, sys_rmdir)
#define __NR_creat				85
__SYSCALL(__NR_creat, sys_creat)
#define __NR_link				86
__SYSCALL(__NR_link, sys_link)
#define __NR_unlink				87
__SYSCALL(__NR_unlink, sys_unlink)

#define __NR_symlink				88
__SYSCALL(__NR_symlink, sys_symlink)
#define __NR_readlink				89
__SYSCALL(__NR_readlink, sys_readlink)
#define __NR_chmod				90
__SYSCALL(__NR_chmod, sys_chmod)
#define __NR_fchmod				91
__SYSCALL(__NR_fchmod, sys_fchmod)
#define __NR_chown				92
__SYSCALL(__NR_chown, sys_chown)
#define __NR_fchown				93
__SYSCALL(__NR_fchown, sys_fchown)
#define __NR_lchown				94
__SYSCALL(__NR_lchown, sys_lchown)
#define __NR_umask				95
__SYSCALL(__NR_umask, sys_umask)

#define __NR_gettimeofday			96
__SYSCALL(__NR_gettimeofday, sys_gettimeofday)
#define __NR_getrlimit				97
__SYSCALL(__NR_getrlimit, sys_getrlimit)
#define __NR_getrusage				98
__SYSCALL(__NR_getrusage, sys_getrusage)
#define __NR_sysinfo				99
__SYSCALL(__NR_sysinfo, sys_sysinfo)
#define __NR_times				100
__SYSCALL(__NR_times, sys_times)
#define __NR_ptrace				101
__SYSCALL(__NR_ptrace, sys_ptrace)
#define __NR_getuid				102
__SYSCALL(__NR_getuid, sys_getuid)
#define __NR_syslog				103
__SYSCALL(__NR_syslog, sys_syslog)

/* at the very end the stuff that never runs during the benchmarks */
#define __NR_getgid				104
__SYSCALL(__NR_getgid, sys_getgid)
#define __NR_setuid				105
__SYSCALL(__NR_setuid, sys_setuid)
#define __NR_setgid				106
__SYSCALL(__NR_setgid, sys_setgid)
#define __NR_geteuid				107
__SYSCALL(__NR_geteuid, sys_geteuid)
#define __NR_getegid				108
__SYSCALL(__NR_getegid, sys_getegid)
#define __NR_setpgid				109
__SYSCALL(__NR_setpgid, sys_setpgid)
#define __NR_getppid				110
__SYSCALL(__NR_getppid, sys_getppid)
#define __NR_getpgrp				111
__SYSCALL(__NR_getpgrp, sys_getpgrp)

#define __NR_setsid				112
__SYSCALL(__NR_setsid, sys_setsid)
#define __NR_setreuid				113
__SYSCALL(__NR_setreuid, sys_setreuid)
#define __NR_setregid				114
__SYSCALL(__NR_setregid, sys_setregid)
#define __NR_getgroups				115
__SYSCALL(__NR_getgroups, sys_getgroups)
#define __NR_setgroups				116
__SYSCALL(__NR_setgroups, sys_setgroups)
#define __NR_setresuid				117
__SYSCALL(__NR_setresuid, sys_setresuid)
#define __NR_getresuid				118
__SYSCALL(__NR_getresuid, sys_getresuid)
#define __NR_setresgid				119
__SYSCALL(__NR_setresgid, sys_setresgid)

#define __NR_getresgid				120
__SYSCALL(__NR_getresgid, sys_getresgid)
#define __NR_getpgid				121
__SYSCALL(__NR_getpgid, sys_getpgid)
#define __NR_setfsuid				122
__SYSCALL(__NR_setfsuid, sys_setfsuid)
#define __NR_setfsgid				123
__SYSCALL(__NR_setfsgid, sys_setfsgid)
#define __NR_getsid				124
__SYSCALL(__NR_getsid, sys_getsid)
#define __NR_capget				125
__SYSCALL(__NR_capget, sys_capget)
#define __NR_capset				126
__SYSCALL(__NR_capset, sys_capset)

#define __NR_rt_sigpending			127
__SYSCALL(__NR_rt_sigpending, sys_rt_sigpending)
#define __NR_rt_sigtimedwait			128
__SYSCALL(__NR_rt_sigtimedwait, sys_rt_sigtimedwait)
#define __NR_rt_sigqueueinfo			129
__SYSCALL(__NR_rt_sigqueueinfo, sys_rt_sigqueueinfo)
#define __NR_rt_sigsuspend			130
__SYSCALL(__NR_rt_sigsuspend, sys_rt_sigsuspend)
#define __NR_sigaltstack			131
__SYSCALL(__NR_sigaltstack, stub_sigaltstack)
#define __NR_utime				132
__SYSCALL(__NR_utime, sys_utime)
#define __NR_mknod				133
__SYSCALL(__NR_mknod, sys_mknod)

/* Only needed for a.out */
#define __NR_uselib				134
__SYSCALL(__NR_uselib, sys_ni_syscall)
#define __NR_personality			135
__SYSCALL(__NR_personality, sys_personality)

#define __NR_ustat				136
__SYSCALL(__NR_ustat, sys_ustat)
#define __NR_statfs				137
__SYSCALL(__NR_statfs, sys_statfs)
#define __NR_fstatfs				138
__SYSCALL(__NR_fstatfs, sys_fstatfs)
#define __NR_sysfs				139
__SYSCALL(__NR_sysfs, sys_sysfs)

#define __NR_getpriority			140
__SYSCALL(__NR_getpriority, sys_getpriority)
#define __NR_setpriority			141
__SYSCALL(__NR_setpriority, sys_setpriority)
#define __NR_sched_setparam			142
__SYSCALL(__NR_sched_setparam, sys_sched_setparam)
#define __NR_sched_getparam			143
__SYSCALL(__NR_sched_getparam, sys_sched_getparam)
#define __NR_sched_setscheduler			144
__SYSCALL(__NR_sched_setscheduler, sys_sched_setscheduler)
#define __NR_sched_getscheduler			145
__SYSCALL(__NR_sched_getscheduler, sys_sched_getscheduler)
#define __NR_sched_get_priority_max		146
__SYSCALL(__NR_sched_get_priority_max, sys_sched_get_priority_max)
#define __NR_sched_get_priority_min		147
__SYSCALL(__NR_sched_get_priority_min, sys_sched_get_priority_min)
#define __NR_sched_rr_get_interval		148
__SYSCALL(__NR_sched_rr_get_interval, sys_sched_rr_get_interval)

#define __NR_mlock				149
__SYSCALL(__NR_mlock, sys_mlock)
#define __NR_munlock				150
__SYSCALL(__NR_munlock, sys_munlock)
#define __NR_mlockall				151
__SYSCALL(__NR_mlockall, sys_mlockall)
#define __NR_munlockall				152
__SYSCALL(__NR_munlockall, sys_munlockall)

#define __NR_vhangup				153
__SYSCALL(__NR_vhangup, sys_vhangup)

#define __NR_modify_ldt				154
__SYSCALL(__NR_modify_ldt, sys_modify_ldt)

#define __NR_pivot_root				155
__SYSCALL(__NR_pivot_root, sys_pivot_root)

#define __NR__sysctl				156
__SYSCALL(__NR__sysctl, sys_sysctl)

#define __NR_prctl				157
__SYSCALL(__NR_prctl, sys_prctl)
#define __NR_arch_prctl				158
__SYSCALL(__NR_arch_prctl, sys_arch_prctl)

#define __NR_adjtimex				159
__SYSCALL(__NR_adjtimex, sys_adjtimex)

#define __NR_setrlimit				160
__SYSCALL(__NR_setrlimit, sys_setrlimit)

#define __NR_chroot				161
__SYSCALL(__NR_chroot, sys_chroot)

#define __NR_sync				162
__SYSCALL(__NR_sync, sys_sync)

#define __NR_acct				163
__SYSCALL(__NR_acct, sys_acct)

#define __NR_settimeofday			164
__SYSCALL(__NR_settimeofday, sys_settimeofday)

#define __NR_mount				165
__SYSCALL(__NR_mount, sys_mount)
#define __NR_umount2				166
__SYSCALL(__NR_umount2, sys_umount)

#define __NR_swapon				167
__SYSCALL(__NR_swapon, sys_swapon)
#define __NR_swapoff				168
__SYSCALL(__NR_swapoff, sys_swapoff)

#define __NR_reboot				169
__SYSCALL(__NR_reboot, sys_reboot)

#define __NR_sethostname			170
__SYSCALL(__NR_sethostname, sys_sethostname)
#define __NR_setdomainname			171
__SYSCALL(__NR_setdomainname, sys_setdomainname)

#define __NR_iopl				172
__SYSCALL(__NR_iopl, stub_iopl)
#define __NR_ioperm				173
__SYSCALL(__NR_ioperm, sys_ioperm)

#define __NR_create_module			174
__SYSCALL(__NR_create_module, sys_ni_syscall)
#define __NR_init_module			175
__SYSCALL(__NR_init_module, sys_init_module)
#define __NR_delete_module			176
__SYSCALL(__NR_delete_module, sys_delete_module)
#define __NR_get_kernel_syms			177
__SYSCALL(__NR_get_kernel_syms, sys_ni_syscall)
#define __NR_query_module			178
__SYSCALL(__NR_query_module, sys_ni_syscall)

#define __NR_quotactl				179
__SYSCALL(__NR_quotactl, sys_quotactl)

#define __NR_nfsservctl				180
__SYSCALL(__NR_nfsservctl, sys_nfsservctl)

/* reserved for LiS/STREAMS */
#define __NR_getpmsg				181
__SYSCALL(__NR_getpmsg, sys_ni_syscall)
#define __NR_putpmsg				182
__SYSCALL(__NR_putpmsg, sys_ni_syscall)

/* reserved for AFS */
#define __NR_afs_syscall			183
__SYSCALL(__NR_afs_syscall, sys_ni_syscall)

/* reserved for tux */
#define __NR_tuxcall				184
__SYSCALL(__NR_tuxcall, sys_ni_syscall)

#define __NR_security				185
__SYSCALL(__NR_security, sys_ni_syscall)

#define __NR_gettid				186
__SYSCALL(__NR_gettid, sys_gettid)

#define __NR_readahead				187
__SYSCALL(__NR_readahead, sys_readahead)
#define __NR_setxattr				188
__SYSCALL(__NR_setxattr, sys_setxattr)
#define __NR_lsetxattr				189
__SYSCALL(__NR_lsetxattr, sys_lsetxattr)
#define __NR_fsetxattr				190
__SYSCALL(__NR_fsetxattr, sys_fsetxattr)
#define __NR_getxattr				191
__SYSCALL(__NR_getxattr, sys_getxattr)
#define __NR_lgetxattr				192
__SYSCALL(__NR_lgetxattr, sys_lgetxattr)
#define __NR_fgetxattr				193
__SYSCALL(__NR_fgetxattr, sys_fgetxattr)
#define __NR_listxattr				194
__SYSCALL(__NR_listxattr, sys_listxattr)
#define __NR_llistxattr				195
__SYSCALL(__NR_llistxattr, sys_llistxattr)
#define __NR_flistxattr				196
__SYSCALL(__NR_flistxattr, sys_flistxattr)
#define __NR_removexattr			197
__SYSCALL(__NR_removexattr, sys_removexattr)
#define __NR_lremovexattr			198
__SYSCALL(__NR_lremovexattr, sys_lremovexattr)
#define __NR_fremovexattr			199
__SYSCALL(__NR_fremovexattr, sys_fremovexattr)
#define __NR_tkill				200
__SYSCALL(__NR_tkill, sys_tkill)
#define __NR_time				201
__SYSCALL(__NR_time, sys_time)
#define __NR_futex				202
__SYSCALL(__NR_futex, sys_futex)
#define __NR_sched_setaffinity			203
__SYSCALL(__NR_sched_setaffinity, sys_sched_setaffinity)
#define __NR_sched_getaffinity			204
__SYSCALL(__NR_sched_getaffinity, sys_sched_getaffinity)
#define __NR_set_thread_area			205
__SYSCALL(__NR_set_thread_area, sys_ni_syscall)	/* use arch_prctl */
#define __NR_io_setup				206
__SYSCALL(__NR_io_setup, sys_io_setup)
#define __NR_io_destroy				207
__SYSCALL(__NR_io_destroy, sys_io_destroy)
#define __NR_io_getevents			208
__SYSCALL(__NR_io_getevents, sys_io_getevents)
#define __NR_io_submit				209
__SYSCALL(__NR_io_submit, sys_io_submit)
#define __NR_io_cancel				210
__SYSCALL(__NR_io_cancel, sys_io_cancel)
#define __NR_get_thread_area			211
__SYSCALL(__NR_get_thread_area, sys_ni_syscall)	/* use arch_prctl */
#define __NR_lookup_dcookie			212
__SYSCALL(__NR_lookup_dcookie, sys_lookup_dcookie)
#define __NR_epoll_create			213
__SYSCALL(__NR_epoll_create, sys_epoll_create)
#define __NR_epoll_ctl_old			214
__SYSCALL(__NR_epoll_ctl_old, sys_ni_syscall)
#define __NR_epoll_wait_old			215
__SYSCALL(__NR_epoll_wait_old, sys_ni_syscall)
#define __NR_remap_file_pages			216
__SYSCALL(__NR_remap_file_pages, sys_remap_file_pages)
#define __NR_getdents64				217
__SYSCALL(__NR_getdents64, sys_getdents64)
#define __NR_set_tid_address			218
__SYSCALL(__NR_set_tid_address, sys_set_tid_address)
#define __NR_restart_syscall			219
__SYSCALL(__NR_restart_syscall, sys_restart_syscall)
#define __NR_semtimedop				220
__SYSCALL(__NR_semtimedop, sys_semtimedop)
#define __NR_fadvise64				221
__SYSCALL(__NR_fadvise64, sys_fadvise64)
#define __NR_timer_create			222
__SYSCALL(__NR_timer_create, sys_timer_create)
#define __NR_timer_settime			223
__SYSCALL(__NR_timer_settime, sys_timer_settime)
#define __NR_timer_gettime			224
__SYSCALL(__NR_timer_gettime, sys_timer_gettime)
#define __NR_timer_getoverrun			225
__SYSCALL(__NR_timer_getoverrun, sys_timer_getoverrun)
#define __NR_timer_delete			226
__SYSCALL(__NR_timer_delete, sys_timer_delete)
#define __NR_clock_settime			227
__SYSCALL(__NR_clock_settime, sys_clock_settime)
#define __NR_clock_gettime			228
__SYSCALL(__NR_clock_gettime, sys_clock_gettime)
#define __NR_clock_getres			229
__SYSCALL(__NR_clock_getres, sys_clock_getres)
#define __NR_clock_nanosleep			230
__SYSCALL(__NR_clock_nanosleep, sys_clock_nanosleep)
#define __NR_exit_group				231
__SYSCALL(__NR_exit_group, sys_exit_group)
#define __NR_epoll_wait				232
__SYSCALL(__NR_epoll_wait, sys_epoll_wait)
#define __NR_epoll_ctl				233
__SYSCALL(__NR_epoll_ctl, sys_epoll_ctl)
#define __NR_tgkill				234
__SYSCALL(__NR_tgkill, sys_tgkill)
#define __NR_utimes				235
__SYSCALL(__NR_utimes, sys_utimes)
#define __NR_vserver				236
__SYSCALL(__NR_vserver, sys_ni_syscall)
#define __NR_mbind				237
__SYSCALL(__NR_mbind, sys_mbind)
#define __NR_set_mempolicy			238
__SYSCALL(__NR_set_mempolicy, sys_set_mempolicy)
#define __NR_get_mempolicy			239
__SYSCALL(__NR_get_mempolicy, sys_get_mempolicy)
#define __NR_mq_open				240
__SYSCALL(__NR_mq_open, sys_mq_open)
#define __NR_mq_unlink				241
__SYSCALL(__NR_mq_unlink, sys_mq_unlink)
#define __NR_mq_timedsend			242
__SYSCALL(__NR_mq_timedsend, sys_mq_timedsend)
#define __NR_mq_timedreceive			243
__SYSCALL(__NR_mq_timedreceive, sys_mq_timedreceive)
#define __NR_mq_notify				244
__SYSCALL(__NR_mq_notify, sys_mq_notify)
#define __NR_mq_getsetattr			245
__SYSCALL(__NR_mq_getsetattr, sys_mq_getsetattr)
#define __NR_kexec_load				246
__SYSCALL(__NR_kexec_load, sys_kexec_load)
#define __NR_waitid				247
__SYSCALL(__NR_waitid, sys_waitid)
#define __NR_add_key				248
__SYSCALL(__NR_add_key, sys_add_key)
#define __NR_request_key			249
__SYSCALL(__NR_request_key, sys_request_key)
#define __NR_keyctl				250
__SYSCALL(__NR_keyctl, sys_keyctl)
#define __NR_ioprio_set				251
__SYSCALL(__NR_ioprio_set, sys_ioprio_set)
#define __NR_ioprio_get				252
__SYSCALL(__NR_ioprio_get, sys_ioprio_get)
#define __NR_inotify_init			253
__SYSCALL(__NR_inotify_init, sys_inotify_init)
#define __NR_inotify_add_watch			254
__SYSCALL(__NR_inotify_add_watch, sys_inotify_add_watch)
#define __NR_inotify_rm_watch			255
__SYSCALL(__NR_inotify_rm_watch, sys_inotify_rm_watch)
#define __NR_migrate_pages			256
__SYSCALL(__NR_migrate_pages, sys_migrate_pages)
#define __NR_openat				257
__SYSCALL(__NR_openat, sys_openat)
#define __NR_mkdirat				258
__SYSCALL(__NR_mkdirat, sys_mkdirat)
#define __NR_mknodat				259
__SYSCALL(__NR_mknodat, sys_mknodat)
#define __NR_fchownat				260
__SYSCALL(__NR_fchownat, sys_fchownat)
#define __NR_futimesat				261
__SYSCALL(__NR_futimesat, sys_futimesat)
#define __NR_newfstatat				262
__SYSCALL(__NR_newfstatat, sys_newfstatat)
#define __NR_unlinkat				263
__SYSCALL(__NR_unlinkat, sys_unlinkat)
#define __NR_renameat				264
__SYSCALL(__NR_renameat, sys_renameat)
#define __NR_linkat				265
__SYSCALL(__NR_linkat, sys_linkat)
#define __NR_symlinkat				266
__SYSCALL(__NR_symlinkat, sys_symlinkat)
#define __NR_readlinkat				267
__SYSCALL(__NR_readlinkat, sys_readlinkat)
#define __NR_fchmodat				268
__SYSCALL(__NR_fchmodat, sys_fchmodat)
#define __NR_faccessat				269
__SYSCALL(__NR_faccessat, sys_faccessat)
#define __NR_pselect6				270
__SYSCALL(__NR_pselect6, sys_pselect6)
#define __NR_ppoll				271
__SYSCALL(__NR_ppoll,	sys_ppoll)
#define __NR_unshare				272
__SYSCALL(__NR_unshare,	sys_unshare)
#define __NR_set_robust_list			273
__SYSCALL(__NR_set_robust_list, sys_set_robust_list)
#define __NR_get_robust_list			274
__SYSCALL(__NR_get_robust_list, sys_get_robust_list)
#define __NR_splice				275
__SYSCALL(__NR_splice, sys_splice)
#define __NR_tee				276
__SYSCALL(__NR_tee, sys_tee)
#define __NR_sync_file_range			277
__SYSCALL(__NR_sync_file_range, sys_sync_file_range)
#define __NR_vmsplice				278
__SYSCALL(__NR_vmsplice, sys_vmsplice)
#define __NR_move_pages				279
__SYSCALL(__NR_move_pages, sys_move_pages)
#define __NR_utimensat				280
__SYSCALL(__NR_utimensat, sys_utimensat)
#define __IGNORE_getcpu		/* implemented as a vsyscall */
#define __NR_epoll_pwait			281
__SYSCALL(__NR_epoll_pwait, sys_epoll_pwait)
#define __NR_signalfd				282
__SYSCALL(__NR_signalfd, sys_signalfd)
#define __NR_timerfd_create			283
__SYSCALL(__NR_timerfd_create, sys_timerfd_create)
#define __NR_eventfd				284
__SYSCALL(__NR_eventfd, sys_eventfd)
#define __NR_fallocate				285
__SYSCALL(__NR_fallocate, sys_fallocate)
#define __NR_timerfd_settime			286
__SYSCALL(__NR_timerfd_settime, sys_timerfd_settime)
#define __NR_timerfd_gettime			287
__SYSCALL(__NR_timerfd_gettime, sys_timerfd_gettime)
#define __NR_accept4				288
__SYSCALL(__NR_accept4, sys_accept4)
#define __NR_signalfd4				289
__SYSCALL(__NR_signalfd4, sys_signalfd4)
#define __NR_eventfd2				290
__SYSCALL(__NR_eventfd2, sys_eventfd2)
#define __NR_epoll_create1			291
__SYSCALL(__NR_epoll_create1, sys_epoll_create1)
#define __NR_dup3				292
__SYSCALL(__NR_dup3, sys_dup3)
#define __NR_pipe2				293
__SYSCALL(__NR_pipe2, sys_pipe2)
#define __NR_inotify_init1			294
__SYSCALL(__NR_inotify_init1, sys_inotify_init1)
#define __NR_preadv				295
__SYSCALL(__NR_preadv, sys_preadv)
#define __NR_pwritev				296
__SYSCALL(__NR_pwritev, sys_pwritev)
#define __NR_rt_tgsigqueueinfo			297
__SYSCALL(__NR_rt_tgsigqueueinfo, sys_rt_tgsigqueueinfo)
#define __NR_perf_event_open			298
__SYSCALL(__NR_perf_event_open, sys_perf_event_open)
#define __NR_recvmmsg				299
__SYSCALL(__NR_recvmmsg, sys_recvmmsg)

在Linux中,系统调用是用户空间访问内核的唯一手段;除异常和中断外,它们是内核惟一的合法入口。

系统调用必须验证参数是否合法(fd,pid..),最重要的是验证指针是否有效。如果一个进程可以给内核传递指针,但是没有进行验证,那么就可以给出一个它根本没有访问权限的指针,哄骗内核去为它拷贝不允许它访问的数据,这会产生严重的后果。

因此,在接收用户空间传递的指针时,必须保证:

1.指针指向的内存区域是用户空间,进程决不能哄骗内核去访问内核空间数据(属于内核的1G内存)

2.指针指向的内存区域在进程的地址空间里,进程决不能哄骗内核去读取其他进程的数据(不能访问其他进程地址空间)

3.如果是读,该内存应被标记为刻度。如果是写,该内存应被标记为可写。进程决不能绕过内存访问限制

用户空间<-->内核空间,内核提供了两个方法来完成检查和数据拷贝。

为了向用户空间写入数据:

/**
 * copy_to_user: - Copy a block of data into user space.
 * @to:   Destination address, in user space.
 * @from: Source address, in kernel space.
 * @n:    Number of bytes to copy.
 *
 * Context: User context only.  This function may sleep.
 *
 * Copy data from kernel space to user space.
 *
 * Returns number of bytes that could not be copied.
 * On success, this will be zero.
 */
unsigned long
copy_to_user(void __user *to, const void *from, unsigned long n)
{
	if (access_ok(VERIFY_WRITE, to, n))
		n = __copy_to_user(to, from, n);
	return n;
}

为了从用户空间读数据

static inline unsigned long __must_check copy_from_user(void *to,
					  const void __user *from,
					  unsigned long n)
{
	int sz = __compiletime_object_size(to);

	if (likely(sz == -1 || sz >= n))
		n = _copy_from_user(to, from, n);
	else
		copy_from_user_overflow();

	return n;
}

系统调用的返回值放入了errno全局变量中,可以通过调用perror()把变量翻译成可理解字符串

以fork()来看看系统调用

在unistd.h
#define __NR_fork 1079
#ifdef CONFIG_MMU
__SYSCALL(__NR_fork, sys_fork)
#else
__SYSCALL(__NR_fork, sys_ni_syscall)
#endif /* CONFIG_MMU */

在syscalls.h
asmlinkage int sys_fork(struct pt_regs *);

在process.c
int sys_fork(struct pt_regs *regs)
{
	return do_fork(SIGCHLD, regs->sp, regs, 0, NULL, NULL);
}

系统调用访问示例
操作系统使用系统调用表将系统调用编号翻译为特定的系统调用。系统调用表包含有实现每个系统调用的函数的地址。例如,read() 系统调用函数名为 sys_read。read() 系统调用编号是 3<unistd_32.h>,所以 sys_read() 位于系统调用表的第四个条目中(因为系统调用起始编号为0)。从地址 sys_call_table + (3 * word_size) 读取数据,得到 sys_read() 的地址。


感谢https://blog.csdn.net/q_l_s/article/details/55101496,写的很详细。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值