• 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 " #x " .set " #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,写的很详细。
    ------------------

    from:
    https://blog.csdn.net/sinat_33518009/article/details/93416217

  • 相关阅读:
    uniapp入门
    第一章、javascript高级
    Python绘制冰墩墩
    PyCharm快捷键大全
    关闭win10自动更新(详细步骤)
    神经网络与深度学习中文实战版电子书
    傅里叶变换、傅里叶级数——超详细讲解(史上最全)
    Python3基于PyMySQL封装的常用操作基础类库
    PHP根据二维数组的某个键去重
    PHP超简单生成唯一数字ID的方法
  • 原文地址:https://www.cnblogs.com/aspirs/p/12541426.html
Copyright © 2020-2023  润新知