x86 Linux の 32bit と 64bit のシステムコールの違い

x86 Linux の 32bit と 64bit ではシステムコールの呼び出し方法と、 システムコール番号が異なります。システムコールの呼び出しは、 32bit では int 0x80 でソフトウェア割り込みを実行することでシステムコールを呼び出していますが、64bit では syscall 命令を実行します。

x86-64 の Linux でシステムコールを呼び出すには以下のようにします。rcx と r11 の内容は保存されません(破壊される)。

  1. rax にシステムコール番号を設定
  2. 必要ならば、第 1 引数 を rdi に設定
  3. 必要ならば、第 2 引数 を rsi に設定
  4. 必要ならば、第 3 引数 を rdx に設定
  5. 必要ならば、第 4 引数 を r10 に設定
  6. 必要ならば、第 5 引数 を r8 に設定
  7. 必要ならば、第 6 引数 を r9 に設定
  8. システムコール命令( syscall ) を実行

Linux のカーネルソースの arch/x86/include/asm/ 以下の unistd_32.h と unistd_64.h にはシステムコールの名称と番号の対応が定義 されています。32bit Linux と 64bit Linux のシステムコールの名称とシステムコール番号の対応表を以下に示します。

32 bit 64 bit
x86_syscall syscall# x64_syscall syscall#
_llseek 140 - -
_newselect 142 - -
_sysctl 149 _sysctl 156
- - accept 43
- - accept4 288
access 33 access 21
acct 51 acct 163
add_key 286 add_key 248
adjtimex 124 adjtimex 159
afs_syscall 137 afs_syscall 183
alarm 27 alarm 37
- - arch_prctl 158
- - bind 49
bdflush 134 - -
break 17 - -
brk 45 brk 12
capget 184 capget 125
capset 185 capset 126
chdir 12 chdir 80
chmod 15 chmod 90
chown 182 chown 92
chown32 212 - -
chroot 61 chroot 161
clock_getres 266 clock_getres 229
clock_gettime 265 clock_gettime 228
clock_nanosleep 267 clock_nanosleep 230
clock_settime 264 clock_settime 227
clone 120 clone 56
close 6 close 3
- - connect 42
creat 8 creat 85
create_module 127 create_module 174
delete_module 129 delete_module 176
dup 41 dup 32
dup2 63 dup2 33
dup3 330 dup3 292
epoll_create 254 epoll_create 213
epoll_create1 329 epoll_create1 291
epoll_ctl 255 epoll_ctl 233
- - epoll_ctl_old 214
epoll_pwait 319 epoll_pwait 281
epoll_wait 256 epoll_wait 232
- - epoll_wait_old 215
eventfd 323 eventfd 284
eventfd2 328 eventfd2 290
execve 11 execve 59
exit 1 exit 60
exit_group 252 exit_group 231
faccessat 307 faccessat 269
fadvise64 250 fadvise64 221
fadvise64_64 272 - -
fallocate 324 fallocate 285
fchdir 133 fchdir 81
fchmod 94 fchmod 91
fchmodat 306 fchmodat 268
fchown 95 fchown 93
fchown32 207 - -
fchownat 298 fchownat 260
fcntl 55 fcntl 72
fcntl64 221 - -
fdatasync 148 fdatasync 75
fgetxattr 231 fgetxattr 193
flistxattr 234 flistxattr 196
flock 143 flock 73
fork 2 fork 57
fremovexattr 237 fremovexattr 199
fsetxattr 228 fsetxattr 190
fstat 108 fstat 5
fstat64 197 - -
fstatat64 300 - -
fstatfs 100 fstatfs 138
fstatfs64 269 - -
fsync 118 fsync 74
ftime 35 - -
ftruncate 93 ftruncate 77
ftruncate64 194 - -
futex 240 futex 202
futimesat 299 futimesat 261
get_kernel_syms 130 get_kernel_syms 177
get_mempolicy 275 get_mempolicy 239
get_robust_list 312 get_robust_list 274
get_thread_area 244 get_thread_area 211
getcpu 318 - -
getcwd 183 getcwd 79
getdents 141 getdents 78
getdents64 220 getdents64 217
getegid 50 getegid 108
getegid32 202 - -
geteuid 49 geteuid 107
geteuid32 201 - -
getgid 47 getgid 104
getgid32 200 - -
getgroups 80 getgroups 115
getgroups32 205 - -
getitimer 105 getitimer 36
- - getpeername 52
getpgid 132 getpgid 121
getpgrp 65 getpgrp 111
getpid 20 getpid 39
getpmsg 188 getpmsg 181
getppid 64 getppid 110
getpriority 96 getpriority 140
getresgid 171 getresgid 120
getresgid32 211 - -
getresuid 165 getresuid 118
getresuid32 209 - -
- - getrlimit 97
getrusage 77 getrusage 98
getsid 147 getsid 124
- - getsockname 51
- - getsockopt 55
gettid 224 gettid 186
gettimeofday 78 gettimeofday 96
getuid 24 getuid 102
getuid32 199 - -
getxattr 229 getxattr 191
gtty 32 - -
idle 112 - -
init_module 128 init_module 175
inotify_add_watch 292 inotify_add_watch 254
inotify_init 291 inotify_init 253
inotify_init1 332 inotify_init1 294
inotify_rm_watch 293 inotify_rm_watch 255
io_cancel 249 io_cancel 210
io_destroy 246 io_destroy 207
io_getevents 247 io_getevents 208
io_setup 245 io_setup 206
io_submit 248 io_submit 209
ioctl 54 ioctl 16
ioperm 101 ioperm 173
iopl 110 iopl 172
ioprio_get 290 ioprio_get 252
ioprio_set 289 ioprio_set 251
ipc 117 - -
kexec_load 283 kexec_load 246
keyctl 288 keyctl 250
kill 37 kill 62
lchown 16 lchown 94
lchown32 198 lgetxattr 192
lgetxattr 230 - -
link 9 link 86
linkat 303 linkat 265
- - listen 50
listxattr 232 listxattr 194
llistxattr 233 llistxattr 195
lock 53 - -
lookup_dcookie 253 lookup_dcookie 212
lremovexattr 236 lremovexattr 198
lseek 19 lseek 8
lsetxattr 227 lsetxattr 189
lstat 107 lstat 6
lstat64 196 - -
madvise 219 madvise 28
madvise1 219 - -
mbind 274 mbind 237
migrate_pages 294 migrate_pages 256
mincore 218 mincore 27
mkdir 39 mkdir 83
mkdirat 296 mkdirat 258
mknod 14 mknod 133
mknodat 297 mknodat 259
mlock 150 mlock 149
mlockall 152 mlockall 151
mmap 90 mmap 9
mmap2 192 - -
modify_ldt 123 modify_ldt 154
mount 21 mount 165
move_pages 317 move_pages 279
mprotect 125 mprotect 10
mpx 56 - -
mq_getsetattr 282 mq_getsetattr 245
mq_notify 281 mq_notify 244
mq_open 277 mq_open 240
mq_timedreceive 280 mq_timedreceive 243
mq_timedsend 279 mq_timedsend 242
mq_unlink 278 mq_unlink 241
mremap 163 mremap 25
- - msgctl 71
- - msgget 68
- - msgrcv 70
- - msgsnd 69
msync 144 msync 26
munlock 151 munlock 150
munlockall 153 munlockall 152
munmap 91 munmap 11
- - nanosleep 35
- - newfstatat 262
nfsservctl 169 nfsservctl 180
nice 34 - -
oldfstat 28 - -
oldlstat 84 - -
oldolduname 59 - -
oldstat 18 - -
olduname 109 - -
open 5 open 2
openat 295 openat 257
pause 29 pause 34
personality 136 personality 135
pipe 42 pipe 22
pipe2 331 pipe2 293
pivot_root 217 pivot_root 155
poll 168 poll 7
ppoll 309 ppoll 271
prctl 172 prctl 157
pread64 180 pread64 17
prof 44 - -
profil 98 - -
pselect6 308 pselect6 270
ptrace 26 ptrace 101
putpmsg 189 putpmsg 182
pwrite64 181 pwrite64 18
query_module 167 query_module 178
quotactl 131 quotactl 179
read 3 read 0
readahead 225 readahead 187
readdir 89 - -
readlink 85 readlink 89
readlinkat 305 readlinkat 267
readv 145 readv 19
reboot 88 reboot 169
- - recvfrom 45
- - recvmsg 47
remap_file_pages 257 remap_file_pages 216
removexattr 235 removexattr 197
rename 38 rename 82
renameat 302 renameat 264
request_key 287 request_key 249
restart_syscall 0 restart_syscall 219
rmdir 40 rmdir 84
rt_sigaction 174 rt_sigaction 13
rt_sigpending 176 rt_sigpending 127
rt_sigprocmask 175 rt_sigprocmask 14
rt_sigqueueinfo 178 rt_sigqueueinfo 129
rt_sigreturn 173 rt_sigreturn 15
rt_sigsuspend 179 rt_sigsuspend 130
rt_sigtimedwait 177 rt_sigtimedwait 128
sched_get_priority_max 159 sched_get_priority_max 146
sched_get_priority_min 160 sched_get_priority_min 147
sched_getaffinity 242 sched_getaffinity 204
sched_getparam 155 sched_getparam 143
sched_getscheduler 157 sched_getscheduler 145
sched_rr_get_interval 161 sched_rr_get_interval 148
sched_setaffinity 241 sched_setaffinity 203
sched_setparam 154 sched_setparam 142
sched_setscheduler 156 sched_setscheduler 144
sched_yield 158 sched_yield 24
- - security 185
select 82 select 23
- - semctl 66
- - semget 64
- - semop 65
- - semtimedop 220
sendfile 187 sendfile 40
sendfile64 239 - -
- - sendmsg 46
- - sendto 44
set_mempolicy 276 set_mempolicy 238
set_robust_list 311 set_robust_list 273
set_thread_area 243 set_thread_area 205
set_tid_address 258 set_tid_address 218
setdomainname 121 setdomainname 171
setfsgid 139 setfsgid 123
setfsgid32 216 - -
setfsuid 138 setfsuid 122
setfsuid32 215 - -
setgid 46 setgid 106
setgid32 214 - -
setgroups 81 setgroups 116
setgroups32 206 - -
sethostname 74 sethostname 170
setitimer 104 setitimer 38
setpgid 57 setpgid 109
setpriority 97 setpriority 141
setregid 71 setregid 114
setregid32 204 - -
setresgid 170 setresgid 119
setresgid32 210 - -
setresuid 164 setresuid 117
setresuid32 208 - -
setreuid 70 setreuid 113
setreuid32 203 - -
setrlimit 75 setrlimit 160
setsid 66 setsid 112
- - setsockopt 54
settimeofday 79 settimeofday 164
setuid 23 setuid 105
setuid32 213 - -
setxattr 226 setxattr 188
sgetmask 68 - -
- - shmat 30
- - shmctl 31
- - shmdt 67
- - shmget 29
- - shutdown 48
sigaction 67 - -
sigaltstack 186 sigaltstack 131
signal 48 - -
signalfd 321 signalfd 282
signalfd4 327 signalfd4 289
sigpending 73 - -
sigprocmask 126 - -
sigreturn 119 - -
sigsuspend 72 - -
- - socket 41
socketcall 102 - -
- - socketpair 53
splice 313 splice 275
ssetmask 69 - -
stat 106 stat 4
stat64 195 - -
statfs 99 statfs 137
statfs64 268 - -
stime 25 - -
stty 31 - -
swapoff 115 swapoff 168
swapon 87 swapon 167
symlink 83 symlink 88
symlinkat 304 symlinkat 266
sync 36 sync 162
sync_file_range 314 sync_file_range 277
sysfs 135 sysfs 139
sysinfo 116 sysinfo 99
syslog 103 syslog 103
tee 315 tee 276
tgkill 270 tgkill 234
time 13 time 201
timer_create 259 timer_create 222
timer_delete 263 timer_delete 226
timer_getoverrun 262 timer_getoverrun 225
timer_gettime 261 timer_gettime 224
timer_settime 260 timer_settime 223
timerfd_create 322 timerfd_create 283
timerfd_gettime 326 timerfd_gettime 287
timerfd_settime 325 timerfd_settime 286
times 43 times 100
tkill 238 tkill 200
truncate 92 truncate 76
truncate64 193 - -
- - tuxcall 184
ugetrlimit 191 - -
ulimit 58 - -
umask 60 umask 95
umount 22 - -
umount2 52 umount2 166
uname 122 uname 63
unlink 10 unlink 87
unlinkat 301 unlinkat 263
unshare 310 unshare 272
uselib 86 uselib 134
ustat 62 ustat 136
utime 30 utime 132
utimensat 320 utimensat 280
utimes 271 utimes 235
vfork 190 vfork 58
vhangup 111 vhangup 153
vm86 166 - -
vm86old 113 - -
vmsplice 316 vmsplice 278
vserver 273 vserver 236
wait4 114 wait4 61
waitid 284 waitid 247
waitpid 7 - -
write 4 write 1
writev 146 writev 20