early_fixmap_init 함수 질문

에러가왜안뜨지 2019.09.12 12:59 조회 수 : 345

안녕하세요

 

http://jake.dothome.co.kr/fixmap/#comment-217495

 

링크를 통해 early_fixmap_init 을 공부하던 중 이해가 되지 않는 부분이 있어 질문을 하게 되었습니다.

제가 이해 하기로는

 early_fixmap_init 함수에서

코드 라인 10~18번은 page table level 에 따른 변환 level을 처리하는 과정으로 이해 했습니다.

CONFIG_PGTABLE_LEVEL4 로 해석해보겠습니다.

 

10번 line에 if문 조건에 의해  CONFIG_PGTABLE_LEVEL 이 4일 경우  아래 함수를 실행하는데

pgd_none(pgd) || pgd_page_paddr(pgd) == __pa_symbol(bm_pud)

PUD TABLE 같은 경우는 이미 커널 이미지 용도로 활성화 되어있기 때문에 fixmap 시작 주소에 해당하는 pud 엔트리 포인터를 구합니다.

 그리고 나머지 page table들을 활성화(?) 시키기 위해 아래 함수를 실행 합니다.

 __pgd_populate(pgdp, __pa_symbol(bm_pud), PUD_TYPE_TABLE);     //pgd table ->pud table 로 populate

__pud_populate(pudp, __pa_symbol(bm_pmd), PMD_TYPE_TABLE);    //pud table -> pmd table로 populate

__pmd_populate(pmdp, __pa_symbol(bm_pte), PMD_TYPE_TABLE);    //pmd table ->pte table로 populate

 

최종적으로

init_mm -> pgd table -> pud_table -> pmd_table -> pte_table

와 같이 page table이 활성화 되는 것으로 알고 있습니다.

 

제가 이해하고 있는게 맞다고 가정하고

CONFIG_PGTABLE_LEVEL3으로 해석 하면

 

if (CONFIG_PGTABLE_LEVELS > 3 &&  // level3이므로 if문은 무조건 거짓이 됩니다.

따라서 아래 조건문은 실행 하지 않습니다.

!(pgd_none(pgd) || pgd_page_paddr(pgd) == __pa_symbol(bm_pud)))

 

실행하지 않는다는 근거는

disassembly로 보았을 때 조건에 따라 분기하는  명령어가 보여서 입니다.

   0xffff0000111261f8 <+44>:  cbz  x0, 0xffff000011126210 <early_fixmap_init+68>

   0xffff000011126204 <+56>:  cmp  x1, x0

   0xffff000011126208 <+60>:  b.eq  0xffff000011126240 <early_fixmap_init+116>  // b.none

 

즉 아래 그림처럼 3단계의 페이지 테이블을 사용하므로 중간 pud 테이블이 생략되는 과정으로 이해했습니다.

 

early_fixmap_init-1a.png

 

 

문제는 pud가 생략되면 pgd 테이블에서 pmd 테이블로  populate 하는 작업이 보이지 않는데

어떻게 그림처럼 pgd table->pmd table로 갈 수 있는지 궁금합니다.

다른 함수에 후처리를 해주는건가요? 아니면 제가 early_fixmap_init 함수를 잘못 이해하고 있는 건가요??

 

감사합니다.

 

 

 

 

 

 

번호 제목 글쓴이 날짜 조회 수
공지 [공지] 프로그래밍 관련 Q&A 게시판 입니다. woos 2016.04.09 22253
517 alloc과 free함수에 대해서 질문입니다. [1] 정재훈 2011.06.28 93663
516 안드로이드 system 폴더안의 파일을 인식못하는데.. [5] 김영일 2011.04.14 69702
515 x86에서 ZONE_DMA 영역의 사용 [1] 홍문화 2011.05.02 58329
514 커널에서 page alloc에 관해서 [1] 미다리로23 2017.02.05 34579
513 디바이스 드라이버 모듈에서 작성한 함수를 커널에서 사용하는 방법 [1] 개짖는소리 2017.02.06 27052
512 Linux kernel의 CFS(Completely Fair Scheduling) 스케줄러에서 time slice 구하는 방법? [10] 김재호 2010.04.30 25225
511 "만들면서 배우는 OS..." 4장 kernel.asm 중 idtr 설정 질문드립니다 쿨쿨 2013.06.18 24962
510 리눅스 스케줄러 관련 [9] 홍문화 2011.02.23 22949
509 NFS NAS SAN 이란 무엇인가? file 박은병 2010.04.13 21882
508 s3c2440기반의 리눅스 커널 분석 중 MM관련 질문입니다. 유태경 2007.09.02 21523
507 /dev 폴더에 있는 node파일 중에서 어떤 것을 open해야 플래쉬를 사용할 수 있을까요? [1] 박종주 2012.02.17 19849
506 sparsemem에 대한 질문이 있습니다. [5] 안정모 2010.03.20 19719
505 16기 리눅스 커널 스터디 C조 18주차 질문입니다. [3] cien 2019.10.12 18832
504 tty, tty0, console, vc 는 각각 뭐하는 디바이스인지? [3] 이창만 2008.12.04 18557
503 ARM A8 이상의 프로세서를 공부할 때 스터디 방향 [4] 유강희 2011.06.15 18519
502 임베디드 OS 만들기 내용과 관련하여 문의드립니다. [5] 송인재 2010.03.25 18321
501 far call 이란 무엇인가요? [4] 박한범 2010.04.13 17841
500 파일시스템에 관한 질문(Htree [6] 사앙조 2017.05.22 17073
499 SMP관련 질문입니다. [2] 컴퓨터 2017.04.13 16586
XE Login