Kernel

    [LKM] Module Programming Basic

    Environment: Linux Kernel v2.6.14.6 LKM (Loadable Kernel Module). Module programming을 하기 위해 필요한 기본 지식과 만드는 법. 1. callee, caller 모듈 작성 callee.c #include #include #include // module init int __init init_callee(void) { return 0; } // module exit void __exit exit_callee(void) { } int add(int a, int b) { printk(KERN_ALERT "[callee Module] add called...\n"); return a + b; } int sub(int a, int b) { pri..

    [Linux Kernel] 부팅 중 Kernel Panic 해결하기

    커널 만지다가 책 따라서 실습을 하고 있었지만 똑같이 하니 역시 옛날 환경이라 예상치 못한 일들이 일어난다. 그중 하나가 바로 부팅 시 커널 패닉이 일어나는 상황이다. 이번에 내가 마주한 상황은 VFS 싱크로 관련 에러였다. 그때 당시의 스크린샷을 찍지는 못했지만 위에서 나타난 에러 구문과 똑같았다. Cause & Solution https://unix.stackexchange.com/questions/414655/not-syncing-vfs-unable-to-mount-root-fs-on-unknown-block0-0 not syncing: VFS: Unable to mount root fs on unknown-block(0,0) I had Windows 10 and Manjaro on my lapto..

    [Linux Kernel] System Call 추가하기 - 미완!

    보호되어 있는 글입니다.

    [Linux Kernel] 커널 빌드 과정

    make mrproper Mr.Proper는 수세미 이름인데 딱딱한 스펀지로 되어 있어 잘 지워진다. 그래서 커널 소스 처음 가져왔을 때나 커널을 여러 번 컴파일했을 때 기존에 설정되어 있던 모든 의존 관계를 완전히 제거해주는 역할을 한다. make menuconfig GUI 메뉴 형식의 커널 환경 설정 시작 명령어. CLI는 "make config"로 가능하다. make dep 커널에 설정된 내용에 따라 소스 코드의 파일들을 확인하고 필요한 링크들을 생성하는 것과 같은 의존성 설정 작업. 의존성 확인 후 커널 컴파일에 필요한 파일들의 목록만 각 디렉터리에 .depend 파일로 저장. 이 과정을 거치지 않고 "make bzImage" 명령어를 사용해도 되지만 안 했을 때보다는 컴파일 과정이 빠르게 실행된..

    [Linux Kernel] IRQ 스레드 실습

    본 실습은 책 「디버깅을 통한 리눅스 커널의 구조와 원리」 p.438를 기준으로 진행했다. IRQ 스레드 생성 실습 IRQ 스레드를 생성할 인터럽트 선택 라즈베리 파이에 존재하는 IRQ 스레드의 개수는 많지 않다. 먼저 존재하는 IRQ 스레드를 확인해보면, 책과는 달리 166번 인터럽트에 대한 IRQ 스레드도 보인다. usb 관련 인터럽트 같은데 지금은 그냥 넘어가도 된다. 이제 IRQ 스레드를 생성해 볼 인터럽트를 선택하기 위해 "cat /proc/interrupts" 명령어로 확인해본다. 각 cpu 번호 별로 실행된 횟수를 참고해서 선택할 예정이다. 위에서 이미 돌고 있던 86, 166번 인터럽트를 제외하고 선택하면, 적당한 횟수로 도는 17번 인터럽트 3f00b880.mailbox가 좋겠다. 17번..

    [Linux Kernel] Interrupt 후반부 처리

    인터럽트 후반부 처리 Top Half, Bottom Half 중 Bottom Half 처리. 인터럽트가 실행되는 동안인 인터럽트 컨텍스트 상태일 때는 프로세스가 멈춰있으므로 가능한 한 빨리 실행되고 컨텍스트를 돌려줘야 하는데, 꼭 인터럽트 컨텍스트일 때 처리하지 않아도 되는 것들은 인터럽트 핸들러가 끝나고 빠르게 여러 가지 방법으로 마무리한다. IRQ 스레드 (threaded IRQ) "irq/인터럽트 번호-인터럽트 이름" 형식의 이름을 가진 프로세스가 바로 IRQ 스레드다. 어찌됐던 스레드이기 때문에 스케줄링하는 과정이 필요하고 그러므로 1초에 몇 천 번 이상 인터럽트가 걸리는 핸들러는 IRQ 스레드를 이용하면 부하가 많이 걸리니 추천하지 않는다. 부팅 단계에서 request_threaded_irq()..

    [Linux Kernel] Interrupt

    ARMv7 코어 기준 Interrupt란 하드웨어적 관점 : 하드웨어에서 발생하는 전기 신호 CPU 관점 : 프로세스가 하던 일 멈추고 인터럽트 서비스 루틴(ISR; Interrupt Service Routine) 실행 Ω 진리 Ω 인터럽트는 그 자체로 프로세스의 진행을 멈추고 실행하는 것이기 때문에 시스템에 많은 부하가 걸리지 않게 짧고 간결하게 실행되어야 한다. 그렇기 때문에 인터럽트 컨텍스트에서는 휴면 상태로 진입할 수 없고 인터럽트 컨텍스트에서 호출 가능한 커널 함수는 제한되어 있다(안 되는 함수는 예를 들어 lock 얻는 함수 같은 거). 주요 개념 인터럽트 핸들러 - 발생된 인터럽트를 실제로 처리하는 함수 인터럽트 벡터 - 각 인터럽트 별로 정해진 주소가 있는 주소 테이블 인터럽트 디스크립터 ..

    [Linux Kernel] alloc_thread_stack_node() 함수 분석

    '디버깅을 통해 배우는 리눅스 커널의 구조와 원리' 책을 읽으면서 정리를 하다가 한 가지 코드 상의 차이를 발견했다. 커널 버전은 책에 나온 대로 v4.19다. 개요 프로세스가 새로 생성될 때 불리는 _do_fork() 함수 내 copy_process() 함수에서 일어나는 동작 중 하나로 프로세스가 이용할 스택을 할당하는 게 있다. 태스크 디스크립터 생성하고 slab cache에서 스택 공간 할당받는 함수인 alloc_thread_stack_node() 함수가 있는데 책에 있는 코드와 구현 상의 차이가 있길래 초보자 입장에서는 흥미롭게 다가왔다. Before static unsigned long *alloc_thread_stack_node(struct task_struct *tsk, int node) {..

    [Linux Kernel] 공부에 도움되는 사이트 / 책 / 블로그

    LAST UPDATE: 2022.01.28 SITE 1. 커널 연구회 커뮤니티 (https://kernel.bz/) 커널연구회 커뮤니티/기술교육/쇼핑몰/협동프로젝트 커널연구회는 리눅스 커널과 디바이스드라이버를 연구하고 머신러닝 및 지능형로봇 관련 프로젝트를 수행하면서 관련 내용들을 공유하고 있습니다. kernel.bz 커널의 기초에 대한 설명이 잘 나와있다. 계단을 올라가려 할 때 어떻게 생긴 계단인지 살펴보는 단계 정도라고 생각하면 될 것 같다. '리눅스커널' 탭에 나온 내용들로 아쉽다면 이 연구회에서 출간한 책도 있다. 읽어보진 않아 평을 할 수는 없지만 정말 아무것도 모르는 사람이라면 접해보는 데에 무리는 없을 것 같다. 2. ★ Kernel of Linux (https://olc.kr/course..