'memory'에 해당되는 글 4건

  1. 2012.11.15 Copy On Write
  2. 2012.08.26 Stack frame
  3. 2012.08.16 Little endian
  4. 2012.08.16 Stack에 변수가 저장되는 방식
OS/Concept2012. 11. 15. 21:34

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
Posted by slimV
OS/Concept2012. 8. 26. 15:50

Stack frame



Stack에서 주로 사용되는 세 개의 레지스터로는 EBP, ESP, EIP가 있습니다.

EBP는 Stack frame의 시작점을 가리키고

ESP는 Stack의 TOP을 가리키고

EIP는 다음에 실행할 명령의 offset을 가지고 있습니다.


다음 그림은 시스템에서 프로그램이 실행되고 함수가 호출될 때 stack의 변화를 나타낸 그림입니다.

main()이 실행되는 중에 func1()을 호출하면 func1()에게 stack을 할당합니다.

이때 func1의 실행이 끝나면 다시 main()으로 돌아와야 합니다.

그러기 위해 Return address를 stack에 넣어둡니다.

같은 방식으로 func1()에서 func2()를 호출합니다.


위와 같은 상황에서 Stack frame은 호출된 함수가 실행되는 동안

호출한 함수의 지역변수나 실행에 필요한 정보가 손실되지 않도록 stack에 저장하는 구조를 의미합니다.


Stack frame에 저장하는 정보는 다음과 같습니다.

- 함수의 실행이 종료된 후에 return 할 주소

- 지역 변수

- 자신을 호출한 함수의 Stack frame 위치

- Register와 같은 기계 상태

- 예외 처리 리스트 등


'OS > Concept' 카테고리의 다른 글

Copy On Write  (0) 2012.11.15
CPU register  (0) 2012.08.18
Little endian  (0) 2012.08.16
Stack에 변수가 저장되는 방식  (0) 2012.08.16
Posted by slimV
OS/Concept2012. 8. 16. 20:47

Little endian



Intel x86 계열은 Little endian 방식을 사용합니다.


먼저 1-byte는 8-bit입니다.

(0xFF = 11111111 )


16진수는 한자리가 16(F)까지 표현할 수 있습니다.

(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F)


16은 2의 4제곱이므로 bit로 표현하려면 4-bit가 필요합니다.

위의 hexadecimal을 두자리씩 끊으면 각각 1-byte가 됩니다.

(0x12, 0x34, 0x56, 0x78)


이제 Little endian에 대해 설명하겠습니다.

Little endian은 하위 byte의 값이 메모리상에서 먼저 들어가는 방식입니다.

위의 변수 a가 메모리상에 저장이 된다면 아래와 같이 저장이 됩니다.

a = 0x12345678

 0x78

 0x56 

 0x34 

 0x12


'OS > Concept' 카테고리의 다른 글

Copy On Write  (0) 2012.11.15
Stack frame  (0) 2012.08.26
CPU register  (0) 2012.08.18
Stack에 변수가 저장되는 방식  (0) 2012.08.16
Posted by slimV
OS/Concept2012. 8. 16. 15:35

Stack에 변수가 저장되는 방식



위의 코드상에서 보여지는 변수 입력 순서는 1, 2, 3, 4, 5입니다.


하지만 gdb로 stack을 보면 1, 2, 5, 4, 3 순으로 들어간 것을 확인할 수 있습니다.


컴퓨터가 stack에 변수를 집어넣는 방식을 나열하자면

1. 'int a = 1'을 통해 stack에 4-byte를 확보하고 1을 입력

2. 'int b = 2'를 통해 stack에 4-byte를 확보하고 2를 입력

3. 'int c[] = {3, 4, 5}'를 통해 12-byte를 확보하고 낮은 주소에서부터 차례로 3, 4, 5를 입력 


Low addr

 3

   ┐

 4

  c[]

 5

   ┘
 2

  b

 1

  a

High addr


'OS > Concept' 카테고리의 다른 글

Copy On Write  (0) 2012.11.15
Stack frame  (0) 2012.08.26
CPU register  (0) 2012.08.18
Little endian  (0) 2012.08.16
Posted by slimV