본문 바로가기

linux11

Page Cache: write 글을 좀 오랜만에 쓴다. 이것저것 하느라 글을 그동안 못썼다. 흠, 다음 글은 뭐쓰지? 이전 글 VFS: read_iter() & write_iter() 원래는 페이지 캐시를 정리하려고 했는데 정리하다보니 read/write 매커니즘을 정리할 수밖에 없었다. 이 글에선 read_iter()가 어떻게 동작한는지 간단하게 알아본다. 관련 글 이 글은 가상 파일시스 hyeyoo.com Page Cache: filemap_read 이전 글 이전 글에서는 read() 시스템 호출에서 어떤 일이 일어나는지 알아봤다. read() 시스템 호출은 모드와 권한이 적절한지 확인한 후, 1) Direct IO를 수행하거나 2) filemap_read()로 페이지 캐시에서 hyeyoo.com 앞선 글에서 read()를 할 때.. 2022. 3. 9.
[책] BPF 성능 분석 도구 요즘 코드만 보다보니까 너무 시야가 좁아진다는 생각이 들어서 알라딘에서 볼만한 책을 찾다가 이 책을 만났다. 이 책은 BPF라는 도구가 어떻게 동작하고, 이 도구로 리눅스 시스템을 어떻게 계측하는지를 설명해준다. 나는 원래 BPF, TRACING, PERF와 같은 서브시스템이 왜 중요한지 몰랐다. 하지만 이 책을 읽다보니 생각이 완전히 바뀌었다. 예를 들어서 성능과 관련된 부분에서 작업을 한다면 성능을 정확하게 측정할 수 있어야 한다. 코드의 어떤 부분에서 병목이 생기는지, 어떤 코드 경로에서 시간을 잡아먹는지, 실행시에 어떤 이벤트가 발생하는지를 알아야 한다. 정확한 측정 없이는 문제를 찾을 수도 개선할 수도 없다. BPF가 리눅스 시스템을 더 잘 이해할 수 있도록 시야를 넓혀줄거란 기대가 생겼다. 그.. 2021. 10. 28.
[Linux Kernel] 시간과 타이머 이번 글에선 시간 관련 코드를 짜는 방법을 다뤄보겠다. 타이머도 다룰 건데, low resolution timer (보통 'the timer wheel'이라고 언급된다.)를 다룰 것이다. high resolution timer나 bottom-half에서 사용하는 softirq, tasklet, workqueue 등도 다루려 했으나 워낙 방대해서 천천히 글로 남겨볼 생각이다. 시간의 측정 타이머 인터럽트와 jiffies 커널의 시간은 타이머 인터럽트를 통해 관리된다. 타이머 인터럽트는 초당 10번, 초당 1000번 처럼 정해진 빈도가 있으며, 이는 HZ로 정의되며, HZ가 작을수록 오차가 더 줄어드므로 시간의 해상도가 높아진다. 다만 초당 인터럽트 발생 수가 높아지면 그만큼 인터럽트 처리를 위한 오버헤드가.. 2021. 5. 4.
[Linux Kernel] 인터럽트와 후반부 처리의 개념 Interrupt 컴퓨터는 프로세서만으로 이루어져있지 않다. 디스크로부터 데이터를 읽고 쓰거나, 네트워크 카드로부터 데이터가 들어오거나, 사용자가 마우스나 키보드로 입력을 할 수 있다. 이처럼 프로세서는 주변 장치로부터 어떤 이벤트가 발생했다는 것을 처리할 방법이 필요한데, 그것이 바로 인터럽트이다. 마우스로 무언가를 입력하면 프로세서는 실행을 잠시 중단하고, 마우스가 발생시킨 인터럽트를 처리한 후 다시 원래 실행하던 코드로 돌아간다. 그런데 마우스가 발생시키는 인터럽트와 키보드가 발생시키는 인터럽트는 다를 것이다. 커널은 서로 다른 인터럽트에 IRQ 번호를 부여하여 관리한다. 또한, 부팅시, 혹은 실행 중에 IRQ 번호에 따라 인터럽트 핸들러라는 함수를 미리 등록하여, 인터럽트가 발생했을 때 실행될 콜.. 2021. 4. 28.
[Linux Kernel] proc 파일시스템과 seq_file 인터페이스 IT EXPORT, 리눅스 커널 프로그래밍을 읽고 있다. 책에서 다루는 커널 버전은 2.6인데 이걸 5.8에서 따라하려니 인터페이스가 많이 바뀌었다. 책 따라해보다 짜증나서 정리해보려고 한다. (아, 책은 정말 좋다.) 이 글은 5.8 기준으로 작성되었다. proc 파일시스템이란 procfs는 말 그대로 파일시스템이다. 하지만 디스크 기반 파일시스템과는 달리, 실제로 하드디스크 상에 존재하지는 않는다. 다만, 커널 상에서 VFS 인터페이스를 활용해 특수한 파일시스템을 구현한 것이다. procfs는 일반적으로 /proc에 마운트되어있다. 비슷하게 sysfs, debugfs 등이 존재한다. 한 번 쉘에서 /proc에 무엇이 들어있는지 확인해보자. ls /proc 숫자인 것과 아닌 것이 있다. 숫자된 폴더들은.. 2021. 4. 18.
[LInux Kernel] 문자 디바이스 드라이버 작성 디바이스 드라이버란 디바이스 드라이버란 마우스, 키보드, 모니터, 디스크, 네트워크 인터페이스 카드 등 컴퓨터의 주변 장치를 제어하기 위한 프로그램이다. 디바이스 드라이버가 없다면 주변 장치들을 사용할 수가 없다. read()라는 작업을 디스크 관점에서 어떻게 처리할 것인가?와 같은 하드웨어에 밀접한 기능들은 모두 디바이스 드라이버로 구현된다. 디바이스 드라이버는 리눅스 커널에서 모듈로 구현하므로, 먼저 리눅스 커널 모듈에 대해서 알아야 한다. 이건 글로 정리해두었다. 디바이스의 종류 디바이스는 문자 디바이스 드라이버, 블록 디바이스 드라이버로 나눌 수 있다. 문자 디바이스는 시간 순으로 들어오는 데이터를 처리한다. 예를 들어 마우스, 키보드의 입력과 같이 순서대로 처리하는 것이 의미가 있는 데이터들이다.. 2021. 4. 17.