[커널 17차] 33주차

2021.04.18 00:04

ㅇㅇㅇ 조회 수:195

arm64_memblock_init() 마지막 진행

 

cma_declare_contiguous()
- cma_declare_contiguous_nid() 수행
- nid로 NUMA_NO_NODE 추가

 

cma_declare_contiguous_nid()
- memblock_end는 DRAM memblock 끝 주소로 설정
- 32bit system호환성 때문에 highmem이 사용된다
- 아래와 같이 sanity check를 수행한다
+-- cma_areas 배열이 다 차있으면 에러 리턴
+-- size가 0이거나 alignment가 없거나 2의 승수가 아니면 에러 리턴
+-- fixed인데 base가 align이 안맞으면 에러 리턴
+-- base/size를 모두 align시킴
+-- limit에서 align 안맞는 부분은 버림
+-- base가 0이 되면 fixed는 false로 설정
+-- size가 order_per_bit으로 align되어 있는지 체크
+-- fixed인데 base부터 size까지가 highmem boundary를 cross하면 에러 리턴
+-- limit이 0이거나 limit이 memblock_end보다 크면 limit을 memblock_end로 설정
+-- base + size가 limit보다 크면 에러 리턴
- fixed이면 base부터 size만큼이 이미 reserve되어 있는지 보고 아니면 해당 영역을 reserve한다
- fixed가 아니면 다음과 같이 memblock reserve 시도
+-- base가 highmem보다 작고 limit은 큰 경우엔 우선 highmem start부터 limit까지 size만큼의 영역을 찾고 reserve 시도한다
+-- 만약 안되면 base부터 highmem start까지 size만큼의 영역을 찾고 reserve 시도한다
+-- 둘 다 실패하면 에러 리턴
- 이후 찾은 영역에 대해 cma_init_reserved_mem() 실행하여 default cma 설정한다
- 실패하면 다시 memeblock_free하고 에러 리턴
- 성공하면 0 리턴


high memory
- 32bit system에서
- 760MB는 linear mapping, 나머지 240MB는 vmap/kmap처럼 map/unmap하여 일시적으로 사용하였다
- 이 때 240MB 영역을 high memory 영역이라고 한다


memblock_alloc_range_nid(size, align, start, end, nid, flags)
- start부터 end까지 size만큼 연속된 영역을 찾고 memblock_reserve한다
- 우선 요청된 nid 영역만 찾아보고 안되면 nid랑 무관하게 찾는다
- 우선 flag 맞는 영역을 찾고 아니면 무관한 영역 포함해서 찾는다


paging_init()
- fixmap API로 swapper_pg_dir의 물리주소에 임시 가상 주소를 할당해서 받아온다
- 일단 현 시점에서는 fixmap 영역은 init_pg_dir 영역을 이용해서 setting되어 있다
- 따라서 fixmap API를 쓰면 init_pg_dir을 이용해서 임시 매핑해준다
- 일단 링커 스크립트를 보면 init_pg_dir, swapper_pg_dir, idmap_pg_dir 모두 _text와 _end 사이에 있음 --> 모두 커널 이미지 내부에 속해있는 것으로 보임


ARM v8.5 BTI
- https://developer.arm.com/documentation/102433/0100/Jump-oriented-programming
- https://developer.arm.com/documentation/ddi0596/2020-12/Base-Instructions/BTI--Branch-Target-Identification-
- https://community.arm.com/developer/ip-products/processors/b/processors-ip-blog/posts/armv8-1-m-pointer-authentication-and-branch-target-identification-extension
- Jump oriented programming 공격을 막기 위한 기능
- BR/BLR을 수행하면 자동으로 PSTATE.BTYPE에 BR 또는 BLR type을 저장한다
- BR/BLR은 항상 BTI 명령어로만 점프하게 만든다 (만약 아니면 exception 발생)
- BTI에 도착하면 BTI의 operand와 PSTATE.BTYPE이 일치하는지 확인한다
- 다르면 exception을 발생시킨다

 

==================================

 

qspinlock 스터디

전체 구조 그림 + qspinlock 전반적 설명
- https://www.programmersought.com/article/69965557777/

다음 시간에 코드 들어갈 예정

XE Login