[x86] fixed_addresses

pororo 2012.03.04 22:41 조회 수 : 11498

fixmap.h의 fixed_addresses 처음에 나오는 VSYSCALL_START는 끝에서 -10M (0xFFFFFFFFFF600000) VSYSCALL_END는 -2M(0xFFFFFFFFFFE00000) 입니다.

여기서는 8M의 VSYSCALL 로 추측되는 부분을 페이지 단위로 쪼개줍니다.

    VSYSCALL_LAST_PAGE,   
    VSYSCALL_FIRST_PAGE = VSYSCALL_LAST_PAGE
                + ((VSYSCALL_END-VSYSCALL_START) >> PAGE_SHIFT) - 1,

FIXADDR_TOP 32비트는 메모리 끝-1페이지(4KB)가 인데 64비트는 특이하게 VSYSCALL_END-1페이지 입니다.

이 enum fixed_addresses는 페이지 번호(인덱스)가 맞는것 같습니다.

이 고정된 공간은 TOP부터 메모리의 높은쪽에서 낮은쪽으로 페이지 번호(0,1,2...)가 매겨지는데 이 연산은 __fix_to_virt와 __virt_to_fix 매크로를 사용해 페이지 번호 <-> 가상주소를 변환합니다. 페이지 번호/ 메모리주소가 높을수록 메모리 공간에서는 낮은쪽에 위치합니다.

fixed_addressed를 살펴보면 VSYSCALL, APIC도 보이고 좀 헤맸던 __end_of_permanent_fixed_addresses와 FIX_BTMAP도 보이네요. __end_of_fixed_addresses가 끝에 또 보입니다.

페이징은 복잡하네요.

xor 나오는 곳에 주석을 달아봤습니다.

  /* 이 루틴은 같은 PTE에 BITMAP 페이지(256)들이 같은 PTE블럭에 연속적으로 할당가능한지 체크한다.
     * 공간이 충분하다면 연속해서 할당하고 모자라면 PTE블럭을 넘겨서 정렬한후 할당한다.
     *
     * (x ^ (x + small_block - 1)) & large_block 에서
     * small_block이 large_block에 들어갈수 있다면 값이 넘치지 않으면 and도 0이 된다.
     * x가 원래 large_block의 비트값을 가지는 경우도 있기에 자신과 xor해서 체크한다.
     * large_block 단위로 넘치지 않았다면 xor결과 0이 되고 and 또한 0이 된다.
     * (large_block은 2의 승수)
     *
     * 1이면 x + block - (x & (block - 1)) 은 블럭단위를 증가시키고
     * (x & (block - 1))로 block보다 작은 값을 구한다.
     * x의 block단위안에서 값을 빼면 블럭 단위로 정렬된다.
     *
     * 0이면 small_block이 들어가기에 공간이 충분하다. 주소를 그대로 사용한다.
     **/
    FIX_BTMAP_END =
     (__end_of_permanent_fixed_addresses ^
      (__end_of_permanent_fixed_addresses + TOTAL_FIX_BTMAPS - 1)) &
     -PTRS_PER_PTE
     ? __end_of_permanent_fixed_addresses + TOTAL_FIX_BTMAPS -
       (__end_of_permanent_fixed_addresses & (TOTAL_FIX_BTMAPS - 1))
     : __end_of_permanent_fixed_addresses,
    FIX_BTMAP_BEGIN = FIX_BTMAP_END + TOTAL_FIX_BTMAPS - 1,
번호 제목 글쓴이 날짜 조회 수
공지 [공지] 커널 스터디 관련 Q&A 게시판 입니다. [5] woos 2016.04.09 2194
1725 [잡담] O(1) 스케쥴러에서 [5] 박은병 2008.04.02 13742
1724 u-boot 분석 참고자료 file 구본규 2012.07.27 13313
1723 [추가] linux, busybox .config / build 방법 [4] file 구본규 2012.07.29 13178
1722 CFS 스케줄러 기초 정리 홍문화 2011.05.27 12874
1721 이클립스에서 ARM Linux 개발 툴 사용하기(DS-5) [1] file 와사 2013.08.15 12867
1720 x86 linux booting 과정 file 백창우 2007.02.23 12734
1719 [문의] linux device driver 개정 3판 가지고 계신분? [6] 맥주 2008.03.27 12442
1718 링크 레지스터 오프셋 [6] 정현철 2011.06.12 12360
1717 안녕하세요~ 소성은 입니다~ [5] file 소성은 2010.04.05 12159
1716 [문서] 커널 분석 문서입니다. file 맥주 2008.11.10 12087
1715 커널 소스 분석에 도움을 주는 도구들 구본규 2012.08.06 12006
1714 RealMode? ProtectedMode? [2] 김태훈91 2012.05.11 11951
1713 linux부팅과정 설명 문서 [3] file 이상철 2009.03.18 11768
1712 ELF 파일 포맷 정리 [6] 도영주 2013.05.04 11536
» [x86] fixed_addresses pororo 2012.03.04 11498
1710 kernel stack과 이를 이용하는 context_switch()사이의 연관성에 대한 질문 [11] 이종인 2011.05.27 11433
1709 memory map in powerpc kernel [1] file 김강년 2007.07.08 11267
1708 커널 스터디 6기 멤버 소개(arm-11 mp-core) 소개 페이지로 이동 예정 [4] 강진성 2010.03.24 11224
1707 리눅스 커널 초기화(ARM) 참고 자료 [2] file 유강희 2010.04.07 11221
1706 다들 주무시죠?? 자~ 질문입니다 ㅋ [4] 변유준 2007.06.16 11220
XE Login