start_kernel - setup_arch - paging_init 공부 중에 잘 이해되지 않는 내용이 있어 질문드립니다.
void __init paging_init(void)
{
pgd_t *pgdp = pgd_set_fixmap(__pa_symbol(swapper_pg_dir));
map_kernel(pgdp);
map_mem(pgdp);
pgd_clear_fixmap();
cpu_replace_ttbr1(lm_alias(swapper_pg_dir));
init_mm.pgd = swapper_pg_dir;
memblock_free(__pa_symbol(init_pg_dir),
__pa_symbol(init_pg_end) - __pa_symbol(init_pg_dir));
memblock_allow_resize();
}
위의 코드를 분석한 결과,
pgd_set_fixmap을 사용해서 fixmap을 통해 swapper_pg_dir에 접근할 수 있게 하고
map_kernel과 map_mem에서 swapper_pg_dir에 pud/pmd/pte 페이지 테이블과 물리주소를 매핑하고
init_mm.pgd를 swapper_pg_dir로 업데이트를 하는 것으로 이해했습니다.
(실제 스터디는 map_mem까지 진행해서 cpu_replace_ttbr1 아직 보지 않은 상태입니다)
그런데 각 페이지 테이블을 만든 후에 p*d_clear_fixmap을 호출하는데
함수를 따라가면 매핑할때와 동일한 ptep에 "0"을 write하고 있습니다.
처음에는 이 의미를 전혀 이해하지 못하다가
http://jake.dothome.co.kr/map64/ 페이지의 "paging_init() – ARM64" 단락에서
"코드 라인 8에서 fixmap 영역의 pgd 엔트리에 매핑한 pgd 테이블을 매핑 해제한다."를 보고
'fixmap에서swapper_pg_dir에 대한 매핑을 해제하는 것으로 받아들였습니다.'*
위 내용에서 아직 이해하지 못한 내용은,
우선 *에 대한 해석이 맞는지 입니다.
그리고 그 해석이 맞다면 어떻게 p*d_clear_fixmap가
만들어진 swapper_pg_dir에는 영향을 주지않고
fixmap에서 swapper_pg_dir에 대한 매핑을 해제하는게 가능한지 입니다.
댓글 6
-
코딩의노예
2020.03.22 21:19
-
DEWH
2020.03.23 10:14
좋은 설명 감사합니다. 그림을 추가하면 좀 더 이해에 도움이 될 것 같아 그림을 추가하였습니다 :)
현재 상황을 아래 그림은 간단하게 현재 상황을 보여주고 있습니다.
FIX_PXD 영역에 해당하는 tranlsation table은 이미 구성되어 있는 상태고, 마지막 레벨 테이블(bm_pte)의 엔트리만 비어있습니다. 따라서 이 상황에서 해당 영역의 가상 주소를 접근하면 페이지 폴트가 발생할 것 입니다.
> pgd_t *pgdp = pgd_set_fixmap(__pa_symbol(swapper_pg_dir));
> 이 라인이 의미하는 것은 fixmap에 swapper pg dir이라는 페이지 테이블을 가르키도록 한다는 뜻입니다.> (정확힌 pgd를) 다시 말해 swapper pg dir에 저장된 커널 코드가 매핑될 pgd의 물리주소를
> fixmap 영역(가상주소)에 매핑한다는 뜻입니다. 그리고 그 주소를 pgd pointer에 대입합니다.
리턴 값은, _pa_symbol(swapper_pg_dir)이 매핑된 가상주소, FIX_PGD가 리턴됩니다. 따라서 해당 주소를 사용하여 물리 페이지프레임에 접근할 수 있습니다.
> 그 후에
> pgd_clear_fixmap();
> 을 하게되면 위에서 fixmap의 pgd가 가르키던 물리주소에 매핑하던 것을 해제하는 것입니다. fixmap 영역의 데이터를> 지워버린 것이죠. swapper pg dir가 가리키는 물리주소 영역의 데이터를 지워버리는 것이 아닙니다.
-
문c(문영일)
2020.03.23 10:22
DEWH님 표현력이 남다릅다는 것을 발견하였습니다 ^^
그림으로 표현한 것도 이해에 큰 도움이 될듯합니다.
잘 정리하셔서 나중에 발표회를 한 번 할까요?
-
DEWH
2020.03.23 10:52
감사합니다.
이해에 도움을 드릴 수 있다면 발표를 안 할 이유가 없지요 :)
-
문c(문영일)
2020.03.23 10:17
안녕하세요? 문c 블로그(http://jake.dothome.co.kr)의 문영일입니다.
답글 달아주신 두 분 모두 엄청난 내공입니다. 저도 rnsscman님께 조금 더 쉽게 전달하기 위해 아래의 제 post를 일부 수정하였습니다.
가볍게 먼저 말씀 드리면
-> init_pg_dir(임시 커널 매핑)
-> 현재 cpu가 접근 불가능한 상태의 swpper_pg_dir이므로 cpu가 swapper_pg_dir을 수정할 수 있도록 fixmap에 매핑
-> swapper_pg_dir이 수정 가능한 상태이므로 커널 영역을 swapper_pg_dir에 매핑
-> 새로운 swapper_pg_dir을 사용할 준비가 되었으므로 fixmap에 매핑된 swapper_pg_dir을 fixmap에서 분리
-> 현재 init_pg_dir에 연결된 ttbr1을 swapper_pg_dir로 전환
-> init_pg_dir 영역은 더 이상 사용할 필요 없으므로 제거
다음을 참고하세요.
ARM64 페이지 테이블 -2- (매핑) | 문c
-
rnsscman
2020.03.24 21:13
답변주신 세 분 모두 감사드립니다
fixmap의 bm_pte의 매핑된 물리주소가
swapper_pg_dir의 물리주소라고 생각하지 못해
이해하기 어려웠는데 자세한 설명과 그림 덕분에 이해할 수 있었습니다
감사합니다 :D
.
5점대에 오면서 코드가 많이 바뀌어서 정말 혼란스러웠는데요.
일단 *을 표시한 부분이 제가 이해한 생각과 작성자님이 생각한 내용이 같다면 맞는 말씀이십니다.
pgd_t *pgdp = pgd_set_fixmap(__pa_symbol(swapper_pg_dir));
이 라인이 의미하는 것은 fixmap에 swapper pg dir이라는 페이지 테이블을 가르키도록 한다는 뜻입니다.(정확힌 pgd를) 다시말해 swapper pg dir에 저장된 커널 코드가 매핑될 pgd의 물리주소를 fixmap 영역(가상주소)에 매핑한다는 뜻입니다. 그리고 그 주소를 pgd pointer에 대입합니다.
mep kernel map mem은 보셨다시피 커널 코드의 페이지 테이블을 만들어서 인자로 넘어온 pgdp에 매핑시켜주는 것을 알 수 있습니다. 결국 swapper pg dir이 가리키는, fixmap에 매핑된 페이지 테이블에 커널 코드를 매핑시켜주는 게 되겠죠.
그 후에
pgd_clear_fixmap();
을 하게되면 위에서 fixmap의 pgd가 가르키던 물리주소에 매핑하던 것을 해제하는 것입니다. fixmap 영역의 데이터를 지워버린 것이죠. swapper pg dir가 가리키는 물리주소 영역의 데이터를 지워버리는 것이 아닙니다.
정리해드리면 swapper pg dir은 "커널 페이지 테이블 엔트리"이며, 이는 "ttrb1" 이라는 레지스터가 가리키고있습니다.
cpu_replace_ttbr1(lm_alias(swapper_pg_dir));
init_mm.pgd = swapper_pg_dir;
이 부분에서 ttrb1 레지스터가 swaper_pg_dir를 가르키도록 하고 init_mm의 pgd가 swaper_pg_dir과 같은 곳(pgd의 가상주소)을 가리킵니다. (lm alias는 물리주소로 바꾸고 다시 가상주소로 바꿉니다. 음.... 추측하건데, 64비트 중 48비트만 사용하므로써 남는 주소비트를 이용한 플래그들을 지워버리거나 셋팅하기 위함으로 보입니다. 저도 잘...)
마지막으로 memblock free를 이용해 pgd만 남기고 나머지 메모리공간을 할당해제하죠. (처음에는 커널 크기를 몰라서 크게 공간을 잡나봅니다.)
저도 매우매우 어려웠지만, 저만 어려운 건지도 모르겠지만, 가상주소와 물리주소 구분이 확실해야합니다. 이게 진짜 힘든데 안그러면 점점헷깔려요.
커널코드는 결국 실제 물리메모리에 올라가야하고, 그 물리메모리의 주소를 물리주소라고 하고, 그 것을 메모리 파편화 등을 해결하기 위해 가상주소를 만들었고, 그 가상주소를 효율적으로 사용하기 위해서 페이지 테이블을 만들었고, 결국 페이지 테이블도 물리메모리에 존재해야하며 물리주소와 가상주소가 있습니다.
즐공하시길 바랍니다.