1 / 89

메모리 관리

메모리 관리. 주소변환. 가상 주소 공간.   0 번지부터 시작되는 단일 선형 주소 공간   과거 유닉스에서 도입하고 있었던 모델과 같은 모델   가상 주소 공간의 크기는 CPU 아키텍쳐에 따라 달라짐 .   32 비트 아키텍쳐에서는 4GB(Because 2^32) 물리적으로 메모리에 바로 대응하는 것이 아니라 ,  가상 주소 공간이 필요한 이유는 물리 메모리가 제한적이기 때문이다 . 페이지 (page). 메모리를 일정한 공간으로 나눈 것   페이지 또는 프레임이라고 함 .

ping
Download Presentation

메모리 관리

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 메모리 관리 주소변환

  2. 가상 주소 공간   0번지부터 시작되는 단일 선형 주소 공간   과거 유닉스에서 도입하고 있었던 모델과 같은 모델   가상 주소 공간의 크기는 CPU 아키텍쳐에 따라 달라짐.   32비트 아키텍쳐에서는 4GB(Because 2^32) 물리적으로 메모리에 바로 대응하는 것이 아니라,  가상 주소 공간이 필요한 이유는 물리 메모리가 제한적이기 때문이다.

  3. 페이지(page) 메모리를 일정한 공간으로 나눈 것   페이지 또는 프레임이라고 함. 가상 페이지 - 가상 주소 공간을 나눈 것   물리 페이지 - 물리 메모리 공간을 나눈 것   페이지의 크기는 CPU 아키텍쳐에 따라 다름   일반적으로 IA-32에서 4KB   1GB 기준으로 = 262,144 개의 독립된 페이지 존재 4GB 기준으로 = 1,048,576 개의 독립된 페이지 존재 struct page {     page_flags_t flags;

  4. 플래그 페이지는 4KB이기 때문에 페이지 선두 주소의 하위 12비트는 0이 된다.  그래서 각 테이블의 하위 12비트를 다양한 플래그로 사용하고 있다. 4 byte = 32 bits 20  + 12 bits 2^12 = 4096 1 KB = 1024 byte 4096 byte

  5. 페이지 변환 테이블 가상 주소 공간(페이지)을 물리 주소 공간(페이지)에 대응하기 위한 테이블   이 테이블로 가상 주소 공간을 실제 물리 메모리 공간으로 대응시킨다. 페이지 변환 테이블은 가상공간마다 한개씩 존재하며, 따라서   프로세스 마다 존재한다.  컨텍스트 스위칭 할때마다 커널에서 바꾸는 자원이다. 가상 주소에서 물리 주소로의 변환은 하드웨어가 페이지 변환 테이블에 따라 자동적으로 수행하는데,  페이지 변환 테이블의 설정은 커널의 역할이다. 여기서 말하는 하드웨어는.. MMU(Memoery Management Unit) 가 아닐까 싶다.. typedef struct page *pgtable_t; // 페이지 테이블의 크기

  6. 리눅스의 페이지 변환 테이블 아키텍처에 관계없이 주소 변환을 구현, 메모리 관리하는 인터페이스의 필요성에 의해서 만들어지는 4단계 모델 구조

  7. 테이블 엔트리/관련 함수, 매크로 pgd_t, pud_t, pmd_t, pte_t pgd_alloc pgd_free pgd_offset pgd_none pgd_bad pgd_clear

  8. 페이지 테이블 엔트리 및 함수/매크로 페이지에 대한 접근 권한 : 읽기, 쓰기, 실행   페이지가 접근된 것을 나타내는 정보   페이지가 수정된 것을 나타내는 정보 pte_dirty - 페이지가 수정되었는지 pte_young - 페이지가 접근되었는지 pte_mkclean - 페이지가 수정되었다고 하는 정보를 정리 pte_mkold -  페이지가 접근되었다고 하는 정보를 정리

  9. IA-32의 주소 변환 처리 세그먼트(segment)라고 하는 주소 변환처리가 존재 프로세스의 주소 공간을 논리 주소로 표현.  논리주소를 선형 주소로 바꾼 뒤, 페이징 처리에 의해 물리 주소로 변환   리눅스에서는 선형 주소 공간과, 가상 주소 공간을 동일한 것으로 처리하여,  선형 주소 공간 전체와 동일한 세그먼트를 정이하면 됨.   KERNEL_CS - 읽기, 실행 가능 KERNEL_DS - 읽기, 쓰기 가능 USER_CS - 읽기, 실행 가능 USER_DS - 읽기, 쓰기 가능   커널 모드와 사용자 모드가 변환될 때,  커널용 세그먼트와 사용자 세그먼트가 변환됨

  10. IA-32의 페이지 변환 테이블 CR3 레지스터

  11. IA-32의 페이지 변환 테이블(1) bits : 10, 10, 12 경우의 수 : 1024, 1024, 4096 각 테이블의 크기는 4KB로 정확히 1페이지를 차지

  12. IA-32의 페이지 변환 테이블(2) PAE(Physical Address Extend)

  13. TLB(Transfer Lookaside Buffer) 하드웨어는 가상 페이지와 페이지 프레임의 대응을 TLB라고 불리는캐쉬로 관리.  Why? 가상 주소를 접근할 때마다 페이지 테이블에 접근하게 되는데, 이는 직접 물리 주소에 접근하는 것과 비교해 보면 성능상의 차이가 크기 때문에 하드웨어는 예외 없이 캐쉬를 가짐.   TLB의 엔트리 추가는 하드웨어가 하고, 삭제는 커널이 한다. 찾아보니 엔트리 삭제 함수들뿐이다.... 하드웨어는 어떤식으로 추가를하는것인가? flush_tlb_all flush_tlb_mm flush_tlb_range flush_tlb_page

  14. 메모리 캐쉬 아키텍처에 따라서 페이지 테이블을 변경했을 경우 메모리 캐쉬를 무효화할 필요가 있다고 함. 따라서 메모리 캐쉬를 무효화 하는 인터페이스 존재 IA-32에서, 메모리 캐쉬는 물리 주소를 키로 하고 있기 때문에 아무것도 할 필요가 없음.

  15. 커널 공간의 레이아웃

  16. 커널 공간의 레이아웃 커널 자신도 가상 주소 공간상에서 동작   아키텍쳐마다 자유롭게 설정할 수 있기 때문에 하나의 OS이더라도 아키텍쳐마다 구현 방법이 다르다. 리눅스의 메모리 관리는 원래 IA-32의 커널 공간 레이아웃을 바탕으로 설계 되어 있어서, IA-32 구현방법을 사용

  17. 세 개의 영역 *2가지의 하드웨어적 한계   어떤 하드웨어 장치는 특정 메모리 주소에 대해서만 DMA(Direct memory access)를 수행 가능   어떤 아키텍처는 가상 주소보다 더 많은 물리적 주소를 사용할 수 있다.  그 결과 어떤 메모리는 커널 주소 공간에 영구 매핑되지 않게 된다. *Solve* 이런 제한 때문에 리눅스에서는 세 개의 영역을 둔다. ZONE_DMA : 이 영역은 DMA가 가능한 페이지를 포함한다. ZONE_NORMAL : 이 영역은 일반적이고 정규적으로 매핑되는 페이지를 포함한다. ZONE_HIGHMEM : 이 영역은 "상위 메모리"를 포함한다.  상위 메모리는 커널 주소 공간으로 영구적으로 매핑되지 않는다.

  18. 커널 공간 레이아웃 PAGE_OFFSET : 0xc0000000 = 3221225472...3GB 직접 엑세스 한계 : 0xf8000000 = 4160749568...3GB + 896MB HIGHMEM 접근 영역 : 0xff800000 = 4286578688... 고정맵 영역 : 0xfffff000 - 0xffffe000 = 4096byte 직접 엑세스 한계 ~ HIGHMEM 접근 영역 = 약 120MB 0xfffff000 = 4GB - 4096Byte 0xffffffff = 4294967295 0xffffffff - HIGHMEM(0xff800000) = 8388607Byte... 약 7.9MB

  19. 프로세스 공간 프로세스 - 3GB 커널 공간 - 1GB 프로세스 공간과 커널 공간은 동일한 주소 공간에 존재   프로세스를 변환할 때, 페이지 글로벌 디렉토리를 변환하여 TLB도 정리(flush)(단, 이 경우 커널의 주소 범위는 TLB의 항목이 정리되지 않도록 설정되어 있다.)

  20. 직접 엑세스 영역(NORMAL) 커널은 모든 물리 메모리에 접근할 필요가 있다. 가상 주소 = 물리 주소 + PAGE_OFFSET (즉, 물리 주소 = 가상주소 - PAGE_OFFSET) 다만 커널 공간이 1GB밖에 안 되는 관계로, 직접 매핑할 수 있는 영역은 896MB까지이다. 나머지 128MB는 커널 전용이다.  i386 구조의 한계 때문에 커널이 직접 접근할 수 있는 영역은 0 ~ 896M까지이고,  897 ~ 1024M, 즉 128M 영역은 1G 이상의 영역과 데이터를 교환하는 방식으로 접근한다. 직접 엑세스 영역의 끝은 high_memory로 표시

  21. 고정 맵 영역 어느 고정의 가상의 주소로 임의의 물리 주소를 접근할 수 있으면 편리한 경우가 있음 0xffffe000 ~ 0xffff0000-1 : 1page분(4096byte) ( 책에서는 vsyscall용이라고 쓰여져 있음) 가상 페이지에 대응하는 페이지 테이블이 할당이 되어 있다.! 각각의 처리에 대해서 전용의 페이지 테이블 항목이 할당되어 있어서 인터럽트 처리의 연장으로도 안전하게 쓰인다.

  22. HIGHMEM 영역 물리 메모리가 896MB를 넘을 경우, 스트레이트로 매핑을 할 수 없었던 물리 메모리에 접근하기 위한 영역이 상위 메모리(ZONE_HIGHMEM) 엑세스 영역이다. kmap - page (1) 직접 엑세스 영역 : 지정한 페이지의 가상 주소를 그대로 반환.                     (2) 상위 메모리(ZONE_HIGHMEM) : 상위 메모리 접근 영역이 비어 있는 페이지 테이블 항목에 매핑해서, 그 자상 주소를 반환.  비어 있는 영역이 없을 경우에는 빈 영역이 생길 때까지 대기  [ZONE_HIGHMEM] 접근용 인터페이스 void *kmap(struct page *page); void kunmap(struct page *page); // TLB를 지연 매커니즘.

  23. HIGHMEM 영역(2) 커널의 처리에 따라서는 확실히 상위 메모리(ZONE_HIGHMEM)에 접근할 필요가 있는 경우가 있다. 그래서 고정 맵 영역의 일부에 상위 메모리(ZONE_HIGHMEM) 접근용의 영역이 있다. * 고정맵중 상위 메모리 접근용 인터페이스 void *kmap_atomic(struct page *page, enum km_type type); void kunmap_atomic(void *kvaddr, enum km_type type); kmap_atomic 함수 : 지정된 페이지를 지정된 인덱스에 맵핑 kunmap_atomic 함수 : kmap_atomic 함수와 1:1로 호출해야 한다.  커널 2.6에서 신경쓰지 않으면 선점 카운트의 일관성이 없어지게 되므로 주의가 필요하다.

  24. 커널 가상 영역 커널이 자신의 작업에 사용하는 영역 VMALLOC_START, VMALLOC_END 매크로로 시작주소와 끝주소(+1)을 표시 물리 메모리가 896MB인 경우 약 120MB가 된다. vmalloc, vmalloc32, vfree, vmap, vunmap, ioremap, iounmap vmalloc - 물리주소(비연속) but 가상주소(연속) vmap - 지정한 크기의 가상 공간 할당, 그곳에 물리 페이지를 매핑. ioremap - 지정한 크기의 가장 공간을 할당, 지정한 물리 주소를 매핑

  25. 커널 가상 영역 관리 vm_struct 구조체 연결리스트로 관리 vmlist로부터 addr이 작은 순서로 링크 되어 있음 vmalloc/vmap/ioremap 함수로 영역 획득시,  vmlist의 선두부터 vm_struct 구조체를 뒤져서,  비어 있는 영역을 찾아가는 단순한 관리를 하고 있다.  또한 size는 지정된 크기보다 1페이지 정도 커진다.  마지막 1페이지는 물리 페이지를 할당하지 않고, 매핑도 되지 않는다. -> 프로그램의 오류로, 지정된 크기 이상의 영역에 접근하려고 할때 예외가 생길 수 있도록 하기 위한 것.

  26. vfree/vunmap 으로 TLB 전체가 정리되는 구현으로 되어 있기 때문에,  빈번하게 할당하거나 해제를 수행하는 일은 성능상 좋지 않다고 생각된다.

  27. 그 밖의 커널 레이아웃 1.프로세스 공간과 커널 공간을 별도로? 2. 64bit 아키텍처... 64bit 아키텍처에서는 가상 주소 공간이 광대하기 때문에, 물리 메모리를 모두 직접 엑세스 할 수 있다.

  28. Page 크기와 관련하여 페이지 크기가 Intel Architecture에서 4Kbyte인 이유? -> 페이지 크기는 메모리 블록 하나가 디스크로부터 얼마만큼의 데이터를 읽어들여서 저장할 것인지를 결정하는 요소이다. 이 크기에 따라 디스크의 접근 횟수가 결정되어지므로 페이징 기법의 효율성을 결정하는 데 매우 큰 요소 아키텍쳐에 따라 크기가 다르다. Motorola 68030 :256~32KBytes IBM 360/67 1024Kbyes의 크기 사용

  29. Page 테이블의 크기와 관련하여 만약 20bit(2^10 * 2^10)으로 참조 테이블의 프레임 개수를 결정한다면?

  30. Intel Architecture • 세그멘테이션 + 페이징

  31. 세그멘테이션 • 프로그램과 관련된 데이터들에 대하여 여러 개의 세그먼트들로 나누어 다루게 되며 이 세그먼트의 크기는 똑같을 필요가 없다.

  32. 세그멘테이션 • 16bit 시절…

  33. CR3 레지스터

  34. CR3 레지스터(2)

  35. 세그먼트 + 페이징 인텔 마이크로프로세서에서는 6개의 세그먼트용 레지스터를 가지고 있어서 한 프로세스에서 한순간에 6개의 세그먼트를 가리킬 수 있게 하였고 이 마이크로프로세서에서 메모리를 참조할 때에는 암시적이든 명시적이든 이 세그먼트 레지스터와 함께 사용되게 하였으며,  이렇게 지시되어진 세그먼트 레지스터는 세그먼트 디스크립터 테이블(Segment Descriptor Table)을 참조하여 그 세그먼트에 대한 시작 주소를 가져오고 이 시작 주소와 엑세스하고자 하는 메모리 주소가 합해져 실제 선형 주소(Linear Address)를 만들어주게 된다.  그리고 이때 주소가 한계치를 넘는지 또는 해당 세그먼트가 엑세스하고자 하는 세그먼트에 대한 접근권한이 있는지 등을 체크하게 된다.  만약 이와 같은 접근에 문제가 있다면 운영체제에게 트랩을 발생시킴으로써 엑세스를 제한하도록 하고 있다.   또한 위에서 정상적인 접으로 확인된 경우 위에서 만들어진 선형 주소를 다시 페이지 변환에 의하여 CR3라는 특별한 레지스터를 참조하여 페이지 디렉토리(Page Directory)의 시작 위치를 알아내고  선형 주소의 상위 10비트를 페이지 디렉토리의 인덱스로 사용하여 페이지 테이블의 위치를 알아낸 후 선형 주소의 다음 페이지 인덱스를 사용하여 실제적인 물리적 메모리의 시작 어드레스를 알아내게 되며 이후의 오프셋(Offset) 데이터를 사용하여 실제의 물리적 어드레스를 알아내게 된다.

  36. 실제적인 메모리 할당 4KB보다 큰 경우 : 버디 할당자(Buddy Allocater) - 이용 가능한 물리 메모리(빈 페이지) - 빈 페이지를 관리하는 것 4KB보다 작은 경우 : 슬랩 할당자(Slab Allocater) - 동적 할당(malloc), File구조체 등을 사용할 때

  37. Buddy System • Struct free_area free_area[MAX_ORDER]; • IA-32의 경우, MAX_ORDER == 11

  38. Free_area 구조체 • struct list_head free_list // 빈 페이지 연결리스트 • unsigned long nr_free // 이 오더의 빈 페이지 수

  39. 2.6.10 이전의 버디 관리

  40. Page 할당 • Ex) 4페이지 연속으로 할당 하고 싶다? • free_area[2]의 free_list를 본다.

  41. Page 해제 • Free_list에 추가하거나 재귀적으로 상위 오더로 합침

  42. But. 1Page 할당은? • 1페이지 단위(오더 0)의 할당과 해제는 버디시스템을 이용하지 않는다. • CPU의 캐쉬를 직접적으로 이용한다. • hot, cold라고 부른다. 확보되어 있는 페이지 수가 low 이하가 되면 버디 시스템으로부터 batch 페이지분을 가져온다. 확보한 페이지가 high 이상이 되면 버디 시스템에 batch 페이지분을 반환한다.

  43. per_cpu_pages

  44. Slab Allocator • 정적으로 확보하기 힘든 메모리의 동적 확보를 위한 것 • 캐쉬 헤더 • 슬랩 내의 오브젝트가 전부 사용 중인 슬랩 리스트 • 슬랩 내의 오브젝트가 사용중과 미사용의 것이 혼재된 슬랩 리스트 • 슬랩 내의 오브젝트가 전부 미사용인 슬랩 리스트

  45. slab 구조체의 free멤버가 리스트 선두의 빈 오브젝트를 가리킴.

  46. struct kmem_list3

  47. 제어용 헤더 • 제어용 헤더

More Related