리눅스 커널 소스의 구조 및 objdump 바이너리 유틸리티
·
Linux/Linux Kernel
리눅스 커널 소스의 구조arch : 아키텍처별로 동작하는 커널 코드arm : 32bit 계열 ARM 아키텍처 코드가 있으며, 라즈비안도 이 하부 디렉터리 코드를 실행함arm64 : 64bit 계열 ARM 아키텍처 코드가 있음x86 : 폴더 이름과 같이 인텔 x86 아키텍처 코드가 있음include : 커널 코드 빌드에 필요한 헤더파일이 있음Documentation : 커널 기술 문서가 있는 디렉터리로, 커널 시스템에 대한 기본 동작을 설명하는 문서를 찾을 수 있음kernel : 커널의 핵심 코드가 있는 디렉터리, 아키텍처와 무관한 커널 공통 코드가 있음 아키텍처별로 동작하는 메모리 관리 코드는 arch/*/mm/ 아래에 있음irq : 인터럽트 관련 코드sched : 스케줄링 코드power : 커널..
리눅스 커널에 시스템 콜 추가 및 커널 설치
·
Linux/Linux Kernel
리눅스 커널에 시스템 콜 추가시스템 콜을 추가하려면 기본적으로 3개의 파일을 수정해야 한다.kernel/파일명.ckernel/Makefilearch/x86/entry/syscalls/syscall_64.tbl각 파일들을 보며 시스템 콜을 추가해보자.kernel/파일명.c이 파일이 시스템 콜이 실제로 구현될 위치이다.my_syscall.c 파일을 추가해보자.// kernel/my_syscall.c#include #include SYSCALL_DEFINE2(my_syscall, int, num1, int, num2){ int result = num1 * num2; printk(KERN_INFO "my_syscall result: %d * %d = %d\n", num1, num2, result); ..
커널 v6.x 컴파일
·
Linux/Linux Kernel
앞으로 "김동현"님의 [디버깅을 통해 배우는 리눅스 커널의 구조와 원리] 책을 공부하며, 공부한 내용을 정리해보려고 한다. 책에서는 라즈베리파이를 가지고 내용이 진행되는데, 나는 VMWare에 Ubuntu 24.04를 올려서 진행했다.커널 컴파일가상머신 Ubuntu 24.04(커널 v6.8)에서 커널 컴파일을 해보겠다.컴파일하고 나면 용량이 16GB 정도 사용된다. Ubuntu의 기본 사용 용량 등을 고려해서 Disk 크기를 64GB 정도는 잡는 것이 여유로울 것이다.그렇지 않으면 오랜 컴파일의 결과가 디스크 부족일 수도 있다.. 일단 빌드 툴 설치부터 하자.sudo apt updatesudo apt install -y build-essential libncurses-dev bison flex libss..
커널 전처리 코드 생성
·
Linux/Linux Kernel
전처리 코드 생성리눅스 커널 소스코드를 분석하다 보면 수많은 매크로를 만나게 된다.리눅스 커널을 캡슐화나 다형성과 같은 객체지향 방식으로 구현하다 보니 매크로로 구현된 코드가 많다.그런데, 이 매크로들이 소스 분석의 걸림돌이 되기 때문에 전처리 코드로 이러한 매크로들을 풀 수 있다. 전처리 코드는 GCC 컴파일 오브젝트를 생성하는 과정에서 추출되고, 방식은 크게 2가지가 있다.전체 전처리 파일을 추출특정 전처리 파일을 추출전체 전처리 파일을 추출하는 방법리눅스 커널의 전체 소스코드를 전처리 파일로 추출하기 위해서는 Makefile을 수정해야 한다.아래 부분의 빨간 줄을 추가하면 된다.전처리 파일을 추출하기 위해 커널 빌드를 다시 수행해야 한다. (build_kernel.sh 실행)아래 글에서 커널 빌드 ..