Ucore lab2

4286 단어
lab2
Page 데이터 구 조 는 어떻게 실제 물리 페이지 와 연 결 됩 니까?struct Page { int ref; // page frame’s reference counter uint32_t flags; // array of flags that describe the status of the page frame unsigned int property; // the num of free block, used in first fit pm manager list_entry_t page_link; // free list link }; 쉽게 말 하면 페이지 대상 중 page링크 의 주소, 페이지 빼 기링크 는 페이지 구조 에서 의 오프셋 을 찾 아 해당 페이지 대상 의 주 소 를 찾 은 다음 페이지 대상 으로 강하 게 전환 합 니 다.st_entry_t. 유 니 버 설 양 방향 순환 링크 에 특정한 데이터 구조 에서 링크 노드 구성원 변수의 주소 만 저장 되 어 있 습 니 다. 그러면 이 링크 노드 구성원 변 수 를 통 해 그의 소유자 (즉 특정한 데이터 구조의 변수) 에 어떻게 접근 합 니까?Linux 는 이 를 위해 데이터 구조 XXX 의 le2XXX (le, member) 에 대한 매크로 를 제공 합 니 다. 그 중에서 le, 즉 list entry 의 줄 임 말 은 데이터 구조 XXX 에서 list 를 가리 키 는 것 입 니 다.entry_t 구성원 변수의 지침, 즉 양 방향 순환 링크 에 저 장 된 노드 주소 값 이 고 member 는 XXX 데이터 형식 에 포 함 된 링크 노드 의 구성원 변수 입 니 다.예 를 들 어, 우 리 는 빈 블록 링크 에 있 는 모든 노드 가 있 는 Page 데이터 구 조 를 기반 으로 하 는 변 수 를 옮 겨 다 니 려 면 다음 과 같은 프로 그래 밍 방식 (lab 2 / kern / mm / default pmm. c 기반) 을 사용 할 수 있 습 니 다. / freearea 는 빈 블록 관리 구조, freearea.free_list 는 빈 블록 체인 헤더 freearea_t free_area; list_entry_t * le = &free_area.free_list; //le 는 빈 블록 체인 헤더 포인터 while ((le = list next (le)! = & free area. free list) {/ 첫 번 째 노드 부터 struct Page * p = le2page (le, page link) 를 옮 겨 다 니 며 노드 가 있 는 페이지 데이터 구 조 를 기반 으로 하 는 변 수 를 가 져 옵 니 다...}
uore 에서 사용 하 는 방법 은 struct Page 를 그들 이 관할 하 는 물리 페이지 의 주소 크기 에 따라 연속 으로 저장 하 는 것 입 니 다. 따라서 page2pa 매크로 를 사용 하여 page 구조의 첫 번 째 주 소 를 이동 하 는 작업 을 통 해 해당 주 소 를 얻 을 수 있 습 니 다. 상세 한 내용 은 mm / pmm. h 를 볼 수 있 습 니 다. 그 중에서 page2pa 매크로 는 모든 struct Page 를 저장 하 는 첫 번 째 주소 로 볼 수 있 습 니 다. static inline ppnt page2ppn(struct Page *page) { return page - pages; }
static inline uintptr_t page2pa(struct Page *page) { return page2ppn(page) << PGSHIFT; }
memlayot. h 가 정의 하 는 KERNEL BASE 는 \ # define KERNBASE 0xC 000000 입 니 다.uccore kernel 의 가상 커 널 공간의 시작 주 소 는 0xC 000000 입 니 다.
한편, tools / kernel. ld (ld 링크 도구 의 프로필) 는 지적 했다.
SECTIONS {/ * Load the kernel at this address: "." means the current address * /. = 0xC 0100000; < - 컴 파일 된 kernel 실행 파일 의 가상 커 널 의 시작 주 소 는 0xC 0100000 임 을 설명 합 니 다. 이 주 소 는 kern entry 함수 (kern / init / entry. S 에 있 음) 의 시작 주소 입 니 다.
pte2page 는 pa2page 의 패키지 일 뿐 어떤 의미 에서 도 같 습 니 다.
가장 먼저 일치 하 는 것 은 남 은 파 티 션 목록 을 주소 순 으로 배열 하 는 것 입 니 다. 그러나 lab 2 의 answer 는 매번 free 를 사용 한 후에 남 은 것 을 목록 머리 에 직접 추가 하 는 것 같 습 니 다.
get pte 에 페이지 시트 가 존재 하지 않 습 니 다 (pgdir [pdx] & PTE P) = = 0)이 때 공간 을 나 누 어 페이지 표를 배치 하고 페이지 디 렉 터 리 항목 을 다시 작성 해 야 합 니 다. 0xC 0000000 은 KERNBASE 이 고 가상 주소 공간 에 있 는 커 널 기반 주소 입 니 다. uore 에서 커 널 주 소 는 하나의 이동 맵 만 하기 때문에 물리 적 주 소 는 0xC 0000000 을 추가 하 는 것 이 가상 주소 입 니 다. 0xC 000000 이라는 값 은 인위적인 설정 이 고 특별한 원인 이 없 으 며 서로 다른 운영 체제 가 다 를 수 있 습 니 다. 가상 으로물리 적 주소 로 의 주소 변환 은 하드웨어 로 이 루어 집 니 다.
lab2 /mm/mmu.h
#define PTE_P 0x001 // Present
#define PTE_W 0x002 // Writeable
#define PTE_U 0x004 // User
#define PTE_PWT 0x008 // Write-Through
#define PTE_PCD 0x010 // Cache-Disable
#define PTE_A 0x020 // Accessed
#define PTE_D 0x040 // Dirty
#define PTE_PS 0x080 // Page Size
#define PTE_MBZ 0x180 // Bits must be zero
#define PTE_AVAIL 0xE00 // Available for software use

PTE PS 는 pd 의 PTE PS 비트 가 1 이면 pd 에 저 장 된 것 은 다음 페이지 표 가 아니 라 4M 페이지 의 시작 주소 이 며, 즉 페이지 의 입 도 는 4K 가 아니 라 4M 이다.
PG reserved = 1 페이지 는 kernel code 나 전역 변수 에 의 해 사용 되 고 있 는 메모리 또는 일반 읽 기와 쓰기 에 사용 할 수 없 는 메모리 입 니 다. PG reserved = 0 페이지 는 alloc / free 메모리 로 사용 할 수 있 습 니 다. reserved 페이지 는 할당 되 지 않 습 니 다. default pmm 은 페이지 단위 의 남 은 메모 리 를 관리 하 는 pm manager 입 니 다.

좋은 웹페이지 즐겨찾기