[리눅스커널] 인터럽트 후반부 처리: 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
[커널크래시] 인터럽트 컨텍스트에서 wake_up_interruptible 대신 wake_up_locked 사용
By Guillermo Austin Kim | 2022년 1월 5일 |
인터럽트 컨텍스트에서 슬립을 지원하는 커널 함수를 호출하면 어떻게 동작할까요? 커널 패닉이 유발됩니다.이번에는 인터럽트 컨텍스트에서 발생한 커널 패닉 이슈를 소개합니다. 먼저 커널 로그를 소개합니다. [1.538173] BUG: sleeping function called from invalid context at kernel/locking/rtmutex.c:973[1.577234] in_atomic(): 1, irqs_disabled(): 128, non_block: 0, pid: 0, name: swapper/3[1.578316] Preemption disabled at:[1.597859] CPU: 3 PID: 0 Comm: swapper/3 [1.617377] Hardware name: rpi[1.6
[RISC-V] RISC-V 툴체인으로 리눅스 커널 빌드하기
By Guillermo Austin Kim | 2020년 9월 28일 |
이번 포스트에서는 RISC-V 툴체인을 설치해 리눅스 커널을 빌드하는 방법을 소개합니다. 먼저 RISC-V 툴체인을 설치하는 명령어를 입력합시다. RISC-V 툴체인 소스를 내려받기 다음 명령어를 입력해 RISC-V 툴체인 소스를 내려받습니다. $ git clone --recursive 아래는 리눅스 터미널에서 위 명령어를 실행한 후 출력 결과입니다. 소스를 내려받는데 1시간 정도 걸리네요. austindh.kim:~/src/risc-v_toolchain$ git clone --recursive into 'riscv-gnu-toolchain'...remote: Enumerating objects: 21, done.remote: Counting objects: 100% (21/21), done.re
[리눅스커널] 시간관리: jiffies와 jiffies_64 변수란
By Guillermo Austin Kim | 2019년 8월 5일 |
![[리눅스커널] 시간관리: jiffies와 jiffies_64 변수란](https://img.zoomtrend.com/2019/08/05/c0246238_5d48560b1c176.png)
jiffies와 jiffies_64 변수란지금까지 커널에서 jiffies 개념에 대해 알아봤습니다. 그렇다면 커널 코드에서 어떤 변수가 jiffies일까요? jiffies와 jiffies_64 변수이다. 뭔가 이상합니다. 어떻게 2개의 변수를 jiffies라고 말할 수 있을까요? 이해를 돕기 위해 한 가지 예를 들겠습니다.[https://github.com/raspberrypi/linux/blob/rpi-4.19.y/drivers/base/power/wakeup.c]1 void pm_wakeup_ws_event(struct wakeup_source *ws, unsigned int msec, bool hard)2 {3unsigned long flags;4unsigned long expires