전체 글

전체 글

    [Kernel of Linux] 11. File System (1)

    지난 강의 요약 - Interrupt (3) IRQ를 처리하는 과정은 크게 두 가지로 나뉜다. Top-Half와 Bottom-Half가 그것이다. Bottom-Half는 소프트웨어가 후속 처리를 위해 건 인터럽트를 처리하는 과정이다. Bottom-Half를 처리하기 위해 프로그래머가 사용할 수 있는 handler로는 총 3가지가 존재한다. Softirq, Tasklet, Workqueue. Softirq는 여러 다른 CPU가 동시에 실행이 가능해 concurrency가 높다는 장점이 있지만 코딩하기 복잡하다는 단점이 있고, Tasklet은 Softirq와는 반대로 같은 Tasklet이 여러 다른 CPU가 동시에 돌릴 수 없다는 단점이 있지만 그만큼 reentrant와 data access 부분을 신경 쓰..

    [Kernel of Linux] 10. Interrupt (3)

    지난 강의 요약 - Interrupt (2) Interrupt를 처리할 때 발생 가능한 문제점이 있다는 것을 배웠다. mth IRQ line을 처리하는 CPU가 아무도 없다면 그냥 들어가서 처리하면 되고, 반대로 이미 처리하고 있는 CPU가 있을 수도 있다. 이럴 때는 뒤늦게 들어온 CPU 입장에서는 line state를 확인하고 PENDING bit을 설정하고 나가면 된다. 왜냐하면 이미 처리 중인 CPU에게 처리할 것이 더 있으니 해당 라인에 요청된 ISR 마치고 오라고 말하는 것과 같기 때문이다. 이미 ISR을 처리 중이던 CPU 입장에서 보면 handle_IRQ_event() 함수를 마치고 돌아왔더니 분명히 없애고 갔던 PENDING bit이 설정되어 있으니 다시 ISR을 처리하러 가면 된다. 이..

    [Kernel of Linux] 9. Interrupt (2)

    지난 강의 요약 - Interrupt (1) interrupt를 발생시키는 하드웨어들은 각기 배정된 IRQ line에 속해있다. 그리고 여러 line들을 통제해주는 컨트롤러가 필요한데 이것이 바로 PIC(Programmable Interrupt Controller)다. 각 line은 irq_desc 구조체를 가지고 있는데 여기에는 현재 line의 상태, handler, lock, action 같은 정보들이 담겨있다. action field에는 irqaction 구조체가 포인터로 연결되어 있다. 각 irqaction은 device의 ISR을 처리하기 위한 정보들이 담겨있다. interrupt를 처리하기 위해 불리는 함수들이 존재한다. PIC으로부터 받은 vector를 이용해 어셈블리어로 작성된 함수로 점프..

    [Kernel of Linux] 8. Interrupt (1)

    지난 강의 요약 - Scheduling & Interrupt (0) 리눅스에서 사용하는 Timer에 대한 동작을 알아보았다. HZ의 크기는 아키텍처마다 다를 수 있다. Interrupt는 CPU cycle을 진행하는 도중 다른 PC로 jump 하게 만드는 효과가 있다. 그리고 Interrupt를 발생시키는 여러 devices를 통제하기 위해 PIC(Programmable Interrupt Controller)가 존재한다. PIC에서는 프로그래머가 원하는 대로 interrupt를 masking 할 수 있고 각 interrupt 별로 handler를 두어 원하는 동작을 실행하게 할 수 있다. Interrupt를 처리하고 있는 동안에는 해당 인터럽트 라인의 PIC는 block 상태이므로 인터럽트는 가능한 짧은..

    [Kernel of Linux] 7. Interrupt (0)

    1. The Concept of Interrupt CPU는 instruction을 가져와서 fetch 하고 decode 한 뒤 실행한다. 그 과정은 데이터를 읽고 쓰는 행위가 대부분이다. 32-bit 기준으로 PC는 4-Byte씩 증가하여 다음 instruction을 탐색한다. 이 루틴은 검은색 선으로 된 부분이다. 그런데 여기서 중간에 interrupt가 걸리는 상황을 생각해보자. 이때는 분홍색 선으로 된 루틴을 따라간다. CPU에 interrupt request bit을 보고 interrupt가 가능한지 확인한 뒤에 interrupt가 가능하면 interrupt 루틴을 따라간다. PC에는 평소처럼 4-Byte가 증가하는 것이 아닌 저장되었던 다른(새) 레지스터로 fetch 된다. 즉 해당 addres..

    [Kernel of Linux] 6. Scheduling

    지난 강의 요약 - Process Management (2) kernel thread의 특징에 대해 알아보았다. user space에서 동작하는 thread와는 달리 address access의 접근 제한이 없다는 특징을 가지고 있고 주로 daemon 같은 것들이 kernel thread 형식으로 존재한다. process state의 종류에 대해 몇 가지 알아보았고 종류별 상관관계가 존재한다. cpu를 차지할 프로세스를 선택하고 관리하는 것을 스케줄링이라고 한다. 다음으로 cpu를 차지할 프로세스를 선택하기 위해 필요한 조건으로 두 가지를 소개했다. 첫 번째로는 highest priority다. 높은 priority를 지닐수록 cpu를 먼저 선점할 기회가 많아진다. 두 번째는 remaining times..

    [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을 ..