[커널 17차] 37주차
2021.05.16 02:01
map_kernel()
- rodata는 나중에 mapping을 다시 할 것이기 때문에 cont mapping을 하지 않는다
- 나머지는 remapping을 할 일이 없기 때문에 cont mapping을 허용한다
- data 영역만 VM_NO_GUARD를 안 넣고 guard page를 넣는다
- guard page는 data write시 영역을 넘어가는 것을 탐지하기 위해 사용된다
- guard page는 mapping은 안되어 있고 vma size에는 추가되어 있다
- kernel image의 마지막에 guard page를 넣어 주는 것임 --> compiler 호환성 문제 X
- kernel image 중간에 guard page를 삽입하면 안된다
- 그 다음 영역은 vmalloc 영역이고 vmalloc 사용시 사용되는 vma 자료구조에서는 guard page를 사용하는 경우엔 어차피 page 한 개를 더 할당하므로 문제 없는 것으로 보임
- kernel memory에 mapping이 안되어 있는 영역에 접근하면 무조건 panic으로 죽게 되어 있고 나중에 dump하면 해당 가상 주소에 접근해서 죽었단는 것을 알 수 있다
- vmalloc에서는 할당 단위마다 guard page를 할당한다
- 현재 fixmap으로 임시 할당받은 pgdp 기준으로 FIXADDR_START 가상주소가 매핑된 pgd index entry에 어떤 물리주소가 매핑되어 있는지 본다
- 만약 매핑된 물리주소가 없으면 init_pg_dir에서 FIXADDR_START에 매핑된 물리주소를 복사해서 pgdp의 FIXADDR_START에 해당하는 pgd entry에 쓴다
- 먄약 fixmap으로 임시 할당받은 pgdp 기준으로 FIXADDR_START 가상주소에 해당하는 index의 pgd entry가 비어 있지 않은 경우, 이는 kernel image를 매핑한 pgd entry와 겹친다는 의미이다.
- 이 경우는 16KB page granule 및 4-level page table을 쓰는 경우이고 이 경우엔 pud entry에 init_pg_dir에서 FIXADDR_START에 매핑된 물리주소를 복사해서 사용한다.
- 여기서 bm_pmd는 early_fixmap_init() 할 때 pudp를 매핑할 때 사용한 전역 변수 array 주소이다 (pud entry가 가리키는 pmd의 시작 주소)
lm_alias
- kimage 또는 linear mapping 가상 주소를 linear mapping 가상 주소로 바꿔준다
- 안써도 기능상 무관하고 커널 config에 따라 warning이 뜨게 된다
__pa = __virt_to_phys = __virt_to_phys_nodebug = __lm_to_phys : __kimg_to_phys
CONFIG_DEBUG_VIRTUAL를 쓰면
__pa = __virt_to_phys : !__is_lm_address 이면 warning 뜬다
__lm_to_phys = x + physvirt_offset
__kimg_to_phys = x - kimage_voffset
__va = __phys_to_virt = x - physvirt_offset
- swapper_pg_dir도 보안 때문에 이제 RO 영역이고 따라서 변경하기 위해서는 fixmap을 이용해서 변경해야 한다. (예전에는 RW 영역이었음)
- 그런데 현재 paging_init() 시점에서는 init_pg_dir 자체는 RW이기 때문에 fixmap 안써도 매핑은 가능하다
- clear_fixmap() 할 때마다 TLB flush를 안하기 위해서 fixmap 사용?
==================================================
Memory sequence
- memmap, vmemmap
- per-cpu
- page allocator
- buddy system
- pcp
- compaction
- reclaim
- LRU
- pagevec
- swap
- pageout
- slab
- kmalloc
- vmalloc
- vmap
- cma, dma
- rmap
- pagefault
=====================================================
task context switching은 interrupt 처리가 끝나고 돌아갈 때 일어난다
preempt_disable()은 인터럽트가 끝나도 원래 task로 돌아간다
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
공지 | [공지] 스터디 정리 노트 공간입니다. | woos | 2016.05.14 | 627 |
68 | [커널 17차] 41주차 | ㅇㅇㅇ | 2021.06.13 | 36545 |
67 | [커널 18차] 3주차 | V4bel | 2021.06.12 | 103 |
66 | [커널 17차] 40주차 | ㅇㅇㅇ | 2021.06.05 | 283 |
65 | [커널 18차] 2주차 | V4bel | 2021.06.05 | 271 |
64 | [커널 17차] 39주차 | ㅇㅇㅇ | 2021.05.29 | 185 |
63 | [커널 18차] 1주차 | V4bel | 2021.05.29 | 3599 |
62 | [커널 17차] 38주차 | ㅇㅇㅇ | 2021.05.23 | 366 |
» | [커널 17차] 37주차 | ㅇㅇㅇ | 2021.05.16 | 97 |
60 | [커널 17차] 36주차 [2] | ㅇㅇㅇ | 2021.05.09 | 133 |
59 | [커널 17차] 35주차 | ㅇㅇㅇ | 2021.05.05 | 85 |
58 | [커널 17차] 34주차 | ㅇㅇㅇ | 2021.04.25 | 99 |
57 | [커널 17차] 33주차 | ㅇㅇㅇ | 2021.04.18 | 195 |
56 | [커널 17차] 32주차 | ㅇㅇㅇ | 2021.04.11 | 443 |
55 | [커널 17차] 31주차 [2] | ㅇㅇㅇ | 2021.04.04 | 158 |
54 | [커널 17차] 30주차 [1] | 주영 | 2021.03.30 | 203 |
53 | [커널 17차] 29주차 | ㅇㅇㅇ | 2021.03.26 | 103 |
52 | [커널 17차] 27주차 | 주영 | 2021.03.15 | 276 |
51 | [커널 17차] 27주차 | 주영 | 2021.03.08 | 172 |
50 | [커널 17차] 26주차 | 주영 | 2021.03.01 | 539 |
49 | [커널 17차] 25주차 | 주영 | 2021.02.23 | 91 |
.