x86 CR3 레지스터, 페이지디렉토리 질문
글쓴이: declspec / 작성시간: 월, 2012/06/11 - 5:08오후
안녕하세요
x86 리눅스 아키텍쳐에서.
커널 페이지디렉토리의 물리주소가 CR3 레지스터에 들어있다고하길래
int cr3_value = 0; asm ( "movl %%cr3, %%eax\n\t" "movl %%eax, %0" : "=m" (cr3_value) : : "eax" ); printk("cr3_value == %X\n", cr3_value);
어떤분이 올려놓으신 소스를 가지고
커널모듈상에서 CR3 레지스터값을 출력해봤습니다
그러니까 0x1FBFD000 뭐 이런값이 나와서
이게 페이지디렉토리의 물리주소 위치인가보다... 했는데
혹시나싶어 모듈을 내렸다가 다시올려보니 위치가 다르게 찍히고, 할때마다 다르게찍히더군요??
어떻게된걸까요? ㅠㅠ
페이징을 해야하니까
CR3 레지스터값은 항상 일정해야하는거아닌가요??
Forums:
CR3 레지스터에 주소가 기록된다는것만
CR3 레지스터에 주소가 기록된다는것만 규정된다면
페이지 테이블에 접근할 때마다 cr3 레지스터를 읽으면 되니까요.
cr3 레지스터의 값이 동일해야하다면 늘 같은 위치에 페이지 테이블을 저장해야한다는 건데 이게 더 불편할것 같습니다.
참고로 주소 변환할때 레지스터값을 읽어야되므로 비용이 커집니다.
그래서 미리 주소를 변환해놓은 테이블도 있습니다.
캐시도 그렇고 이름은 기억이 안나는데 안보이는 레지스터가 있습니다.
프로세서 메뉴얼에 그림으로 설명되어있었던걸로 기억이 납니다.
해결
해결되었습니다.
알고봤더니 커널모듈상의 코드가 커널레벨에서 실행되긴 해도
몇몇 레지스터의 컨텍스트는 해당 커널모듈의 루틴을 호출한 유저레벨 프로세스의 컨텍스트를
가지고가더군요
그래서 CR3 레지스터가 insmod 프로그램의 것이 찍힌것이어서
매번 달랐던 것이었습니다
자기실력이 좋다고 느껴지는건 공부를 안하고 있다는 신호.
아 모듈로 올리면 insmod 프로그램의 프로세스
아 모듈로 올리면 insmod 프로그램의 프로세스 컨텍스트를 가지는 거였군요.
그럼 커널에 링크해서 실행시키면 항상 동일한 cr3 값을 가질 것이구요.
좋은걸 배웠습니다. 감사합니다.
댓글 달기