struct page{
page_flages_t flags;
atomic_t _count;
atomic_t private;
unsigned long private;
struct address_space *mapping;
pgoff_t index;
struct list_head lru;
void *virtual;
atomic_t _count;
atomic_t private;
unsigned long private;
struct address_space *mapping;
pgoff_t index;
struct list_head lru;
void *virtual;
}
flags 필드는 페이지의 상태를 저장한다. 여기에 저장되는 플래그에는 페이지가 변경되었는지(dirty), 혹은 메모리가 잠겨졌는가(lock) 등을 나타내는 여러가지가 있다. 이러한 플래그는 비트 플래그의 형태로 최소 32가지의 서로 다른 플래그가 동시에 표현될 수 있다. 이 플래그 값들은 <linux/page-flags.h>에 정의돼있다.
http://lxr.linux.no/linux+v2.6.39.4/include/linux/page-flags.h
_count 필드는 페이지의 사용횟수, 즉 해당 페이지에 대한 참조가 얼마나 되는지를 저장한다. 이 횟수가 0이면 누구도 이 페이지를 사용하지 않는것이며, 따라서 이 페이지를 다른 누군가에게 할당해 줄 수 없게된다. 커널 코드에서는 이 필드를 직접 접근하는 대신 page_count() 함수에 page 구조체를 넘겨주어 그 값을 얻으면 된다. 페이지가 사용되고 있지 않을 떄, 내부적으로 _count 필드는 음의 값을 갖지만, page_count()는 0을 리턴한다.
물론 페이지가 사용중이라면 양의 정수값을 리턴한다. 페이지는 페이지 캐시에 의해 사용되거나(이 경우 mapping 필드는 이 페이지와 연관된 address_space 객체를 가리킨다.), 고유 데이터(private 필드가 가리키는)로, 혹은 프로세스의 페이지 테이블 안에 위치하는 매핑으로 사용된다.
virtual 필드는 페이지의 가상주소이다. 일반적으로 이 값은 단지 가상 메모리에서의 페이지의 주소를 나타냄.
한편 상위 메모리(high memory)라 불리는 메모리는, 커널의 주소 공간으로 영구적으로 매핑되지 않는데, 이러한 메모리를 나타낼 경우 이플드에 NULL를 사용한다. 그리고 이 경우 페이지는 필요할 때마다 동적으로 매핑돼야 한다.
여기서의 핵심은, page구조체가 가상 페이지가 아닌 물리적인 페이지와 연계되어 있다는 사실이다. 즉, 스와핑 등의 동작이 계속일어나므로, 어떤 페이지를 기술하는 page 구조체는 계속 바뀔 수 있다는 것이다. 즉, 이 자료구조를 사용하는 목적은 물리적 메모리의 상태를 기술하는 것이지, 그 안에 포함되어 있는 데이터를 나타내려는 것이 아니다!!
커널은 이 자료구조를 사용하여 시스템 상의 모든 페이지를 관리하며, 따라서 이 자료구조를 통해 어떤 페이지가 사용 가능한지를 알 수 있게 된다. 만약 페이지가 가용하지 않는 경우 커널은 누가 그 페이지를 소유하고 있는가를 알 수 있어야 한다. 페이지를 소유할 가능성이 있는 주체로는 유저공간 프로세스, 동적으로 할당되는 커널 데이터, 정적 커널 코드, 페이지 캐쉬등이 있다.
flags 필드는 페이지의 상태를 저장한다. 여기에 저장되는 플래그에는 페이지가 변경되었는지(dirty), 혹은 메모리가 잠겨졌는가(lock) 등을 나타내는 여러가지가 있다. 이러한 플래그는 비트 플래그의 형태로 최소 32가지의 서로 다른 플래그가 동시에 표현될 수 있다. 이 플래그 값들은 <linux/page-flags.h>에 정의돼있다.
http://lxr.linux.no/linux+v2.6.39.4/include/linux/page-flags.h
_count 필드는 페이지의 사용횟수, 즉 해당 페이지에 대한 참조가 얼마나 되는지를 저장한다. 이 횟수가 0이면 누구도 이 페이지를 사용하지 않는것이며, 따라서 이 페이지를 다른 누군가에게 할당해 줄 수 없게된다. 커널 코드에서는 이 필드를 직접 접근하는 대신 page_count() 함수에 page 구조체를 넘겨주어 그 값을 얻으면 된다. 페이지가 사용되고 있지 않을 떄, 내부적으로 _count 필드는 음의 값을 갖지만, page_count()는 0을 리턴한다.
물론 페이지가 사용중이라면 양의 정수값을 리턴한다. 페이지는 페이지 캐시에 의해 사용되거나(이 경우 mapping 필드는 이 페이지와 연관된 address_space 객체를 가리킨다.), 고유 데이터(private 필드가 가리키는)로, 혹은 프로세스의 페이지 테이블 안에 위치하는 매핑으로 사용된다.
virtual 필드는 페이지의 가상주소이다. 일반적으로 이 값은 단지 가상 메모리에서의 페이지의 주소를 나타냄.
한편 상위 메모리(high memory)라 불리는 메모리는, 커널의 주소 공간으로 영구적으로 매핑되지 않는데, 이러한 메모리를 나타낼 경우 이플드에 NULL를 사용한다. 그리고 이 경우 페이지는 필요할 때마다 동적으로 매핑돼야 한다.
여기서의 핵심은, page구조체가 가상 페이지가 아닌 물리적인 페이지와 연계되어 있다는 사실이다. 즉, 스와핑 등의 동작이 계속일어나므로, 어떤 페이지를 기술하는 page 구조체는 계속 바뀔 수 있다는 것이다. 즉, 이 자료구조를 사용하는 목적은 물리적 메모리의 상태를 기술하는 것이지, 그 안에 포함되어 있는 데이터를 나타내려는 것이 아니다!!
커널은 이 자료구조를 사용하여 시스템 상의 모든 페이지를 관리하며, 따라서 이 자료구조를 통해 어떤 페이지가 사용 가능한지를 알 수 있게 된다. 만약 페이지가 가용하지 않는 경우 커널은 누가 그 페이지를 소유하고 있는가를 알 수 있어야 한다. 페이지를 소유할 가능성이 있는 주체로는 유저공간 프로세스, 동적으로 할당되는 커널 데이터, 정적 커널 코드, 페이지 캐쉬등이 있다.