syscall(2) - wariua/manpages-ko GitHub Wiki
syscall - κ°μ μ μμ€ν νΈμΆ
#define _GNU_SOURCE /* feature_test_macros(7) μ°Έκ³ */
#include <unistd.h>
#include <sys/syscall.h> /* SYS_xxx μ μ */
long syscall(long number, ...);
syscall()
μ μμ λΌμ΄λΈλ¬λ¦¬ ν¨μμ΄λ©°, μ§μ ν λ²νΈ number
μ μ§μ ν μΈμλ€μ κ°μ§ μ΄μ
λΈλ¦¬ μΈμ΄ μΈν°νμ΄μ€μ μμ€ν
νΈμΆμ λΆλ₯Έλ€. μλ₯Ό λ€μ΄ C λΌμ΄λΈλ¬λ¦¬μ λνΌ ν¨μκ° μλ μμ€ν
νΈμΆμ λΆλ₯Ό λ syscall()
μ΄ μ μ©νλ€.
syscall()
μ μμ€ν
νΈμΆμ νκΈ° μ μ CPU λ μ§μ€ν°λ€μ μ μ₯ν΄ λκ³ , μμ€ν
νΈμΆ λ°ν ν κ·Έ λ μ§μ€ν°λ€μ 볡μνλ©°, μ€λ₯ λ°μ μ μμ€ν
νΈμΆμ΄ λ°νν μ€λ₯ μ½λλ₯Ό errno(3)μ μ μ₯νλ€.
μμ€ν
νΈμΆ λ²νΈ μμλ€μ ν€λ νμΌ <sys/syscall.h>
μμ μ°Ύμ μ μλ€.
λΆλ₯΄λ €κ³ νλ μμ€ν
νΈμΆμ΄ λ°ν κ°μ κ·μ νλ€. μΌλ°μ μΌλ‘ λ°ν κ° 0μ μ±κ³΅μ λνλΈλ€. λ°ν κ° -1μ μ€λ₯λ₯Ό λνλ΄λ©° errno
μ μ€λ₯ μ½λκ° μ μ₯λλ€.
4BSDμμ syscall()
μ΄ μ²μ λ±μ₯νλ€.
κ°κ°μ μν€ν
μ² ABIλ§λ€ μμ€ν
νΈμΆμ μ΄λ»κ² 컀λλ‘ μ λ¬νλμ§μ λν λλ¦μ μꡬ μ¬νμ΄ μλ€. glibc λνΌκ° μλ μμ€ν
νΈμΆ(μ¦, λλΆλΆμ μμ€ν
νΈμΆ)μμλ μν€ν
μ²μ λ§λ λ°©μμΌλ‘ μΈμλ₯Ό λ μ§μ€ν°λ‘ 볡μ¬νλ μΈλΆ μ¬νλ€μ glibcκ° λ€λ€ μ€λ€. νμ§λ§ syscall()
μ μ΄μ©ν΄ μμ€ν
νΈμΆμ ν λλ νΈμΆμκ° μν€ν
μ²λ³ μΈλΆ μ¬νλ€μ λ€λ€μΌ ν μλ μλ€. νΉμ 32λΉνΈ μν€ν
μ²λ€μμ μ΄λ° μꡬ μ¬νμ κ°μ₯ νν λ§λκ² λλ€.
μλ₯Ό λ€μ΄ ARM μν€ν
μ² μλ² λλ ABI(EABI)μμλ 64λΉνΈ κ°(κ°λ Ή long long
)μ μ§μ λ² λ μ§μ€ν° μμ μ λ ¬μμΌμΌ νλ€. κ·Έλμ 리ν μλμΈ λͺ¨λ EABI ARM μν€ν
μ²μμ glibcκ° μ 곡νλ λνΌ λμ syscall()
μ μ¬μ©νλ€λ©΄ readahead()
μμ€ν
νΈμΆμ λ€μκ³Ό κ°μ΄ λΆλ₯΄κ² λ κ²μ΄λ€.
syscall(SYS_readahead, fd, 0,
(unsigned int) (offset & 0xFFFFFFFF),
(unsigned int) (offset >> 32),
count);
offset
μΈμκ° 64λΉνΈμ΄κ³ 첫 λ²μ§Έ μΈμ(fd
)λ₯Ό r0
λ‘ μ λ¬νλ―λ‘ νΈμΆμκ° 64λΉνΈ κ°μ μ§μ μͺΌκ°κ³ μ λ ¬ν΄μ r2
/r3
λ μ§μ€ν° μμΌλ‘ μ λ¬λκ² ν΄μΌ νλ€. μ¦ r1
μ λλ―Έ κ°μ λ£λλ€ (λ λ²μ§Έ μΈμ 0). μͺΌκ°κΈ°κ° (νλ«νΌμ λν C ABIμ λ°λ₯Έ) μλμΈ κ·μ½μ λ°λ₯΄λλ‘ νλ λ°μλ μ£Όμλ₯Ό κΈ°μΈμ¬μΌ νλ€.
O32 ABIμ MIPS, 32λΉνΈ ABIμ PowerPC λ° parisc, κ·Έλ¦¬κ³ Xtensaμμλ λΉμ·ν λ¬Έμ κ° λ°μν μ μλ€.
μ°Έκ³ λ‘ parisc C ABIμμλ μ λ ¬λ λ μ§μ€ν° μμ μ¬μ©νμ§λ§ μ€κ° κ³μΈ΅μ μ΄μ©ν΄ μ¬μ©μ 곡κ°μκ² λ¬Έμ λ₯Ό κ°μΆ° μ€λ€.
μν₯ λ°λ μμ€ν νΈμΆμ fadvise64_64(2), ftruncate64(2), posix_fadvise(2), pread64(2), pwrite64(2), readahead(2), sync_file_range(2), truncate64(2)μ΄λ€.
_llseek(2), preadv(2), preadv2(2), pwritev(2), pwritev2(2)μ²λΌ μ§μ 64λΉνΈ κ°μ μͺΌκ°κ³ ν©μΉλ μμ€ν νΈμΆλ€μ μν₯μ λ°μ§ μλλ€. μμ¬μ μμ¬λ€μ λ©μ§ μΈκ³μ μ¨ κ²μ νμνλ€.
μν€ν μ²λ§λ€ 컀λμ νΈμΆνκ³ μΈμλ₯Ό μ λ¬νλ λλ¦μ λ°©μμ΄ μλ€. μ¬λ¬ μν€ν μ²μ μΈλΆ μ¬νλ€μ΄ μλ λ νμ λμ΄λμ΄ μλ€.
첫 λ²μ§Έ νλ 컀λλ‘ μ ννλ λ° μ°λ μΈμ€νΈλμ (컀λλ‘ μ ννλ μ΅λ¨ λ΄μ§ μ΅μ μ λ°©λ²μ΄ μλ μλ μμΌλ©°, κ·Έλμ vdso(7)λ₯Ό μ°Έκ³ ν΄μΌ ν μλ μμ), μμ€ν νΈμΆ λ²νΈλ₯Ό λνλ΄λ λ° μ°λ λ μ§μ€ν°, 컀λ νΈμΆ κ²°κ³Όλ₯Ό λ°ννλ λ° μ°λ λ μ§μ€ν°(λ€), μ€λ₯λ₯Ό μ리λ λ° μ°λ λ μ§μ€ν°λ₯Ό λ³΄μ¬ μ€λ€.
μν€ν μ²/ABI | μΈμ€νΈλμ | μμ€ν
νΈμΆ # |
λ°ν κ° |
λ°ν κ° 2 |
μ€λ₯ | μ°Έκ³ |
---|---|---|---|---|---|---|
alpha | callsys |
v0 |
v0 |
a4 |
a3 |
1, 6 |
arc | trap0 |
r8 |
r0 |
- | - | |
arm/OABI | swi NR |
- | a1 |
- | - | 2 |
arm/EABI | swi 0x0 |
r7 |
r0 |
r1 |
- | |
arm64 | svc #0 |
x8 |
x0 |
x1 |
- | |
blackfin | excpt 0x0 |
P0 |
R0 |
- | - | |
i386 | int $0x80 |
eax |
eax |
edx |
- | |
ia64 | break 0x100000 |
r15 |
r8 |
r9 |
r10 |
1, 6 |
m68k | trap #0 |
d0 |
d0 |
- | - | |
microblaze | brki r14,8 |
r12 |
r3 |
- | - | |
mips | syscall |
v0 |
v0 |
v1 |
a3 |
1, 6 |
nios2 | trap |
r2 |
r2 |
- | r7 |
|
parisc | ble 0x100(%sr2, %r0) |
r20 |
r28 |
- | - | |
powerpc | sc |
r0 |
r3 |
- | r0 |
1 |
riscv | scall |
a7 |
a0 |
a1 |
- | |
s390 | svc 0 |
r1 |
r2 |
r3 |
- | 3 |
s390x | svc 0 |
r1 |
r2 |
r3 |
- | 3 |
superh | trap #0x17 |
r3 |
r0 |
r1 |
- | 4, 6 |
sparc/32 | t 0x10 |
g1 |
o0 |
o1 |
psr /csr
|
1, 6 |
sparc/64 | t 0x6d |
g1 |
o0 |
o1 |
psr /csr
|
1, 6 |
tile | swint1 |
R10 |
R00 |
- | R01 |
1 |
x86-64 | syscall |
rax |
rax |
rdx |
- | 5 |
x32 | syscall |
rax |
rax |
rdx |
- | 5 |
xtensa | syscall |
a2 |
a2 |
- | - |
μ°Έκ³ :
[1] λͺλͺ μν€ν
μ²μμλ λ μ§μ€ν° νλλ₯Ό λΆλ¦¬μΈμΌλ‘ μ¬μ©ν΄ (0μ μ€λ₯ μμ, -1μ μ€λ₯ λνλ) μμ€ν
νΈμΆμ΄ μ€ν¨νλμ§ μλ¦°λ€. μ€μ μ€λ₯ κ°μ λ§μ°¬κ°μ§λ‘ λ°ν λ μ§μ€ν°μ λ΄λλ€. sparcμμλ λ μ§μ€ν° μ 체 λμ νλ‘μΈμ μν λ μ§μ€ν°(psr
)μ μΊλ¦¬ λΉνΈ(csr
)λ₯Ό μ¬μ©νλ€.
[2] NR
μ΄ μμ€ν
νΈμΆ λ²νΈμ΄λ€.
[3] s390κ³Ό s390xμμλ NR
(μμ€ν
νΈμΆ λ²νΈ)κ° 256λ³΄λ€ μμΌλ©΄ svc NR
λ‘ μ§μ μ λ¬ν μλ μλ€.
[4] SuperHμμλ νΈλ© λ²νΈκ° μ λ¬ μΈμμ μ΅λ κ°μλ₯Ό κ·μ νλ€. trap #0x10
μ μΈμ 0κ°μΈ μμ€ν
νΈμΆκ³Ό μ¬μ©ν μ μκ³ , trap #0x11
μ μΈμκ° 0κ°λ 1κ°μΈ μμ€ν
νΈμΆκ³Ό μ¬μ©ν μ μκ³ , κ·Έλ° μμΌλ‘ ν΄μ trap #0x17
μ μΈμ 7κ°μΈ μμ€ν
νΈμΆμ μν κ²μ΄λ€.
[5] x32 ABIλ x86-64 ABIμ μμ€ν νΈμΆ ν μ΄λΈμ 곡μ νλ λͺ κ°μ§ λ―Έλ¬ν μ°¨μ΄κ° μλ€.
-
x32 ABI νμμ μμ€ν νΈμΆμ΄ μ΄λ€μ§λ κ±Έ λνλ΄κΈ° μν΄μ μμ€ν νΈμΆ λ²νΈμ μΆκ°λ‘
__X32_SYSCALL_BIT
λΉνΈλ₯Ό OR νλ€. νλ‘μΈμ€μμ μ¬μ©νλ ABIκ° μκ·Έλ μ²λ¦¬λ μμ€ν νΈμΆ μ¬μμμ ν¬ν¨ν μΌλΆ νλ‘μΈμ€ λμ λ°©μμ μν₯μ μ€λ€. -
x32μμ
long
λ° ν¬μΈν° νμ μ ν¬κΈ°κ° λ€λ₯΄κΈ° λλ¬Έμ μΌλΆ ꡬ쑰체μ (μ λΆλ μλλ€. μλ₯Ό λ€μ΄struct timeval
μ΄λstruct rlimit
μ 64λΉνΈλ₯Ό μ΄λ€.) λ°°μΉκ° λ€λ₯΄λ€. μ΄λ₯Ό λ€λ£¨κΈ° μν΄ μμ€ν νΈμΆ ν μ΄λΈμ λ²νΈκ° (__X32_SYSCALL_BIT
λ μ μΈνκ³ ) 512λΆν° μμνλ μμ€ν νΈμΆλ€μ΄ μΆκ°λΌ μλ€. μλ₯Ό λ€μ΄__NR_readv
κ° x86-64 ABIμλ 19λ‘ μ μλΌ μκ³ x32 ABIμλ__X32_SYSCALL_BIT | 515
λ‘ μ μλΌ μλ€. μ΄λ° μΆκ° μμ€ν νΈμΆ λλΆλΆμ μ¬μ€ i386 νΈνμ± μ 곡μ μν μμ€ν νΈμΆλ€κ³Ό λμΌνλ€. νμ§λ§ preadv2(2)μ²λΌ λμ λλ μμΈλ μλλ°, 4λ°μ΄νΈ ν¬μΈν° λ° ν¬κΈ°λ₯Ό μ°λstruct iovec
νλͺ©(컀λ μ©μ΄λ‘λ "compat_iovec")μ μ¬μ©νλ©΄μλ μ¬ν ABIμμμ²λΌ 8λ°μ΄νΈpos
μΈμλ₯Ό λμ΄ μλ ν λ μ§μ€ν°λ‘ μ λ¬νλ€.
[6] μΌλΆ μν€ν
μ²(Alpha, IA-64, MIPS, SuperH, sparc/32, sparc/64)μμλ μΆκ° λ μ§μ€ν°(μ νμ "λ°ν κ° 2")λ₯Ό μ¬μ©ν΄μ pipe(2) μμ€ν
νΈμΆμ λ λ²μ§Έ λ°ν κ°μ λλλ € μ€λ€. Alphaμμ μν€ν
μ² νμ μμ€ν
νΈμΆμΈ getxpid(2)
, getxuid(2)
, getxgid(2)
μμλ μ΄ κΈ°λ²μ μ΄λ€. λ€λ₯Έ μν€ν
μ²λ€μμ System V ABIμ μ μλΌ μλ κ²½μ°μ‘°μ°¨λ μμ€ν
νΈμΆ μΈν°νμ΄μ€μμ λ λ²μ§Έ λ°ν κ° λ μ§μ€ν°λ₯Ό μ°μ§ μλλ€.
λ λ²μ§Έ νλ μμ€ν νΈμΆ μΈμλ€μ μ λ¬νλ λ° μ°λ λ μ§μ€ν°λ€μ λ³΄μ¬ μ€λ€.
μν€ν μ²/ABI | arg1 | arg2 | arg3 | arg4 | arg5 | arg6 | arg7 | μ°Έκ³ |
---|---|---|---|---|---|---|---|---|
alpha | a0 |
a1 |
a2 |
a3 |
a4 |
a5 |
- | |
arc | r0 |
r1 |
r2 |
r3 |
r4 |
r5 |
- | |
arm/OABI | a1 |
a2 |
a3 |
a4 |
v1 |
v2 |
v3 |
|
arm/EABI | r0 |
r1 |
r2 |
r3 |
r4 |
r5 |
r6 |
|
arm64 | x0 |
x1 |
x2 |
x3 |
x4 |
x5 |
- | |
blackfin | R0 |
R1 |
R2 |
R3 |
R4 |
R5 |
- | |
i386 | ebx |
ecx |
edx |
esi |
edi |
ebp |
- | |
ia64 | out0 |
out1 |
out2 |
out3 |
out4 |
out5 |
- | |
m68k | d1 |
d2 |
d3 |
d4 |
d5 |
a0 |
- | |
microblaze | r5 |
r6 |
r7 |
r8 |
r9 |
r10 |
- | |
mips/o32 | a0 |
a1 |
a2 |
a3 |
- | - | - | 1 |
mips/n32,64 | a0 |
a1 |
a2 |
a3 |
a4 |
a5 |
- | |
nios2 | r4 |
r5 |
r6 |
r7 |
r8 |
r9 |
- | |
parisc | r26 |
r25 |
r24 |
r23 |
r22 |
r21 |
- | |
powerpc | r3 |
r4 |
r5 |
r6 |
r7 |
r8 |
r9 |
|
riscv | a0 |
a1 |
a2 |
a3 |
a4 |
a5 |
- | |
s390 | r2 |
r3 |
r4 |
r5 |
r6 |
r7 |
- | |
s390x | r2 |
r3 |
r4 |
r5 |
r6 |
r7 |
- | |
superh | r4 |
r5 |
r6 |
r7 |
r0 |
r1 |
r2 |
|
sparc/32 | o0 |
o1 |
o2 |
o3 |
o4 |
o5 |
- | |
sparc/64 | o0 |
o1 |
o2 |
o3 |
o4 |
o5 |
- | |
tile | R00 |
R01 |
R02 |
R03 |
R04 |
R05 |
- | |
x86-64 | rdi |
rsi |
rdx |
r10 |
r8 |
r9 |
- | |
x32 | rdi |
rsi |
rdx |
r10 |
r8 |
r9 |
- | |
xtensa | a6 |
a3 |
a4 |
a5 |
a8 |
a9 |
- |
μ°Έκ³ :
[1] mips/o32 μμ€ν νΈμΆ κ·μ½μμλ 5λ²μμ 8λ²κΉμ§ μΈμλ€μ μ¬μ©μ μ€νμΌλ‘ μ λ¬νλ€.
μ°Έκ³ λ‘ μ΄ νλ€μ΄ νΈμΆ κ·μ½ μ 체λ₯Ό ν¬κ΄νλ κ²μ μλλ€. μΌλΆ μν€ν μ²μμ μ¬κΈ° λμ΄ μ λ λ€λ₯Έ λ μ§μ€ν°λ€μ λ§κ΅¬ 건λ릴 μλ μλ€.
#define _GNU_SOURCE
#include <unistd.h>
#include <sys/syscall.h>
#include <sys/types.h>
#include <signal.h>
int
main(int argc, char *argv[])
{
pid_t tid;
tid = syscall(SYS_gettid);
syscall(SYS_tgkill, getpid(), tid, SIGHUP);
}
_syscall(2), intro(2)
, syscalls(2), errno(3), vdso(7)
2018-04-30