x86-64 리눅스 운영체제에서는
메모리 공간을 크게 유저 공간(User Space)와 커널 공간(Kernel Space)로 구분한다.

이 두 공간은 아주 엄격하게 분리되어 있다.

유저 공간의 프로그램은 커널 공간에 직접 접근할 수 없도록 설계되어 있으며,
커널은 필요에 따라 유저 공간 메모리에 접근할 수 있다.

사용자 공간과 커널 공간에 대해 더 자세히 알아보자.

1. 유저 공간 (User Space)

유저 공간은 프로세스, 라이브러리 등 유저 레벨의 프로그램들이 실행되는 메모리 영역으로, 유저가 설치한 소프트웨어는 유저 공간에서 동작하게 된다.

유저 공간에서 실행되는 프로그램들은 아래와 같은 특징을 가진다:

시스템 자원 접근 제한

유저 공간의 프로그램들은 직접 하드웨어나 핵심 시스템 자원에 대한 접근에 제한이 있다.
따라서 하드웨어와의 상호작용은 커널을 통해 간접적으로 수행한다.

System Call (syscall)을 통한 커널 접근

파일 작성이나 메모리 할당 등의 작업을 수행하기 위해서는 시스템 자원 접근 제한으로 인해 커널을 통해야 한다. 이로 인하여 유저 공간의 프로그램들은 syscall을 통해 커널에 필요한 작업을 요청하여 수행하게 되었다.

동적 라이브러리의 사용

유저 공간에서 실행되는 프로그램은 필요에 따라 동적 라이브러리를 로드하고 사용할 수 있다.
이를 통해 같은 라이브러리를 사용하는 프로그램들은 하나의 동적 라이브러리만을 로드하고,
해당 라이브러리를 공유하여 사용할 수 있어 메모리를 효율적으로 사용할 수 있게 된다.
대표적인 예시로는 libc.so.6가 있다.


2. 커널 공간 (Kernel Space)

커널(Kernel)은 간단히 설명하면 운영체제의 이론을 구현한 핵심 프로그램이라고 할 수 있다.

커널 공간은 이 커널을 비롯한 드라이버나 인터럽트(Interrupt) 핸들러가 실행되는 메모리 영역이다.
따라서 커널 공간은 컴퓨터 시스템의 모든 핵심 기능과 하드웨어 제어를 담당한다.
커널 공간과 유저 공간을 엄격하게 나눠 관리하는 것도 이 커널 공간에 대한 안정성을 보장하기 위해서라고 할 수 있다.

따라서 커널 공간에서는

  • 하드웨어와의 상호작용
  • syscall 처리
  • 프로세스 및 메모리의 관리
  • 보안 및 권한 관리
  • 인터럽트 및 예외 처리

등의 중요한 작업을 수행할 수 있는 공간이다.