
Linux Kernel โ 3 System Call Flows and Kernel Component Differences by Architecture๐ง
- ์ํคํ ์ฒ๋ณ ์์คํ ์ฝ ํ๋ฆ๊ณผ ์ปค๋ ๋ณ๊ฒฝ ์ปดํฌ๋ํธ
- ์ํคํ ์ฒ๋ณ ์์คํ ์ฝ ํ๋ฆ ๋น๊ต
์ํคํ ์ฒ๊ฐ ๋ฌ๋ผ์ง๋ฉด ์ปค๋ ๋ด๋ถ์์ ์ํคํ ์ฒ ์์กด์ฑ์ด ๊ฐํ ๋ถ๋ถ๋ค์ด ์ง์ ์ ์ผ๋ก ์ํฅ์ ๋ฐ๋๋ค.
ํนํ ์์คํ ์ฝ๊ณผ ์์ธ ์ฒ๋ฆฌ, ์ปจํ ์คํธ ์ค์์น ๊ฐ์ ๋์์ ๊ฐ ์ํคํ ์ฒ์ ๋ช ๋ น์ด ์งํฉ์ด๋ ๋ ์ง์คํฐ
๊ตฌ์กฐ์ ๋ฐ๋ผ ๊ตฌํ ๋ฐฉ์์ด ํฌ๊ฒ ๋ฌ๋ผ์ง๋ค.
์ํคํ ์ฒ๋ณ ์์คํ ์ฝ ํ๋ฆ๊ณผ ์ปค๋ ๋ณ๊ฒฝ ์ปดํฌ๋ํธ
์ํคํ ์ฒ๊ฐ ๋ฐ๋๋ฉด ์ปค๋์ ๊ตฌ์กฐ์ ๋์ ํ๋ฆ์ ์ํฅ์ ๋ฏธ์น๋ ์ฃผ์ ์ปดํฌ๋ํธ๊ฐ ๋ฌ๋ผ์ง๋ค.
ํนํ ์์คํ ์ฝ ํธ์ถ ๋ฐฉ์, ์์ธ ์ฒ๋ฆฌ, ์ปจํ ์คํธ ์ค์์น, ์ด๊ธฐํ ๋ฃจํด, ๋๋ฐ์ด์ค ํธ๋ฆฌ ์ ์ฉ ๋ฐฉ์์
์ํคํ ์ฒ๋ณ๋ก ๊ตฌํ ๋ฐฉ์์ด ์ ํ ๋ค๋ฅด๋ค. ํ๋ก ์์ฑํ๋ฉด ์๋์ ๊ฐ๋ค.
| Component | Description | x86 (32-bit) | x86_64 (AMD64) | ARMv7 (AArch32) | ARMv8 (AArch64) |
|---|---|---|---|---|---|
| System Call Handling | ๋ฐฉ์ ๋ฐ ํธ์ถ ๊ท์ฝ | Uses int 0x80 instructionSyscall number in EAX, args in EBX~ | Uses syscall instructionNumber in RAX, args in RDI, RSI, RDX, R10, R8, R9 | Uses svc #0Number in r7, args in r0~r6 | Uses svc #0Number in x8, args in x0~x5 |
| Exception / Interrupt Handling | ํธ๋ฉ ๋ฒกํฐ์ ์์ธ ์ง์ | IDT (Interrupt Descriptor Table), gate type ์ค์ | MSRs (Model Specific Registers) ์ฌ์ฉ, SYSCALL/SYSRET ํธ๋ฉ ์ฒ๋ฆฌ | Vector table, ๊ฐ ๋ชจ๋๋ณ ๋ ์ง์คํฐ ๋ฑ ํฌ ์กด์ฌ | Exception levels (EL0~EL3), SPSR/ELR ๋ ์ง์คํฐ๋ก ์ํ ์ ์ฅ |
| Context Switch | ๋ ์ง์คํฐ ์ ์ฅ ๋ฐ ๋ณต์ | EAX~EDI, EIP, ESP, EFLAGS ๋ฑ ์ ์ฅ | RAX~R15, RIP, RSP, RFLAGS ๋ฑ ์ ์ฅ | r0~r12, SP, LR, CPSR ๋ฑ, ํ์ ์ FPU ์ํ ํฌํจ | x0~x30, SP, SPSR_EL1, ELR_EL1 ๋ฑ, SIMD ์ํ ํฌํจ |
| Boot and Initialization Code | ํ์ด์ง, MMU, ์บ์ ์ค์ | CR0, CR3, GDT, IDT ์ค์ ํ ํ์ด์ง ์์ | Long mode ์ง์ , IA32_EFER, PML4 ์ธํ | MMU ์ผ๊ธฐ ์ํด page table, TTBR ์ค์ | Translation table ์์ฑ, TTBR0_EL1, MAIR_EL1 ๋ฑ ์์คํ
๋ ์ง์คํฐ ๊ตฌ์ฑ |
| Device Tree & Driver Binding | ํ๋ซํผ ์ด๊ธฐํ์ ์ฐ๊ฒฐ ์ ๋ณด | ์ผ๋ฐ์ ์ผ๋ก ACPI ๋๋ BIOS ์ ๋ณด ๊ธฐ๋ฐ | ACPI ๊ธฐ๋ฐ์ผ๋ก ๋๋ฐ์ด์ค ๋ฆฌ์์ค ํ์ | Flattened Device Tree (FDT) ๋ฐฉ์ ์ฌ์ฉ๋ณด๋๋ณ DTS ํ์ผ ํ์ | Device Tree ์ฌ์ฉ ๋ฐฉ์์ ๋์ผํ๋ 64๋นํธ์ฉ ๋๋ผ์ด๋ฒ ๊ตฌ์ฑ ํ์ |
์ ๋ด์ฉ ์ฒ๋ผ ์ํคํ ์ฒ๋ณ๋ก ์ปค๋ ๋์ ํ๋ฆ์ด ๋ฐ๋๋ ์ด์ ๋ **๊ฐ CPU ์ํคํ ์ฒ๊ฐ ์๋ก ๋ค๋ฅธ ํ๋์จ์ด ๊ตฌ์กฐ์ ๋ช ๋ น์ด ์งํฉ(ISA: Instruction Set Architecture)**์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ปค๋์ ํ๋์จ์ด์ ์ง์ ๋ง๋ฟ์ ์๋ ์ํํธ์จ์ด์ด๊ธฐ ๋๋ฌธ์, ์๋์ ๊ฐ์ ์์๋ค์ด ๋ฌ๋ผ์ง๋ฉด ์ปค๋์ ๋์ ๋ฐฉ์๋ ๊ตฌ์กฐ์ ์ผ๋ก ๋ฌ๋ผ์ง ์๋ฐ์ ์๋ค.
๋ํ ๊ผญ ISA ์ ์ฐจ์ด ๋ง๊ณ ๋ ๋ ์ง์คํฐ๋ ๋ถํธ ์ด๊ธฐํ ๋ฐฉ์์ ๋ฐ๋ผ์๋ ์ฐจ์ด๊ฐ ๋ํ๋ ์ ์์ผ๋ฉฐ ๋ณด๋ค ์์ธํ ์ค๋ช ์ ํ๋ก ๋์ฒดํ๋ค.
** ์ปค๋ ๋์ ํ๋ฆ์ด ์ํคํ ์ฒ๋ณ๋ก ๋ฐ๋๋ ์ด์
| ๊ตฌ๋ถ | ์ค๋ช |
|---|---|
| ๋ช ๋ น์ด ์งํฉ(ISA) | ๊ฐ ์ํคํ
์ฒ๋ ์๋ก ๋ค๋ฅธ ๋ช
๋ น์ด ์งํฉ์ ๊ฐ์ง๋ค. ์๋ฅผ ๋ค์ด x86์ int 0x80, ARM์ svc #0์ ์ฌ์ฉํ์ฌ ์์คํ
์ฝ์ ํธ์ถํ๋ค. ์ปค๋์ ์ด ๋ช
๋ น์ด์ ๋ง์ถฐ ์ง์
๋ฃจํด์ ๊ตฌํํด์ผ ํ๋ค. |
| ๋ ์ง์คํฐ ๊ตฌ์กฐ | ์ธ์ ์ ๋ฌ, ๋ฐํ๊ฐ ์ ์ฅ, ์ปจํ ์คํธ ์ค์์น ๋ฑ์ ๋ ์ง์คํฐ๋ฅผ ํตํด ์ด๋ฃจ์ด์ง๋ค. ์ํคํ ์ฒ๋ง๋ค ๋ ์ง์คํฐ ์์ ๋ช ์นญ, ์ฉ๋๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ปค๋์ ์์คํ ์ฝ ์ฒ๋ฆฌ, ์ค์ผ์ค๋ฌ, ์ธํฐ๋ฝํธ ํธ๋ค๋ฌ ์ฝ๋๊ฐ ๋ฌ๋ผ์ง๋ค. |
| ์์ธ/์ธํฐ๋ฝํธ ์ฒ๋ฆฌ ๊ตฌ์กฐ | ํธ๋ฉ ๋ฒกํฐ ํ ์ด๋ธ์ ์์น์ ๊ตฌ์กฐ, ๋ชจ๋ ์ ํ ๋ฐฉ์์ด ์ํคํ ์ฒ๋ง๋ค ๋ค๋ฅด๋ค. ARM์ Exception Level(EL) ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์๊ณ , x86์ IDT์ privilege level ๊ธฐ๋ฐ์ด๋ค. |
| MMU ๋ฐ ํ์ด์ง ๊ตฌ์กฐ | ๋ฉ๋ชจ๋ฆฌ ๋ณดํธ์ ๊ฐ์ ์ฃผ์ ๋ณํ์ ์ฌ์ฉํ๋ ํ์ด์ง ํ ์ด๋ธ ํ์์ด ์ํคํ ์ฒ๋ง๋ค ๋ค๋ฅด๋ค. ๋ฐ๋ผ์ ์ด๊ธฐํ ์ฝ๋์ ํ์ด์ง ํ ์ด๋ธ ์์ฑ ์ฝ๋๋ ๊ฐ๊ฐ ๋ค๋ฅด๊ฒ ๊ตฌํ๋๋ค. |
| ๋ถํธ ๋ฐ ์ด๊ธฐํ ๋ฐฉ์ | ๋ถํธ๋ก๋์ ์ปค๋์ ์ด๊ธฐํ ์ง์ ๋ฐฉ์ ๋ํ ์ํคํ ์ฒ๋ณ๋ก ์ฐจ์ด๊ฐ ์๋ค. ์๋ฅผ ๋ค์ด x86์ BIOS ๋๋ UEFI๋ฅผ ํตํด ์ง์ ํ๊ณ , ARM์ U-Boot๊ณผ DTB(Device Tree Blob)๋ฅผ ์ฌ์ฉํ๋ค. |
| ํ๋์จ์ด ์ธํฐํ์ด์ค ํ์ค | x86์ ACPI ๊ธฐ๋ฐ์ผ๋ก ๋๋ฐ์ด์ค๋ฅผ ์ด๊ธฐํํ๋ ๋ฐ๋ฉด, ARM์ Device Tree๋ฅผ ํตํด ํ๋์จ์ด ์ ๋ณด๋ฅผ ์ ๋ฌํ๋ค. ์ด์ ๋ฐ๋ผ ํ๋ซํผ ๋๋ผ์ด๋ฒ ์ด๊ธฐํ ์ฝ๋๊ฐ ๋ค๋ฅด๋ค. |
์ ๋ฆฌํ์๋ฉด ์ปค๋์ ๋จ์ํ ํ๋ก๊ทธ๋จ์ด ์๋๋ผ, ํ๋์จ์ด๋ฅผ ์ ์ดํ๋ ํ๋ก๊ทธ๋จ์ด๋ฉฐ,
์ด์ ๋ฐ๋ผ CPU๊ฐ ์ฌ์ฉํ๋ ๋ช ๋ น์ด, ๋ ์ง์คํฐ, ์ธํฐ๋ฝํธ ์ฒ๋ฆฌ ๋ฐฉ์, ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ๊ตฌ์กฐ๊ฐ ๋ฐ๋๋ฉด, ์ด๋ฅผ ์ ์ ๋ก ๋ง๋ค์ด์ง ์ปค๋ ์ฝ๋๋ ์ํคํ ์ฒ์ ๋ง๊ฒ ์ค๊ณ๋์ด์ผ ํ๋ค.
๊ทธ๋์ ์ปค๋์๋ ํญ์ arch/ ๋๋ ํฐ๋ฆฌ ์๋์ ์ํคํ
์ฒ๋ณ ๊ตฌํ ์ฝ๋๊ฐ ๋ฐ๋ก ์กด์ฌํ๋ค.
์ด๋ ๋จ์ํ ๋ฌธ๋ฒ์ด๋ ํ๊ธฐ ๋ฐฉ์์ด ๋ฌ๋ผ์ง๋ ๊ฒ์ด ์๋๋ผ, ๋์์ ๊ธฐ๋ณธ ์์น๊ณผ ํ๋ฆ์ด ํ๋์จ์ด ๊ตฌ์กฐ์ ๋ง๊ฒ ์ค๊ณ๋์ด์ผ ํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
์ํคํ ์ฒ๋ณ ์์คํ ์ฝ ํ๋ฆ ๋น๊ต
(System Call Flow Comparison by Architecture)
์ํคํ ์ฒ๋ณ ์์คํ ์ฝ ํ๋ฆ ๋น๊ต๋ฅผ ์ํด ๊ฐ ์ํคํ ์ฒ๊ฐ ์์คํ ์ฝ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์, ๋ช ๋ น์ด,
๋ ์ง์คํฐ ์ ๋ฌ ๊ท์ฝ, ์ง์ ์ ๋ ๋ฒจ ๋ณํ ๋ฑ์ ์ ๋ฆฌํ ํ๋ก ์ปค๋ ํฌํ ์ด๋
์ํคํ ์ฒ๋ณ syscall handler ๊ตฌํ ์ ์ฐธ๊ณ ํ๊ธฐ ์ํด ์ ๋ฆฌํ์๋ค.
| ํญ๋ชฉ | x86 (IA-32) | x86_64 (AMD64) | ARMv7 (AArch32) | ARMv8 (AArch64) |
|---|---|---|---|---|
| ํธ์ถ ๋ช ๋ น์ด | int 0x80 | syscall | svc #0 | svc #0 |
| ์ง์ ๋ฐฉ์ | ์ํํธ์จ์ด ์ธํฐ๋ฝํธ(INT instruction) | Fast syscall path(SYSCALL MSR + STAR) | Supervisor Call ๋ฒกํฐ | Exception Level ์ ํ (EL0 โ EL1) |
| ์์คํ ์ฝ ๋ฒํธ | EAX | RAX | r7 | x8 |
| ์ธ์ ์ ๋ฌ | EBX, ECX, EDX, ESI, EDI, EBP | RDI, RSI, RDX, R10, R8, R9 | r0 ~ r6 | x0 ~ x5 |
| ๋ฐํ๊ฐ | EAX | RAX | r0 | x0 |
| ์ปค๋ ์ง์ ์ | IDT (Interrupt Descriptor Table) | MSRs + syscall handler (do_syscall_64) | Vector table base + SVC handler | VBAR_EL1 ๋ฒกํฐ ํ ์ด๋ธ + EL1 ํธ๋ค๋ฌ |
| ๋ณต๊ท ๋ช ๋ น์ด | iret | sysret | movs pc, lr (๋๋ subs pc, lr, #4) | eret |
| ๋ชจ๋ ์ ํ | ์ฌ์ฉ์ ๋ชจ๋ โ ์ปค๋ ๋ชจ๋ | Ring 3 โ Ring 0 | ์ฌ์ฉ์ ๋ชจ๋ โ SVC ๋ชจ๋ | EL0 โ EL1 |
| ๋ณด์/๊ถํ ๋ณดํธ | Ring level ๊ธฐ๋ฐ (Ring 3 โ 0) | ๋์ผ (Ring ๊ธฐ๋ฐ) | CPSR ๋ชจ๋ ํ๋๊ทธ | SPSR_EL1 + ELR_EL1 ์กฐํฉ์ผ๋ก ์ ์ด |
ํ์์ ๋ํ๋ ์ฃผ์ ์ฐจ์ด์ ์ ๋ํด ๊ฐ๋จํ ์ค๋ช ํ์๋ฉด
x86: ์ ํต์ ์ธ ๋ฐฉ์์ธ int 0x80 ์ฌ์ฉ, ๋๋ฆฌ์ง๋ง ๋จ์ํจ.
x86_64: syscall ๋ช
๋ น์ผ๋ก ๋น ๋ฅธ ์ง์
. syscall ๋ฒํธ๋ RAX, ์ธ์๋ ์ต๋ 6๊ฐ ๊ณ ์ ๋ ์ง์คํฐ.
ARMv7: svc #0์ ํตํด ์ง์
, syscall ๋ฒํธ๋ r7 ๋ ์ง์คํฐ์, ์ธ์๋ r0๋ถํฐ ์ ๋ฌ.
ARMv8: ARMv7๊ณผ ์ ์ฌํ์ง๋ง 64๋นํธ ์ ์ฉ ๊ตฌ์กฐ. EL0์์ EL1๋ก ์์ธ ์ ํ๋๋ฉฐ x8์ syscall ๋ฒํธ ์ ๋ฌ.
ARMv8์ ARMv7๊ณผ ๋ช
๋ น์ด๋ ๊ฐ์ง๋ง ๊ตฌ์กฐ๋ ํจ์ฌ ์ ๊ตํ๋ค. ์ ์ ๋ชจ๋์ธ EL0์์ ์ปค๋ ๋ชจ๋์ธ EL1๋ก ์ ํ๋๋ฉฐ, syscall ๋ฒํธ๋ x8, ์ธ์๋ x0๋ถํฐ x5๊น์ง ์ฌ์ฉ๋๋ค. ์ปค๋์ VBAR_EL1์ ์ง์ ๋ ๋ฒกํฐ ํ
์ด๋ธ์ ํตํด ์์ธ๋ฅผ ์ฒ๋ฆฌํ๊ณ , ๋ณต๊ท๋ eret ๋ช
๋ น์ผ๋ก ์ํ๋๋ค.
์ปค๋ ๊ฐ๋ฐ ํ๋ก์ ํธ์ ์์ ํ์๋ "ARMv8" ์ํคํ ์ฒ๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋ฉฐ
์์ผ๋ก ์์ฑ๋๋ ๊ธ์ ๋ํด์๋ ํด๋น ์ํคํ ์ฒ๋ฅผ ๊ธฐ์ค์ผ๋ก ์์ฑํ ์์ ์ด๋ค.


