Kernel

    [v5.17] The kernel radar: folios, multi-generational LRU, and Rust

    혹시나 틀린 번역 혹은 틀린 내용이 있다면 언제든지 말씀해주세요. 또 알고 계신 자세한 내용이나 위 글과 관련된 좋은 정보가 있다면, 공유해주시면 감사하겠습니다! Introduction lwn.net에서 발간하는 기사 중 현재 개발 중인 커널에 관련된 여러 주제들 중 주목되고 있는 주제들에 대해 짤막하게 소개해주는 게 있어서 간단한 번역과 함께 살펴보려 한다. 이번 5.17 버전 개발 주기에서는 무엇이 화두가 되고 있는지 살펴보자. https://lwn.net/Articles/881675/ (2022.01.20 published by Jonathan Corbet) The kernel radar: folios, multi-generational LRU, and Rust [LWN.net] This artic..

    [LKM] procfs & seq_file

    Kernel version: 5.14.17 procfs이란? procfs는 proc + fs = process file system의 약자다. 모든 것을 파일로 취급하는 유닉스 사상에 따라 이 특별한 파일 시스템은 시스템 내의 정보를 제공하기 위해 존재한다. 실제로 존재하는 하드웨어에 대한 파일 시스템이 아닌 메모리 상에서만 존재하고, 가상 파일 시스템(VFS)의 인터페이스의 형태이며 /proc 경로에 마운트 되어 사용된다. 예전에 정리했던 포스팅에서도 아주 잠깐 다룬 적이 있다. [wikipedia] "ls /proc" 명령어를 사용해보면 뭔가 많이 있는 것을 확인할 수 있다. 숫자로 된 디렉터리들은 현재 올라가 있는 프로세스들의 PID를 나타내고, 나머지들도 각자의 결과를 반환하는 역할을 하는 함수들..

    [LKM] Character Device Driver

    Kernel version: 5.14.17 What is a device driver? device driver는 하나의 컴퓨터 프로그램이다. 컴퓨터나 오토마톤에 접목되어 특정 타입의 device를 동작시키거나 조종한다. device는 우리가 생각하는 여러 주변 하드웨어 기기들을 일컫는 말이다. 키보드, 마우스, 모니터, USB,... 등등 많은 종류의 하드웨어가 컴퓨터와 통신하는데 주로 sequential bytes의 형태로 이루어진다. 이 말은 즉 linux에서는 모든 devices가 file이라고 본다. ([Kernel of Linux] 강의 정리 내용을 참고하자.) 결국 우리가 만들게 될 device driver는 device라는 하나의 파일을 컨트롤하기 위한 프로그램을 만드는 것이다. devic..

    [Kernel of Linux] 14. Memory Management

    지난 강의 요약 - File System (3) Linux는 Unix와는 달리 많은 종류의 FS을 커버할 수 있도록 만들어졌다. 그래서 실제 physical FS layer 위에 유저를 위한 standard를 제공하기 위한 VFS(Virtual FS) layer를 얹어놨다. VFS는 standard objects 4가지를 통해 어떤 FS든지 정의할 수 있도록 했다. superblock object / inode object / file object / dentry object. dentry를 제외한 나머지 object들은 이전에도 많이 했으니 넘어가고 dentry에 대해 알아보자. dentry는 directory entry로 단순히 말해 path(name) components의 inode를 저장하는 것을..

    [Kernel of Linux] 13. File System (3)

    지난 강의 요약 - File System (2) 디스크는 inode와 data를 저장하는 부분으로 나뉘어 있다. inode 0번째는 root directory를 의미한다. open("/a/b") 이렇게 시스템 콜이 불렸다면 처음에 root directory file을 열어서 밑에 있는 inode 포인터 리스트를 가져온다. 파일 중 a file을 가리키는 inode 포인터를 찾았다면 또 거기서 아래로 내려가 찾는다. 그렇게 b file까지 오게 되면 b를 위한 offset을 저장할 file struct를 만들고 나서 이를 가리키는 포인터를 커널에 있는 u_ofile[] array에 저장한다. 포인터를 저장한 이 array의 index를 바로 fd(file descriptor)라고 한다. 디스크에 데이터를 ..

    [Kernel of Linux] 12. File System (2)

    지난 강의 요약 - File System (1) linux에는 파일과 파일을 표현하는 메타 데이터가 있다. 메타 데이터에는 여러 정보가 들어있는데 그중에서 중요한 정보 중 하나로 offset이 있다. 파일은 sequence of bytes라고 정의하고 있는 만큼 파일을 읽을 때 sequential 하게 읽는다. 이때 offset을 보고 어디서부터 읽을지 결정한다. 파일을 storage에 저장할 때 연속적으로 저장하는 방식을 사용할 수 있다. 이 방식의 장점은 access 할 때 빠르게 접근할 수 있지만 단점으로는 외부 단편화(external fragmentation)가 발생하여 관리가 어렵다. 다른 저장 방식으로는 storage를 일정 크기로 잘라놓은 다음에 파일이 저장된 섹터의 주소를 기억하는 것이 있..

    [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를 이용해 어셈블리어로 작성된 함수로 점프..