[커널 20차] 16주차

2023.08.20 21:26

이민찬 조회 수:132

 

 

2023.08.19 (16주차) - 약 13명 참여

1. 리눅스 커널 6.4.2 분석 

head.S : create_idmap의 map_memory까지 진행

 

Q.: 페이지 크기가 4K인 경우, SWAPPER_PGTABLE_LEVELS는 CONFIG_PGTABLE_LEVELS보다 1 작은 값으로 설정합니다. 그 이유는 무엇인가요?

A1: 주석을 보면 커널 이미지가 2M align 되어있고, 페이지 크기가 4K인 경우 섹션 매핑을 사용할 수 있기 때문이라고 나와있습니다. 

A2: http://jake.dothome.co.kr/head-64-60/

jSadqbnRWVWfDgvgyMQzrNBPp0Ja8PpQLiPtLEyZ

 

Q.:  b.ls에서 ls는 작거나 같은 경우를 의미한다. 이 때, 작거나 같은 경우인지 어떻게 판단하나요?

A1: cmp 명령어에서 플래그를 만드는데, 작은 경우는 C 플래그가  0인 경우이고, 같은 경우는 Z 플래그가 1인 경우입니다. 따라서 C 플래그가 0이거나 Z 플래그가 1이라면 조건에 부합합니다. 

A2: https://ezbeat.tistory.com/359

A3: 

 WfxktUX8l-s0FN3uO2NdrXjD48uZ9b7WEAqiAPJt (32bit의 경우)

cmp에 사용되는 연산은 빼기(substract) 입니다.

 

Q: pgd, pud, pmd를 만드는 과정에서 인덱스에 대한 질문입니다. pgd는 0번 인덱스가 사용됐지만, pud는 1번 인덱스가 사용된 이유가 뭔가요?

A1: 인덱스를 istart와 iend에 의해 결정이 되는데, istart와 iend는 가상 주소의 비트에 의해 결정이 된다. 결국에는 주소에 따라 시작 인덱스는 달라진다.

A2: 각 페이지 테이블이 커버할 수 있는 주소 범위의 크기를 보게 되면, 어떤 인덱스에 값이 들어가는지는 당연하게 된다. pgd의 각 엔트리는 512GB를 커버할 수 있는데, 매핑하려는 주소 크기가 512GB 보다 작으므로 pgd의 0번 인덱스를 사용하였다. pud의 각 엔트리는 1GB를 커버할 수 있는데 1GB = 0x4000_0000이므로 pud에서는 1번 인덱스는 1G~2G를 커버하므로 pud에서는 1번 인덱스가 쓰인다.  520cyhHu5jkTzPSbsL71NsZL6lsAraY2TR9li9RO

A3: 예를 들어, 커널이미지 0x4020_0000 ~ 0x4308_0000 주소를 커버하는 PGD는 언제나 0, PUD는 언제나 1, PMD는 1~24 입니다.


 

Q.: pmd를 만드는 과정에서 SWAPPER_BLOCK_SIZE 라는 심볼이 사용됩니다. 이 변수의 이름에서 SWAPPER는 무엇을 의미하나요? swapper page table과 관련이 있나요?

1) Swapper process란?

A1: https://wiki.kldp.org/KoreanDoc/html/Boot_Process-KLDP/swapper.html

A2: pid 가 0 인 swapper 프로세스만은(이건 프로세스라기 보다는 운영체제 자체라고 해도 좋을 거 같습니다.) 부모가 존재하지 않는 프로세서.

A3: "잠들어" 있는 프로세스를 메모리에서 내려서 디스크 공간에 잠시 "스왑” 역활을 하는 프로세스

      

2) Swapper page table 이란?

A1: Swapper process가 운영체제(커널) 그 자체라고 설명하는것을 봐서 리눅스 커널을 mapping한   Page Table이 아닐까 하는 추측을 할수 있다.

 

Q: 페이지 테이블 PAGE_SHIFT, PMD_SHIFT, PAGE_SIZE, PMD_SIZE 등들 설명

A1: https://www.kernel.org/doc/gorman/html/understand/understand006.html

A2: PAGE_SHIFT, PMD_SHIFT

Gqu3hVJOXxgu-b406IMJ4aI5rkkeVHElU8SpQb5y

 

  1. PAGE_SIZE, PMD_SIZE1v60qg_84Lo9zmoP7szDL3_-GIkN6ylTDCKYNDlj


 

Q.:  PMD_TYPE_TABLE 0x03, SWAPPER_RX_MMUFLAGS 0x781과 같은 flags가 시스템에 어떻게 반영되나요? 주소의 하위 12비트에 플래그 값을 써주는 것만으로 해당 주소에 대한 권한을 설정할 수 있다는 것이 이해되지 않습니다.

A1: Armv8 엔트리 포맷을 보면 하위 12비트의 쓰임을 알 수 있다.

A2: 

lmeJm1liX6UiPsHigB_gBK9CtMQTO8fWWg0zOVQA

A3: Lower attribute

PgVZl394DJTCkh0JIOdi6mNztbeawmR0Ik2HLPKb

A4: http://jake.dothome.co.kr/pt64/ 

A5: 더 자세한 내용은 찾아봐야 할 것 같습니다.

 

Q.: 완성한 pgd, pud, pmd

  1.  

0_RjEKl1UJ5ARHZWrTHgOvnyR976b3TVI7ViTGRQ

 

2. 디버깅을 통해 배우는 리눅스 커널의 구조와 원리

~4.9 스레드 정보: thread_info 구조체 까지 진행 

 

 

4.8 태스크 디스크립터(task_struct 구조체)

Q:  자식 스레드가 존재할 수 있나요? (4.8.1,  205p)

4.8.2 바로 위에 "자식스레드인 경우 tid, pid가 다릅니다"

저 부분이 자식 스레드가 아닌 자식 프로세스여야하는거 같습니다

A1: 리더스레드가 아닌 스레드라고 생각합니다.

A2: 질문에서 남겨주신 것처럼 POSIX에서 스레드 간 상하 관계가 없다고 알고 있습니다. 여기서의 스레드, 프로세스 표현은 엄밀하게 쓰이지 않은 것 같습니다. 이전 장에서도 커널 프로세스와 커널 스레드를 구분하지 않은 것을 볼 수 있었습니다.

 

Q.: task_struct 구조체에서 연결리스트를 사용하는 이유는 무엇인가요? 

A1: 여러 자료 구조를 사용하지만, 필요에 의해 연결리스트를 사용하였다. 

A2: https://velog.io/@mythos/Linux-Tutorial-19-linked-list-%EC%99%80-listsort-%ED%95%A8%EC%88%98

A3: https://satisfactoryplace.tistory.com/200

 

4.9 스레드 정보: thread_info 구조체

Q.: task_struct는 연결리스트이고 thread_info는 스택인 이유는 무엇인가요?

A1: task_struct가 연결리스트인 것은 아닙니다. 또한 thread_info가 스택인 것도 아닙니다. task_struct, thread_info, 스택, 큐 등은 모두 자료 구조입니다. task_struct의 tasks 필드가 연결리스트로 구현이 되어있고, 프로세스마다 스택 공간이 할당되는데 thread_info 구조체는 이 스택의 최상단에 위치하고 있습니다.

번호 제목 글쓴이 날짜 조회 수
공지 [공지] 스터디 정리 노트 공간입니다. woos 2016.05.14 627
248 [커널 19차] 103 주차 Min 2024.04.28 5
247 [커널 20차] 48주차 무한질주 2024.04.25 22
246 [커널 19차] 102 주차 Min 2024.04.20 37
245 [커널 19차] 101 주차 Min 2024.04.13 63
244 [커널 19차] 100 주차 Min 2024.04.13 16
243 [커널 19차] 99 주차 Min 2024.03.30 82
242 [커널 19차] 98 주차 Min 2024.03.23 55
241 [커널 19차] 97 주차 Min 2024.03.16 50
240 [커널 19차] 96 주차 Min 2024.03.14 32
239 [커널 19차] 95 주차 [2] Min 2024.03.03 111
238 [커널 20차] 32주차 brw 2023.12.16 386
237 [커널 20차] 29주차 brw 2023.11.27 161
236 [커널 20차] 27주차 brw 2023.11.21 86
235 [커널 20차] 26주차 brw 2023.11.21 48
234 [커널 20차] 28주차 이민찬 2023.11.19 64
233 [커널 20차] 25주차 이민찬 2023.10.30 120
232 [커널 20차] 24주차 이민찬 2023.10.22 745
231 [커널 20차] 23주차 이민찬 2023.10.14 81
230 [커널 20차] 22주차 이민찬 2023.10.08 76
229 [커널 20차] 21주차 이민찬 2023.09.23 116
XE Login