토요일, 7월 13, 2013

Virtual address spaces

Processor가 메모리 영역을 읽거나 쓸때, 가상주소(virtual Address)를 이용한다.
Read/Write operation의 한부분으로 Process는 가상주소(virtual Address)를 물리주소(physical address)로 변환한다.
가상의 주소를 통한 메모리 접근은 다음과 같은 장점이 있다.
 - 프로그램은 큰 메모리 버퍼를 접근할때 비연속적인 물리메모리를 가 아닌 연속적인 가상 주소를 사용 할 수 있다.
 - 프로그램은 물리 메모리가 제공하는 크기보다 더 큰 메모리버퍼에 접근 할 수 있다.
   물리 메모라가 적게 제공될때, 메모리 메니저는 물리메모리의 Page들을(보통 4KB크기다.) disk file에 저장한다. 데이터 혹은 Code의 Page들은 필요에 따라 물리 메모리와 Disk에 옮겨진다.
 - 가상 주소는 다른 프로세서와 각각 따로이 사용된다. 하나의 Process에서 code는 다른 process가 사용하는 물리 메모리를 변경 할 수 없다.

 Process에서 사용 할수 있는 가상주소의 범위를 Process의 Virtual address space라 부른다.
 각각의 user-mode process는 개벌적인 virtual address space를 갖는다. 32bit process에서 virtual address space는 0x00000000~ 0x7FFFFFFF의 2GB이다. 64bit process에의 virtual address space는 0x00000000000 ~ 0x7FFFFFFFFFF 의 8TB 이다.
 가상주소의 범위는 가끔 가상 메모리의 범위라 부른다.

  아래의 그림은 Virtual address spaces의 핵심모양을 보여준다.



  위의 그림은 Notepad.exe와 MyApp.exe 2개의 64bit process를 위한 virtual address spaces를 보여준다.
  각 Process는 각각 0x00000000000 ~ 0x7FFFFFFFFFF의 virtual address space를 갖는다. 색칠된 block은 0x7F79..93950000에서 시작하는 가상 메모리 혹은 물리 메모리상의 Page(4KB)를 표시한다.
  메모장 process는 0X7f793950000에서 시작되는 가상주소의 연속된 3개의 page들을 사용함을 알수 있다.
  하지만, 이 3개의 연속작인 가상주소 page는 물리 메모리상 연속되지 않은 페이지들이 연결되어 있다. 또한 두 Process들은 똑같이 0X7f793950000에서 시작하는 가상메모리 page를 사용함을 알수 있다. 하지만 이 가상 page들은 서로 다른 물리 메모리의 page에 메핑되어 있다.

  사용자 공간과 시스템 공간(User space and system space)

  Notepad.exe와 MyApp.exe와 같은 Process들은 user mode에서 동작을 한다.(실행된다) 핵심OS 요소들과 많은 driver들은 더 특권적인 kernel mode에서 동작을 한다.
  32bit Windows에서 사용가능한 virtual address space 는 2^32 Bytes(4GB)이다. 보통 위쪽 2GB는 user space로 사용 되고 하래쪽 2GB는 System space로 사용된다.



  32Bit Windows에서 여러분은 부팅때 2GB이상의 user space를 사용 할지 지정 할수 있다.
 선택의 결과는 System space로 사용 가능한 공간 가상 주소가 줄어든다. 여러분은 user space의 크기를 3GB 까지 늘릴 수 있고 이 경우 단지 1GB의 System area으로 사용 가능하다.
 user space의 크기를 증가 시키려면 "BCDEdit/set increaseuseva"를 사용하라.

  64bit Windows에서 이론적으로 virtual address space의 양은 2^64(16ExaBytes)이지만 16 ExaBytes중에 적은 부분만이 실제 사용가능 하다.
  8TB(0X00000000000 ~ 0x7FFFFFFFFFF)가 User space로 사용 가능 하고 248TB(0XFFFF080000000000 ~ 0xFFFFFFFFFFFFFFFF)가 System space로 사용 가능하다.



  User mode에서 동작(실행)되는 Code는 System space에는 접근 할 수 없고 단지 user space에만 접근가능하다.
  이러한 제약은 user-mode code가 보호된(Protected) OS 자료구조를 읽거나 변경 하는 것을 방지 한다.
  Kernel mode에서 동작(실행)되는 Code는 System space와 User space 모두 접근이 가능하다.
  이는 kernel mode에서 동작 하는 code가 system space와 현재의 user-mode process의 virtual address space에 접근이 가능 함을 말한다.

  Kernel mode에서 동작하는 Driver는 user space의 주소에 직접 쓰거나(Write) 주소로부터 직접 읽을때 메우 조심해야 한다. 아래의 시나리오는 그 이유를 설명한다.
  1. user-mode program이 장치(device)로부터 어떤 데이터를 읽는 요청을 시작한다. 그 프로그램은 데이터를 받을 버퍼의 주소를 제공한다.
  2. kernel mode에서 실행중인 Device driver routine이 Read 명령을 시작하고 호출자에게 제어권을 반환 한다.
  3. 나중에, Read 명령이 완료됨을 알리기해 현제 실행중인 Thread가 머든 장치는 Interrupts를 발생시킨다. 그 Interrupt는 임의의 Process에 속한 임의의 Thread에서 실행중인 kernel-mode driver routine에 의해 처리된다.
  4. 이때, Driver는 1단계에서 user-mode 프로그램이 제공한 주소로 시작하는 곳에 데이터를 쓰기(write)를 하면 안된다. 이 주소는 현재 실행중인 Process는 다른 요청을 시작한 Process의 virtual address space에 속한 주소이다.

  Paged pool And Nonpaged pool

  user space에서 모든 물리 메모리 page들은 필요에 따라 disk file로 paged될 수 있지만 System space에 있는 어떤 물리적 Page는 그렇지 못하다.
  System space는 동적으로 할당되는 메모리를 위한 2영역(Paged pool, Nonpaged pool)이 있다. 64bit Windows에서 paged pool은 virtual address로 0xFFFFA80000000000~0xFFFFA81FFFFFFFFF의 128GB이다. Nonepaged pool은 virtual address로 0xFFFFAC0000000000 ~ 0xFFFFAC1FFFFFFFFF의 128GB이다.
  Paged pool에 할당된 메모리는 필요에 따라 Disk file을 Page될수 있지만, Nonpaged pool에 할당된 메모리는 disk file올 page될 수 없다.





댓글 없음: