2018/08

    [ELF] Segment와 Program Header

    [ELF] Segment와 Program Header

    ELF 란 용어를 많이 들어보셨을텐데요, ELF는 Executable and Linking Format의 약어입니다. UNIX / LINUX 기반에서 사용되는 실행 및 링킹 파일 포맷입니다. 지난 글에 이어 이번 글에서는 ELF 파일 포맷에서 Program Header에 대해 알아보겠습니다. [이전 글]2018/08/27 - [Linux/Debugging & Testing] - [ELF] Executable and Linking Format - ELF Header Program HeaderProgram Header Table은 ELF내의 Segment들에 대한 정보와 그 Segment들을 메모리에 어떻게 로드해야 하는지에 대한 정보가 포함되어 있습니다. Segment란 앞 선 글에서도 설명하였지만 다시 ..

    [ELF] ELF Header

    [ELF] ELF Header

    ELF 란 용어를 많이 들어보셨을텐데요, ELF는 Executable and Linking Format의 약어입니다. UNIX / LINUX 기반에서 사용되는 실행 및 링킹 파일 포맷입니다. 이번 글에서는 ELF 파일 포맷에 대해 알아보겠습니다. 개념 및 사전 지식 정의ELF는 하나의 ELF Header와 파일데이터로 구성되어 있습니다. 아래 그림을 보시면 파일의 가장 위에 ELF Header 정보가 들어있고, 그 아래 program header table이 있습니다. 그 이후 Segment 정보와 Section 관련 정보들이 나오네요. ELF header Program header table Segment 1 Segment 2 ... Section header table optional ELF head..

    [커널분석] static void __init setup_machine_fdt(phys_addr_t dt_phys)

    fdt를 최초 셋업하는 함수입니다. 함수 인자로 phys_addr_t 자료형의 dt_phys를 전달받는다. 전달받은 주소를 이용해 부팅과정 중 먼저 필요한 항목에 대해 설정해준다. 185 static void __init setup_machine_fdt(phys_addr_t dt_phys)186 {187 void *dt_virt = fixmap_remap_fdt(dt_phys);188 const char *name;189190 if (!dt_virt || !early_init_dt_scan(dt_virt)) {191 pr_crit("\n"192 "Error: invalid device tree blob at physical address %pa (virtual address 0x%p)\n"193 "The..

    [커널분석] Architecture 별 분석을 위한 설정 (ctags & cscope)

    리눅스 커널 분석 시 많이 사용하는 툴로 ctags와 cscope를 많이 사용합니다. 하지만 분석 시 다양한 architecture에 따라 동일 네이밍의 함수나 매크로 등으로 인해 분석하기 쉽지 않은데요. 쉽게, 해결할 수 있는 방법을 알려드립니다. 리눅스 커널에서 스크립트 형태로 tags와 cscope란 옵션을 제공하고 있습니다.만약 arm64를 기반으로 분석한다고 하면 아래와 같이 설정해 주세요. $ make tags ARCH=arm64 $ make cscope ARCH=arm64 내부적으로 script를 작성해 놓았기 때문에 해당 Architecture에 해당하는 코드만 분석할 수 있습니다.

    void __init early_fixmap_init(void) (작성중...)

    [주의] - 코드 분석 시 잘못된 부분도 있을 수 있으므로, 참고만 부탁드립니다. [분석 기준] kernel version : linux kernel 4.16 architecture : aarch64 (arm64) [사전 지식]fixmap영역은 컴파일 타임에 가상 주소공간이 이미 결정된 매핑 메모리 영역입니다. 따라서 매핑된 메모리 영역을 사용하기 위해서 fixmap영역을 초기화 해줄 필요가 있습니다. 리눅스 커널은 pgd, pud, pmd, pte를 이용하여 페이징 기법을 제공하고 있습니다. pgd와 pud, pmd, pte 중 무엇을 사용하느냐에 따라 단계별 페이징으로 나뉠 수 있습니다. pgd -> pte을 사용하는 2단계 페이징, pgd -> pmd -> pte를 이용한 3단계 페이징, 4가지 모..

    [gdb] The GNU Debugger : 3. Stack 정보 분석하기

    스택은 현재 프로세스가 실행 중인 코드가 어디인지 확인할 수 있기에 매우 중요한 정보라고 할 수 있습니다. gdb에서는 종료되지 않은 함수를 하나의 frame이라고 합니다. 각 프레임은 스택에 쌓여있는 함수, 아직 종료되지 않은 함수라고 보시면 됩니다. 각 프레임은 Caller와 Callee의 관계를 구성하게 되죠. 이번 예제는 아래 코드를 사용하겠습니다. #include #include void func4(int a, int b) { printf("sum : %d\n", a + b); } void func3(int a, int b) { return func4(a, b); } void func2(int a, int b) { return func3(a, b); } void func1(int a, int b..