[커널 20차] 16주차
2023.08.20 21:26
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/
Q.: b.ls에서 ls는 작거나 같은 경우를 의미한다. 이 때, 작거나 같은 경우인지 어떻게 판단하나요?
A1: cmp 명령어에서 플래그를 만드는데, 작은 경우는 C 플래그가 0인 경우이고, 같은 경우는 Z 플래그가 1인 경우입니다. 따라서 C 플래그가 0이거나 Z 플래그가 1이라면 조건에 부합합니다.
A2: https://ezbeat.tistory.com/359
A3:
(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번 인덱스가 쓰인다.
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
-
PAGE_SIZE, PMD_SIZE
Q.: PMD_TYPE_TABLE 0x03, SWAPPER_RX_MMUFLAGS 0x781과 같은 flags가 시스템에 어떻게 반영되나요? 주소의 하위 12비트에 플래그 값을 써주는 것만으로 해당 주소에 대한 권한을 설정할 수 있다는 것이 이해되지 않습니다.
A1: Armv8 엔트리 포맷을 보면 하위 12비트의 쓰임을 알 수 있다.
A2:
A3: Lower attribute
A4: http://jake.dothome.co.kr/pt64/
A5: 더 자세한 내용은 찾아봐야 할 것 같습니다.
Q.: 완성한 pgd, pud, pmd
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 구조체는 이 스택의 최상단에 위치하고 있습니다.
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
공지 | [공지] 스터디 정리 노트 공간입니다. | 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 |
.