라즈베리파이

포스트: 191|조회수: 0|ARTIFACT
Items

Posts

191 posts

[라즈베리파이] 커널동기화 - 임계영역(Critical Section)이란

Guillermo Austin Kim|2018년 9월 7일

리눅스 커널이나 운영체제에서 임계영역(Critical Section)이나 커널 동기화를 설명할 때 화장실을 예를 많이 듭니다. 하나밖에 없는 화장실 문에 있는 자물쇠를 잠그고 용무를 보는 상황입니다. 위 상황을 리눅스 커널 동기화 과정과 빗대서 생각해 봅시다. 첫 번째, 자물쇠는 화장실 문에 있는 잠금장치입니다. 누구나 화장실에 들어갈 때 화장실 문을 잠급니다. 화장실에 들어갈 때 먼저 화장실 문에 있는 자물쇠가 잠겨 있나 확인하는 습관입니다. 화장실 잠금장치는 여러 가지 종류가 있듯 리눅스 커널에도 스핀락, 뮤텍스 기법에 따라 자물쇠 잠금 방법이 다릅니다. 두 번째, 화장실에서 용무는 딱 한 사람만 볼 수 있습니다. 화장실에서 두 사람이 동시에 들어갈 수 없습니다. 유일하게 한 사람이 일을 보는 순

[라즈베리파이]워크큐(Workqueue) - 워크 초기화는 어떻게 하나

Guillermo Austin Kim|2018년 9월 5일

워크를 실행하기 위해서 먼저 워크를 초기화해야 합니다. 워크를 초기화하기 위해서 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

[라즈베리파이] 커널 타이머 -동적 타이머는 누가 언제 호출하나? (3)

Guillermo Austin Kim|2018년 8월 29일

커널 시스템 타이머 전체 흐름에서 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(

[라즈베리파이] 워크큐(Workqueue) 함수 및 로그 Overview

Guillermo Austin Kim|2018년 8월 22일

이전에 소개한 용어와 함께 간단히 워크가 어떤 흐름으로 실행하는지 간단히 코드와 ftrace 로그를 살펴봅시다.[https://elixir.bootlin.com/linux/v4.14.43/source/drivers/tty/vt/vt.c]static DECLARE_WORK(console_work, console_callback); 워크를 실행하려면 우선 워크를 초기화해야 하는데 2가지 방법으로 나눌 수 있습니다. 워크를 전역 변수로 지정하는 방법과 커널 코드가 실행할 때 INIT_WORK() 매크로를 써서 워크를 초기화하는 방법입니다. 위 코드에서는 console_work 전역 변수로 워크를 선언했습니다. 워크를 표현하는 구조체는 struct work_struct인데 이 변수가 console_work이고