[CS] System Call: 프로그래밍 언어로 어떻게 하드웨어를 조작할 수 있을까?

2025. 11. 29. 23:50·Knowledge/운영체제

프로그래밍을 하다가 문득 생각이 들었다.

우리가 단순히 몇가지 단어들(프로그래밍 언어)만 가지고 어떻게 모니터에 표시할 수 있고, 저장장치 속 파일들을 긁어올 수 있는걸까?

이 명령들이 어떻게 CPU나 메모리, 디스크와 같은 하드웨어들을 직접 다룰 수 있으며, 제약은 없는걸까..

이번 게시물에서는 프로그래밍 언어로 어떻게 하드웨어를 조작할 수 있는건지. 그리고 해당 기능을 왜 사용하고 있는건지에 대해 차근차근 알아가보고자 한다.

 


 

1. 우리가 하드웨어를 다룰 수 있는 이유

우리가 printf() 함수 하나로 화면에 글자를 띄우고, open() 함수 하나로 디스크의 파일을 조작할 수 있는 이유는 바로 운영체제가 하드웨어 접근을 추상화해주기 때문이다.

우리가 Java나 C 같은 언어로 코드를 짜면, 그 코드는 결국 OS가 이해할 수 있는 형태의 요청으로 변환되는데, 이 요청을 OS에게 전달하는 공식적인 통로가 바로 시스템 콜 인터페이스이다.

프로그래머 입장에선 복잡한 하드웨어의 작동 방식(예: 디스크 섹터 주소, 비디오 메모리 제어)을 몰라도, OS가 제공하는 약속된 함수 이름만 가지고도 하드웨어를 다룰 수 있는 것이지만, 여기엔 명확한 한계가 있다. 프로그램이 하드웨어를 '직접' 조작할 수 있는 게 아니라, 오직 OS에게 대리인 역할을 부탁할 수 있다.

그렇다면 문뜩 생각이 든다. 굳이 OS가 중간에 껴야할까?

다이렉트로 하드웨어를 제어하면 더 빠르고 효율적이지 않을까?

 


 

2. 왜 OS가 중간에 껴서 하드웨어를 다루는지

프로그램이 하드웨어에 직접 접근할 수 없고, 반드시 운영체제를 거쳐야 하는 이유는 시스템의 안정성과 자원의 통제 때문이다.

시스템 보호의 필수 조건: 이중 모드 (Dual Mode)

컴퓨터의 자원은 한정되어 있고, 여러 프로그램이 공유한다. 만약 프로그램이 실수든 버그든 악의적으로든 CPU나 메모리 같은 핵심 자원을 마음대로 조작할 수 있다면 한순간에 시스템 전체가 붕괴될 수 있다.

이러한 문제를 막기 위해 CPU는 실행 모드를 두 가지로 나눠 권한을 분리한다.

  • 사용자 모드 (User Mode): 일반 응용 프로그램이 실행되는 모드. 입출력 명령이나 메모리 관리 같은 하드웨어 조작 명령어(특권 명령어)의 실행이 금지된다.
  • 커널 모드 (Kernel Mode): 운영체제의 핵심 영역인 커널이 실행되는 모드. 모든 명령어를 실행할 수 있으며, 하드웨어를 직접 조작할 수 있는 최고 권한 모드이다

응용 프로그램은 기본적으로 사용자 모드로 실행되기 때문에, 하드웨어를 건드리고 싶으면 반드시 커널 모드로 전환되어야 하고, 이 전환을 요청하는 유일한 수단이 바로 시스템 콜이다.

 


 

3. 시스템 콜(System Call) 작동 원리

시스템 콜은 사용자 모드의 프로그램이 커널 모드에 있는 OS에게 서비스를 요청하는 공식적인 방법이다. 이는 일종의 소프트웨어 인터럽트로 작동한다.

모드 전환을 통한 서비스 요청 과정

사용자 프로그램이 파일 열기(open()) 같은 하드웨어 관련 작업을 요청하면 다음과 같은 과정이 일어난다.

  1. 시스템 콜 호출 사용자 프로그램이 특정 OS 서비스를 요청한다
  2. Trap 발생 CPU는 현재 실행을 멈추고 Trap을 발생시킨다 (소프트웨어 인터럽트)
  3. 상태 저장 및 모드 전 CPU는 하던 작업의 상태(PCB, 프로그램 카운터)를 저장하고, 실행 모드를 사용자 모드 → 커널 모드로 자동으로 전환한다
  4. 인터럽트 서비스 루틴(ISR) 실행: 커널 영역에서 해당 시스템 콜 요청을 처리하는 코드를 실행하여 하드웨어 조작을 대리 수행한다.
  5. 복귀 커널이 작업을 완료하면, 모드를 커널 모드 → 사용자 모드로 복귀하고, 저장했던 프로그램 상태를 복원하여 원래 프로그램으로 돌아간다.

이 과정을 통해 OS는 자원에 대한 통제권을 안전하게 유지하면서도, 프로그램의 요청을 완벽하게 처리할 수 있게 된다.

 


 

4. 개발자가 직접 System Call을 부르진 않는다

실제 프로그래밍을 할 때 우리는 sys_write 같은 OS 종속적인 복잡한 함수 대신, printf()나 read() 같은 간단한 함수를 사용한다.

우리가 사용하는 이 함수들은 OS가 제공하는 라이브러리 함수이자 **API(Application Programming Interface)**이다. (이건 운영체제에 대한 API 입니닷)

**API**는 개발자와 시스템 콜 사이의 중간 계층 역할을 한다.

  • API는 복잡하고 OS마다 다른 시스템 콜을 개발자가 사용하기 쉬운 형태로 추상화한다
  • 예를 들어, C언어의 printf() 함수는 내부적으로 write() 시스템 콜을 호출하여 커널 모드로 진입하게 한다
  • ⇒ printf()도 사실 write()로 구성되어있다..!

이러한 API 덕분에 프로그래머는 OS 내부 구조나 시스템 콜의 세부 번호를 몰라도, 일관된 방식으로 OS 서비스를 요청할 수 있다.

 


 

5. 주요 시스템 콜 종류

시스템 콜은 OS가 제공하는 핵심 기능별로 분류되며, 우리가 코딩하는 모든 프로그램에서 간접적으로 사용된다.

C언어에서는 Unistd.h 라이브러리에 해당 시스템 콜이 포함되어있다

카테고리 설명 주요 시스템 콜 (Unix/Linux 예시)

프로세스 제어 프로세스의 생성, 실행, 종료 및 상태 관리 fork(), exec(), exit(), wait()
파일 관리 파일 및 디렉토리 열기, 읽기, 쓰기, 닫기 등 조작 open(), read(), write(), close(), unlink()
장치 관리 입출력 장치(Device)에 대한 접근 및 제어 ioctl(), read(), write()
정보 유지 시스템 시간, 프로세스 ID, OS 버전 등의 정보 얻기 time(), getpid(), alarm()
통신 프로세스 간 통신(IPC) 및 네트워크 소켓 생성/데이터 전송 pipe(), socket(), send(), recv()

 


 

6. 마무리

시스템 콜은 프로그램과 하드웨어 사이를 잇는 중요한 연결고리지만, 모드 전환(Context Switching)이 반복될 때마다 오버헤드가 발생한다.

I/O 인터럽트와 시스템 콜의 관계

커널 모드에 진입한 OS가 하드웨어에게 실제 일을 시키면, 하드웨어는 작업을 마친 후 CPU에게 I/O 인터럽트를 발생시켜 작업 완료를 알려준다.

  • 시스템 콜: 프로그램 → OS (소프트웨어 요청)
  • I/O 인터럽트: 하드웨어 → CPU (하드웨어 응답)

시스템 콜은 I/O 작업의 시작을 알리고, I/O 인터럽트는 그 작업의 완료를 알리는 중요한 쌍을 이룬다.

 


 

성능 극대화 기술: DMA와 DirectX

이러한 Context Switching의 비용을 줄여 I/O 성능을 높이려는 기술들이 발전해 왔다.

  • DMA (Direct Memory Access)
  • CPU 개입 없이 주변 장치(디스크 등)가 메모리에 직접 데이터를 전송하도록 하여, CPU의 부하를 줄이고 불필요한 인터럽트 발생을 감소시킨다
  • DirectX
  • 게임처럼 고성능 그래픽 처리가 필요할 때, OS의 복잡하고 느린 커널 경로를 최소화하거나 우회하여 Context Switching 지연을 줄이고 처리 속도를 극대화하는 기술이다

결론적으로, 프로그래밍 언어로 작성된 모든 명령은 시스템 콜을 거쳐야만 하드웨어에 닿을 수 있으며, 이 시스템 구조 자체가 프로그래밍 언어가 하드웨어를 동작시킬 수 있는 방식이댜.

'Knowledge > 운영체제' 카테고리의 다른 글

[Linux] 작업 예약 스케줄러(Cron)을 이용한 게임 서버 재부팅  (0) 2025.11.30
'Knowledge/운영체제' 카테고리의 다른 글
  • [Linux] 작업 예약 스케줄러(Cron)을 이용한 게임 서버 재부팅
ryuwon
ryuwon
여러 개발 정보 끄적이고 있습니닷..
  • ryuwon
    이름 없는 블로그
    ryuwon
  • 글쓰기 관리
  • 전체
    오늘
    어제
    • 분류 전체보기 (34)
      • Series (0)
      • Programming (1)
        • Java (1)
        • C (0)
        • Swift (0)
      • Framework & Library (8)
        • Spring (6)
        • Spring Boot (2)
      • Data & ORM (0)
        • RDBMS (0)
        • NoSQL (0)
        • ORM (0)
      • Infra & DevOps (1)
        • Cloud (0)
        • DevOps (1)
        • Infra (0)
      • Knowledge (4)
        • 자료구조 (1)
        • 알고리즘 (3)
        • 운영체제 (2)
        • 네트워크 (1)
        • 아키텍쳐 및 디자인 패턴 (0)
        • 개발지식 (3)
      • Testing (0)
      • Security & System (0)
      • Project (5)
      • Writing (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    OCI
    Spring Profile
    찐빵
    네트워크
    K3S
    프로젝트
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.5
ryuwon
[CS] System Call: 프로그래밍 언어로 어떻게 하드웨어를 조작할 수 있을까?
상단으로

티스토리툴바