[Linux] 소프트웨어 계층 구조 (Hierarchy) 정리

mommers·2026년 2월 2일

Linux

목록 보기
27/59

소프트웨어 계층 구조 (Hierarchy)

리눅스 시스템은 하드웨어 제어(Low-level)에서 사용자 경험(High-level)으로 이어지는 계층 구조를 가집니다.

영역 (Level)구성 요소주요 특징
User SpaceApplication고수준 라이브러리 활용 (GUI, 비즈니스 로직)
User SpaceSystem Software커널/핵심 라이브러리와 직접 인터페이스 (쉘, 컴파일러, 서버)
Kernel SpaceKernel / Driver하드웨어 직접 제어, 리소스 관리, 시스템 호출 처리
HardwareDeviceCPU, Memory, Disk, Network Interface 등


1. 커널의 핵심 역할

  • 운영체제(OS)의 심장(Core)이자 관리자(Supervisor).
    • 하드웨어 직접 제어 및 시스템 자원 분배.
    • 상위 계층(응용 프로그램)에 기본적인 시스템 서비스 제공.

2. 자원 관리와 추상화 (Resource Abstraction)

커널은 물리적 하드웨어를 소프트웨어가 쓰기 편한 논리적(추상적) 개념으로 변환하여 제공합니다.

물리적 자원 (Hardware)추상적 자원 (Logical View)
CPU태스크(Task), 스레드(Thread)
메모리 (RAM)세그먼트(Segment), 페이지(Page)
디스크 (Disk)파일(File), inode
네트워크 (NIC)프로토콜(Protocol), 패킷(Packet)

3. 커널의 5대 세부 기능 (Subsystems)

① 프로세스 관리 (Process Management)

  • 생명주기: 프로세스 생성(fork), 실행, 소멸(exit) 관리.
  • 스케줄링: 여러 프로세스에 CPU 시간을 공평/효율적으로 분배 (Context Switching).
  • 통신: 프로세스 간 데이터 교환 (IPC: Signal, Pipe, Socket 등).

② 메모리 관리 (Memory Management)

  • 가상 메모리: 물리 메모리보다 큰 프로그램을 실행하기 위한 추상화.
  • 하드웨어 제어: 페이징(Paging), 스와핑(Swapping), 메모리 보호.

③ 파일 시스템 관리 (File System Management)

  • VFS (Virtual File System): ext4, ntfs, fat 등 서로 다른 파일 시스템을 동일한 API(open, read)로 접근 가능하게 함.
  • 매핑: 디스크의 물리적 섹터를 논리적인 '파일'과 '디렉터리' 구조로 변환.

④ 장치 관리 (Device Management)

  • I/O 스케줄링: 디스크 입출력 순서를 최적화하여 성능 향상.
  • 인터럽트 처리: 하드웨어 신호(키보드 입력, 패킷 수신 등)를 감지하고 처리 루틴 실행.
  • 데이터 전송: DMA 등을 통해 주변장치와 메모리 간 고속 데이터 이동.

⑤ 네트워크 관리 (Network Management)

  • 프로토콜 스택: TCP/IP 등 통신 규약 구현.
  • 패킷 처리: 라우팅(경로 설정), 주소 지정(IP Addressing), 패킷 필터링.

4. 시스템 콜(System Call) 처리 과정–ARM

"레지스터에 '주문 번호(Syscall No)'를 넣고 SVC 명령을 실행하면, CPU가 익셉션 벡터(Exception Vector)로 점프하여 커널 모드로 진입."

x86의 int 0x80이나 syscall과 원리는 같으나, 사용하는 명령어와 레지스터가 다릅니다.

x86의 int 0x80이나 syscall과 원리는 같으나, 사용하는 명령어레지스터가 다릅니다.

4-1) 핵심 흐름 (Flow)

  1. 준비 (User): glibc 래퍼가 레지스터에 인자값과 시스템 콜 번호를 저장.
  2. 발동 (Trigger): SVC (Supervisor Call) 명령어 실행 (구 SWI).
  3. 진입 (Exception): CPU가 User Mode → SVC Mode (또는 EL1)로 전환되고, 익셉션 벡터 테이블의 SVC 핸들러 주소로 점프.
  4. 처리 (Kernel): 커널의 vector_swi(32bit) 또는 el0_svc(64bit) 루틴이 실행됨.
  5. 복귀 (Return): 결과값을 레지스터에 싣고 유저 모드로 복귀.

4-2) 아키텍처별 레지스터 규칙 (ABI)

개발자가 가장 신경 써야 할 "데이터 전달 약속"입니다.

구분ARM 32-bit (EABI)ARM 64-bit (AArch64)비고
명령어svc 0 (또는 swi)svc 0Supervisor Call
시스템 콜 번호R7X8"몇 번 함수 실행해줘?"
인자 (Args)R0 ~ R6X0 ~ X5함수 파라미터 전달
결과값 (Return)R0X0실행 결과 (성공/에러)
모드 전환User → SVC ModeEL0 → EL1Exception Level 상승

4-3) 단계별 상세 처리 (Deep Dive)

① Wrapper Routine (glibc)

  • 사용자가 open() 호출.
  • glibc 내부:
    • R0 = 파일 경로 포인터
    • R1 = 플래그 (Read/Write)
    • R7 = 5 (open의 시스템 콜 번호)
    • svc 0 실행!

② Exception Vector Table (H/W)

  • SVC 명령을 만나면 CPU는 하드웨어적으로 정해진 주소(Vector Base Address + Offset)로 강제 점프함.
  • 이곳에는 커널의 진입점(Entry Point) 코드가 있음.

③ Dispatcher (Kernel S/W)

  • 어셈블리 코드(entry-common.S)가 실행됨.
  • Context Save: 현재 유저 모드의 레지스터 값들을 스택(Kernel Stack)에 백업.
  • Table Lookup: sys_call_table에서 R7(또는 X8)에 해당하는 함수 주소를 찾음.
  • Execution: sys_open 함수 실행.

④ Return Path

  • sys_open이 파일 디스크립터(fd)를 반환.
  • 커널은 이 값을 R0(또는 X0)에 저장.
  • Context Restore: 스택에 백업해둔 유저 레지스터 복원.
  • movs pc, lr (32bit) 또는 eret (64bit) 명령어로 유저 모드 복귀.
profile
임베디드 개발자가 되기 위해 공부중입니다!

0개의 댓글