Kernel/Theory

    [Kernel of Linux] 5. Process Management (2)

    지난 강의 요약 - Process Management (1) UNIX 시절에는 child를 만드는데 fork-exec 방식을 따랐다. 이 방식도 진화해왔었는데 처음에는 parent 측에서 먼저 wait() (혹은 종료) 할 때까지 기다렸다가 child가 실행되었다. 그 이후에는 parent의 page tables만을 복사하게 바뀌었지만 COW(Copy-on-Write)에 의해 page-fault가 많이 발생하여 비효율적인 오버헤드가 많이 생겼다. 그래서 이후에는 parent의 fork 호출 이후에 parent로 돌아가지 않고 child process의 우선순위를 높여줘서 child가 먼저 실행되도록 바꿨다. 위에서 기술한 옛날 UNIX가 사용하던 방식과는 달리 linux에서는 process를 task_s..

    [Kernel of Linux] 4. Process Management (1)

    지난 강의 요약 - System Call (2) system call의 대표적인 함수 몇 가지를 살펴보았고 system call로 인한 context switch 동작까지 이해했다. 1. PCB in Linux linux에서 프로세스마다 가지고 있는 프로세스 메타데이터가 PCB라는 것은 이제 분명하다. 이제 이 PCB가 linux에서 어떻게 구현되어 있는지 알아보자. PCB가 저장하고 있는 여러 값들이 있는데 이는 크게 6개의 struct로 나뉘어 있다. task_struct 구조체를 메인으로 해서 files, fs(file system), tty(터미널), mm(main memory), signals 구조체가 담겨 있다. 소스 코드를 살펴보면 task_struct 내부에서 포인터의 형태로 나머지 5개의..

    [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] 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 얻는 함수 같은 거). 주요 개념 인터럽트 핸들러 - 발생된 인터럽트를 실제로 처리하는 함수 인터럽트 벡터 - 각 인터럽트 별로 정해진 주소가 있는 주소 테이블 인터럽트 디스크립터 ..