[커널 20차] 15주차

2023.08.13 22:50

이민찬 조회 수:126

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

S19iVynG8mz-V4pwRjRku_7WfUc6pLm3NKlC10Ii

 

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: 2-3LaBAii0hjIa2GcnGTBDEAe0Cvs7QJ2Z2Maw6B

 

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

cqjowSmd8TAAW2Eqs8szPKkLhnN5yPyJOxXqfSrg

 

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 프로세스의 종료 과정 분석 

번호 제목 글쓴이 날짜 조회 수
공지 [공지] 스터디 정리 노트 공간입니다. 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
XE Login