시스템 콜이란?
Coddy Assembly 여정의 기초 섹션에 포함된 레슨. 45개 중 31번째.
mov 및 lea와 같은 어셈블리 명령어를 작성했습니다. 이러한 명령어는 CPU에서 직접 실행됩니다. 하지만 화면에 출력하거나, 키보드에서 입력을 읽거나, 프로그램을 종료하는 것처럼 CPU가 자체적으로 할 수 없는 작업을 해야 한다면 어떻게 해야 할까요?
이 작업에는 (이 과정에서는 Linux인) 운영 체제가 필요합니다.
시스템 호출이란 무엇인가요?
시스템 호출(system call)은 프로그램이 운영체제에 요청하는 것입니다. 시스템 호출을 통해 운영체제에 어떤 작업을 대신 해 달라고 요청할 수 있습니다.
시스템 호출이 필요한 이유:
| 작업 | CPU만으로 할 수 있나요? | 시스템 호출이 필요한가요? |
|---|---|---|
| 두 숫자 더하기 | 예 | 아니요 |
| 레지스터 간 데이터 이동 | 예 | 아니요 |
| 화면에 텍스트 출력 | 아니요 | 예 |
| 키보드 입력 읽기 | 아니요 | 예 |
| 프로그램 종료 | 아니요 | 예 |
| 파일 열기 | 아니요 | 예 |
시스템 호출이 작동하는 방식:
- 시스템 호출 번호를
rax에 넣습니다(운영체제에 원하는 작업을 알려 줍니다). - 다른 레지스터(
rdi,rsi,rdx등)에 인수를 넣습니다. syscall명령어를 실행합니다.
- CPU가 OS 커널로 점프합니다
- OS가 요청을 수행합니다
- OS가 프로그램에 제어권을 반환합니다
비유:
시스템 호출을 관공서에 민원을 신청하는 것처럼 생각해 보세요:
| 단계 | 비유 | 어셈블리에서 |
|---|---|---|
| 1 | 필요한 서비스 결정하기 | 시스템 호출 번호 선택하기 (rax에 넣기) |
| 2 | 양식 작성하기 | 레지스터에 인수 넣기 |
| 3 | 요청 제출하기 | syscall 실행하기 |
| 4 | 관공서에서 처리하기 | OS 커널이 작업 수행하기 |
| 5 | 결과 받기 | 프로그램 계속 실행하기 |
이 과정에서 배우게 될 시스템 호출:
| 시스템 호출 | 번호 | 기능 | 장 |
|---|---|---|---|
exit | 60 | 프로그램을 종료합니다 | 4장 |
write | 1 | 화면에 텍스트를 출력합니다 | 5장 |
지금 가장 중요한 시스템 호출: exit
exit가 없으면 프로그램은 영원히 실행되거나 충돌할 수 있습니다. 작성하는 모든 프로그램은 exit 시스템 호출로 끝나야 합니다.
mov rax, 60 ; exit용 syscall 번호
mov rdi, 0 ; 종료 코드 (0 = 성공)
syscall ; OS에 종료 요청직접 해보기
이 레슨에는 코드 챌린지가 없습니다.
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
기초의 모든 레슨
직접 연습해 보세요: Assembly 플레이그라운드