메모리 공부 중에 질문이 있습니다.(2번째 질문)

222 views
Skip to first unread message

scrib...@gmail.com

unread,
Apr 3, 2019, 4:16:41 AM4/3/19
to Linux Kernel ARM

질문에대하여 자세하고 친절하게 답변해주셔서 너무나 감사드립니다.

답변 내용(http://jake.dothome.co.kr/pt/)과 레퍼런스 메뉴얼을 참고하여 공부하던 도중 궁금한점이 있어서 질문 드립니다.


현재 Sabre Lite(Cortex-A9)을 사용하고 있습니다. Sabre Lite는 32bit short descripor page table format을 사용하고 있습니다.

1. "TTBR0은 유저 태스크마다 생성되는 해당 유저 태스크의 pgd 페이지 테이블을 가리킨"다고 하셨습니다. 그러면 프로세스가 여러 개가 존재하는 경우 PGD 역시 여러 개가 존재할 수 있는 건가요? 지금까지 저는 PGD는 최상위 페이지 테이블로서 하나만 존재하는 것으로 이해하고 있었습니다.




2. 블로그 내용에서 "가상 주소 vs 물리 주소 변환" 항목에서 TTBR은 TTBR1을 의미하는 것으로 이해하였습니다. 아래 그림은 TTBR1 레지스터입니다.

"인터럽트가 발생할 때 TTBR1으로 전환하지 않고, 그냥 TTBR0를 사용한다" 내용을 참고하면 1st page directory_base 주소를 구할 때 TTBR0의 'Translation table base 0 address'를 사용하는 것이 맞는 지 궁금합니다. 아래 그림은 TTBR0 레지스터 입니다.



3. "http://jake.dothome.co.kr/pt-api/" 페이지의 "pgd_offset()" 매크로를 참고하면 task의 mm_struct의 pgd를 사용하여 프로세스의 PGD 주소에 접근할 수 있는 것으로 확인하였습니다. 프로세스의 PGD 주소를 확인하는 방법은 mm_struct의 pgd를 확인하거나 TTBR 레지스터의 TTBA(Translation table base address)와 가상 주소를 사용하여 확인하는 방법 2가지가 있다는 것으로 이해하는게 맞을까요?

Youngil Moon

unread,
Jul 14, 2019, 8:20:40 PM7/14/19
to Linux Kernel ARM
안녕하세요? 문영일입니다.

이 질문이 여기에 게제된지 까맣게 모르고 있었습니다.
보통 mail로 전달되는데 문제가 있었나 봅니다.

늦었더라도 답변드립니다.

1. "TTBR0은 유저 태스크마다 생성되는 해당 유저 태스크의 pgd 페이지 테이블을 가리킨"다고 하셨습니다. 그러면 프로세스가 여러 개가 존재하는 경우 PGD 역시 여러 개가 존재할 수 있는 건가요? 지금까지 저는 PGD는 최상위 페이지 테이블로서 하나만 존재하는 것으로 이해하고 있었습니다.

-> 커널은 한 벌의 페이지 테이블을 사용합니다. 그러나 유저에서는 프로세스가 실행될 때 마다 페이지 테이블(pgd, ...)이 생성됩니다. 

2. 블로그 내용에서 "가상 주소 vs 물리 주소 변환" 항목에서 TTBR은 TTBR1을 의미하는 것으로 이해하였습니다. 아래 그림은 TTBR1 레지스터입니다. 

"인터럽트가 발생할 때 TTBR1으로 전환하지 않고, 그냥 TTBR0를 사용한다" 내용을 참고하면 1st page directory_base 주소를 구할 때 TTBR0의 'Translation table base 0 address'를 사용하는 것이 맞는 지 궁금합니다. 아래 그림은 TTBR0 레지스터 입니다.

-> 네 arm32 시스템의 경우 ttbr0 하나만을 사용하여 4G 가상 주소를 관리하도록 커널이 설정됩니다.
유저 태스크에 해다하는 페이지 테이블이 ttbr0가 가리킬 때 하위 3G 유저 공간을 사용하다가, 인터럽트가 발생하면 ttbr0가 가리키는 페이지 테이블의 위 1G 부분에 접근합니다.

3. "http://jake.dothome.co.kr/pt-api/" 페이지의 "pgd_offset()" 매크로를 참고하면 task의 mm_struct의 pgd를 사용하여 프로세스의 PGD 주소에 접근할 수 있는 것으로 확인하였습니다. 프로세스의 PGD 주소를 확인하는 방법은 mm_struct의 pgd를 확인하거나 TTBR 레지스터의 TTBA(Translation table base address)와 가상 주소를 사용하여 확인하는 방법 2가지가 있다는 것으로 이해하는게 맞을까요?

TTBR0는 preemption될 때마다 즉 태스크 스케줄링이 발생할 때마다 해당 태스크가 가리키는 pgd로 재설정됩니다.
즉, TTBR0를 조회하면 현재 태스크가 가리키는 pgd를 알아낼 수 있습니다. 또한 task 구조체에 있는 pgd의 경우는 해당 태스크의 pgd 테이블을 의미합니다. 말씀하신 것과 같이 pgd 주소를 확인하려면 둘 다 가능하다고 이해하시면 됩니다. 다만 TTBR0의 경우는 현재 프로세스(태스크)만을 의미합니다.

감사합니다.


2019년 4월 3일 수요일 오후 5시 16분 41초 UTC+9, scrib...@gmail.com 님의 말:
Reply all
Reply to author
Forward
0 new messages