[커널 17차] 37주차

2021.05.16 02:01

ㅇㅇㅇ 조회 수:97

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로 돌아간다

XE Login