2012-04-04 3 views
7

페이지 캐시 된 파일의 주소 공간에서 struct page을 얻었습니다.구조 페이지에서 관련 데이터의 실제 주소를 얻는 방법은 무엇입니까?

struct page에서 4KB 데이터의 시작 실제 주소를 어떻게 얻을 수 있습니까?

struct sk_buff 안에 data 포인터가 있어야한다고 생각하지만 찾지 못했습니다.


답변에 대한 편집

감사 매트와 llya.

답변을 살펴본 후 struct pageZONE_NORMAL 또는 ZONE_HIGHMEM에 있는지 여부를 확인하는 것이 가장 먼저 생각한 문제입니다.

파일 I/O 중에 캐시 된 페이지를 찾지 못한 경우 먼저 page_cache_alloc_cold()을 사용하여 새 페이지를 할당합니다. page_cache_alloc_cold()은 마침내 ZONE_HIGHMEM (x86의 경우 PAGE_OFFSET + 896M에서 시작하는 커널 메모리 영역)을 사용하는 것처럼 보이는 alloc_pages()을 호출합니다.

그래서

  • 내가 매트의 대답은
  • 우리는 구조체의 페이지와 관련된 4킬로바이트 데이터의 시작 물리적 주소를 찾을 수 kmap()를 사용한다고 가정 ZONE_NORMAL에 페이지에 적합하다고 생각, 그것은 우리가해야 정확 (unsigned long)(&page)-PAGE_OFFSET을 사용하여 구조 자체를 저장하는 실제 주소를 찾으십니까?

수정하십시오. 다음과 같이

+0

'mem_map' 배열의 항목으로'page'에 대해 생각해보십시오. –

답변

1

당신은 커널 메모리에 page를 매핑해야합니다. (예에 대한 this 링크 참조) 리눅스에서 HighMemory 개념이있는 한

void * mapping = kmap_atomic(page, KM_USER0); 
// work with mapping... 
kunmap_atomic(mapping, KM_USER0); 

이 트릭이 필요합니다.

UPD : 비 원자 (non-atomic) 컨텍스트에서 kmap_atomic 대신 kmap을 사용할 수 있습니다.

+1

OP는 그가 이미 '구조 페이지'를 가지고 있다고 말합니다. 왜 정확히 매핑해야합니까? (BTW : http://lwn.net/Articles/356378/ kmap_atomic에 대한 두 번째 인수는 2009 년에 사라졌습니다) – Mat

+0

HighMemory를 다룰 때 몇 가지 제약이 있습니다. 일반적인 32 비트 커널은 1G의 메모리 만 볼 수 있습니다 (0xc000000 이후). 그래서 당신은 4G 이상의 RAM을 가지고 있다고 상상해보십시오. 커널에서 어떻게 접근합니까? –

관련 문제