[리눅스커널] 워크큐: create_worker() 함수에서 호출한 워크큐 커널 함수 분석하기
By Guillermo Austin Kim | 2019년 9월 26일 |
이번 시간에는 create_worker() 함수에서 호출한 워커 스레드 세부 제어 함수를 살펴보겠습니다. worker_attach_to_pool() 함수 분석하기 worker_attach_pool() 함수는 워커를 워커풀에 연결하는 역할을 수행합니다. [https://elixir.bootlin.com/linux/v4.19.30/source/kernel/workqueue.c] 01 static void worker_attach_to_pool(struct worker *worker,02 struct worker_pool *pool)03 {04mutex_lock(&pool->attach_mutex);0506set_cpus_allowed_ptr(worker->task, pool-
[리눅스커널] 프로세스 별로 파일 디스크립터(파일 객체)는 어떻게 관리하나?
By Guillermo Austin Kim | 2020년 2월 18일 |
아래 포스팅을 읽은 방문자님께서 댓글로 남겨 주신 질문에 대답하려고 합니다. [리눅스커널][가상파일시스템] 파일 객체: write 연산 세부 동작 분석 질문 서로 다른 프로세스에서 f1파일을 열었으니 fd가 가르키는 시스템 파일 테이블의 파일이 다를텐데어떻게 내용이 삭제되거나 섞이지도 않는지 알수 있을까요? 답신 사실 이 부분은 커널을 디버깅해봐야 알 수 있는 내용입니다. 커널 디버깅 툴 중 많이 사용되는 크래시 유틸리티로 이 내용을 확인해보겠습니다. 다음은 프로세스가 저장하고 있는 파일 디스크립터 목록을 출력해주는 'files 1' 명령어를 입력한 결과입니다. crash> files 1PID: 1 TASK: cf930f40 CPU: 0 COMMAND: "systemd"ROO
[라즈베리파이] 워크큐(Workqueue)는 왜 잘 알아야 할까?
By Guillermo Austin Kim | 2018년 8월 22일 |
이번에 워크큐는 왜 잘 알아야 하는지 생각해 봅시다.워크큐는 영어 문법으로 보면 BE 동사와 같다고 볼 수 있습니다. 리눅스 커널을 탑재한 어느 시스템에서도 워크, 워커 쓰레드를 볼 수 있습니다. 리눅스 핵심 함수들에서 워크큐를 쓰고 있기 때문입니다. 다른 기법과 마찬가지로 워크큐 함수를 모르면 드라이버 코드를 읽을 수 없습니다. 워크를 써서 후반부 처리를 하는 코드를 작성하기는 쉽습니다. 하지만 워크를 쓰다가 생기는 문제는 개발자가 직접 해결해야 합니다. 워크큐 커널 함수 입장에서는 누가 워크를 큐잉했는지 모릅니다. 그래서 커널 핵심함수나 드라이버에서 워크를 큐잉해도 워크큐 커널 함수는 동등하게 처리합니다. 워크를 쓰다 생기는 문제를 해결하려면 어떤 단계를 밟아야 할까요? 우선 우선 커널이 워크큐를 어떻
[리눅스커널] 인터럽트 후반부 처리: IRQ 스레드의 전체 실행 흐름 정리
By Guillermo Austin Kim | 2020년 4월 25일 |
![[리눅스커널] 인터럽트 후반부 처리: IRQ 스레드의 전체 실행 흐름 정리](https://img.zoomtrend.com/2020/04/25/a0386257_5ea4bb44cd025.png)
지금까지 IRQ 스레드 핸들인 irq_thread() 함수에서 irq_thread_fn() 함수를 호출해 IRQ 스레드 핸들러 함수를 호출하는 과정을 살펴봤습니다. 이번에는 배운 내용을 정리하는 차원으로 IRQ 스레드 전체 실행 흐름을 보면서 정리하는 시간을 갖겠습니다. [그림 6.7] "irq/86-mmc1" IRQ 스레드 실행 흐름도 눈끔 화살표는 함수 실행 흐름 방향입니다. 위 그림에서 실행 순서별 동작을 살펴보겠습니다. [1]: arch_cpu_idle() 함수 실행 중 86번 인터럽트가 발생해서 인터럽트 벡터인 __irq_svc가 실행합니다. [2]: __handle_irq_event_percpu() 함수까지 실행한 후 86번 인터럽트 핸들러인 bcm283