
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 #0 Number in r7 , args in r0 ~r6 | Uses svc #0 Number 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” μν€ν μ²λ₯Ό μ¬μ©ν κ²μ΄λ©°
μμΌλ‘ μμ±λλ κΈμ λν΄μλ ν΄λΉ μν€ν μ²λ₯Ό κΈ°μ€μΌλ‘ μμ±ν μμ μ΄λ€.