System Programming(ARM)

[ARM] System Call 정리

suhwanc 2020. 11. 8. 02:38

arm assembly 코드를 짜면서 자주 사용하지만 항상 헷갈리는 system call에 대해 정리해봅니다.

코드에 대한 대략적인 설명은 @(주석)에 쓰여 있습니다!

 

 

0. 기초

 

아래 코드에서 공통되는 내용입니다.

 

fd

File Descriptor의 약자이며, 리눅스에서 프로세스가 파일을 다룰 때 사용하는 개념으로, 간단히 파일에 접근을 어떻게 할 것인지 지정하는 역할을 합니다.

 

pstr

포인터입니다. 보통 버퍼의 앞 부분을 가리키는 데에 사용하며, 주소 값을 갖습니다.

 

len

버퍼의 길이를 의미합니다.

 

swi

swi(software interrupt)는 어떤 장치가 다른 장치의 일을 잠시 중단시키고 자신의 상태 변화를 알려 주는 것입니다.

아래 코드에서는 잠깐 멈춰 입출력 혹은 종료를 하도록 합니다.

 

1. 입력(system read)

 

1
2
3
4
5
6
7
 @ sys_read (fd, pstr, len);
 @            r0   r1  r2
  mov r0, #0      @ fd <- stdin
  ldr r1, =buf    @ r1 = buffer(4 bytes)
  mov r2, #4      @ len <- 4
  mov r7, #3      @ syscall <- sys_read
  swi 0           @ system call
cs

line 3) mov r0, #0    -> 입력의 fd는 0입니다. (암기)

line 4) ldr r1, =buf   -> r1이 버퍼 공간을 로드합니다. (buf는 아래 선언된 4바이트 빈 공간입니다!)

line 5) mov r2, #4    -> 길이를 4로 설정해둡니다. 

line 6) mov r7, #3    -> 입력의 system call 번호는 3입니다.

 

2. 출력(system write)

 

1
2
3
4
5
6
@ sys_write (fd, pstr, len);
@            r0   r1   r2
    mov r0, #1      @ fd <- stdout
    mov r2, #1      @ len <- 1
    mov r7, #4      @ syscall <- sys_write
    swi 0           @ system call
cs

 

line 3) mov r0, #1    -> 출력의 fd는 1입니다. (암기)

line 4) mov r2, #1    -> 길이를 1로 설정해둡니다.

line 5) mov r7, #4    -> 입력의 system call 번호는 4입니다.

 

3. 종료(exit)

 

1
2
3
4
@ sys_exit (exitcode)
    mov r0, #0      @ exitcode <- 0
    mov r7, #1      @ syscall <- sys_exit
    swi 0           @ system call
cs

line 2) mov r0, #1    -> 종료의 fd는 0입니다. (입력과 같습니다!)

line 3) mov r7, #1    -> 종료의 system call 번호는 1입니다.

 

 

4. 응용

 

이번엔 이 3가지를 합쳐서, 입력받은 4 bytes char 글자 하나를 그대로 출력하는 코드입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
@ suhwan++20201108
system call test
 
.text
_start: .global _start
 
@ sys_read (fd, pstr, len);
@            r0   r1  r2
    mov r0, #0      @ fd <- stdin
    ldr r1, =buf    @ r1 = buffer(4 bytes)
    mov r2, #4      @ len <- 4
    mov r7, #3      @ syscall <- sys_read
    swi 0           @ system call
 
@ sys_write (fd, pstr, len);
@            r0   r1   r2
    mov r0, #1      @ fd <- stdout
    mov r2, #1      @ len <- 1
    mov r7, #4      @ syscall <- sys_write
    swi 0           @ system call
 
    adr r1, lf
    swi 0
@ sys_exit (exitcode)
    mov r0, #0      @ exitcode <- 0
    mov r7, #1      @ syscall <- sys_exit
    swi 0           @ system call
lf: .byte '\n'
.data
.align
msg:
    buf: .skip 4 
.end
 
cs