리눅스 시스템은 하드웨어 제어(Low-level)에서 사용자 경험(High-level)으로 이어지는 계층 구조를 가집니다.
| 영역 (Level) | 구성 요소 | 주요 특징 |
|---|---|---|
| User Space | Application | 고수준 라이브러리 활용 (GUI, 비즈니스 로직) |
| User Space | System Software | 커널/핵심 라이브러리와 직접 인터페이스 (쉘, 컴파일러, 서버) |
| Kernel Space | Kernel / Driver | 하드웨어 직접 제어, 리소스 관리, 시스템 호출 처리 |
| Hardware | Device | CPU, Memory, Disk, Network Interface 등 |

커널은 물리적 하드웨어를 소프트웨어가 쓰기 편한 논리적(추상적) 개념으로 변환하여 제공합니다.
| 물리적 자원 (Hardware) | 추상적 자원 (Logical View) |
|---|---|
| CPU | 태스크(Task), 스레드(Thread) |
| 메모리 (RAM) | 세그먼트(Segment), 페이지(Page) |
| 디스크 (Disk) | 파일(File), inode |
| 네트워크 (NIC) | 프로토콜(Protocol), 패킷(Packet) |
fork), 실행, 소멸(exit) 관리.ext4, ntfs, fat 등 서로 다른 파일 시스템을 동일한 API(open, read)로 접근 가능하게 함."레지스터에 '주문 번호(Syscall No)'를 넣고 SVC 명령을 실행하면, CPU가 익셉션 벡터(Exception Vector)로 점프하여 커널 모드로 진입."
x86의 int 0x80이나 syscall과 원리는 같으나, 사용하는 명령어와 레지스터가 다릅니다.
x86의 int 0x80이나 syscall과 원리는 같으나, 사용하는 명령어와 레지스터가 다릅니다.
glibc 래퍼가 레지스터에 인자값과 시스템 콜 번호를 저장.SVC (Supervisor Call) 명령어 실행 (구 SWI).vector_swi(32bit) 또는 el0_svc(64bit) 루틴이 실행됨.개발자가 가장 신경 써야 할 "데이터 전달 약속"입니다.
| 구분 | ARM 32-bit (EABI) | ARM 64-bit (AArch64) | 비고 |
|---|---|---|---|
| 명령어 | svc 0 (또는 swi) | svc 0 | Supervisor Call |
| 시스템 콜 번호 | R7 | X8 | "몇 번 함수 실행해줘?" |
| 인자 (Args) | R0 ~ R6 | X0 ~ X5 | 함수 파라미터 전달 |
| 결과값 (Return) | R0 | X0 | 실행 결과 (성공/에러) |
| 모드 전환 | User → SVC Mode | EL0 → EL1 | Exception Level 상승 |
open() 호출.glibc 내부:R0 = 파일 경로 포인터R1 = 플래그 (Read/Write)R7 = 5 (open의 시스템 콜 번호)svc 0 실행!SVC 명령을 만나면 CPU는 하드웨어적으로 정해진 주소(Vector Base Address + Offset)로 강제 점프함.entry-common.S)가 실행됨.sys_call_table에서 R7(또는 X8)에 해당하는 함수 주소를 찾음.sys_open 함수 실행.sys_open이 파일 디스크립터(fd)를 반환.R0(또는 X0)에 저장.movs pc, lr (32bit) 또는 eret (64bit) 명령어로 유저 모드 복귀.