본문 바로가기
한국으로/임베디드 리눅스

5.3 메모리 관리

by 영킴. 2018. 6. 29.

5.3 메모리 관리

5.3.1 커널의 메모리 관리 방법





유저 공간 안에 스택(32MB)은 실제 물리메모리의 적은 부분(8MB)만 연결돼있음.

물리 메모리의 8MB 이상을 사용하면, page fault를 발생시켜 4KB씩 물리메모리 할당을 늘리는 구조임.


이처럼 리눅스는 물리 메모리를 '페이지' 단위로 나누어서 관리한다.

한 페이지는 4KB.

물리메모리의 페이지를 가리키는 페이지 프레임 배열(물리 메모리)의 주소를 담고있는 '페이지 테이블'은 MMU에서 관리한다.



페이지 테이블

페이지 테이블은 가상 주소를 물리 주소로 변환해주는  테이블이다.
CPU가 가상 메모리로 액세스하면 페이지 테이블에 지정된 물리 메모리 값이 액세스되는 것!
페이지 테이블 역시 물리 메모리이다.
만약, 물리 메모리가 배정되지 않은 가상 메모리를 액세스하면 page fault가 발생하고, 소프트웨어 인터럽트가 발생한다.
이 경우, 소프트웨어 인터럽트는 프로세스를 커널 모드로 전환시키고, 추가로 물리 메모리를 배정한다.




5.3.2 커널 공간

lowmem

커널 데이터(.text, .data, .init, 동적할당영역)를 담고있다.

vmalloc

low memory와 high memory, 주변장치를 동적할당할 수 있다.

pkmap

high memory 동적할당 전용.

fixmap

특수 목적으로 사용되는 가상 주소



void* kmalloc(size_t size, gfp_t flags);

size 이상의 '연속적인' 물리 메모리를 할당하고, 가상 주소를 리턴한다.
GFP 플래그는 메모리 할당 시, 영역, 동작, 유형을 지정할 수 있다. 예를 들어, 인터럽트 핸들러처럼 sleep이 불가능하도록 만들고 싶다면 GFP_ATOMIC 플래그를 넣어주자.
실패 시 NULL 리턴.

void kfree(const void* ptr);

사용한 뒤에 메모리 반납은 필수!


void* vmalloc(unsigned long size);

size 이상의 '연속적이지 않은' 물리 메모리를 할당하고, 가상 주소를 리턴한다.
실패 시 NULL 리턴.

void vfree(const void* addr);

메모리를 반납.


kmalloc() vs. vmalloc()

kmalloc() 과 vmalloc() 의 차이는 할당하는 물리 메모리의 연속성도 있지만, 일반적인 경우 kmalloc() 을 사용한다. (최대 4MB)
vmalloc() 은 연속적이지 않은 물리 메모리를 할당하기 때문에 큰 메모리를 할당할 때 유리하다. (4MB 이상)




'한국으로 > 임베디드 리눅스' 카테고리의 다른 글

7.3 문자 드라이버  (0) 2018.07.01
7.2 모듈  (0) 2018.07.01
7.1 디바이스 드라이버  (0) 2018.07.01
5.4 파일시스템  (0) 2018.07.01
5.2 시스템 콜  (0) 2018.06.28
5.1 프로세스 관리  (0) 2018.06.28
4.2 스레드 동기화  (0) 2018.06.28
4.1 스레드란?  (0) 2018.06.27