[OS] Dual Mode(이중모드), 하드웨어 보호

2020. 4. 8. 19:05Programming/CS

이중모드, 하드웨어 보호

듀얼모드

한 컴퓨터를 여러사람이 동시에 사용하는 환경이거나 (ex. 서버컴퓨터) 한 사람이 여러개의 프로그램을 동시에 사용하는 환경일 때 (ex. 스마트폰, PC) 일반 사용자가 STOP명령등을 실행시켜 cpu를 중단시키는 일이 발생하면 안된다. 그래서 사용자 프로그램은 치명적인 명령을 사용할 수 없게 모드를 나눈 것이다.

  1. User 모드 (사용자 모드)
  2. Supervisor 모드(관리자 모드, monitor, priviliged, system 모드) = OS

privileged instruction 중에는 STOP, HALT, RESET, SET_TIMER, SET_HW .. 등이 대표적이다.

dual mode 의 시나리오를 보자.

  • register에 모드를 나타내는 (이중모드를 나타내는) flag(상태 bit) 하나를 더 추가한다. ex. monitor bit 라고 했을 경우 1->systemMode, 0->userMode 이런 식으로 듀얼모드를 나타낸다.
  • power ON
  • BOOT : OS가 HDD -> RAM으로 적재 && monitorbit==1(systemMode)
  • OS BOOOTING 끝, 사용자 프로그램 실행시키려고 더블클릭 -> monitorbit==0(userMode)
  • 프로그램이 RAM으로 적재, 이후 HW/SW 인터럽트 발생 시 처리 -> monitorbit==1(systemMode)
  • OS 서비스가 끝남 -> monitorbit==0(userMode)

일반 유저프로그램이 하드디스크에 접근할 수 있다는 뜻은 서버컴퓨터에 여러 사용자 / 여러 프로그램 파일이 있는데, 상관이 없는 프로그램/사용자가 하드디스크에 접근할 수 있으므로 보안에 취약하다는 문제가 있다.

그래서 일반 유저 프로그램이 데이터의 업데이트 및 저장을 할 때는, SW인터럽트를 사용하여 -> cpu는 현재 하는 일을 중단하고 OS 내에 있는 ISR(Interrupt Service Routine)로 이동 -> 현재 업데이트 할 데이터를 하드디스크에 접근하여 저장

대부분의 cpu는 monitorBit가 있다! 이 2중모드는 보호와 관련이 깊다.


하드웨어 보호

과거 하나의 컴퓨터를 여러명의 사용자가 공유한다는 것은,

현재의 서버컴퓨터의 개념과도 마찬가지

다른 사용자가 다른 사용자의 정보에 접근하거나 내용을 변경시키면 안된다는 뜻이다. 그래서 OS가 다양한 보호 처리를(입출력장치, 메모리, cpu) 해주어야한다.

  • I/O device protection
    • 타 사용자의 정보 수정/삭제하거나 HDD 접근하려함ㅜㅜ
    • 🧚🏻‍♀️ 입출력을 하려면 OS에게 요청 systemMode 전환-> OS가 IN/OUT 하며 업무를 마친 후 다시 userMode 복귀 -> 올바른 요청이 아닐 경우 OS가 거부
    • Privileged instruction violation : userMode에서는 priviliged명령들을 사용할 수 없게 -> 제한
  • Memory protection
    • OS해킹할수도있음 ㅠㅠ 핵 치명적!
    • 🧚🏻‍♀️MMU(Memory Management Unit)를 두어 다른 메모리영역 침범을 감시하도록 함. MEM번지를 다들 할당해주어, 문지기역할을 하는 MMU가 해당 번지만을 읽을 수 있도록 한다. (이 MMU안에있는 baseLimit 할당은 OS가 함)
    • Segment violation : 다른 사용자/OS영역의 메모리에 접근을 시도했을 경우 -> 제한
  • CPU protection
    • 한 사용자가 실수, 고의로 CPU 시간을 독점할 경우ㅜ ex. while(1) 을 사용자 A가 코드로 하여, 작업이 끝나지 않아 사용자 B의 작업을 처리하지 못하는 경우
    • 🧚🏻‍♀️ timer을 두어 일정시간 경과 시 timer interrupt(인터럽트 -> OS -> 다른 프로그램으로 강제 전환을 막음)

운영체제 서비스

모든 프로그램은 자원(cpu, mem ...)을 사용하는데, 그 자원을 효율적으로 사용하게 control 해주는 것이 OS. OS에는 해당 업무에 따라 작업 담당이 구분되어있다.

  • process management(프로세스관리) : cpu 자원을 나누어줌
  • mainMemory management(주기억장치관리) : main memory(RAM)를 application에게 나누어줌
  • file management(파일관리) : HDD 내에 있는 file들을 관리해줌
  • Secondary storage management (보조기억장치 관리)
  • I/O management(입출력장치관리)
  • networking management(네트워킹 관리)
  • protection(보호)

등이 있다. 그 중에 OS에서는 process management, mainmemory management을 집중적으로 배운다. OS는 해당 hw별로 구체적으로 어떠한 관리들을 하는지를 알아보자.

  1. Process management (프로세스 관리)

    • Process = task = job : 메인 메모리 내에서 실행중인 프로그램(program in execution). != program
    • 기능
      • 프로세스의 생성, 소멸 (creation, deletion)
      • 프로세스 활동 일시 중지, 재개 (suspend, resume)
      • 프로세스 간 통신 (interprocess communication : IPC)
      • 프로세스 간 동기화 (synchronization)
      • 교착상태 처리 (deadlock handling)
  2. mainMemory management (메모리 관리)

    • 기능
      • 프로세스에게 메모리 공간 할당 (allocation)
      • 메모리의 어느 부분이 어느 프로세스에게 할당되었는가 추적, 감시
      • 프로세스 종료 시 메모리 회수 (deallocation)
      • 메모리의 효율적인 사용
      • VM : 실제 메모리의 물리 크기 보다 더 큰 용량을 갖도록 함
  3. File management (파일 관리)

    • 물리적으로 track, sector로 구성되어있는 것을 사용자들에게 file 이라는 개념으로 사용할 수 있도록 해줌.
    • 기능
      • 파일 생성, 삭제 (file creation, deletion)
      • directory 생성, 삭제(folder)
      • open, close, CRUD
      • track, sector : file간의 mapping
      • backup
  4. Secondary storage management (보조기억장치 관리)

    • 하드디스크, 플래시 메모리 등을 관리
    • 기능
      • 빈 공간 관리 (free space management)
      • 저장 공간 할당 (storage allocation)
      • 디스크 스케쥴링 (disk scheduling) : 얼마나 최소한으로 움직여서, 어떤 경로로 디스크 해당 파일에 접근할수있을지 계산
  5. I/O management (입출력 장치 관리)

    • 기능
      • 장치 드라이브 (Device drivers) : 어떠한 장치를 사용하기 위한 디바이스 드라이브 설치하는데, OS 에 설치해서 사용할 수 있게끔 하는 것
      • 입출력 장치의 성능 향상
        • buffering : 입출력 장치에서 읽은 내용을 메모리로 들고옴. 한번 메모리로 들고오면 그다음부터는 빨리 읽을 수 있을테니!
        • caching : buffering과 비슷
        • spooling : 메모리 대신 하드디스크를 중간 매체로 사용하는것. ex. print 사용할 떄 프린트보다는 빠르고 cpu보다는 느린 disk 에 처리한 값을 저장하고, print로 보내 오버헤드를 조금 줄이는 것.

System calls

일반 application 프로그램이 위와 같은 운영체제 서비스(ex. 메모리 관리기능, processor 관리기능 ...) 를 받기 위해 호출하는 것. 쉽게말해 user Program이 OS에게 나좀 일하게 도와줘.. 하고 요청하는 것이다.

주요 시스템 콜

  • Process : end(정상종료), abort(강제종료), load(HDD->RAM으로가져옴), execute, create, terminate(==end), get/set attributes(process의 속성(메모리 얼마나 사용하고있음, id 등...)), wait event, signal event
  • Memory : allocate(명시적 || ex. new 로 객체 생성시 OS에 요청), free(다 쓰면 반납)
  • File : CRUD, open, close, ,,,
  • Device" request, release, attach/detache devices ...
  • Information : get/set time, get/set system data
  • Communication : socket, send, receive

그럼 이 system call이 어떻게 이루어지는지 한번 예제로 보자.

MS-DOS

Create file하려면 3Cfunction code로 한다.

[Index]AH = 3Ch - "CREAT" - CREATE OR TRUNCATE FILE

Entry:

CX = file attributes # file attributes(이 파일의 경로, 날짜, 확장자 등)을 CX reg에 넣어라
DS:DX -> ASCIZ filename # DX reg가 file의 이름을 나타내게 해라.
Return:

CF clear if successful, AX = file handle
CF set on error AX = error code (03h,04h,05h)
Notes: if a file with the given name exists, it is truncated to zero length

SeeAlso: AH=16h,AH=3Dh,AH=5Ah,AH=5Bh

라고 써져있는데, Create file을 하려면 이러한 system call을 만들어라!! 라는 뜻이다. 실제로 만들어보자.

MS-DOS : INT 21H

mov cx, 0      # attributes : null 이라 침
mov dx, 100    # ds 는 보통 만들어져있기 떄문에 dx만 설정, 100번지
mov ah, 3c     # create file 의 func code
int 21         # sw interrupt. MS-DOS의 경우 21이 int code이다.

100번지에 "aaaa"라는 제목파일이 저장되어 있을 경우 위처럼 코드를 작성해주면 aaaa 라는 파일이 생성된다.

위 예제는 MS-DOS였으니 이제 리눅스를 한번 봐보자.

ex. create file
EAX = 8, ECX = file attributes, EBX = file name.

Linux : INT 80H

mov eax, 8
mov ecx, 0    # attributes : null 이라 침
mov ebx, ??   # ?? : file name 이 적혀있는 주소
int 80        # sw interrupt. Linux의 경우 80이 int code이다.

이렇게 system call을 하면 OS가 여러가지를 계산하여 적절한 위치/크기 등을 만든다.

그리고 system call library : system call을 처음부터 object 파일로 만들어서 우리에게 제공하는 것을 말한다.

예제를 정리를 해보면, OS system call특정 레지스터에 특정 값을 넣고 -> sw interrupt 를 발생시켜 서비스를 받음.