mojo's Blog
Address Translation 본문
이전에 배웠던거 잠깐 복습하기...
저번에 Memory virtualization 에 대해서 두가지 방법에 대해서 배웠다.
첫 번째 : Time Sharing of Memory
먼저 Context switch 할 때 CPU를 점유하는 건 한 개의 프로세스만 점유했었다.
시분할 한 것처럼 메모리 또한 시분할을 해보자라는게 바로 Time Sharing 이다.
그러나 Disk 로 내렸다가 다시 올리는 과정 즉, overhead가 큰 문제점이 있다.
그래서 이러한 overhead를 해결하기 위해서 물리적으로 남아있는것처럼 다른 주소를 쓸 수 있도록 하면 되지 않을까? 라는 방법이 Static Relocation 이다.
두 번째 : Static Relocation
메모리에 로딩을 하는 과정에서 프로그램을 rewrite 해서 주소를 바꿔치기 해주는 방법이다.
즉, 프로세스마다 주소가 다르다.
동일한 코드라 서로 다른 주소로 올라가면서 공간적인 분할이 일어나는 것은 당연하다.
Time Sharing 에서의 다른 주소를 쓸 수 없는 문제점을 해결할 수 있지만 Protection 문제가 존재한다.
예를 들어서 rbp가 stack pointer 8을 더하면 변수 x의 주소를 가르킨다고 하자.그런데 malicious code가 생성된다던가 코드가 실행될 때 0x2058 같은걸 더한다고 하면 다른 곳의메모리 영역을 침범하는 문제점이 생긴다.
즉, 다른 process의 address를 접근할 수 있는 문제점이 발생하는 것이다.
그래서 이러한 protection mechanism 이 없고 그래서 코드가 어떻게 짜였는지에 따라 Memory address 를훔쳐볼 수 있고 destory 할 수 있다는 점.
즉, Confidentiality, Integrity 등의 문제점이 있으며 Privacy 또한 보장되지가 않는다.
다른 곳으로 Memory Space를 특정 영역에 배치시킨다면 다른 영역으로 이동할 수 없는 문제점 또한 존재한다. (배치한 곳에 계속 머물러야 함)
Dynamic Relocation
Goal : Protect processes from one another
Requires hardware support=> Memory Management Unit (MMU)
MMU dynamically changes process address at every memory reference
- Process generates logical or virtual addresses
- Memory hardware uses physical or real address
앞에 있던 Static Relocation 과 달리 Dynamic Relocation 은 다른 Address를 침범할 수 없도록 방지해준다.
이를 해결하기 위해 MMU (Memory Management Unit) 이 나왔고 dynamic 하게 process address를 바꿔준다.
여기서 process가 가지고 있는 Address는 virtual address이다.
이전까지는 물리적인 주소였지만 Dynamic Relocation 에서는 virtual address 를 실제 DRAM 에 존재하는 physical address로 변경해준다.
즉 다시 말해서 virtual address(logical address) 를 MMU에 넘겨주면 Physical address로 변경시켜준다.
ex ) Process A, B가 있다고 가정하기
Process A, B(0 GB ~ 4 GB) 의 code 부분이 존재한다.
CPU가 볼때는 virtual space로 보는데 process A가 돌고 있다고 하면 code 부분에 어떤 instruction 을 실행하려 할 때 CPU 안에 eip register 값이 process A의 code 부분을 가르키게 된다.
이때 physical Address 를 MMU 에게 물어본다 (eip register 값이 physical인지 logical인지?)
또한 process B가 돌고있다면 process B에 매핑되어 있는 page Directory 가 존재하는데 이는 소프트웨어, MMU는 하드웨어로 알면 된다.
여기서 의문은 MMU가 page Directory 역할을 다 하면 될 텐데 page Directory 의 용량이 매우 커서 MMU 에 다 들어가지 못한다는 점이 있다.
따라서 MMU는 몇가지 Register 만을 가지고 있다.
Hardware Support for Dynamic Relocation
Two operating modes
1. Privileged (protected, kernel) mode : OS runs
- When enter OS (trap, system calls, interrupts, exceptions)
- Allows certain instructions to be executed
=> can manipulate contents of MMU
- Allows OS to access all of physical memory
2. User mode : User processe run
- perform translation of logical address to physical address
Minimal MMU contains base register for translation
=> base : start location for address space
Implementation of Dynamic Relocation : Base Register
Translation on every memory access of user process
=> MMU adds base register to logical address to form physical address
1 bit mode => kernel 인지 user 인지를 변경 가능하도록 해주는 bit를 의미한다.
MMU 구현방법은 base register 가 최소 하나 있어야 한다는 점이다.
Contiguous allocation 으로 이어진 공간에 프로그램이 연결된다.
그리고 그 전에는 contiguous 하게 적재된다고 한다.
만약에 process A, B 의 시작주소만 안다면 contiguous 하게 mapping 되어 있으므로 만약 logical address 라면 base register 값을 더하기만 한다면 찾아갈 수 있다.
그리고 logical address가 아닌 physical address라면 바로 return 해준다.
ex ) 0 ~ 4 GB 가 있다고 한다면 process A(virtual address) 위에 kernel, user 영역이 존재할 것이다.
CPU 에서 instruction 을 처리할려고 할 때 eip 를 MMU 에 보내서 physical address 를 반환하려고 할 때 실제 이러한 작업들이 kernel 영역에서 실행이 된다.
만약 addressing 할 때 user mode라면? => kernel mode 이면 그냥 return 하고 user mode 라면 process A의 address 에 base register 값을 더하여 physical address 를 return 하게 된다.
process 간에 A 에서 B로 변경하거나 그럴때는 mode bit 를 통해 바꿔줄 수 있다.
logical address 에서 process A, B 가 contiguous 하게 할당하게 된다면 실제 base 만큼 얼마만큼 떨어지는지는 명확해지고 이렇게 구현을 하게된다면 protection 을 방지하기에는 약간의 무리가 있다고 본다.
그러나 이전과 달리 virtual address에서 physical address 로 변경하는 것은 가능하게 되었다.
Dynamic Relocation with Base Register
Idea : translate virtual address to physical by adding a fixed offset each time.
Store offset in base register
Each process has different value in base register
MMU 를 고칠 수 있는건 privilieged mode 일때만 가능하다는 것 알아두기 (Quiz 로 나올수도?)
위 그림을 보다싶이 process 1의 base register는 1024 이고 process 2 의 base register는 4096 이다.
P1 : load 100, R1 을 할 때, base register 를 더해 physical address인 1124에 load 할 수 있도록 한다.
P2 : load 1000, R1 을 할 때, base register 를 더해 physical address인 5096에 load 할 수 있도록 한다.
What entity should do translation of address with base register?
=> Hardware(MMU) 가 해주겠군
What entity should modify the base register?
=> OS가 고쳐주겠군 (Context switch 같은게 일어날 때?)
노란색으로 칠한 부분을 보자.
3072 + 1024 = 4096 즉, process 2의 address를 가르키는 이상한 현상이 일어난다.
CPU에 protection device가 없어서 그냥 접근해 버리는... 즉, Process 1이 Process 2를 hurt 하게 하는 경우가 생겨버린다.
Dynamic with Base + Bounds
Idea : limit the address space with a bounds register
Base register : smallest physical addr (or starting location : 0, 1024, 2048, ...)
Bounds register : size of this process's virtual address space
=> somtimes defined as largest physical address (base + size)
OS kills process if process loads/stores beyond bounds
위에서의 예제를 다시한번 생각해보도록 하자
process A가 있을 때, logical address가 base register 아래에 있을 경우 base register를 더하다가 physical address가 되는 반면에 다른 process 의 address 에 침범할 수 있는 경우가 존재한다.
그리고 logical address가 base register보다 크다면 이 또한 항상 다른 process 의 address 에 침범할 수 있다.
그래서 이를 해결하기 위해 base register 에서 bounds register 를 더하여 체크를 하나 더 해주도록 한다.
bound register = base register + size 가 되며 bound 값을 넘어가면 base register 를 더하지 않고 바로 에러를 return 하도록 해준다.
이러한 Mechanism 으로 OS 가 bound value를 넘는 값을 발견하게 되는 경우 process를 kill 을 한다.
즉 segmentation fault 로 OS 가 처리해주는 것임을 알 수 있겠다.
다시 돌아와서 P1 에 3072 는 2048 (P1 bounds) 값을 넘었기 때문에 process Kill 을 일으킨다.
Managing Processes with Base and Bounds
Context-switch
- Add base and bounds registers to PCB
- Step
(1) Change to privileged mode (Kernel mode)
(2) Save base and bounds registers of old prcoess
(3) Load base and bounds registers of new process
(4) Change to user mode and jump to new process
Protection requirement
- User process cannot change base and bounds registers
- User process cannot change to privileged mode
Advantages
- Provides protection (both read and write) across address spaces
- Supports dynamic relocation
=> Can place process at different locations initially and also move address spaces
- Simple, inexpensive implementation (Few registers, little logic in MMU)
- Fast (Add and compare in parallel)
Disadvantages
- Each process must be allocated contiguously in physical memory
=> Must allocate memory that may not be used by process
- No partial sharing : Cannot share limited parts of address space
정리하자면 protection 을 제공하고 dynamic relocation 이 가능하다.
dynamic 하게 process의 위치를 배치할 수 있다.지금까지의 가정은 process가 memory에 올라가면 physical address에 contiguous 하게 배치된다는 것이다.위 과정을 통해 protection 이 가능하지만 contiguous 한 배치가 계속해서 이뤄지는 경우 fragmentation 이 일어난다.
즉, memory space 효율성이 떨어진다.
오늘 질문타임때 올라왔던 내용이다.
왜 contiguous 하게 process를 배치하는지? 에 대한 질문이다.
process A, B, ... 가 contiguous 하게 memory 에 올라갔다고 가정한다.
시간이 지나서 process 가 free 된다고 할 때, 다시 process를 실행한다고 할 때 contiguous 한 공간이 없는 경우가 존재한다.
즉, 중간 중간에 free된 부분을 fragmentation 이라 할 수 있겠고 이로 인해 프로그램을 실행할 수 없는 경우가 발생한다.
그래서 non-contiguous 하다면 memory 효율성이 좋아지겠지만 fragmentation 을 tracking 하는 directory 즉, page Directory 가 있어야 해결이 가능하다.
'학교에서 들은거 정리 > 운영체제' 카테고리의 다른 글
Paging (0) | 2021.10.08 |
---|---|
Memory API, Segmentation (0) | 2021.10.07 |
Memory Virtualization (0) | 2021.09.30 |
Multiprocessor Scheduling (Advanced) (0) | 2021.09.24 |
The Multi-Level Feedback Queue (0) | 2021.09.17 |