-
Resource Protection & System CallCS/OS(운영체제) 2022. 4. 11. 17:35728x90
자원보호와 시스템콜
Kernal
- 운영체제에 상주하는 메모리
- 대다수 C, 어셈블리 언어로 작성됨 (빠른 속도를 위해)
- 함수의 집합으로 구성됨
- 기본적인 메커니즘을 제공 (프로세스 관리 , 동기화 , CPU 스케줄링 , 메모리 관리 , 디바이스 관리 , 인터럽트 핸들링)
- 시스템 콜을 통해 서비스를 제공함
Utility
- System utility or User utiliry
- 디스크는 OS의 일부로서 상주한다. ( 요구시 로드 )
Shell
- 특별한 유틸리티. 명령을 제어하는 역할.
Dual-Mode
- 최소 두개의 구별되는 모드로 하드웨어의 Support를 제공함.
Kernel Mode / 어떤 OP-code던지 실행가능/아무 제한 없이 어떤 메모리라도 접근 가능/어떤 레지스터든지 접근 가능
User Mode / 권한 있는 OP-code 존재 X / 오직 내 메모리 영역만 접근 가능 / 특별한 레지스터 없음
몇몇 명령은 운영체제에 의해서 제한됨.
- 유저는 직접적으로 입출력장치에 접근할 수 없음 ( 권한있는 명령이나 메모리 맵핑을 통해서만 접근할 수 있음 )
- 메모리 상태 관리를 조작하는 명령은 반드시 제어되어야 함 ( page table pointers , TLB load etc..)
Machine Instruction Cycle
Fetch -> Decode -> Excute -> Memory -> Write Back
Mode Switch(모드 스위치)
- 모드 비트를 0 또는 1로 하드웨어에게 할당
(현재는 주로 0(Kernel Mode) , 1(User Mode) )
- 인터럽트 or 예외가 발생하면 하드웨어는 커널 모드로 스위치함.
- Change Mode Bit 명령은 권한이 있어야 하기 때문.
CPU Protection Mechanism
- CPU 독점을 막기 위함
- 보호는 보안이 아님 (예를 들어 무한 루프에 걸린 사용자 프로그램은 OS에 제어권을 반환하지 않음)
- 하드웨어에 타이머 지원(Ex. SMP에 로컬 APIC 필요)
System Timer
- PIT(Programmable Interval Timer) 라고 불림
- 주기적인 속도로 인터럽트 구동 -> Hitting Hz(tick) !
- 특정 시간이 지나면, 인터럽트를 발생시킴
- 타이머 인터럽트가 발생하면 , OS에 제어권을 넘김
- 타이머는 권한이 있어야 함. 오직 OS만 로드할 수 있음.
절대 시간 & 상대 시간
Absolute Time : 어떤 벤치마크 방식 없이 시간을 나타냄. (2022년 3월) , Unix 시스템은 1970년 1월 이후로부터 초단위의 숫자로 절대시간을 나타냄.
Relative Time : 어떠한 시간을 기준으로 현재 상태를 나타냄. ( 지금으로부터 5초 )
Timer Interrupt 예시
Timer Interrupt Handler가
1. jiffies를 업데이트함 -> 2. wall time을 업데이트하고 xtime에 저장함. -> 3. process time을 업데이트함.
(현재 실행하고 있는 프로세스의 자원 사용을 Update 및 time slice를 Update.) quantum(time slice)을 체크함.
Memory Protection
MMU ( Memory Management Unit )
- logical한 메모리 주소를 physical한 주소로 번역하는데 도움을 줌.
- 메모리 보호, 캐시 컨트롤 , bus arbitration을 동시에 handling함.
- 메모리 관리 상태를 조작하는 명령
I/O Protection
- 모든 I/O 명령은 권한이 있는 명령임.
- 유저가 직접적으로 I/Oㅇ에 접근할 수 없음.
- 사용자가 명령어를 수행하기 위해선 OS Procedure를 호출해야 함.
그렇다면 User Mode 프로그램은 Kernel Mode 서비스를 어떻게 호출하냐 ?
-> 그것이 바로 시스템 콜(System Call)
Kernel Enrty Point
유저가 어떠한 이슈에 의해 커널 모드에 들어오는 시점은 인터럽트 / 예외 / 시스템 콜이 있음.
System Call(시스템 콜)
- 프로세스가 특정 커널 서비스에 요청한다는 의미로 어플리케이션이 OS와 소통하도록 허락함.
시스템 콜의 목적
- 시스템 자원을 보호하기 위해(신뢰할 수 있는 ex.OS 와 신뢰할 수 없는 ex.User 를 반드시 구분해야함)
- 프로그램의 신뢰성을 위해 ( 무한 루프, Buggy Memory 등 )
- 악의적인 유저로부터의 보안성을 위해 ( 권한 없이 OS 및 다른 자원 Read/Write )
시스템 콜은 약 200개가 존재함.
portable이 뛰어나고 견고함. 따라서 직접적인 시스템 호출이 아닌 wrapping된 API를 통해 대부분 사용자 프로그램에 Access함.
그렇다면 System Call 대신 API를 사용하는 이유는 ?
-> OS에게 약간의 유연성을 주기 위함.
-> System call은 사용하기 쉽지 않음. 이러한 것들을 사용하기 쉽게 하기 위해 라이브러리를 만듬.
각 운영체제마다 System call이 다름.
가장 일반적인 3가지 APIs
POSIX API / Win32 API / Java API
시스템콜의 Type
- 크게 6가지의 카테고리로 그룹화 되어 있음.
Process / Scheduling / Interprocess Communication / File System / Socket(Networking) / Miscellaneous
시스템콜 호출 시 유저와 커널 예시.
User Program
- 라이브러리 안에 있는 read() 시스템 콜 함수를 호출함 -> 레지스터 안에 arguments를 생성하거나 user stack에 push함. -> 전용 레지스터에 시스템 콜 number를 배치함. -> 명령을 수행함
Kernel
- 시스템콜 인터럽트 핸들러를 실행함 -> 시스템 콜 테이블 안에 있는 sys_???() 커널 함수를 실행함. -> 전용 레지스터를 생성함 -> RETURN_FROM_INTERRUPT를 실행함.
System Call Parameter Passing
일반적으로 3가지 방식으로 OS에게 파라미터를 전달함.
1. Register 안에 파라미터를 넘김
2. 메모리 안 block에 파라미터를 저장하고 block의 address를 전달함
3. 프로그램에 의해 파라미터를 stack에 push하고 OS에 의해 stack에서 pop함.
이 때, Block과 Stack 방식은 전달되는 파라미터의 길이에 대한 제한이 없음.
728x90'CS > OS(운영체제)' 카테고리의 다른 글
인터럽트(Interrupts) (0) 2022.04.17 컴퓨터 하드웨어(Computer Hardware) (0) 2022.04.17 Process Scheduling (0) 2022.04.12 Process Switch (0) 2022.04.12 Program & Process (0) 2022.04.12