Run if you want it
300x250

Linux System 16

Kernel Panic Calltrace 분석

Kernel Panic이 발생한 경우 하기와 같이 Calltrace log를 출력하기 때문에 해당 정보를 기반으로 디버깅 하는 방법 정리 example) xen porting 과정 중 kernel 부팅 시 발생한 error [ 0.500423] Internal error: synchronous external abort: 96000010 [#1] PREEMPT SMP [ 0.501475] Modules linked in: [ 0.502306] CPU: 1 PID: 1 Comm: swapper/0 Not tainted 4.20.11 #6 [ 0.503174] Hardware name: linux,dummy-virt (DT) [ 0.507173] pstate: 40000005 (nZcv daif -PAN -..

ramdisk(initrd, initramfs)

ramdisk 이전에 설명한 루트 파일 시스템을 마운트하기 전, 임시로 RAM을 disk로 사용하여 최소한의 기능만을 가진 initrd(initial RAM disk)가 마운트 되어 커널 부팅 프로세스의 일부로 실행됨. 부트로더는 커널과 ramdisk를 load하고, 커널에게 ramdisk에 대한 정보를 전달 함(메모리 내 위치 정보). 커널은 initrd를 마운트 하고 linuxrc가 실행되어 리눅스 부팅 초기화를 실행 함. 이와 같이 초기 부팅 과정을 따로 분리함으로써 최소한의 커널 드라이버와 기능을 가지고 insmod를 통해 커널 모듈을 동적으로 loading 할 수 있는 장점과 동적으로 파일 시스템(ext4, etc...)을 마운트 하는 등 부팅 과정에서 유연한 구성이 가능해 짐. 이후 실제 루트..

Linux System/Linux 2023.12.28

Root File System

Root File System 리눅스 부팅 간 커널 부팅 이후에 시스템 초기화 및 저장장치나 각종 device를 제어하기 위한 시스템 프로그램이 필요함. 이러한 프로그램들은 디스크 장치에 저장되어 있으며, 리눅스에서는 이를 파일 형태(File System)로 처리하는데, 이를 Root File System이 담당함. 리눅스 디렉토리 조회 시 최상위에 '/'형태로 root가 저장장치에 연결되어 있고, 해당 저장장치에는 리눅스 부팅 동작을 수행하기 위한 기능들이 저장되어 있음. Shell과 같은 시스템 프로그램을 통해 커널과 interaction을 통해 동작 RFS Directory 생성 rfs를 구성하는 기본적인 디렉토리는 다음과 같다. /dev /proc /bin /etc /lib /usr /tmp

Linux System/Linux 2023.12.28

[Kernel] Timer

jiffies 커널에서 시간은 타이머 인터럽트를 통해 관리되는데, 타이머 인터럽트는 1초당 n번 발생하는 빈도가 HZ로 정의되어 있음. 이 HZ값은 아키텍처마다 다르게 정의되어 있다. 만약 100HZ라고 하면 1초당 100번의 타이머 인터럽트가 발생함 해당 커널 시스템의 HZ 값은 .config에 CONFIG_HZ로 정의되어 있다. 커널에는 시스템이 시작한 후, 해당 타이머 인터럽트 발생횟수를 저장하는 jiffies라고하는 전역변수가 정의되어 있는데 extern unsigned long volatile __cacheline_aligned_in_smp __jiffy_arch_data jiffies; 만약 HZ가 100인 시스템에서 시스템이 시작된 뒤 1초 후 jiffies는 값은 100이다. 해당 jiff..

Device Driver

개요 디바이스 드라이버는 특정 H/W 장치(Device)에 대한 제어를 위해 커널에서 동작하는 프로그램으로서, 시스템과 H/W 장치 간 인터페이스 역할 특성 커널에 포함되어 동작(built-in)하거나 런타임에 적재(module)되어 사용 됨. 커널의 일부분으로 동작함으로 error 발생 시 시스템이 critical한 영향을 끼칠수 있음 표준 인터페이스를 제공해야 하며, 커널 Service(memory allocation, IRQ, wait, etc...)를 이용할 수 있다. 종류 Character(문자) 디바이스 드라이버: buffer를 거치지 않고 direct로 raw data에 대하여 read/write 가능한 장치(ex. 키보드, 마우스, 시리얼포트 etc) Block(블록) 디바이스 드라이버: ..

runtime에 target board kernel의 config 확인

커널을 빌드하는 host 환경이 아닌 실행중인 target board에서 해당 kernel image에 적용된 config를 확인할 수 있는 방법 /proc 디렉토리 아래 config.gz로 해당 커널 image의 config가 압축되어 config.gz파일로 존재 이를 압축 해제하게 되면 해당 image의 kernel config를 확인할 수 있음 하기 명령은 압축해제한 config를 running.config에 저장 cat /proc/config.gz | gunzip > /tmp/running.config 압축 해제한 config 확인 vi /tmp/running.config # # Automatically generated file; DO NOT EDIT. # Linux/arm64 4.14.202 ..

User Space와 Kernel Space

User Space와 Kernel Space 응용 프로그램은 유저 영역에서, 커널 모듈은 커널 영역에서 실행 됨. 이와 같이 메모리 영역을 나눔으로서 응용 프로그램이 OS가 load되어 있는 커널 영역에 침범하여 시스템에 critical한 에러 등을 발생시키는 일을 방지. 커널 영역에 접근하기 위해서는 커널 모드(or 관리자 모드)로 전환되어야 함 System Call(시스템 콜) 위와 같은 이유로 인해 응용 프로그램에서 H/W나 커널의 리소스에 접근하여 사용할 수 있도록 System Call 방식을 이용 응용프로그램이 직접 커널의 기능을 호출할 수 없으므로 커널은 유저공간에 추상화된 인터페이스인 System Call을 제공하며 이를 통해 유저 영역에서 커널 기능을 호출. 시스템 콜이 호출 되면 유저 모..

Device Driver - Atomic

Atomic 연산 Atomic 연산이란 연산 수행 중 다른 thread로 context 전환이 되지 않는 연산을 의미하며 task의 context switching이 일어나거나 interrupt routine에서 해당 메모리에 대해 동시 처리되지 않도록 보장하는 연산을 일컫는다. 성능이 굉장히 중요한 부분에 있어서 Lock을 사용하기에는 성능 저하가 우려되는 경우 사용 Function Description ATOMIC_INIT(int i) At declaration, initialize an atomic_t to i int atomic_read(atomic_t *v) Atomically read the integer value of v void atomic_set(atomic_t *v, int i) At..

[cmd] sed

Description GUI기반의 편집기인 vi처럼 CLI(Command Line Interface)기반으로 파일을 인자로 받아 명령를 통해 작업을 진행한 후, 화면에 출력하는 방식 명령어로서, 원본을 직접 수정하지 않고 수정한 결과를 출력해주는 역할의 명령어 Pattern space와 Hold space sed명령어는 동작시 내부적으로 2개의 Work Space를 사용하는데, 이 두 버퍼를 Pattern Space(Pattern Buffer)와 Hold Space(Hold Buffer)라고 함 Pattern space: 입력 스트림을 통해 읽어들인 라인 한 줄이 저장되는 공간으로서 수정, 출력 등의 명령이 적용(처리)되는 공간 Hold space: 임시 저장공간으로서 수정 명령 등의 영향을 받지 않아 ..

Linux System/Linux 2022.03.15

Kernel Build

Kernel Configuration Kernel Config 커널을 빌드하기 전에 각 시스템에 맞게 설정을 해주어야 하는데 "CONFIG_"라는 prefix로 시작되는 설정 옵션을 조정함으로서 가능하다. 예를 들어 FrameBuffer에 대한 feature를 활성화해주기 위해서는 CONFIG_FB를 enable 시키면 된다. 이 설정 옵션은 두 가지 형태의 값을 갖는데 Boolean과 Tri-state의 형태로 값을 갖는다. Boolean 타입의 경우 커널 빌드 시 해당 feature를 활성화할 것인지(yes), 비활성화(no)할 것인지를 설정하게 되고, Tri-State의 경우 Boolean 타입에서 module이라는 값이 추가된 타입인데 module로 설정하여 빌드 시, 해당 feature 모듈을 ..

728x90