Unix 계열의 어셈블리어의 3줄의 코드로 표현되는 시스템 콜 함수 인터럽트 수행과정을 살펴보자.
우선 cpu Register의 'EAX' 'EBX'부터 가볍게 눈으로 보고 넘어가자
EAX (Extended Accumulator Register) : Arithmetic Logic Operation 수행, 함수의 반환값이 이 레지스터에 저장됨.
EBX (Extended Base Register): 메모리 주소를 저장하기 위한 용도
(32 bit Linux OS 기준)
시스템콜 인터럽트의 수행 과정을 살펴보자
1. 시스템콜 어셈블리 코드 실행 (살펴보기!)
[Assembly Code]
mov eax, 1
mov ebx, 0
int 0x80
eax : systemcall number (주소)가 저장됨
ebx: systemcall argument 주소가 저장됨.
<int> 0x80 : <int>는 OP code
0x80: Interrupt Number (systemcall의 인터럽트 번호는 0x80)
2. 시스템콜 인터럽트 명령을 호출하며
<int> 0x80 => CPU가 User Mode -> Kernnel Mode 전환.
3. IDT(Interrupt Descripter Table) 참조
Interrupt Number | excution Code (function) address 심볼릭 상수 형태로 기록 |
0x0 | divide_error() |
.. | .. |
0x80 | system_call() |
4. system_call() 함수에서
eax에 담긴 systemcall number 에 매칭되는 kernel function 을 호출한다!
5. kernel function (system call) 수행후
kernel mode -> user mode 전환.
6. 다음 프로세스(코드) 진행.
🔗 Reference
(32 bit 기준)
http://syscalls.kernelgrok.com/
(64 bit 기준)
https://crasy.tistory.com/75
(systemcall Table)
http://shell-storm.org/shellcode/files/syscalls.html
'Low Level > OS' 카테고리의 다른 글
[OS] User Thread vs Kernel Thread (0) | 2024.02.03 |
---|---|
Virtual Memory (0) | 2020.03.18 |