본문으로 이동
주 메뉴
주 메뉴
사이드바로 이동
숨기기
둘러보기
대문
최근 바뀜
임의 문서로
~ldmsys
검색
검색
외관
로그인
개인 도구
로그인
현재 모든 문서는 작성 중입니다. 보시는 데 불편함이 있더라도 양해 부탁드립니다.
운영체제 기본/보호 문서 원본 보기
문서
토론
한국어
읽기
원본 보기
역사 보기
도구
도구
사이드바로 이동
숨기기
작업
읽기
원본 보기
역사 보기
일반
여기를 가리키는 문서
가리키는 글의 최근 바뀜
문서 정보
외관
사이드바로 이동
숨기기
←
운영체제 기본/보호
문서 편집 작업을 수행할 권한이 없습니다. 다음 이유를 확인해주세요:
요청한 작업은 다음 권한을 가진 사용자에게 제한됩니다:
사용자
.
문서의 원본을 보거나 복사할 수 있습니다.
[[운영체제 기본|목차]] · 이전: [[운영체제 기본/추상화|추상화]] · 다음: [[운영체제 기본/프로세스와 스레드|프로세스와 스레드]] 여러 프로그램이 한 컴퓨터에서 실행된다면, 한 프로그램의 실수가 다른 프로그램이나 커널까지 망가뜨리지 않도록 경계를 두어야 한다. Linux에서는 CPU의 권한 모드와 메모리 접근 권한 등을 이용하고, 커널이 자원 접근 요청을 검사한다. == 사용자 공간과 커널 공간 == 일상적으로 Linux라고 부르는 시스템에는 커널뿐 아니라 셸, C 라이브러리, 각종 명령어와 서비스가 함께 들어 있다. 이 중 '''커널'''은 CPU 실행, 메모리 매핑, 장치 접근 등을 관리하는 핵심 부분이다. Bash나 <code>ls</code>는 커널 바깥의 사용자 공간에서 실행되는 프로그램이다. 프로그램이 정수 두 개를 더할 때마다 커널을 호출하는 것은 아니다. 일반적인 계산과 접근이 허용된 메모리의 읽기·쓰기는 사용자 공간에서 진행된다. 파일을 열거나 새 프로세스를 만드는 등 커널의 도움이 필요한 작업에는 '''시스템 호출'''을 사용한다. C에서는 보통 라이브러리 함수를 통해 이 인터페이스를 사용한다. 따라서 C 함수 호출 하나와 시스템 호출 하나가 반드시 일대일로 대응하지는 않는다. [https://man7.org/linux/man-pages/man2/syscalls.2.html syscalls(2)] 사용자 모드의 프로그램은 임의의 커널 메모리를 읽고 쓰거나, 제한된 CPU 명령을 마음대로 실행할 수 없다. 그렇다고 아무 일도 못 하는 것은 아니다. 일반적인 계산은 CPU에서 직접 실행하며, 커널의 권한이 필요한 작업만 정해진 경로로 요청한다. == 시스템 호출은 권한을 넘겨주는 통로가 아니다 == 파일을 열 때 프로그램은 경로와 열기 방식을 전달한다. 커널은 경로를 해석하고 접근 조건을 검사한 다음 성공하면 파일 디스크립터를 반환한다. 실패하면 프로그램은 오류를 처리해야 한다. 호출한 프로그램이 잠시 커널의 모든 권한을 얻어 원하는 일을 하는 구조가 아니다. C에서 <code>open()</code>이 -1을 반환하면 <code>errno</code>를 확인한다. 예를 들어 <code>ENOENT</code>는 경로의 구성 요소가 없거나 끊어진 심볼릭 링크 등으로 대상을 찾지 못한 경우에 나올 수 있고, <code>EACCES</code>는 필요한 접근 권한이 없는 경우에 나올 수 있다. “열기에 실패했다”는 결과만 보고 파일이 없다고 단정하면 원인을 잘못 찾게 된다. [https://man7.org/linux/man-pages/man2/open.2.html open(2)] 같은 이유로 읽기 전용으로 연 fd에 쓰기를 요청하면 거부된다. 메모리에도 비슷한 제한이 있다. 매핑되지 않은 주소나 허용되지 않은 쓰기 접근은 정상적인 메모리 사용으로 처리되지 않는다. 사용자와 그룹에 따른 파일 권한 검사, CPU 권한 모드, 페이지 접근 권한은 서로 관련되지만 동일한 장치는 아니다. == 커널 진입과 문맥 교환 == 시스템 호출로 커널 코드를 실행하는 것과 다른 스레드에 CPU를 넘기는 것은 구별해야 한다. 요청을 바로 처리할 수 있다면 같은 스레드가 커널 작업을 마치고 사용자 공간으로 돌아갈 수 있다. 반면 데이터가 도착할 때까지 기다려야 하는 호출이라면 해당 스레드가 잠들고 다른 스레드가 실행될 수 있다. 이 차이는 시스템 호출 비용을 이야기할 때도 중요하다. 호출 횟수만으로 문맥 교환 횟수를 추정할 수 없으며, 호출에 걸린 시간에는 커널 처리뿐 아니라 대기 시간이 포함될 수도 있다. == 참고 문헌 == * [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/mprotect.2.html mprotect(2)]: 메모리 영역의 접근 보호.
운영체제 기본/보호
문서로 돌아갑니다.
검색
검색
운영체제 기본/보호 문서 원본 보기
새 주제