Karatus
[Kernel of Linux] 3. System Call (2)
지난 강의 요약 - System Call (1) system call이 불리는 과정, wrapper routine, vendor마다 다른 system call number, 새로운 system call 추가에 대한 장단점 및 대체방안 등을 알아봤다. 그리고 kernel이 해주는 중요한 임무 중 하나로 Process Management가 있다. kernel은 HW, SW 간의 접근 제어를 해주어야 하므로 각각의 devices와 processes를 표현해주는 metadata를 가지고 있다. 그중에서도 user process의 정보를 담고 있는 data structure를 PCB라고 한다. 지난 강의 마지막 부분에서는 command를 입력할 때마다(새 utility를 실행할 때마다) 생기는 Child Proc..
[Kernel of Linux] 2. System Call (1)
지난 강의 요약 - Introduction OS는 하나의 거대한 프로그램이 아니라 여러 프로그램으로 나뉘어 있다. 여러 프로그램 중에서도 커널은 memory resident 한 프로그램이다. 나머지는 모두 disk resident 프로그램이므로 필요할 때만 메모리에 올라갔다가 필요 없어지면 다시 내려간다. 커널을 제외한 나머지 프로그램들을 utility, job, command라고도 부른다. 하나의 user가 하드웨어의 모든 resource를 사용하는 윈도우 OS와는 달리, 리눅스는 multi-user system이므로 한 프로세스 혹은 user가 다른 프로세스나 user의 정보를 담고 있는 memory, disk에 접근하는 것을 예방(prevention) 해야 한다. 접근은 I/O operation을 ..
[Kernel of Linux] 1. Introduction
계속 커널 공부를 하고는 있지만 뭔가 기본기가 부족하다는 느낌을 많이 받고 있다. 그래서 예전부터 알고 있던 까망눈연구소 님의 블로그 글 중에 커널과 관련된 글을 강의를 통해 잘 정리하고 계신 것을 발견하고 나도 똑같이 해당 강의를 통해 기본기를 다지려고 한다. https://olc.kr/course/course_online_view.jsp?id=35&s_keyword=Kernel&x=0&y=0 OLC CENTER olc.kr 1. What is an Operating System? 프로그램은 user와 hardware 사이의 중개인 역할을 수행한다. 이때 OS가 관여를 하는데 이 중개인 역할이 바로 OS다. 아래(lowlevel)로는 hardware 자원을 관리하고, 위(highlevel)로는 프로그램..
[Linux Kernel] local_irq_disable() / local_irq_save()
Environment: Linux Kernel v5.14.14 리눅스 커널 소스를 분석하다 보면 두 개의 비슷한 코드를 볼 수 있다. 둘 다 local_irq 접두사를 가지고 있는데 하나는 disable, 다른 하나는 save를 달고 있다. 비슷하지만 하는 일이 완전히 다른 둘의 차이점을 잊지 않기 위해 글을 남긴다. ※ IRQ : Interrupt ReQuest local_irq_disable() / local_irq_enable() functionality 인터럽트 컨텍스트 상황에서 해당 라인의 CPU의 다른 인터럽트를 비활성화/활성화한다. local_irq_disable() ~ local_irq_enable() 사이 컨텍스트에서 이를 보장한다. source code include/linux/irqf..
[Linux Kernel] Packages for Linux Kernel Build
Environment: Linux Kernel v5.14.14 / Debian 11 (bullseye) kernel 빌드할 때 make 명령어를 통해 실행 가능한 바이너리 파일이 만들어진다. 처음 가상 이미지를 만들면 당연히 아무런 빌드 관련 패키지가 없을 텐데 이를 위해 필요한 패키지들은 다음 명령어로 설치하면 된다. $ apt update $ apt install build-essential libncurses5 libncurses5-dev bin86 libssl-dev bison flex libelf-dev build-essential: make, gcc, ... 같은 빌드에 필요한 기본적인 패키지들이 설치된다. libncurses5{-dev}: make menuconfig 같이 터미널 그래픽이 필..
[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..
[C Lab] How-To inline assembly & test
Linux Kernel에 존재하는 시스템 콜을 직접 구현해보면서 inline assembly 문법에 대해 궁금해져 쓰는 글이다. 레퍼런스는 이 글의 제일 아래에 명시해놓았다. How-To inline assembly Why we use the inline assembly? 이유는 몇 가지가 있다. 1) 시스템 성능 최적화에 제격이라 2) 어셈블리어로 작업할게 필요한데 그때마다 서브루틴의 프롤로그와 에필로그의 작성이 번거로울 때 이외에도 있을 텐데 내가 아는 선에서는 그렇다. Grammar __asm__ __volatile__ (asms : output : input : clobber ); __asm__ : asm으로도 쓸 수 있지만, ansi 옵션일 때는 asm이 정의되지 않기 때문에 되도록이면 __as..
[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] 커널 빌드 과정
make mrproper Mr.Proper는 수세미 이름인데 딱딱한 스펀지로 되어 있어 잘 지워진다. 그래서 커널 소스 처음 가져왔을 때나 커널을 여러 번 컴파일했을 때 기존에 설정되어 있던 모든 의존 관계를 완전히 제거해주는 역할을 한다. make menuconfig GUI 메뉴 형식의 커널 환경 설정 시작 명령어. CLI는 "make config"로 가능하다. make dep 커널에 설정된 내용에 따라 소스 코드의 파일들을 확인하고 필요한 링크들을 생성하는 것과 같은 의존성 설정 작업. 의존성 확인 후 커널 컴파일에 필요한 파일들의 목록만 각 디렉터리에 .depend 파일로 저장. 이 과정을 거치지 않고 "make bzImage" 명령어를 사용해도 되지만 안 했을 때보다는 컴파일 과정이 빠르게 실행된..