본문으로 이동
  • 현재 모든 문서는 작성 중입니다. 보시는 데 불편함이 있더라도 양해 부탁드립니다.

운영체제 기본/보호: 두 판 사이의 차이

~ldmsys
메타문서에서 보호와 시스템 호출 내용을 독립 챕터로 분리·보충
 
출처·문체 정리: 커널 원문은 git.kernel.org, em dash는 콜론으로 변경
25번째 줄: 25번째 줄:


== 참고 문헌 ==
== 참고 문헌 ==
* [https://man7.org/linux/man-pages/man2/syscalls.2.html syscalls(2)] — 커널 인터페이스와 라이브러리 래퍼.
* [https://man7.org/linux/man-pages/man2/syscalls.2.html syscalls(2)]: 커널 인터페이스와 라이브러리 래퍼.
* [https://man7.org/linux/man-pages/man2/open.2.html open(2)] — 파일 열기의 권한 검사와 오류.
* [https://man7.org/linux/man-pages/man2/open.2.html open(2)]: 파일 열기의 권한 검사와 오류.
* [https://man7.org/linux/man-pages/man2/mprotect.2.html mprotect(2)] — 메모리 영역의 접근 보호.
* [https://man7.org/linux/man-pages/man2/mprotect.2.html mprotect(2)]: 메모리 영역의 접근 보호.

2026년 10월 31일 (토) 06:49 판

목차 · 이전: 추상화 · 다음: 프로세스와 스레드

여러 프로그램이 한 컴퓨터에서 실행된다면, 한 프로그램의 실수가 다른 프로그램이나 커널까지 망가뜨리지 않도록 경계를 두어야 한다. Linux에서는 CPU의 권한 모드와 메모리 접근 권한 등을 이용하고, 커널이 자원 접근 요청을 검사한다.

사용자 공간과 커널 공간

일상적으로 Linux라고 부르는 시스템에는 커널뿐 아니라 셸, C 라이브러리, 각종 명령어와 서비스가 함께 들어 있다. 이 중 커널은 CPU 실행, 메모리 매핑, 장치 접근 등을 관리하는 핵심 부분이다. Bash나 ls는 커널 바깥의 사용자 공간에서 실행되는 프로그램이다.

프로그램이 정수 두 개를 더할 때마다 커널을 호출하는 것은 아니다. 일반적인 계산과 접근이 허용된 메모리의 읽기·쓰기는 사용자 공간에서 진행된다. 파일을 열거나 새 프로세스를 만드는 등 커널의 도움이 필요한 작업에는 시스템 호출을 사용한다. C에서는 보통 라이브러리 함수를 통해 이 인터페이스를 사용한다. 따라서 C 함수 호출 하나와 시스템 호출 하나가 반드시 일대일로 대응하지는 않는다. syscalls(2)


사용자 모드의 프로그램은 임의의 커널 메모리를 읽고 쓰거나, 제한된 CPU 명령을 마음대로 실행할 수 없다. 그렇다고 아무 일도 못 하는 것은 아니다. 일반적인 계산은 CPU에서 직접 실행하며, 커널의 권한이 필요한 작업만 정해진 경로로 요청한다.

시스템 호출은 권한을 넘겨주는 통로가 아니다

파일을 열 때 프로그램은 경로와 열기 방식을 전달한다. 커널은 경로를 해석하고 접근 조건을 검사한 다음 성공하면 파일 디스크립터를 반환한다. 실패하면 프로그램은 오류를 처리해야 한다. 호출한 프로그램이 잠시 커널의 모든 권한을 얻어 원하는 일을 하는 구조가 아니다.

C에서 open()이 -1을 반환하면 errno를 확인한다. 예를 들어 ENOENT는 경로의 구성 요소가 없거나 끊어진 심볼릭 링크 등으로 대상을 찾지 못한 경우에 나올 수 있고, EACCES는 필요한 접근 권한이 없는 경우에 나올 수 있다. “열기에 실패했다”는 결과만 보고 파일이 없다고 단정하면 원인을 잘못 찾게 된다. open(2)

같은 이유로 읽기 전용으로 연 fd에 쓰기를 요청하면 거부된다. 메모리에도 비슷한 제한이 있다. 매핑되지 않은 주소나 허용되지 않은 쓰기 접근은 정상적인 메모리 사용으로 처리되지 않는다. 사용자와 그룹에 따른 파일 권한 검사, CPU 권한 모드, 페이지 접근 권한은 서로 관련되지만 동일한 장치는 아니다.

커널 진입과 문맥 교환

시스템 호출로 커널 코드를 실행하는 것과 다른 스레드에 CPU를 넘기는 것은 구별해야 한다. 요청을 바로 처리할 수 있다면 같은 스레드가 커널 작업을 마치고 사용자 공간으로 돌아갈 수 있다. 반면 데이터가 도착할 때까지 기다려야 하는 호출이라면 해당 스레드가 잠들고 다른 스레드가 실행될 수 있다.

이 차이는 시스템 호출 비용을 이야기할 때도 중요하다. 호출 횟수만으로 문맥 교환 횟수를 추정할 수 없으며, 호출에 걸린 시간에는 커널 처리뿐 아니라 대기 시간이 포함될 수도 있다.

참고 문헌

  • syscalls(2): 커널 인터페이스와 라이브러리 래퍼.
  • open(2): 파일 열기의 권한 검사와 오류.
  • mprotect(2): 메모리 영역의 접근 보호.