[0]

Linux kernel의 page 구조체에 대해서 알아본다.

 

[1]

우선, page 구조체는 가상 메모리가 아니라 물리 메모리를 관리하기 위해 존재한다. page 구조체는 물리 메모리의 모든 page마다 하나씩 할당된다. 즉 물리 메모리가 4GB, page 크기가 4KB라면, 4GB/4KB = 1024 * 1024개의 page 구조체 인스턴스가 생성된다. 커널은 이 page 구조체 인스턴스를 통해, 어떤 물리 메모리 영역이 free인지, 혹은 어떤 용도로 할당되어있는지를 파악할 수 있다. 

 

[2]

page 구조체의 전체 코드는 여기에서 확인할 수 있다. 하지만 처음에는 우선 전체 멤버를 보기보다, 핵심을 추려낸 아래 코드를 보자.

struct page {
	unsigned long flags;		/* Atomic flags, some possibly
					 * updated asynchronously */
	
	//
	//... I skipped complicated Unions here
	//
    
	/* Usage count. *DO NOT USE DIRECTLY*. See page_ref.h */
	atomic_t _refcount;

	/*
	 * On machines where all RAM is mapped into kernel address space,
	 * we can simply calculate the virtual address. On machines with
	 * highmem some memory is mapped into kernel virtual memory
	 * dynamically, so we need a place to store that address.
	 * Note that this field could be 16 bits on x86 ... ;)
	 *
	 * Architectures with slow multiplication can define
	 * WANT_PAGE_VIRTUAL in asm/page.h
	 */
#if defined(WANT_PAGE_VIRTUAL)
	void *virtual;			/* Kernel virtual address (NULL if
					   not kmapped, ie. highmem) */
#endif /* WANT_PAGE_VIRTUAL */
}

비교적 간단한 구조체임을 알 수 있다. 핵심 멤버 변수들을 살펴보자.

 

1) unsigned long flags

이 page의 상태를 나타내는 멤버이다. 사실상 이 구조체의 가장 핵심이라고 볼 수 있다. flag들에 대해서는 아래 [3]에서 다시 다룬다.

 

2) atomic_t refcount

이름에서 유추할 수 있듯이, 해당 page에 대한 reference counter를 나타낸다.

 

3) void *virtual

현재 매핑되어 있는 가상 주소를 가리킨다. 매핑되어있지 않다면, 물론 NULL값을 갖게 된다. 아키텍처에 따라 선언되지 않을 수도 있다.(물리 주소로부터 가상 주소를 쉽게 계산할 수 있을 경우 등, 코드 주석 참고)

 

이 외에, 전체 구조체 코드에서는 union들이 상당히 큰 영역을 차지함을 알 수 있다. 예를 들어, page 캐쉬 혹은 익명 페이지는 union안의 다음의 구조체로 선언되어 있다. 

struct {	/* Page cache and anonymous pages */
    /**
    * @lru: Pageout list, eg. active_list protected by
    * pgdat->lru_lock.  Sometimes used as a generic list
    * by the page owner.
    */
    struct list_head lru;
    /* See page-flags.h for PAGE_MAPPING_FLAGS */
    struct address_space *mapping;
    pgoff_t index;		/* Our offset within mapping. */
    /**
    * @private: Mapping-private opaque data.
    * Usually used for buffer_heads if PagePrivate.
    * Used for swp_entry_t if PageSwapCache.
    * Indicates order in the buddy system if PageBuddy.
    */
    unsigned long private;
};

이 외에도 slab/slob/slub page, ZONE_DEVICE page 등등이 선언되어 있다.

 

[3]

page flags는 이 페이지의 상태를 나타낸다. 이를 살펴보는 것으로 커널의 물리 페이지 관리에 대해서 충분히 이해할 수 있다. 

 

1) PG_reserved

특별한 목적을 가진 페이지들. 예를 들어 커널 text, 디바이스 메모리 등등. 일반적인 목적으로 접근할 수 없는 페이지들이며, 해제되거나 swapping 되지 않는다. 

 

2) PG_slab

slab allocator(kmalloc 등)을 통해 할당받은 페이지

 

3) PG_uptodate

페이지 컨텐츠가 최신임. 읽기 작업이 수행되면 이 플래그가 set된다.

 

4) PG_dirty

페이지 컨텐츠가 최신이 아님. 쓰기 작업이 수행되면 이 플래그가 set된다.

 

5) PG_mappedtodisk

페이지가 디스크의 블록에 매핑되어 있음. 이 플래그가 set되어 있어야 swap-out이 가능하다.

 

6) PG_writeback

페이지가 write-back을 수행 중

 

이 외에도 다양한 플래그들이 존재한다. 이 소스에서 확인 가능하다. 

 

 

 

[참고]

http://egloos.zum.com/studyfoss/v/5512112

 

[Linux] pageflags로 살펴본 메모리의 일생

Linux: 2.6.39-rc3arch: x86_64커널은 물리 메모리를 (페이지 단위로) 관리하기 위해 page 구조체를 사용한다.page 구조체에는 해당 페이지 프레임에 관한 정보가 저장되어 있는데그 중 가장 중요한 정보는 바로 페이지가 현재 어떠한 상태에 있는지를 나타내는 flags 필드이다.(추가적으로 flags 필드에는 시스템의 메모리 구성에 따라

egloos.zum.com

 

<9일차 4월 3일 화>

도미 인 프리미엄 난바 -> 겐로쿠스시 -> 귀국

 

8박 9일의 마지막 날이다. 마지막 날 역시 별다른 일정이 없다. 16:45 비행기였기 때문에 호텔에서 느긋하게 일어나서, 도톤보리에서 점심 먹고 공항으로 출발하기로 하였다.

 

겐로쿠 스시

마지막 식사는 100엔 스시로 유명한 회전초밥 겐로쿠 스시 도톤보리 점으로 정했다. 위치는 여기다. 여기로 정한 큰 이유는 없고, 도톤보리라 호텔에서 가깝고, 5년 전 여행에서도 마지막 날 점심에 먹어서 추억팔이 겸 갔다. 10시 45분쯤 도착했는데, 평일임에도 이미 가게 앞에 줄이 꽤 있었다. 그래도 11시 오픈에 바로 입장할 줄은 되었다. 12시나 더 늦게 온다면 웨이팅이 꽤 있을 수 있겠다.

 

겐로쿠 스시

뭐 겐로쿠 스시는 딱 가성비 괜찮은 정도의 스시 맛이다. 특별히 뛰어난 맛을 기대하지 않는다면 무난히 만족할만하다. 마지막 식사이기도 하니 개돼지처럼 먹어서 2106엔 나왔다.

 

제로 카페

시간도 좀 남았겠다, 겐로쿠 스시 바로 옆에 제로 카페라는 곳에서 디저트를 먹었다. (현재는 폐쇄한 듯) 맛은 사실 기억 안 난다. 적당히 도톤보리 강을 더 산책하고 호텔에서 짐 챙겨서 공항으로 이동했다. 난바역에서 폰이 잠깐 sim card 에러가 나서 짜증 났던 기억이 난다. 올 때와 다르게 난바역->간사이 공항역 난카이선은 ic카드로 이용했다. 잔액이 약간 부족했기에 간사이공항역에서 정산기를 처음으로 이용해보았다. 10엔 단위로 되어서 돈 더쓸일 없이 이득인데, 이 글 쓰는 시점 기준(20년 4월) 몇 달 전에 간 후쿠오카 여행에서 안 사실인데, 10엔이 없으면 그 동전만큼 손해를 볼 수도 있다. 예컨대 50엔 정산하면 되는데, 100엔 동전밖에 없어서 그거 넣으면... 50엔이 날아갈 수도 있다. 후쿠오카만 그런지 전체다 그런지는 모름.

 

마지막 날은 물론 적게 걸었다.

 

사실 상 무일정인 마지막 1박 2일을 제외하고 엄청나게 걸었다. 게다가 저 중 2일은 자전거 타고 돌아다닌 날이다. 이 글을 쓰는 시점 기준으로 1일 최대 걸음 수는 최근 갱신했지만(20년 1월 후쿠오카 여행에서 4만보 돌파) 1주일 단위로는 20만보는 커녕 근처에도 가본 적 없다. 물론 1주일짜리 여행이 거의 없었던 것도 있지만...

 

이 글을 쓰는 시점에서 거의 정확히 2년 된 여행이다. 혼자서 이렇게 길게 간건 처음이었는데 마지막 날에도 집에 가고 싶기보단 더 길면 좋았겠다는 생각이 들었다. 그만큼 재미있고 잘 먹고 잘 돌아다니고 추억팔이도 적절히 섞인 좋은 여행이었다. 간사이 쪽은 언젠가 다시 가게 되지 않을까... 싶다.  

330쪽

20.03.19 ~ 27 (9일)

 

sf 단편 7개를 모아놓은 단편집이다.

첫 단편인 "순례자들은 왜 돌아오지 않는가"의 이야기 구성이 굉장히 흥미로워서 재밌게 시작할 수 있었다. 하지만 뒤로 갈수록 단편들이 sf 요소만 바꿔낀 상태로 복붙한 느낌이 너무 강하게 든다. 특히나 표제작인 "우리가 빛의 속도로 갈 수 없다면"부터 후반부 4개의 단편이 모두 아쉽다. 전반적으로 2010년 후반대부터 유행한 전형적인 "감성 베스트셀러"의 sf판에 불과하게 되어버린 것 같아 너무 아쉽다. 

+ Recent posts