728x90
1. User mode vs. Kernel mode
- User mode는 해당 user program의 private한 저장공간(virtual memory)에만 접근할 수 있고, I/O작업을 수행하는 것이 불가능하다.
- 그에 반해, Kernel은 메모리의 어떤 공간이든 접근할 수 있고 어떤 I/O작업도 가능하다.
- 유저모드와 커널모드의 구별을 위해 Mode-bit을 사용해 0, 1을 각각 kernel mode, user mode로 구분한다.
- 가상주소공간: kernel은 단 하나의 가상주소공간을 갖지만, 사용자 프로그램은 분리된 주소공간을 갖는다.
2. Process
- 프로세스는 자원의 할당 단위이다.
- 각 프로세스는 고립된 가상 메모리를 할당 받고, 프로세스 간에는 다른 가상메모리 공간에 접근할 수 없다.(protection)
- 프로세스 간에 통신을 할 수 있기는 한데 비용이 비싸다.
- 프로세스는 하나 이상의 스레드를 가질 수 있다.
- 스레드: 프로세스의 작업 흐름 단위, 스레드는 하나의 프로세스 안에서 다른 스레드와 스택을 제외한 데이터를 공유하기 때문에 light-weight process라고 부르기도 한다.
- 프로그램의 인스턴스(특정 모델을 바탕으로 생성된 새로운 context)이다.
- Created, Running, Waiting, Blocked, Terminated 등의 상태를 갖는다.
Process Environment block (PEB)
- Windows NT 운영체제군에서 사용되는 데이터 구조이다.
- 구조체의 필드들은 유저가 사용하라고 만든 건 아니고 운영체제가 쓰라고 만들어둔 것이다.
- (윈도우에서만 쓰는 게 아닌가? 다른 의미가 있나?)
Process identifier(PID, process ID)
- 운영체제 커널이 active process을 구별하기 위해 붙인 고유한 식별자(숫자)이다.
- 다양한 함수의 파라미터로도 쓰이고, 파라미터를 조작할 때도 사용된다.(우선순위 조작, 프로세스 kill)
- PID 1은 보통 시스템을 시작하고 끄는 init process가 갖는다.
+ 추가 : PCB(Process Control Block)
3. User stack & Kernel stack
- 둘 다 call stack으로서의 역할을 한다.
User space & Kernel space
- 현대 시스템에서는 memory에 대한 주소를 직접 사용하지 않고 가상주소를 사용한다.
- 가상 메모리와 물리 메모리는 여러개의 덩어리로 잘려서 관리하는데, 이 덩어리를 page라고 한다.
- page로 메모리를 관리하는 덕분에 메모리 관리의 복잡성이 완화되고, 프로세스 별로 독립된 주소공간을 사용하게 하여 안전해졌다. 그 외에도 demand-paging, swap-space 덕에 공간을 효율적으로 사용할 수 있다.
- 가상주소공간은 user space와 kernel space로 나눌 수 있는데 kernel space는 항상 높은 주소 공간에 존재한다.
- 주소 매핑은 항상 0xffff800000000000부터 시작한다.
- 만일 사용자 프로그램이 제한된 서비스(I/O등)를 요청하려는 경우, system calls를 사용한다.
User stakcs & Kernel stacks
- 모든 user process는 user stack과 kernel stack을 갖는다.
- user proecss가 privileged instruction을 실행시키려고 하면 trap을 발동시켜 kernel mode로 들어가게 되고, kernel은 user process를 대신해서 이것(privileged instruction)을 수행하는데, 이 수행이 kernel stack에서 일어난다.
- user stack은 user mode에서 실행되고 있는 경우에만 사용된다.
- kernel stack은 kernel space안에 있어서 user process가 직접 접근하는 것이 불가능하다.
- user process가 system call을 사용하면 kernel mode가 됨에 따라 실행중인 프로세스의 kernel stack이 사용된다.
- kernel stack은 각 스레드의 thread_info 구조체를 저장하기 위해 사용된다.
- kernel stack에서 system call을 수행할 때, segment selector와 stack pointer를 TSS에 저장된다.
segment: IPC(Interprocess Communication)에 사용되는 shared memory
segement selector: - system call을 할 때, user process는 caller save register를 모두 저장해놓고 `int $0x80`을 수행한다.
- HW는 TSS에서 프로세스의 커널 스택 주소를 찾고, 이 값들을 %ss(stack segment)에 load한 뒤, old stack stack-pointer (%esp), old program-counter (%eip), old stack segment (%ss), code segment(%cs), and EFLAGS registers 들을 커널 스택에 저장한다.
- 시스템 콜이 끝나면 위에서 push했던 값들을 다시 pop해서 resotre 한다.
https://stackoverflow.com/questions/12911841/kernel-stack-and-user-space-stack
https://stackoverflow.com/questions/9876323/storing-and-retrieving-process-control-block
728x90
'SW사관학교 정글 4기 > pintos' 카테고리의 다른 글
install_page (0) | 2022.06.11 |
---|---|
load_segment (0) | 2022.06.11 |
[Project 2 - Userprogram] 시스템콜, 시스템콜 핸들러 (0) | 2022.06.05 |
pintos alarm clock 테스트 에러 (0) | 2022.05.28 |
내가 자꾸 까먹어서 만든 pintos 코드 없는 함수 사전 (0) | 2022.05.28 |
댓글