Copy On Write
OS는 각 process 별로 가상 주소 공간을 할당합니다.
Task switching을 할 때 OS는 memory의 코드들을 바꿉니다.
Process들은 dll과 같이 서로 같은 코드가 올라가있는 영역이 있습니다.
중복된 코드들을 복사하는 것은 CPU의 자원을 낭비하도록 만듭니다.
그래서 kernel32.dll과 같이 대부분의 process가 공통적으로 사용하는 코드가 들어있는 영역은
Task switching 할 때 복사하지 않고 그대로 남겨둡니다.
그렇다면 kernel32.dll의 코드를 patch하면 다른 process에게도 영향을 미칠 수 있으리라 예상됩니다.
kernel32.dll에 patch를 해보겠습니다.
kernel32.dll 영역에 아무 공간이나 잡고 patch합니다.
patch한 곳의 주소값을 기억하셔야 합니다.
위에서 설명한 논리대로 작동한다면
이제 다른 process에서 해당 주소를 찾아가면 patch된 코드가 있어야 합니다.
다른 process에서 해당 주소를 찾아가 봅니다.
0x90으로 차 있습니다.
분명 kernel32.dll은 수많은 process에서 사용하고
Task switching 할 때 swapping을 하지 않는 공간입니다.
그런데도 다른 process에서의 patch가 적용되지 않았습니다.
이는 Copy On Write라는 기술 때문에 그렇습니다.
Copy on write는 swapping을 하지 않는 공간에 write event가 발생한 경우
Write event가 건드린 영역만 따로 swapping 하는 기술입니다.
Process A에서 특정 library 영역에 write event가 발생합니다.
OS에서는 write event가 발생한 영역만 따로 page로 복사해둡니다.
그리고 process A가 실행 될 때만 저장해둔 page를 swap-in 합니다.
Process A가 아닌 다른 process가 실행 될 때는 해당 page를 swap-out 합니다.
'OS > Concept' 카테고리의 다른 글
Stack frame (0) | 2012.08.26 |
---|---|
CPU register (0) | 2012.08.18 |
Little endian (0) | 2012.08.16 |
Stack에 변수가 저장되는 방식 (0) | 2012.08.16 |