Guillermo Austin Kim
Posts
998 posts![[라즈베리파이] 워크큐(Workqueue) - 워크를 워크큐에 어떻게 큐잉할까?(1)](https://img.zoomtrend.com/2018/09/08/c0246238_5b933e53d810f.png)
[라즈베리파이] 워크큐(Workqueue) - 워크를 워크큐에 어떻게 큐잉할까?(1)
워크를 초기화만 하면 워크를 실행할 수는 없습니다. 우선 워크를 워크큐에 큐잉해야 워커 쓰레드는 워크를 실행할 수 있습니다. 이번절에서는 워크를 워크큐에 큐잉하면 워크큐 전체 흐름으로 어떤 동작을 하는지 알아 보겠습니다. 워크 초기화는 struct work_struct 타입 변수를 INIT_WORK() 함수에 전달하거나 DECLEAR_WORK() 함수로 struct work_struct 변수를 선언하면 됩니다. 이 워크를 워크큐를 큐잉하려면 struct work_struct 타입 변수를 schedule_work()이라는 함수에 파라미터로 전달하면 됩니다. 이번에는 워크를 워크큐에 큐잉하는 코드는 다음과 같습니다.[https://elixir.bootlin.com/linux/v4.14.43/source/d
[라즈베리파이] 커널동기화 - 임계영역(Critical Section)이란
리눅스 커널이나 운영체제에서 임계영역(Critical Section)이나 커널 동기화를 설명할 때 화장실을 예를 많이 듭니다. 하나밖에 없는 화장실 문에 있는 자물쇠를 잠그고 용무를 보는 상황입니다. 위 상황을 리눅스 커널 동기화 과정과 빗대서 생각해 봅시다. 첫 번째, 자물쇠는 화장실 문에 있는 잠금장치입니다. 누구나 화장실에 들어갈 때 화장실 문을 잠급니다. 화장실에 들어갈 때 먼저 화장실 문에 있는 자물쇠가 잠겨 있나 확인하는 습관입니다. 화장실 잠금장치는 여러 가지 종류가 있듯 리눅스 커널에도 스핀락, 뮤텍스 기법에 따라 자물쇠 잠금 방법이 다릅니다. 두 번째, 화장실에서 용무는 딱 한 사람만 볼 수 있습니다. 화장실에서 두 사람이 동시에 들어갈 수 없습니다. 유일하게 한 사람이 일을 보는 순
[라즈베리파이]워크큐(Workqueue) - 워크 초기화는 어떻게 하나
워크를 실행하기 위해서 먼저 워크를 초기화해야 합니다. 워크를 초기화하기 위해서 INIT_WORK() 혹은 DECLARE_WORK() 매크로를 써야 합니다. INIT_WORK() 매크로는 함수가 실행할 때 워크를 동적으로 초기화하고 DECLARE_WORK()은 컴파일이 될 때 전역 변수로 워크를 설정합니다. 두 매크로를 쓰면 워크를 어떻게 초기화하는지 드라이버 코드를 확인하겠습니다. 첫 번째로 INIT_WORK() 매크로로 워크를 초기화하는 방법입니다. 다음 4번째 줄 코드를 보겠습니다.1 void tty_buffer_init(struct tty_port *port)2 {3 struct tty_bufhead *buf = &port->buf;..4 INIT_WORK(&buf->wo
[라즈베리파이] 커널 타이머 - 동적 타이머 실습 및 로그 분석(1)
이전 시간에 소스 코드 분석으로 커널 시스템 타이머 동작에 대해 알아봤습니다. 코드를 읽고 이해하는 과정도 중요하지만 배운 내용을 자신의 것으로 만들려면 분석한 코드가 리눅스 시스템에서 실제 어떻게 실행하는지 확인해야 합니다. 한 걸음 나아가 코드를 수정하면서 라즈베리파이에서는 커널 타이머 자료구조 데이터가 어떤 값인지도 확인할 필요도 있습니다. 이번에 소개하는 패치 코드를 입력하고 ftrace 로그를 분석하는 과정을 거치면 배운 내용이 훨씬 더 오랫동안 기억에 남을 것이라 확신합니다. 먼저 전체 패치 코드를 소개합니다.diff --git a/kernel/softirq.c b/kernel/softirq.c--- a/kernel/softirq.c+++ b/kernel/softirq.c@@ -424,10 +
[라즈베리파이] 커널 타이머 -동적 타이머는 누가 언제 호출하나? (3)
커널 시스템 타이머 전체 흐름에서 4단계를 분석할 차례입니다. [그림 ] 커널 타이머 전체 흐름도 4단계마지막 4단계인 커널 시스템 타이머가 동적 타이머를 종료하고 동적 타이머 핸들러 함수를 호출하는 동작을 살펴보겠습니다. 주석문을 지우고 본 run_timer_softirq() 함수 구현부는 다음과 같습니다. 1 static __latent_entropy void run_timer_softirq(struct softirq_action *h)2 {3struct timer_base *base = this_cpu_ptr(&timer_bases[BASE_STD]);4base->must_forward_clk = false;56__run_timers(base);7if (IS_ENABLED(
![[웹툰단행본] 『통제구역관리부』 1권 후기 : 이상한 변칙과 기이한 일들이 일어나는 공간에 대하여](https://img.zoomtrend.com/2026/06/09/1780996474-SE-5eda86fa-0d63-4afd-b8dd-b801879fed52.jpg)


![[CV] [Comi] 'あかね噺'(아카네 이야기) 22권. 아카네의 첫 전력 승부](https://img.zoomtrend.com/2026/06/08/1780982081-EC9D8CEC9585EC9D98EBA6ACEB93ACEC9CBCEBA19C.jpg)