Linux Kernel Basics: User Space vs. Kernel Space, System Calls, strace (디버깅 프로세스)

발행: (2026년 1월 6일 오전 03:44 GMT+9)
10 min read
원문: Dev.to

I’m happy to translate the article for you, but I’ll need the full text you’d like translated. Could you please paste the content (excluding the source line you already provided) here? Once I have the article text, I’ll keep the source link unchanged at the top and translate the rest into Korean while preserving all formatting, markdown, and technical terms.

리눅스란?

Before we debug it, we must define it.

대부분의 사람들은 “리눅스”라는 용어를 느슨하게 사용합니다.

  • 엄밀히 말하면: 리눅스는 커널 – 하드웨어 자원을 관리하는 저수준 소프트웨어입니다.
  • 실제로는: 리눅스는 운영 체제(OS) – 커널 플러스 유저랜드 (GNU 도구, bash 같은 쉘, glibc 같은 라이브러리, 그리고 컴퓨터를 사용할 수 있게 해 주는 애플리케이션).

커널을 컴퓨터의 독재자라고 생각하세요:

관심사커널 역할
메모리 관리누가 RAM을 얻나요? (Chrome가 100 GB를 요청하면, 커널은 아니오라고 답합니다.)
프로세스 스케줄링누가 CPU를 얻나요? (커널은 마우스 움직임을 위해 MP3 플레이어를 초당 1000번 일시 정지시킵니다.)
하드웨어 추상화개발자는 “파일 저장”이라고 작성하고, 커널은 이를 특정 NVMe SSD 모델에 맞는 전기 신호로 변환합니다.

핵심 개념: 현대 CPU(예: x86‑64)는 **보호 링(Protection Rings)**이라고 불리는 하드웨어 수준 보안 기능을 제공합니다.

보호 링 개요

여기에는 누가 있나요?권한위험
Ring 0 (커널)리눅스 커널, 디바이스 드라이버, 커널 모듈무제한 – 모든 CPU 명령을 실행하고 모든 메모리 주소에 접근 가능충돌 시 커널 패닉(리눅스 “블루 스크린 오브 데스”)이 발생하여 전체 시스템이 재부팅됩니다
Ring 3 (사용자 공간)웹 브라우저, 파이썬 스크립트, Docker 컨테이너, 루트 쉘제한됨 – 가상 메모리 샌드박스에서 실행되며 하드웨어나 다른 프로세스의 메모리에 직접 접근할 수 없음프로그램이 충돌하면(예: 0으로 나누기, 불법 커널 메모리 접근) 커널이 신호(SIGSEGV 등)를 보내고 그 프로세스만 종료합니다; 서버는 계속 가동됩니다

System Calls – The Bridge Between Rings

Why not use Rings 1 and 2?
User space (Ring 3) cannot touch the hardware directly, so it must ask the kernel to do it. This request is a system call – the API of the Linux kernel.

The System‑Call Path

  1. Wrapper (glibc) – You write printf("hello") in C or print("hello") in Python. You are calling a library function, not the kernel yet.
  2. Register Setup – The library places the specific syscall ID (e.g., 1 for write) into a CPU register (usually RAX).
  3. Context Switch (Transition)
    • Legacy: CPU executes interrupt int 0x80.
    • Modern (fast): CPU executes the syscall instruction.
      This forces the CPU to switch from Ring 3 to Ring 0 and jump to a predefined location in kernel code.
  4. Execution – The kernel checks permissions (e.g., “Does UID 1000 have permission to write to /etc/hosts?”). If allowed, it performs the hardware task.
  5. Return – The kernel writes the result (or error code) to a register and issues sysret, dropping the CPU back to Ring 3.

고급 개념: vDSO (Virtual Dynamic Shared Object)

문제: 링 전환은 “비용이 많이 듭니다.” gettimeofday와 같은 호출이 초당 수천 번 발생하는데, 매번 전체 컨텍스트 스위치를 수행하면 성능이 저하됩니다.

해결책: 커널은 읽기‑전용 페이지 자체 메모리를 사용자 공간에 직접 매핑합니다. 애플리케이션은 이 페이지에서 현재 시간을 실제 시스템 콜을 발생시키거나 커널 모드로 진입하지 않고 읽을 수 있습니다. 이 메커니즘이 바로 vDSO입니다.

Source:

strace – 시스템 트레이스 (프로세스 디버깅)

strace는 DevOps를 위한 궁극적인 디버깅 도구입니다. 프로세스에 붙어서 해당 프로세스가 수행하는 모든 시스템 콜을 출력하므로, 소스 코드를 가지고 있지 않은 “블랙‑박스” 바이너리를 디버깅할 수 있습니다.

기본 사용법

# 명령을 실행하고 추적하기
strace ls /tmp

# 실행 중인 프로세스에 붙이기 (예: 멈춘 웹 서버)
strace -p 1234

일반적인 출력 예시:

openat(AT_FDCWD, "/etc/passwd", O_RDONLY) = 3
  • openat – 함수 이름.
  • "/etc/passwd" – 인자 (어떤 파일?).
  • = 3 – 반환값. 양수는 파일 디스크립터(핸들)입니다.

= -1이 보이면 호출이 실패한 것입니다. strace는 오류 코드도 함께 출력합니다. 예: -1 ENOENT (No such file or directory).

고급 strace 기법

옵션목적예시
-c성능 프로파일링 – 각 시스템 콜에 소요된 시간을 집계합니다.strace -c -p 1234
-f자식 프로세스와 스레드를 따라갑니다 (Nginx, Chrome, Java와 같은 멀티‑스레드 앱에 필수).strace -f -p 1234
-s <size>문자열 크기 제한을 늘립니다 (기본값은 긴 문자열을 잘라냅니다).strace -s 2000 -p 1234
-e inject=:error=시스템 콜을 강제로 실패시키기 – 오류 처리 테스트에 유용합니다.strace -e inject=open:error=ENOSPC ./my_application

예시: 성능 프로파일링 출력

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 95.00    0.005000         500        10           futex
  2.00    0.000100          10        10         1 open

futex 시간이 높음 → 애플리케이션이 대부분의 시간을 스레드 락 대기(futex)에 사용하고 있음을 의미 → 동시성 문제이며 디스크 문제는 아님.

SRE가 반드시 알아야 하는 이유

  • 컨테이너 ≠ VM: Docker 컨테이너는 호스트 커널을 공유합니다. 하나의 컨테이너가 커널 패닉(Ring 0 크래시)을 일으키면 호스트와 다른 모든 컨테이너가 죽습니다. 격리는 논리적(네임스페이스)이며 물리적이 아닙니다.
  • **“Permission denied”**는 커널 로직 검사입니다: 커널은 open 시스템 콜 중 파일의 inode 권한을 현재 UID와 비교합니다.

TL;DR

  • Linux = 커널 + 유저랜드
  • 커널은 Ring 0에서 실행, 사용자 프로그램은 Ring 3에서 실행.
  • 시스템 콜은 사용자 공간이 커널과 통신하는 유일한 방법이다.
  • vDSO는 빈번한 읽기 전용 커널 데이터 접근 비용을 줄인다.
  • **strace**는 모든 시스템 콜을 확인하고, 성능을 프로파일링하며, 실패를 주입할 수 있게 해준다.

그 지식을 갖추면 Linux를 블랙 박스로 다루는 것에서 내부 동작을 마스터하는 수준으로 나아갈 수 있다—이는 바로 시니어 SRE와 커널 개발자들이 매일 하는 일이다.

시스템 호출 및 권한 수준

Latency – 모든 시스템 호출에는 비용이 듭니다. 고성능 코드는 시스템 호출을 최소화하려고 합니다(예: 데이터를 쓰기 전에 버퍼링).

구성 요소 개요

구성 요소책임권한충돌 결과
User Space애플리케이션, 셸, Docker 컨테이너Ring 3 (제한됨)단일 프로세스 종료 (SIGSEGV)
System Call사용자와 커널 사이의 인터페이스Ring 3 → Ring 0 (전환)해당 없음 (전환만 발생)
Kernel Space드라이버, 메모리 관리, 스케줄링Ring 0 (전체 권한)전체 시스템 충돌 (커널 패닉)

strace

  • 유형: 디버깅 도구
  • 실행 위치: User space
  • 목적: 애플리케이션이 수행하는 실제 작업(시스템 호출, 시그널 등)을 보여줍니다.
Back to Blog

관련 글

더 보기 »

기술은 구원자가 아니라 촉진자다

왜 사고의 명확성이 사용하는 도구보다 더 중요한가? Technology는 종종 마법 스위치처럼 취급된다—켜기만 하면 모든 것이 개선된다. 새로운 software, ...

에이전틱 코딩에 입문하기

Copilot Agent와의 경험 나는 주로 GitHub Copilot을 사용해 인라인 편집과 PR 리뷰를 수행했으며, 대부분의 사고는 내 머리로 했습니다. 최근 나는 t...