본문 바로가기

All154

[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] semaphore (2) - semaphore 분석 semaphore의 매커니즘을 분석해보자. 아래 그림은 코드를 그림으로 옮긴 것이다. struct semaphore 이전 글에서 살펴본 semaphore 구조체다. 구조체 자체를 보호하기 위한 lock, lock을 획득할 수 있는 스레드 수를 나타내는 count, 대기중인 스레드를 나타내는 wait_list가 있다. /* Please don't access any members of this structure directly */ struct semaphore { raw_spinlock_tlock; unsigned intcount; struct list_headwait_list; }; struct semaphore_waiter semaphore 대기를 하기 위해 사용되는 자료구조이다. 매우 직관적이다. .. 2021. 4. 23.
[Linux Kernel] semaphore (1) - semaphore의 개념과 사용법 [kernel/locking] spinlock (1) - spinlock 사용법 앞선 글에서 lock이란 무엇이고, lock의 필요성에 대해서 알아보았다. 이번 글에서는 가장 기본적인 spinlock을 리눅스 커널에서 어떻게 구현했는지 알아볼 것이다. 우선 관련된 개념을 몇 가지 살펴 hyeyoo.com spinlock은 선점을 비활성화하고, 필요에 따라서 interrupt나 bottom half도 비활성화를 하므로 spinlock은 오랫동안 락을 들고있어선 안된다. 오랫동안 스케줄링과 인터럽트가 처리되지 않는다고 생각하면 정말 끔찍하다. spinlock은 그 특성상 락을 획득한 동안에는 sleep이 불가능하다. 이러한 상황에서는 spinlock 대신, "sleeping lock"인 semaphore를 .. 2021. 4. 22.
[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.