Linuxシステムコール:システムコールとは?

システムコールとは?


 OSが持つ機能を利用するための呼び出しを、Linuxではシステムコールと呼んででいます。OSによってはカネールコール、スーパーバイザコールあるいはサービスコールとも呼ばれることもあります。

 一般的に、OSはコンピューター上の各種資源であるメモリやCPU、あるいはペリフェラルとして接続されているタイマーやファイル、表示や音声のデバイスなど多くのハードウェア・デバイスを管理しています。システムコールの目的の1つが、ユーザープログラムがこれらのハードウェアにアクセスするためのインターフェイスです。
 例えば、メモリを動的に確保したいときに、OSが管理しているメモリ領域からメモリブロックを取得したり、不要になったときに返すなどのメモリを利用するためのシステムコールであったり、ファイルからデータを読み込んだり、書き込んだりするためのシステムコールなどがあります。これらのシステムコールは、物理的に存在しているハードウェアに何らかのアクセスを行います。そして、複数のプロセスから同時にアクセスを行った場合に調停を行う手段を提供していることもあります。

 逆に物理的な存在ではない、プロセスやスレッドと言った実行単位の管理を行うのもOSのしごとです。現代のプログラミング環境は、マルチタスク環境が一般的となっているため、ユーザーが動作させるプログラムの単位であるプロセスやスレッドなどをどのような順番で実行させるか、どのCPUコアを割り当てるかといった実行管理や、動作中のプロセス間での通信手段をサポートするなど、システム全体が協調動作するためのサービスもOSが提供しています。やはりこのようなサービスのインターフェイスもシステムコールとして整備されています。


 さて、ここまでは一般的なシステムコールについてでしたが、ここから先はLinuxのシステムコールについて解説しましょう。

 Linuxは多くのシステムコールを持っています。手元のARM Ver4.14では397個、x86 32bitでは384個のシステムコールがあり、その中にはいくつか使われなくなった番号も含まれます。

 ですが、他のUnix互換のOSと完全に同じではありません。例えば、FreeBSDなどは560個を超えるシステムコールを持っており、他方には存在しないシステムコールもあります。
 つまり、システムコールの体系は他のUnix系OSとは異なる部分があり、同じLinuxでもバージョンやCPUによって異なってくるということです。
 もし、他のCPUや他のUnix系のOSへの互換性を考慮するならLinux固有のシステムコールなどは排除した方がいいと考えられます。

 なお、今回の Lightning Brains Linuxシステムコール投稿では、Beaglebone Black上で動作するARM Ver4.14での解説とします。


さて、ここから先は早速ですが具体的なシステムコールの定義について確認してみましょう。
システムコールは、arch/arm/tools/syscall.tbl に定義されています。
この syscall.tbl はカーネルのビルド時に参照され、syscall.tblを元にシステムコールを定義したソースファイルを生成します。
ファイルの場所が arch/arm/ 以下にあることから想像がつくと思いますが、CPUアーキテクチャ毎にこのシステムコールを定義したファイルが存在し、x86 (PC)では32ビットと64ビットで異なるシステムコールを定義が存在しています。

さて、これから先でこれらのシステムコールをどのように使えばよいかについて見ていきたいと思います。

以下、参考まで arch/arm/tools/syscall.tbl (ARM Ver4.14.108)の内容です。

#
# Linux system call numbers and entry vectors
#
# The format is:
# <num> <abi> <name>   [<entry point>   [<oabi compat entry point>]]
#
# Where abi is:
#  common - for system calls shared between oabi and eabi (may have compat)
#  oabi   - for oabi-only system calls (may have compat)
#  eabi   - for eabi-only system calls
#
# For each syscall number, "common" is mutually exclusive with oabi and eabi
#
0 common restart_syscall  sys_restart_syscall
1 common exit   sys_exit
2 common fork   sys_fork
3 common read   sys_read
4 common write   sys_write
5 common open   sys_open
6 common close   sys_close
# 7 was sys_waitpid
8 common creat   sys_creat
9 common link   sys_link
10 common unlink   sys_unlink
11 common execve   sys_execve
12 common chdir   sys_chdir
13 oabi time   sys_time
14 common mknod   sys_mknod
15 common chmod   sys_chmod
16 common lchown   sys_lchown16
# 17 was sys_break
# 18 was sys_stat
19 common lseek   sys_lseek
20 common getpid   sys_getpid
21 common mount   sys_mount
22 oabi umount   sys_oldumount
23 common setuid   sys_setuid16
24 common getuid   sys_getuid16
25 oabi stime   sys_stime
26 common ptrace   sys_ptrace
27 oabi alarm   sys_alarm
# 28 was sys_fstat
29 common pause   sys_pause
30 oabi utime   sys_utime
# 31 was sys_stty
# 32 was sys_gtty
33 common access   sys_access
34 common nice   sys_nice
# 35 was sys_ftime
36 common sync   sys_sync
37 common kill   sys_kill
38 common rename   sys_rename
39 common mkdir   sys_mkdir
40 common rmdir   sys_rmdir
41 common dup   sys_dup
42 common pipe   sys_pipe
43 common times   sys_times
# 44 was sys_prof
45 common brk   sys_brk
46 common setgid   sys_setgid16
47 common getgid   sys_getgid16
# 48 was sys_signal
49 common geteuid   sys_geteuid16
50 common getegid   sys_getegid16
51 common acct   sys_acct
52 common umount2   sys_umount
# 53 was sys_lock
54 common ioctl   sys_ioctl
55 common fcntl   sys_fcntl
# 56 was sys_mpx
57 common setpgid   sys_setpgid
# 58 was sys_ulimit
# 59 was sys_olduname
60 common umask   sys_umask
61 common chroot   sys_chroot
62 common ustat   sys_ustat
63 common dup2   sys_dup2
64 common getppid   sys_getppid
65 common getpgrp   sys_getpgrp
66 common setsid   sys_setsid
67 common sigaction  sys_sigaction
# 68 was sys_sgetmask
# 69 was sys_ssetmask
70 common setreuid  sys_setreuid16
71 common setregid  sys_setregid16
72 common sigsuspend  sys_sigsuspend
73 common sigpending  sys_sigpending
74 common sethostname  sys_sethostname
75 common setrlimit  sys_setrlimit
# Back compat 2GB limited rlimit
76 oabi getrlimit  sys_old_getrlimit
77 common getrusage  sys_getrusage
78 common gettimeofday  sys_gettimeofday
79 common settimeofday  sys_settimeofday
80 common getgroups  sys_getgroups16
81 common setgroups  sys_setgroups16
82 oabi select   sys_old_select
83 common symlink   sys_symlink
# 84 was sys_lstat
85 common readlink  sys_readlink
86 common uselib   sys_uselib
87 common swapon   sys_swapon
88 common reboot   sys_reboot
89 oabi readdir   sys_old_readdir
90 oabi mmap   sys_old_mmap
91 common munmap   sys_munmap
92 common truncate  sys_truncate
93 common ftruncate  sys_ftruncate
94 common fchmod   sys_fchmod
95 common fchown   sys_fchown16
96 common getpriority  sys_getpriority
97 common setpriority  sys_setpriority
# 98 was sys_profil
99 common statfs   sys_statfs
100 common fstatfs   sys_fstatfs
# 101 was sys_ioperm
102 oabi socketcall  sys_socketcall  sys_oabi_socketcall
103 common syslog   sys_syslog
104 common setitimer  sys_setitimer
105 common getitimer  sys_getitimer
106 common stat   sys_newstat
107 common lstat   sys_newlstat
108 common fstat   sys_newfstat
# 109 was sys_uname
# 110 was sys_iopl
111 common vhangup   sys_vhangup
# 112 was sys_idle
# syscall to call a syscall!
113 oabi syscall   sys_syscall
114 common wait4   sys_wait4
115 common swapoff   sys_swapoff
116 common sysinfo   sys_sysinfo
117 oabi ipc   sys_ipc   sys_oabi_ipc
118 common fsync   sys_fsync
119 common sigreturn  sys_sigreturn_wrapper
120 common clone   sys_clone
121 common setdomainname  sys_setdomainname
122 common uname   sys_newuname
# 123 was sys_modify_ldt
124 common adjtimex  sys_adjtimex
125 common mprotect  sys_mprotect
126 common sigprocmask  sys_sigprocmask
# 127 was sys_create_module
128 common init_module  sys_init_module
129 common delete_module  sys_delete_module
# 130 was sys_get_kernel_syms
131 common quotactl  sys_quotactl
132 common getpgid   sys_getpgid
133 common fchdir   sys_fchdir
134 common bdflush   sys_bdflush
135 common sysfs   sys_sysfs
136 common personality  sys_personality
# 137 was sys_afs_syscall
138 common setfsuid  sys_setfsuid16
139 common setfsgid  sys_setfsgid16
140 common _llseek   sys_llseek
141 common getdents  sys_getdents
142 common _newselect  sys_select
143 common flock   sys_flock
144 common msync   sys_msync
145 common readv   sys_readv
146 common writev   sys_writev
147 common getsid   sys_getsid
148 common fdatasync  sys_fdatasync
149 common _sysctl   sys_sysctl
150 common mlock   sys_mlock
151 common munlock   sys_munlock
152 common mlockall  sys_mlockall
153 common munlockall  sys_munlockall
154 common sched_setparam  sys_sched_setparam
155 common sched_getparam  sys_sched_getparam
156 common sched_setscheduler sys_sched_setscheduler
157 common sched_getscheduler sys_sched_getscheduler
158 common sched_yield  sys_sched_yield
159 common sched_get_priority_max sys_sched_get_priority_max
160 common sched_get_priority_min sys_sched_get_priority_min
161 common sched_rr_get_interval sys_sched_rr_get_interval
162 common nanosleep  sys_nanosleep
163 common mremap   sys_mremap
164 common setresuid  sys_setresuid16
165 common getresuid  sys_getresuid16
# 166 was sys_vm86
# 167 was sys_query_module
168 common poll   sys_poll
169 common nfsservctl
170 common setresgid  sys_setresgid16
171 common getresgid  sys_getresgid16
172 common prctl   sys_prctl
173 common rt_sigreturn  sys_rt_sigreturn_wrapper
174 common rt_sigaction  sys_rt_sigaction
175 common rt_sigprocmask  sys_rt_sigprocmask
176 common rt_sigpending  sys_rt_sigpending
177 common rt_sigtimedwait  sys_rt_sigtimedwait
178 common rt_sigqueueinfo  sys_rt_sigqueueinfo
179 common rt_sigsuspend  sys_rt_sigsuspend
180 common pread64   sys_pread64  sys_oabi_pread64
181 common pwrite64  sys_pwrite64  sys_oabi_pwrite64
182 common chown   sys_chown16
183 common getcwd   sys_getcwd
184 common capget   sys_capget
185 common capset   sys_capset
186 common sigaltstack  sys_sigaltstack
187 common sendfile  sys_sendfile
# 188 reserved
# 189 reserved
190 common vfork   sys_vfork
# SuS compliant getrlimit
191 common ugetrlimit  sys_getrlimit
192 common mmap2   sys_mmap2
193 common truncate64  sys_truncate64  sys_oabi_truncate64
194 common ftruncate64  sys_ftruncate64  sys_oabi_ftruncate64
195 common stat64   sys_stat64  sys_oabi_stat64
196 common lstat64   sys_lstat64  sys_oabi_lstat64
197 common fstat64   sys_fstat64  sys_oabi_fstat64
198 common lchown32  sys_lchown
199 common getuid32  sys_getuid
200 common getgid32  sys_getgid
201 common geteuid32  sys_geteuid
202 common getegid32  sys_getegid
203 common setreuid32  sys_setreuid
204 common setregid32  sys_setregid
205 common getgroups32  sys_getgroups
206 common setgroups32  sys_setgroups
207 common fchown32  sys_fchown
208 common setresuid32  sys_setresuid
209 common getresuid32  sys_getresuid
210 common setresgid32  sys_setresgid
211 common getresgid32  sys_getresgid
212 common chown32   sys_chown
213 common setuid32  sys_setuid
214 common setgid32  sys_setgid
215 common setfsuid32  sys_setfsuid
216 common setfsgid32  sys_setfsgid
217 common getdents64  sys_getdents64
218 common pivot_root  sys_pivot_root
219 common mincore   sys_mincore
220 common madvise   sys_madvise
221 common fcntl64   sys_fcntl64  sys_oabi_fcntl64
# 222 for tux
# 223 is unused
224 common gettid   sys_gettid
225 common readahead  sys_readahead  sys_oabi_readahead
226 common setxattr  sys_setxattr
227 common lsetxattr  sys_lsetxattr
228 common fsetxattr  sys_fsetxattr
229 common getxattr  sys_getxattr
230 common lgetxattr  sys_lgetxattr
231 common fgetxattr  sys_fgetxattr
232 common listxattr  sys_listxattr
233 common llistxattr  sys_llistxattr
234 common flistxattr  sys_flistxattr
235 common removexattr  sys_removexattr
236 common lremovexattr  sys_lremovexattr
237 common fremovexattr  sys_fremovexattr
238 common tkill   sys_tkill
239 common sendfile64  sys_sendfile64
240 common futex   sys_futex
241 common sched_setaffinity sys_sched_setaffinity
242 common sched_getaffinity sys_sched_getaffinity
243 common io_setup  sys_io_setup
244 common io_destroy  sys_io_destroy
245 common io_getevents  sys_io_getevents
246 common io_submit  sys_io_submit
247 common io_cancel  sys_io_cancel
248 common exit_group  sys_exit_group
249 common lookup_dcookie  sys_lookup_dcookie
250 common epoll_create  sys_epoll_create
251 common epoll_ctl  sys_epoll_ctl  sys_oabi_epoll_ctl
252 common epoll_wait  sys_epoll_wait  sys_oabi_epoll_wait
253 common remap_file_pages sys_remap_file_pages
# 254 for set_thread_area
# 255 for get_thread_area
256 common set_tid_address  sys_set_tid_address
257 common timer_create  sys_timer_create
258 common timer_settime  sys_timer_settime
259 common timer_gettime  sys_timer_gettime
260 common timer_getoverrun sys_timer_getoverrun
261 common timer_delete  sys_timer_delete
262 common clock_settime  sys_clock_settime
263 common clock_gettime  sys_clock_gettime
264 common clock_getres  sys_clock_getres
265 common clock_nanosleep  sys_clock_nanosleep
266 common statfs64  sys_statfs64_wrapper
267 common fstatfs64  sys_fstatfs64_wrapper
268 common tgkill   sys_tgkill
269 common utimes   sys_utimes
270 common arm_fadvise64_64 sys_arm_fadvise64_64
271 common pciconfig_iobase sys_pciconfig_iobase
272 common pciconfig_read  sys_pciconfig_read
273 common pciconfig_write  sys_pciconfig_write
274 common mq_open   sys_mq_open
275 common mq_unlink  sys_mq_unlink
276 common mq_timedsend  sys_mq_timedsend
277 common mq_timedreceive  sys_mq_timedreceive
278 common mq_notify  sys_mq_notify
279 common mq_getsetattr  sys_mq_getsetattr
280 common waitid   sys_waitid
281 common socket   sys_socket
282 common bind   sys_bind  sys_oabi_bind
283 common connect   sys_connect  sys_oabi_connect
284 common listen   sys_listen
285 common accept   sys_accept
286 common getsockname  sys_getsockname
287 common getpeername  sys_getpeername
288 common socketpair  sys_socketpair
289 common send   sys_send
290 common sendto   sys_sendto  sys_oabi_sendto
291 common recv   sys_recv
292 common recvfrom  sys_recvfrom
293 common shutdown  sys_shutdown
294 common setsockopt  sys_setsockopt
295 common getsockopt  sys_getsockopt
296 common sendmsg   sys_sendmsg  sys_oabi_sendmsg
297 common recvmsg   sys_recvmsg
298 common semop   sys_semop  sys_oabi_semop
299 common semget   sys_semget
300 common semctl   sys_semctl
301 common msgsnd   sys_msgsnd
302 common msgrcv   sys_msgrcv
303 common msgget   sys_msgget
304 common msgctl   sys_msgctl
305 common shmat   sys_shmat
306 common shmdt   sys_shmdt
307 common shmget   sys_shmget
308 common shmctl   sys_shmctl
309 common add_key   sys_add_key
310 common request_key  sys_request_key
311 common keyctl   sys_keyctl
312 common semtimedop  sys_semtimedop  sys_oabi_semtimedop
313 common vserver
314 common ioprio_set  sys_ioprio_set
315 common ioprio_get  sys_ioprio_get
316 common inotify_init  sys_inotify_init
317 common inotify_add_watch sys_inotify_add_watch
318 common inotify_rm_watch sys_inotify_rm_watch
319 common mbind   sys_mbind
320 common get_mempolicy  sys_get_mempolicy
321 common set_mempolicy  sys_set_mempolicy
322 common openat   sys_openat
323 common mkdirat   sys_mkdirat
324 common mknodat   sys_mknodat
325 common fchownat  sys_fchownat
326 common futimesat  sys_futimesat
327 common fstatat64  sys_fstatat64  sys_oabi_fstatat64
328 common unlinkat  sys_unlinkat
329 common renameat  sys_renameat
330 common linkat   sys_linkat
331 common symlinkat  sys_symlinkat
332 common readlinkat  sys_readlinkat
333 common fchmodat  sys_fchmodat
334 common faccessat  sys_faccessat
335 common pselect6  sys_pselect6
336 common ppoll   sys_ppoll
337 common unshare   sys_unshare
338 common set_robust_list  sys_set_robust_list
339 common get_robust_list  sys_get_robust_list
340 common splice   sys_splice
341 common arm_sync_file_range sys_sync_file_range2
342 common tee   sys_tee
343 common vmsplice  sys_vmsplice
344 common move_pages  sys_move_pages
345 common getcpu   sys_getcpu
346 common epoll_pwait  sys_epoll_pwait
347 common kexec_load  sys_kexec_load
348 common utimensat  sys_utimensat
349 common signalfd  sys_signalfd
350 common timerfd_create  sys_timerfd_create
351 common eventfd   sys_eventfd
352 common fallocate  sys_fallocate
353 common timerfd_settime  sys_timerfd_settime
354 common timerfd_gettime  sys_timerfd_gettime
355 common signalfd4  sys_signalfd4
356 common eventfd2  sys_eventfd2
357 common epoll_create1  sys_epoll_create1
358 common dup3   sys_dup3
359 common pipe2   sys_pipe2
360 common inotify_init1  sys_inotify_init1
361 common preadv   sys_preadv
362 common pwritev   sys_pwritev
363 common rt_tgsigqueueinfo sys_rt_tgsigqueueinfo
364 common perf_event_open  sys_perf_event_open
365 common recvmmsg  sys_recvmmsg
366 common accept4   sys_accept4
367 common fanotify_init  sys_fanotify_init
368 common fanotify_mark  sys_fanotify_mark
369 common prlimit64  sys_prlimit64
370 common name_to_handle_at sys_name_to_handle_at
371 common open_by_handle_at sys_open_by_handle_at
372 common clock_adjtime  sys_clock_adjtime
373 common syncfs   sys_syncfs
374 common sendmmsg  sys_sendmmsg
375 common setns   sys_setns
376 common process_vm_readv sys_process_vm_readv
377 common process_vm_writev sys_process_vm_writev
378 common kcmp   sys_kcmp
379 common finit_module  sys_finit_module
380 common sched_setattr  sys_sched_setattr
381 common sched_getattr  sys_sched_getattr
382 common renameat2  sys_renameat2
383 common seccomp   sys_seccomp
384 common getrandom  sys_getrandom
385 common memfd_create  sys_memfd_create
386 common bpf   sys_bpf
387 common execveat  sys_execveat
388 common userfaultfd  sys_userfaultfd
389 common membarrier  sys_membarrier
390 common mlock2   sys_mlock2
391 common copy_file_range  sys_copy_file_range
392 common preadv2   sys_preadv2
393 common pwritev2  sys_pwritev2
394 common pkey_mprotect  sys_pkey_mprotect
395 common pkey_alloc  sys_pkey_alloc
396 common pkey_free  sys_pkey_free
397 common statx   sys_statx




Lightning Brains

コメント

このブログの人気の投稿

Linuxシステムコール、共有メモリの使い方

Linuxシステムコール、メッセージキューの使い方

Linuxシステムコール、セマフォの使い方