[커널 20차] 15주차
2023.08.13 22:50
2023.08.12 (15주차) - 약 13명 참여
1. 커널 소스코드 분석
head.S : create_idmap의 첫 번째 populate_entries 까지 진행 (가상 주소 48비트, 페이지 크기 4K 가정하고 진행, 이외의 케이스는 다시 돌아와서 정리할 예정)
< map_memory >
Q: 인자로 전달되는 값 중 order의 값은?
A: PGD는 9bit 필드이므로, 2^9 = 512에 log2를 취한 값 -> 9
Q: add \rtbl, \tbl, #PAGE_SIZE 에서 rtbl은 다음 1 레벨 페이지 테이블을 가리키는데, 그것이 이해가 되지 않습니다.
A:
Init_idmap_pg_dir
Init_idmap_pg_dir은 5개의 페이지를 사용한다. 우리가 컴파일한 커널의 경우 PGD, PUD, PMD 3개를 사용하는데 주소 값에 따라 5개의 페이지를 사용할 수 있습니다.
위 그림에서 PGD의 시작 주소를 0x00으로 가정해본다. PGD의 엔트리 개수는 2^9 개이고 (9bit 이므로) 각 엔트리에 8바이트 데이터가 저장되므로 PGD의 크기는 2^12 == 4K == page size 이다. 그리고 주석에 typically 라고 표현할 것으로 봐서 모든 경우에 해당하지는 않을 것 같습니다.
Q: Kconfig에는 가상 주소 48비트에 페이지 크기 64K 인 경우 3 레벨 페이지 테이블을 만들게끔 config 되어있습니다. 페이지 크기가 64K이므로 offset은 16bit이고, 그렇다면 32bit로 3 레벨 페이지 테이블을 구성하는 것인데, 각 페이지 테이블은 몇 비트로 구성될까요? 그 이유는 무엇일까요?
A: http://jake.dothome.co.kr/head-64-60/ 를 참고하면 6bit, 13bit, 13bit 로 구성되는 것을 알 수 있습니다. (그 이유와 이 경우에는 페이지 테이블이 어떻게 생겼는지에 대한 논의는 default case인 VA 48bit, page size 4K를 학습하고 돌아와서 논의할 예정)
Q: 페이지 테이블을 이용해 가상 주소를 물리 주소로 변환하는 과정을 그림으로 설명
A:
PGD: 가상 주소의 PGD에 해당하는 비트의 값은 PGD의 엔트리 번호이고, 그 엔트리에 저장된 값은 PUD의 시작 주소이다.
PUD: 가상 주소의 PUD에 해당하는 비트의 값은 PUD의 엔트리 번호이고, 그 엔트리에 저장된 값은 PMD의 시작 주소이다.
PMD: 가상 주소의 PMD에 해당하는 비트의 값은 PMD의 엔트리 번호이고, 그 엔트리에 저장된 값은 PTE의 시작 주소이다.
PTE: 가상 주소의 PTE에 해당하는 비트의 값은 PTE의 엔트리 번호이고, 그 엔트리에 저장된 값은 pfn(page frame number)이다.
offset: pfn으로 페이지에 접근한 후 offset을 사용해 정확한 physical memory를 찾는다.
< map_memory 내의 compute_indices >
istart, iend, count를 return 하는 매크로
범용적으로 사용되는 매크로이지만, pgd를 만드는 경우에 한정해서 작성.
Q: ubfx \istart, \vstart, \shift, order의 의미는 무엇일까요?
A: ubfx는 unsigned bit field extract를 의미한다. shift를 lsb로 해서 order 만큼 떨어진 비트까지 추출한다. 오늘 학습한 내용에서는 vstart의 pgd에 해당하는 비트를 의미한다.
< map_memory 내의 populate_entries >
Q: phys_to_pte \tmp1, \rtbl 의 의미는?
A: 우리가 가정한 case에서는 tmp에 rtbl을 대입한다. 이제 tmp를 rtbl로 생각해도 된다.
Q: PMD_TYPE_TABLE
Q: str \tmp1, [\tbl, \index, lsl #3] 의 의미는?
A: \tmp1은 rtbl로 생각해도 된다고 위에서 봤다. 그러면 tbl[index] = rtbl 이다. index를 lsl 3 하는 이유는 각 엔트리에 8바이트 데이터가 저장되어 있기 때문이다. 예를 들면, index가 1이라면 *(tbl + 0x08) = rtbl 이고, index가 2라면 *(tbl + 0x10) = rtbl 이다.
Q: cmp \index, \eindex를 한 후 b.ls 의 .Lpe\@의 의미는?
A: index와 eindex를 비교해서 flag를 세운다. 여기서 eindex는 iend를 의미한다. 비교해서 만약 index <= eindex 라면 루프를 도는 것을 의미한다.
C 코드 변환
void populate_entries(IN U64 * tbl, IN_OUT U64 ** rtbl, U64 index, U64 eindex, U64 flags, U64 inc) { U64 tmp1; do { tmp1 = phys_to_pte((U64)*rtbl); tmp1 |= flags; // tmp1 = table entry tbl[index] = tmp1; // str tmp1, [tbl, index, lsl #3] *rtbl += (inc/sizeof(U64)); // rtbl = pa next level ++index; } while(index < eindex); } |
여기까지 마치면 PGD가 만들어진다.
2. 디버깅을 통해 배우는 리눅스 커널의 구조와 원리
4.5 커널 스레드 ~4.7 프로세스 종료 과정 분석
4.5 커널 스레드
Q. 175p 커널 스레드함수 kthread_create() 의 매개변수 중 int node 의 역할이 무엇인지 ?
A: To do
Q.: 180p 17번째줄 schedule() 함수 호출 이후에는 코드 진행이 어떻게 되는지?
A: ktheadd 프로세스는 179page 17줄 코드에서 정지된 상태(TASK_INTERRUPTIBLE) 로 있음. 이때 kthread 생성 함수를 호출하면 __kthread_create_on_node 함수가 호출되고 177 페이지 해당 함수 내부의 wake_up_process()함수가 호출 -> 그러면 다시 kthreadd프로세스는 179page 18라인 코드(__set_current_state(TASK_RUNNING))가 실행됨..
(참고 : https://sonseungha.tistory.com/248 - 리눅스 커널 프로세스 상태 분석)
Q.: 183 page에서 _do_fork()의 함수 포인터로 kthread 함수를 넘기는데 커널 스레드를 생성할때는 항상 kthread 함수를 먼저 실행시키는가?
A: To do
4.6 커널 내부 프로세스의 생성 과정
4.7 프로세스의 종료 과정 분석
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
공지 | [공지] 스터디 정리 노트 공간입니다. | woos | 2016.05.14 | 627 |
228 | [커널 20차] 20주차 [2] | 이민찬 | 2023.09.17 | 182 |
227 | [커널 20차] 19주차 | 이민찬 | 2023.09.10 | 103 |
226 | [커널 20차] 18주차 | 이민찬 | 2023.09.03 | 85 |
225 | [커널 20차] 17주차 | 이민찬 | 2023.08.27 | 129 |
224 | [커널 20차] 16주차 | 이민찬 | 2023.08.20 | 132 |
223 | [커널 19차] 64 주차 | Min | 2023.08.19 | 91 |
» | [커널 20차] 15주차 | 이민찬 | 2023.08.13 | 126 |
221 | [커널 19차] 63 주차 | Min | 2023.08.12 | 60 |
220 | [커널 19차] 62 주차 | Min | 2023.08.05 | 79 |
219 | [커널 20차] 13주차 | 이민찬 | 2023.07.30 | 107 |
218 | [커널 19차] 61 주차 | Min | 2023.07.30 | 45 |
217 | [커널 20차] 12주차 | 이민찬 | 2023.07.22 | 87 |
216 | [커널 19차] 59 ~ 60 주차 | Min | 2023.07.22 | 37 |
215 | [커널 18차] 113주차 | kkr | 2023.07.22 | 78 |
214 | [커널20차] 11주차 | 이경재 | 2023.07.15 | 86 |
213 | [커널20차] 10주차 | 이경재 | 2023.07.09 | 90 |
212 | [커널20차] 9주차 | 이경재 | 2023.07.02 | 85 |
211 | [커널 19차] 58 주차 | Min | 2023.07.01 | 41 |
210 | [커널 19차] 56 ~ 57 주차 | Min | 2023.06.25 | 40 |
209 | [커널 18차] 109주차 | kkr | 2023.06.24 | 33 |
.