리눅스 기초(1) 리눅스 아키텍쳐

2025년 09월 07일

리눅스 아키텍처

리눅스 시스템의 계층 구조

리눅스는 크게 4개의 주요 계층으로 구성되어 있습니다:

┌─────────────────────────────────┐
│        사용자 애플리케이션        │ ← 사용자 프로그램들
├─────────────────────────────────┤
│          시스템 라이브러리       │ ← glibc, 시스템 콜 래퍼
├─────────────────────────────────┤
│       커널 공간 (Kernel)        │ ← 핵심 운영체제
├─────────────────────────────────┤
│         하드웨어 계층            │ ← CPU, 메모리, 디스크 등
└─────────────────────────────────┘

1. 하드웨어 계층 (Hardware Layer)

가장 아래쪽에 위치한 물리적 하드웨어 구성요소들입니다:

  • CPU (Central Processing Unit): 명령어 실행
  • 메모리 (RAM): 데이터와 프로그램 임시 저장
  • 저장장치: HDD, SSD 등 영구 저장
  • 입출력 장치: 키보드, 마우스, 네트워크 카드 등
  • 버스: 하드웨어 구성요소 간 데이터 전송 통로

2. 커널 (Kernel) - 리눅스의 핵심

커널은 리눅스 운영체제의 심장부로, 하드웨어와 소프트웨어 사이의 다리 역할을 합니다.

주요 커널 구성요소

프로세스 관리 (Process Management)

# 현재 실행 중인 프로세스 확인
ps aux
 
# 프로세스 트리 구조 확인
pstree
 
# 특정 프로세스 정보 확인
cat /proc/[PID]/status
  • 프로세스 스케줄링: CPU 시간을 프로세스들에게 할당
  • 프로세스 생성/종료: fork(), exec(), exit() 시스템 콜 처리
  • 멀티태스킹: 여러 프로세스의 동시 실행 관리

메모리 관리 (Memory Management)

# 메모리 사용량 확인
free -h
 
# 가상 메모리 정보 확인
cat /proc/meminfo
 
# 프로세스별 메모리 사용량
cat /proc/[PID]/smaps
  • 가상 메모리: 물리 메모리보다 큰 주소 공간 제공
  • 페이징: 메모리를 페이지 단위로 관리
  • 스왑: 디스크를 임시 메모리로 활용

파일 시스템 (File System)

# 마운트된 파일시스템 확인
mount | column -t
 
# 파일시스템 사용량 확인
df -h
 
# inode 정보 확인
ls -li
  • VFS (Virtual File System): 다양한 파일시스템에 대한 공통 인터페이스
  • ext4, btrfs, xfs: 실제 파일시스템 구현체들
  • 파일 권한 및 소유권 관리

장치 드라이버 (Device Drivers)

# 로드된 커널 모듈 확인
lsmod
 
# 하드웨어 정보 확인
lshw
lspci
lsusb
 
# 커널 메시지 확인
dmesg | tail
  • 하드웨어 추상화: 하드웨어를 소프트웨어로 제어할 수 있게 변환
  • 모듈: 동적으로 로드/언로드 가능한 드라이버
  • 디바이스 파일: /dev 디렉토리의 장치 파일들

네트워크 스택 (Network Stack)

# 네트워크 인터페이스 확인
ip addr show
 
# 네트워크 연결 상태
netstat -tuln
 
# 라우팅 테이블 확인
ip route show
  • TCP/IP 프로토콜 스택: 네트워크 통신 프로토콜 구현
  • 소켓: 네트워크 통신을 위한 인터페이스
  • 방화벽: iptables, netfilter를 통한 패킷 필터링

3. 시스템 라이브러리 (System Libraries)

사용자 프로그램과 커널 사이의 중간 계층입니다.

glibc (GNU C Library)

# glibc 버전 확인
ldd --version
 
# 프로그램의 라이브러리 의존성 확인
ldd /bin/ls
  • 시스템 콜 래퍼: 커널 시스템 콜을 C 함수로 감싸서 제공
  • 표준 C 라이브러리 함수들: printf, malloc, fopen 등
  • POSIX 호환성: 유닉스 표준 API 제공

기타 시스템 라이브러리들

  • libm: 수학 함수 라이브러리
  • libpthread: 스레드 라이브러리
  • libssl: 암호화 라이브러리
  • libX11: X Window System 라이브러리

4. 사용자 공간 (User Space)

사용자가 직접 실행하는 애플리케이션들이 동작하는 영역입니다.

시스템 유틸리티

# 시스템 정보 확인 도구들
uname -a      # 시스템 정보
uptime        # 시스템 가동 시간
whoami        # 현재 사용자
id            # 사용자 ID 정보

셸 (Shell)

# 현재 사용 중인 셸 확인
echo $SHELL
 
# 사용 가능한 셸 목록
cat /etc/shells
 
# 셸 프로세스 정보
ps -p $$
  • bash, zsh, fish: 다양한 셸 종류
  • 명령어 해석: 사용자 입력을 커널이 이해할 수 있는 형태로 변환
  • 스크립팅: 자동화된 작업 실행

데스크탑 환경

  • X11/Wayland: 그래픽 디스플레이 서버
  • GNOME, KDE, XFCE: 데스크탑 환경
  • 윈도우 매니저: 창 관리 시스템

리눅스 부팅 과정에서 보는 아키텍처

리눅스 시스템이 부팅되는 과정을 통해 각 계층이 어떻게 초기화되는지 살펴보겠습니다:

1. BIOS/UEFI → 하드웨어 초기화
2. 부트로더 (GRUB) → 커널 로드
3. 커널 초기화 → 하드웨어 감지, 드라이버 로드
4. init 프로세스 → 시스템 서비스 시작
5. 로그인 관리자 → 사용자 세션 시작
# 부팅 메시지 확인
dmesg | head -20
 
# 시스템 서비스 상태 확인 (systemd)
systemctl status
 
# 부팅 시간 분석
systemd-analyze blame

가상 파일시스템들

리눅스에는 실제 파일이 아닌 커널 정보를 파일 형태로 제공하는 특별한 파일시스템들이 있습니다:

/proc 파일시스템

# 프로세스 정보
ls /proc/[PID]/
 
# 시스템 정보
cat /proc/cpuinfo
cat /proc/meminfo
cat /proc/version

/sys 파일시스템

# 하드웨어 정보
ls /sys/class/
ls /sys/devices/
 
# CPU 정보
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

/dev 파일시스템

# 디바이스 파일들
ls -la /dev/
 
# 블록 디바이스
ls /dev/sd*
 
# 문자 디바이스
ls /dev/tty*

커널 공간 vs 사용자 공간

리눅스에서 가장 중요한 구분은 커널 공간과 사용자 공간의 분리입니다:

커널 공간 (Kernel Space)

  • 권한: 하드웨어에 직접 접근 가능
  • 메모리: 물리 메모리에 직접 매핑
  • 실행 모드: 특권 모드 (Ring 0)
  • 보호: 사용자 프로그램에서 직접 접근 불가

사용자 공간 (User Space)

  • 권한: 제한된 권한, 시스템 콜을 통해서만 커널 기능 사용
  • 메모리: 가상 메모리 주소 공간
  • 실행 모드: 사용자 모드 (Ring 3)
  • 보호: 다른 프로세스나 커널에 영향을 주지 못함

시스템 콜 (System Calls)

사용자 공간과 커널 공간을 연결하는 인터페이스입니다:

# 프로그램이 사용하는 시스템 콜 추적
strace ls
 
# 시스템 콜 통계
strace -c ls
 
# 특정 시스템 콜만 추적
strace -e trace=open,read,write cat /etc/hostname

주요 시스템 콜 카테고리

  • 파일 조작: open(), read(), write(), close()
  • 프로세스 관리: fork(), exec(), wait(), exit()
  • 메모리 관리: mmap(), brk(), sbrk()
  • 네트워크: socket(), bind(), listen(), accept()

리눅스 아키텍처의 장점

모듈성

  • 각 구성요소가 독립적으로 개발/유지보수 가능
  • 드라이버를 동적으로 로드/언로드 가능

확장성

  • 임베디드 시스템부터 슈퍼컴퓨터까지 확장 가능
  • 다양한 하드웨어 아키텍처 지원

안정성

  • 커널과 사용자 공간의 엄격한 분리
  • 한 프로세스의 오류가 전체 시스템에 영향을 주지 않음

이식성

  • 표준화된 인터페이스 (POSIX)
  • 다양한 CPU 아키텍처 지원 (x86, ARM, RISC-V 등)

현업에서 업무하다보니 서버작업 등 다양한 곳에서 필요한 것을 알게 되었고 선임이 없을때 제가 작업을 요청받았을때 아무것도 못하는 것을 보고 공부를 해야 할 것 같아 공부를 시작합니다.