Analysis of Linux Kernel

Linux Kernel 에서의 Memory Barrier 구현

일반적인 명령어(instruction) 뿐만 아니라, Barrier 를 위한 명령어 또한 아키텍쳐마다 다릅니다.그리고, 컴파일러 Barrier 로 사용되는 Directive 도 컴파일러마다 다를 수 있습니다.이 때문에, Linux Kernel 에서는 몇가지 카테고리의 메모리 Barrier 를 정의해두고, 이러한 카테고리 별로 각...

atomic_set 연산에 대하여

start_kernel() -> cgroup_init_early 함수를 보면 아래와 같은 코드가 있습니다. atomic_set(&init_css_set.refcount, 1); 그런데, atomic_set 매크로는 아래와 같이 되어있군요. #define atomic_set(v,i) (((v)->counter) = (i)) 왜 그냥 init_css_set.refcount = 1 과 같이 하면 될 것을 굳이 이렇게 한꺼풀을...

arch/arm/kernel/head.S (5) – domain 과 PTE를 이용한 권한관리

arch/arm/kernel/head.S (5) – domain 과 PTE를 이용한 권한관리

__enable_mmu 함수의 코드에 다음과 같이 domain 을 설정하는 부분이 있었습니다. mov r5, #(domain_val(DOMAIN_USER, DOMAIN_MANAGER) | \               domain_val(DOMAIN_KERNEL, DOMAIN_MANAGER) | \               domain_val(DOMAIN_TABLE,...

arch/arm/kernel/head.S (4) – ALT_SMP 와 ALT_UP 의 동작원리

arch/arm/kernel/head.S (4) – ALT_SMP 와 ALT_UP 의 동작원리

이는 pv_table 과 유사한 패치 개념을 사용하기 때문에 이전 포스팅의 pv_table 을 정확히 이해했다면 수월하게 이해할 수 있습니다. ALT_SMP 와 ALT_UP 매크로는 SMP 용으로 빌드된 커널이 UP(Uni-processor)에서 실행될 때, SMP 용 명령어를 UP 용으로 패치하여...

arch/kernel/head.S (3) – pv_table 을 이용한 가상/물리주소 변환 원리

arch/kernel/head.S (3) – pv_table 을 이용한 가상/물리주소 변환 원리

가. Immediate 및 Rotate pv_table 을 이해하려면 먼저 add/sub 등 instruction 의 rotate field 와 immediate field 의 사용법을 기본적으로 이해해야 합니다. 32 bit 안에 add r0, r1, #0x81000000 와 같이 instruction type 뿐 아니라 condition,...

arm/kernel/head.S (2) – proc_info_list 구조체의 값은 누가 언제 채웠는가?

arm/kernel/head.S (2) – proc_info_list 구조체의 값은 누가 언제 채웠는가?

Makefile 을 보면 processor 관련 config 에 따라 arch/arm/mm 에서 build 하는 파일이 다릅니다. 우리 분석 환경의 .config 에는 다음과 같이 설정되어 있습니다. CONFIG_CPU_V7=y CONFIG_CPU_32v6K=y CONFIG_CPU_32v7=y CONFIG_CPU_ABRT_EV7=y CONFIG_CPU_PABRT_V7=y CONFIG_CPU_CACHE_V7=y CONFIG_CPU_CACHE_VIPT=y CONFIG_CPU_COPY_V6=y CONFIG_CPU_TLB_V7=y CONFIG_CPU_HAS_ASID=y CONFIG_CPU_CP15=y CONFIG_CPU_CP15_MMU=y...

arm/kernel/head.S (1) – Code Flow

arm/kernel/head.S (1) – Code Flow

arch/arm/boot/compressed/head.S 파일의 경우는 사실 이래저래 복잡해보여도, 핵심 역할은 다음과 같았습니다. 메모리에 올린 zImage 가 위치를 잘못잡았을 경우 이미지의 위치를 재배치한다. zImage 속에 삽입된 원래의 압축된 커널 이미지를 zImage 가 속한 128 M 메모리 경계 시작지점...

boot/compressed/head.S 코드 분석 (2)

boot/compressed/head.S 코드 분석 (2)

다음은 head.S 의 dtb_check_done 및 wont_overwrite label 의 어셈블리 코드를 분석한 것이다. 이 부분은 물리메모리에 로드된 커널 이미지가 압축이 풀린 후의 이미지 위치와 겹치는 부분이 있을 경우 재배치를 수행하는 코드이다. 문서에도 기록했지만, 로드된 이미지의 위치에...

boot/compressed/head.S 코드 분석 (1)

boot/compressed/head.S 코드 분석 (1)

아래 자료는 커널 이미지가 bootloader 에 의해 물리 메모리에 로드된 후 처음 수행되는 head.S 의 restart label 의 코드를 분석한 것이다. 초기 이미지의 로드 위치가 자칫 압축이 풀린 후의 이미지와 겹칠 것으로 예상될 경우, head.S 의...

로드된 zImage 의 경계별 메모리주소 획득방법

로드된 zImage 의 경계별 메모리주소 획득방법

boot/compressed/head.S 를 분석하다보면 zImage 의 시작위치나 page table 의 시작위치, 커널의 압축이 해제될 위치, dtb 의 위치 등 각 경계주소들을 구해보아야 이해가 쉬운 경우들이 있다. 이러한 경계주소들을 바탕으로 메모리에 어떤 것들이 배치되는지에 대한 memory map...