주석을 자세하게 써주셔서 잘 이해될줄 알았는데
역시 같이 보지 않고 혼자 보니까 전혀 이해가 안되네요..
담부턴 도망가지 않겠습니다..
head.S를 보면
물리 메모리 16MB를
가상 메모리 0xFFFF 8300 0000 0000 에 맵핑하고
또 동시에 가상 메모리 0xFFFF 828C 8000 0000 에 맵핑하는데요
3/1일 스터디한 부분을 보니까 나머지 물리 메모리를 맵핑하는것 같습니다.
제가 잘 이해가 안되는 부분이
/*
* address 0번 부터, bss 끝까지의 Data를 opt_xenheap_megabytes만큼 이동시킨
* 영역의 address에 이동시킨다.
*/
move_memory(e, 0, __pa(&_end) - xen_phys_start);
이 코드가 어떤 메모리 데이터를 opt_xenheap_megabyte 만큼
옮기는 것인가요?
그리고 왜 이 크기만큼 옮기고, 왜 옮겨야 하는 건가요?
그리고 아래 코드가 계속 이어지는데
이 코드들이 L3 페이지 테이블을 설정하는 것 같습니다.
아래 코드들이 결국 물리 메모리 전체를
가상 메모리 0xFFFF 8300 0000 0000 ~ 0xFFFF 83FF FFFF FFFF 로 맵핑하는 것 같은데
맞나요?
/* Walk initial pagetables, relocating page directory entries. */
pl4e = __va(__pa(idle_pg_table));
//#define L4_PAGETABLE_ENTRIES (1<<PAGETABLE_ORDER) = 512
for ( i = 0 ; i < L4_PAGETABLE_ENTRIES; i++, pl4e++ )
{
if ( !(l4e_get_flags(*pl4e) & _PAGE_PRESENT) )
continue;
// #define l4e_get_intpte(x) ((x).l4)
// #define l4e_from_intpte(intpte) ((l4_pgentry_t) { (intpte_t)(intpte) })
*pl4e = l4e_from_intpte(l4e_get_intpte(*pl4e) +
xen_phys_start);
pl3e = l4e_to_l3e(*pl4e);
// #define L3_PAGETABLE_ENTRIES (1<<PAGETABLE_ORDER) = 512
for ( j = 0; j < L3_PAGETABLE_ENTRIES; j++, pl3e++ )
{
/* Not present or already relocated? */
// 이미 map_pages_to_xen에서 16M 이상 영역 일부에 대해서는
// 페이지 테이블을 만들어 놓았다
// 때문에 그영역에 대해서는 SKIP
if ( !(l3e_get_flags(*pl3e) & _PAGE_PRESENT) ||
(l3e_get_pfn(*pl3e) > 0x1000) )
continue;
*pl3e = l3e_from_intpte(l3e_get_intpte(*pl3e) +
xen_phys_start);
}
}
/* The only data mappings to be relocated are in the Xen area. */
pl2e = __va(__pa(l2_xenmap)); // PML4의 261번 엔트에 해당
// #define L2_PAGETABLE_ENTRIES (1<<PAGETABLE_ORDER) = 512
for ( i = 0; i < L2_PAGETABLE_ENTRIES; i++, pl2e++ )
{
if ( !(l2e_get_flags(*pl2e) & _PAGE_PRESENT) )
continue;
*pl2e = l2e_from_intpte(l2e_get_intpte(*pl2e) +
xen_phys_start);
}
역시 같이 보지 않고 혼자 보니까 전혀 이해가 안되네요..
담부턴 도망가지 않겠습니다..
head.S를 보면
물리 메모리 16MB를
가상 메모리 0xFFFF 8300 0000 0000 에 맵핑하고
또 동시에 가상 메모리 0xFFFF 828C 8000 0000 에 맵핑하는데요
3/1일 스터디한 부분을 보니까 나머지 물리 메모리를 맵핑하는것 같습니다.
제가 잘 이해가 안되는 부분이
/*
* address 0번 부터, bss 끝까지의 Data를 opt_xenheap_megabytes만큼 이동시킨
* 영역의 address에 이동시킨다.
*/
move_memory(e, 0, __pa(&_end) - xen_phys_start);
이 코드가 어떤 메모리 데이터를 opt_xenheap_megabyte 만큼
옮기는 것인가요?
그리고 왜 이 크기만큼 옮기고, 왜 옮겨야 하는 건가요?
그리고 아래 코드가 계속 이어지는데
이 코드들이 L3 페이지 테이블을 설정하는 것 같습니다.
아래 코드들이 결국 물리 메모리 전체를
가상 메모리 0xFFFF 8300 0000 0000 ~ 0xFFFF 83FF FFFF FFFF 로 맵핑하는 것 같은데
맞나요?
/* Walk initial pagetables, relocating page directory entries. */
pl4e = __va(__pa(idle_pg_table));
//#define L4_PAGETABLE_ENTRIES (1<<PAGETABLE_ORDER) = 512
for ( i = 0 ; i < L4_PAGETABLE_ENTRIES; i++, pl4e++ )
{
if ( !(l4e_get_flags(*pl4e) & _PAGE_PRESENT) )
continue;
// #define l4e_get_intpte(x) ((x).l4)
// #define l4e_from_intpte(intpte) ((l4_pgentry_t) { (intpte_t)(intpte) })
*pl4e = l4e_from_intpte(l4e_get_intpte(*pl4e) +
xen_phys_start);
pl3e = l4e_to_l3e(*pl4e);
// #define L3_PAGETABLE_ENTRIES (1<<PAGETABLE_ORDER) = 512
for ( j = 0; j < L3_PAGETABLE_ENTRIES; j++, pl3e++ )
{
/* Not present or already relocated? */
// 이미 map_pages_to_xen에서 16M 이상 영역 일부에 대해서는
// 페이지 테이블을 만들어 놓았다
// 때문에 그영역에 대해서는 SKIP
if ( !(l3e_get_flags(*pl3e) & _PAGE_PRESENT) ||
(l3e_get_pfn(*pl3e) > 0x1000) )
continue;
*pl3e = l3e_from_intpte(l3e_get_intpte(*pl3e) +
xen_phys_start);
}
}
/* The only data mappings to be relocated are in the Xen area. */
pl2e = __va(__pa(l2_xenmap)); // PML4의 261번 엔트에 해당
// #define L2_PAGETABLE_ENTRIES (1<<PAGETABLE_ORDER) = 512
for ( i = 0; i < L2_PAGETABLE_ENTRIES; i++, pl2e++ )
{
if ( !(l2e_get_flags(*pl2e) & _PAGE_PRESENT) )
continue;
*pl2e = l2e_from_intpte(l2e_get_intpte(*pl2e) +
xen_phys_start);
}
댓글 3
-
이일렬
2008.03.04 19:45
-
이일렬
2008.03.04 19:51
한가지더요 왜 옮겨야 되냐는 부분에 대해서는 두가지 예측이 나왔습니다.
1. 나중에 guest를 이쪽에 올려놓고 부팅시켜줄것이다.
2. 과거 장치중에 아래쪽 메모리로만 DMA가 가능한 장치가 있어어
그걸 처리하기 위한게 아니겠느냐...
물론 2가지다 예측입니다. 앞으로 보면 알겠지요 뭐하러 옮겼는지 -
김기오
2008.03.05 10:54
일단 페이지 테이블들을 옮기고 다시 주소 값을 설정하는게
주요 기능이네요.
세부적인 것은 다음 스터디때 거론되면 알 수 있겠지요..
설명 감사드립니다.
.
**첫번째 질문**
현재 돌고 있는 코드는 물리 메모리 0x100000부터 올라가 있는 상황입니다.
여기서 하고 있는 작업은 우선 물리 메모리 16M이상의 영역에서 찾은 영역중에 opt_xenheap_megabyte 보다 큰 첫번째 영역이 발견되면 다음과 같은 작업을 그 영역에 합니다.
그 영역중 끝쪽에서 opt_xenheap_megabyte만큼 영역을 확보합니다.
e = (e - (opt_xenheap_megabytes << 20)) & ~mask;
이렇게 확보된 영역에 0~(_end)까지를 복사하게 됩니다.(xen 이미지 포함)
move_memory(e, 0, __pa(&_end) - xen_phys_start);
**두번째 질문**
여기서 하는 작업은 기존에 만들어둔 페이지 테이블 총 3군데의 slot에 만들어 져 있습니다.(0, 261, 262)
아시다 싶이 현재의 페이지 테이블은 복사하기전 1M~16M 않에 존재하게 됩니다. 이걸 복사해온 위치에서 조정작업을 해야 합니다.
(아주 간단하게 기존 0~16M를 지워버려도 돌수 있도록 말이죠)
-- 기존에 만들어진 페이지 테이블 모두에 대해서(0,261,262) 다음을 처리
1~16M 않에 존재하던 페이지 테이블을 새로운 영역에 복사를 해왔기 때문에 복사해온 PML4가 가리키는 L3 페이지 테이블의 주소는 1~16M 에 존재하는 것일 겁니다. 해서 이걸 새롭게 복사해온 위치의 페이지 테이블로 조정을 해야 겠지요 역시 마찬가지로 L3가 가지고 있는 L2 페이지 테이블도 마찬가지 일것 이구요 해서 그부분 주소도 이동해온 주소로 변경하는 작업을 처리합니다.
-- 261 - xen code, data ....
이부분은 다른 작업을 하나 더 하게 되는 대요 그것은 우리가 옮겨온 것이
xen code, data, ... 이기 때문에 이부분 테이블 수정이 필요하게 됩니다.
가상주소는 바뀌지 않지만 물리주소는 옮긴 주소로 바꾸어 주어야 하기 때문입니다.(이 가상 주소는 xen code, data, .... 를 위한 영역입니다.)
설명이 잘 되었는지 모르겠네요...
다음 스터디때 다른 분들이 잘 설명을 해주실거에요...
(저는 참석이 힘들거 같습니다.)
주석을 더 자세하게 달았으면 좋았을뻔 했네요... 기오님이 다시 잘 이해될수 있도록 정리해 주시면 좋겠습니다.
그럼 수고하세요