OS

[OS] Operating System Organization

포뇨링 2023. 3. 1. 21:55

어렵다 어려워……. 모르겠어…….

 

 

Abstracting Physical Resources

 

✔️ OS가 충족해야하는 조건

1. Time-sharing : 여러 프로세스가 한정된 하드웨어(H/W) 자원을 time-sharing하며 사용할 수 있어야함

→ 프로그램이 주기적으로 H/W를 양보한다면 굳이? 필요없을 것. 하지만 악의적으로 독점한 채 양보하지 않으면 다른 프로그램은 영영 H/W를 사용하지 못할 것임. 따라서 UNIX는 주기적으로 프로그램이 H/W 자원을 양보하도록 만듬.

2. Isolation : 한 프로세스의 bug나 fail이 다른 프로세스에 영향을 주면 안됨

→ 직접 H/W에 접근하는 것보다 추상화된 H/W에 접근하는 것이 여러방면에서 좋음. Ex, 프로세스는 시스템콜을 사용하여 H/W에 접근. 시스템콜은 미리 짜여진 커널 코드를 사용하기때문에 악의적 행동 불가. AND 프로세스의 입장에선 스토리지의 종류와 관계없이 동일한 시스템콜을 사용할 수 있기 떄문에 편리.

IN CASE OF UNIX, 각 프로세스는 isolation을 위해 가상의 메모리를 가짐(가상의 메모리는 물리 메모리에 mapping되어있고 그 mapping은 커널이 관리). 프로그램이 사용하는 메모리는 가상 메모리지만 자신만의 물리 메모리를 가지고 있다고 착각하며 프로그램이 메모리에 써달라고 요청한 데이터는 mapping된 물리 메모리에 써진다. 커널이 mapping할 때 프로세스 간 물리메모리를 중복하여 사용하지 않도록 하여 isolation을 보장

3. Interation : 프로세스간 상호작용이 가능해야함

→ file descriptor을 통해 이루어짐.(커널이 여러 예외 상황을 대신 처리 가능)

EX) 파이프라인의 한 프로세스가 fail시 커널이 다른 프로세스에게 end-of-file을 알림

 

 


 

 

User mode, kernel mode, and system calls

 

strong isolation을 위해 OS와 프로그램의 경계는 명확해야함.

(버그 영향 X, 프로세스가 커널의 자원 혹은 다른 프로세스 메모리에 접근하면 안됨)

⇒ user mode와 kernel mode 사용

kernel mode에선 H/W에 직접 접근 가능한 priviledged instruction을 사용할 수 있음(user mode에선 사용 불가). 또 kernel mode에선 커널의 코드만을 사용할 수 있음.

그렇기때문에 user mode의 프로세스가 H/W 자원을 이용하기위해 INT라는 instruction을 사용. 해당 instruction은 user mode의 프로세스가 kernel mode로 진입할 수 있게 함. kernel mode로의 진입과 user mode로의 복구는 모두 커널이 관리함.

 

 


 

 

Process overview

 

xv6는 page table을 통해 각 프로세스가 자신만의 메모리를 갖도록 함. page table은 가상 주소를 물리 주소로 변환함. 이때 커널 코드와 커널의 데이터는 모든 프로세스에서 사용하므로 물리메모리의 절약을 위해 kernel area는 모든 프로세스에서 공통으로 사용함.

user area는 virtual memory 0번지부터 0x7fffffff까지임. 위 그림에서는 user area가 연속된 채로 physical memory에 mapping되어있지만 실제로는 페이지(4KB)단위로 나뉘어 매핑되어있음.

kernel area는 0x80100000번지에서 높은 방향으로 자란다. 0x80000000에서 0x80100000에는 컴퓨터를 부팅할 때 필요한 BIOS가 존재.

xv6의 virtual address space. linux와 다르게 스택이 높은 주소로 자란다.

각 프로세스 마다 user stack과 kernel stack이 존재. 프로세스가 user mode이면 user stack만 사용하고 kernel stack은 비어있음. 하지만 kernel mode일때 user stack이 비어있진 않음. 커널은 유저 프로세스가 실행중이다가 H/W 자원이 필요할 때 잠시 들린다고 생각하면 됨. kernel mode로 진입하면 user mode의 상태를 kernel stack에 저장한 후 사용. user mode로 복귀할 땐 저장되어있는 uer mode의 상태를 가져와 사용.

= 프로세스가 user instruction을 실행하다가 H/W 자원이 필요한 상황이 발생하면 system call을 호출하여 사용하는 스택을 kernel stack으로 전환하고 privilege level 을 올림. 그리고 kernel instruction을 사용하여 지정된 작업 수행. 완료하면 다시 privilege level을 내리고 user stack으로 전환 후 이어감

 

 

 


 

 

The first address space

 

부팅과정은 크게 아래와 같이 이루어짐

PC powers on → load bootloader(bootasm.S, bootmain.c) → load kernel → execute kernel entry

PC의 전원을 켜면 컴퓨터는 각종 하드웨어를 초기화하고 부트로더(bootasm.S)를 실행시킴. 부트로더는 (xv6 내에서 bootasm.S, bootmain.c) 항상 디스크의 첫번째 섹터에 위치하고 커널 이미지를 메모리로 로드.

부트로더는 xv6 kernel을 물리메모리 0x100000에 위치시킴. 더 낮은 물리메모리는 I/O device에 대해 쓰임. 부트로더가 xv6의 entry(entry.S)에 진입함으로써 xv6 커널이 실행. memory layout을 그림과 같이 설정 후 main코드로 진입.

 

 

 


 

 

Creating First user-level Proess

 

위 코드가 실행하는 main 함수임. main은 여러 장치와 하위 시스템으 초기화 후 userinit을 호출하여 첫번째 프로세스를 생성함.

이렇게 생성된 프로세스는 RISC-V assembly로 쓰인 xv6의 첫 시스템 콜을 만드는 프로그램을 실행. initcode.S는 SYS_EXEC(exec의 시스템콜 번호)를 a7레지스터에 넣고 ecall을 불러 커널에 재진입.

그러면 커널은 원하는 시스템콜을 부르기 위해 a7에 있는 숫자를 사용함. 시스템콜 테이블은 SYS_EXEC(시스템콜 번호)과 sys_exec을 연결함. 그러면 exec함수가 메모리를 대체하고

엥 뭐라는 거임…. 알아야할까..? 알아야겠지…? 하……………………………

 

 

 


Ref

https://92-lwj.tistory.com/5

https://pdos.csail.mit.edu/6.828/2022/xv6/book-riscv-rev3.pdf