숙지하고 있습니까? 당신? Arm 64 커널을 공부한다? 1.1 ARMv8 소개 4 1.1.1 익셉션 모델 5 1.1.2 익셉션 레벨 변경 6 1.1.3 실행 상태 7 1.1.4 실행 상태 변경 7 1.2 ARMv8 레지스터 8 1.2.1 프로세서 상태 레지스터(PSTATE) 9 1.2.2 AArch64 특수 목적 레지스터 10 1.2.3 시스템 레지스터 12 1.2.4 ABI의 레지스터 사용 규칙 12 1.3 AArch64 익셉션 핸들링 13 1.3.1 익셉션 타입 14 1.3.2 동기 및 비동기 익셉션 15 1.3.3 익셉션 핸들링 16 1.3.4 익셉션에 의해 변경되는 실행 상태와 익셉션 레벨 17 1.3.5 AArch64 익셉션 벡터 테이블 19 1.3.6 인터럽트 핸들링 20 1.3.7 GIC 표준 인터럽트 컨트롤러 21 1.4 캐시 21 1.4.1 캐시 구조 22 1.4.2 캐시 컨트롤러 24 1.4.3 캐시 정책 24 1.4.4 캐시 일관성의 두 가지 관점 25 1.4.5 캐시 관리 27 1.4.6 캐시 탐색 27 1.5 MMU 28 1.5.1 가상 주소를 물리 주소로 변환 29 1.5.2 AArch64의 테이블 디스크립터 종류 30 1.5.3 커널과 애플리케이션의 가상 주소 공간 분리 32 1.5.4 변환 테이블의 cacheable과 shareable 속성 33 1.5.5 디스크립터 메모리 속성 34 1.5.6 시큐리티와 MMU 36 1.5.7 컨텍스트 스위칭 36 1.6 메모리 오더링 37 1.6.1 메모리 타입 39 1.6.2 배리어 41 1.6.3 메모리 속성 42 1.7 멀티코어 프로세서 44 1.7.1 멀티프로세싱 시스템 44 1.7.2 캐시 일관성 47 1.7.3 클러스터 내의 멀티코어 캐시 일관성 48 1.7.4 버스 프로토콜과 캐시 일관성 인터커넥트 51 1.8 전력 관리 52 1.8.1 유휴 상태 관리 52 1.8.2 소비전류 관련 인스트럭션 54 1.8.3 PSCI 54
(1) Arm 리눅스 커널 1장 (1조 이파란) : 5p 하이퍼바이저와 보안모니터의 주체 (하드웨어적? 소프트웨어적으로? 펌웨어?) - hypervisor mode desciptions : 2140 PAGE - https://static.docs.arm.com/ddi0487/db/DDI0487D_b_armv8_arm.pdf (2) Arm 리눅스 커널 1장 (1조 최지영) : 18p 익셉션 모드가 어떤 상황일 때 하이퍼 바이저로 전환되는지? - 호스트가 자신을 지탱하는 하이퍼 바이저에게 서비스를 요청하면 바뀜. (3) ARM 리눅스 커널 1장 (4조 박진우) : AArch64 는 V7A와 같이 CP15를 통한 Coprocessor을 지원하지 않음. - 대표적인 ARMv8A의 SoC칩들은 GPU 나 전원/외부단순 인터페이스용으로 Cortex-M Core 을 가지고 있는 경우가 있음. (4) ARM 리눅스 커널 1장(3조 김태형) : 익셉션 벡터 테이블 옵셋이 기존 ARM 아키텍쳐에서는 4Byte이었는데 128Byte로 바꾼 이유? - aarch64 의 Exception Table 사용 예시 (리눅스 메일링 리스트 인용) - https://lore.kernel.org/patchwork/patch/312340/ - Aarch64에서는 exception table에 명령어를 넣고 (aarch32의 어셈블리라면 2배로 더 많이 들어감) - http://recipes.egloos.com/5035801 - 차후 Exception table을 다루는 단원/코드 분석에서 보자! (5) ARM 리눅스 커널 1장 (3조 김태형) : 31페이지의 주소변환 테이블의 구성 이미지가 있는데 블록 디스크립터가 어떻게 맵핑이 되는지? - 매핑한 페이지 디스크립터
Chap 4. Memory Management and Allocators 중 - Page mobility and placement 까지 읽음 (p122 시작부)
__alloc_pages_slowpath 복습
9장. 프로세스 주소공간 : p399 '주소 공간 밖의 잘못된 주소 처리하기' 까지 진행
9장. 프로세스 주소공간 p408 '불연속적인 메모리 영역 접근 처리'까지 진행
12장 - 가상 파일 시스템 역할, 파일 객체, 아이노드 객체, 디엔트리 객체, 디엔트리 객체 캐시
15장 - 페이지 캐시에서 페이지 캐시처리 함수 부분
17장 - 페이지 프레임 회수 p692 'LRU 리스트 시이의 페이지 이동'까지 진행
17장 - 페이지 프레임 회수 p705 '아이노드 캐시에서 페이지 프레임 회수하기'까지 진행
17장 - 페이지 프레임 회수 p720 'sys_swapoff() 서비스 루틴'까지 진행
17장 - 페이지 프레임 회수 p730 '스왑 캐시에서 페이지 프레임 제거하기'까지 진행
17장 - 페이지 프레임 회수 마치고 요약정리 진행
10장 Page Frame Reclamation 진행
__alloc_pages_nodemask (mm/page_alloc.c) : heart' of the zoned buddy allocator. - __alloc_pages_slowpath(alloc_mask, order, &ac) (mm/page_alloc.c) -- get_page_from_freelist(gfp_t gfp_mask, unsigned int order, int alloc_flags, const struct alloc_context *ac) (/mm/page_alloc.c) : for_next_zone_zonelist_nodemask(zone, z, ac->zonelist, ac->high_zoneidx, ac->nodemask) { ret = node_reclaim(zone->zone_pgdat, gfp_mask, order); --- node_reclaim(zone->zone_pgdat, gfp_mask, order) (/mm/vmscan.c) ---- __node_reclaim(pgdat, gfp_mask, order) (/mm/vmscan.c) : struct scan_control sc 설정함. do { shrink_node(pgdat, &sc); } while (sc.nr_reclaimed < nr_pages && --sc.priority >= 0); ----- shrink_node(pgdat, &sc) (/mm/vmscan.c) : do{ } while (should_continue_reclaim(pgdat, sc->nr_reclaimed - nr_reclaimed, sc->nr_scanned - nr_scanned, sc)); ------ should_continue_reclaim (/mm/vmscan.c) /* * Reclaim/compaction is used for high-order allocation requests. It reclaims * order-0 pages before compacting the zone. should_continue_reclaim() returns * true if more pages should be reclaimed such that when the page allocator * calls try_to_compact_zone() that it will have enough free pages to succeed. * It will give up earlier than that if there is difficulty reclaiming pages. */ static inline bool should_continue_reclaim(struct pglist_data *pgdat, unsigned long nr_reclaimed, unsigned long nr_scanned, struct scan_control *sc)
v2.6.16.62 -> v2.7.17 [PATCH] vmscan: rename functions We have: try_to_free_pages ->shrink_caches(struct zone **zones, ..) ->shrink_zone(struct zone *, ...) ->shrink_cache(struct zone *, ...) ->shrink_list(struct list_head *, ...) ->refill_inactive_list((struct zone *, ...) which is fairly irrational. Rename things so that we have try_to_free_pages ->shrink_zones(struct zone **zones, ..) ->shrink_zone(struct zone *, ...) ->shrink_inactive_list(struct zone *, ...) ->shrink_page_list(struct list_head *, ...) ->shrink_active_list(struct zone *, ...) static void refill_inactive_zone(struct zone *zone, struct scan_control *sc) -> static void shrink_active_list(unsigned long nr_pages, struct zone *zone, struct scan_control *sc) # v5.1 기준 이름 변경 사항 반영 관련 try_to_free_pages(struct zonelist *zonelist, int order, (/mm/vmscan.c) gfp_t gfp_mask, nodemask_t *nodemask) : struct scan_control sc 설정함. - do_try_to_free_pages(zonelist, &sc) : (/mm/vmscan.c) -- shrink_zones(zonelist, sc) : (/mm/vmscan.c) : for_each_zone_zonelist_nodemask(zone, z, zonelist, sc->reclaim_idx, sc->nodemask) { shrink_node(zone->zone_pgdat, sc); --- shrink_node(zone->zone_pgdat, sc) (/mm/vmscan.c) : do{} while (should_continue_reclaim(pgdat, sc->nr_reclaimed - nr_reclaimed, sc->nr_scanned - nr_scanned, sc)); ---- shrink_node_memcg(pgdat, memcg, sc, &lru_pages); : for_each_evictable_lru(lru) { nr_reclaimed += shrink_list(lru, nr_to_scan, lruvec, sc); ----- shrink_list(lru, nr_to_scan, lruvec, sc) (/mm/vmscan.c) : return shrink_inactive_list(nr_to_scan, lruvec, sc, lru); ------ shrink_active_list(nr_to_scan, lruvec, sc, lru) (/mm/vmscan.c) : a helper for shrink_node(). It returns the number of reclaimed pages ------- shrink_page_list(&page_list, pgdat, sc, 0, &stat, false) (/mm/vmscan.c) : returns the number of reclaimed pages ----- shrink_inactive_list(nr_to_scan, lruvec, sc, lru); : a helper for shrink_node(). It returns the number of reclaimed pages