[리눅스커널] 인터럽트 후반부 처리: IRQ 스레드 핸들러인 irq_thread() 함수 분석
By Guillermo Austin Kim | 2020년 4월 25일 |
커널에서 지원하는 wake_up_process() 함수를 사용해 커널 스레드를 깨우면 스케줄러에 의해 커널 스레드는 실행을 시작합니다. 이 때 커널 스레드의 스레드 핸들 함수가 호출되며 스레드의 시나리오에 따라 정해진 동작을 수행합니다. 마찬가지로 IRQ 스레드의 스레드 핸들 함수는 irq_thread() 입니다. 따라서 IRQ 스레드가 깨어나면 irq_thread() 함수가 호출됩니다. 이번 시간에는 IRQ 스레드를 깨우면 실행하는 irq_thread() 함수를 살펴보겠습니다. 먼저 IRQ 스레드를 깨우면 실행하는 irq_thread() 함수를 보겠습니다. static int irq_thread(void *data)2 {3struct callback_head on_exit_work;4stru
[리눅스커널][스케줄링] 컨택스트 스위칭이란 무엇인가
By Guillermo Austin Kim | 2019년 3월 3일 |
컨택스트 스위칭이란 무엇인가컨택스트 스위칭 세부 동작을 알기 위해서 context_switch() 함수를 분석할 필요가 있습니다. context_switch() 함수를 분석하기 전 컨택스트 스위칭의 개념을 소개하겠습니다. 먼저 컨택스트 스위칭이란 용어에 대해서 살펴봅시다. 컨택스트 스위치란 용어는 컨택스트 + 스위치란 단어의 합성어입니다. 컨택스트를 바꾼다는 의미입니다. 여기서 컨택스란 용어는 무슨 뜻일까요? 컨택스트는 프로세스가 실행 중인 그 자체를 의미합니다. 이 표현은 추상적이라 이해하기 어렵습니다. 프로세스 실행 그 자체를 어떻게 표현할까요? 그것은 레지스터 세트입니다. CPU 레지스터 세트가 프로세스 실행 자체를 표현하기 때문입니다. 다음 테이블을 보면서 컨택스트 스위칭에 대한 개념을 알아봅시
[RISC-V] 익셉션 벡터 핸들러 코드 산책 - 리눅스 커널
By Guillermo Austin Kim | 2020년 9월 27일 |
이번 시간에는 RISC-V 기반 리눅스 커널에 구현된 익셉션 벡터 테이블과 익셉션 벡터 핸들러를 분석하겠습니다. 익셉션 벡터 핸들러를 호출하는 코드 확인하기 다음은 익셉션 벡터 핸들러의 구현부입니다. RISCV_PTR do_trap_insn_misaligned RISCV_PTR do_trap_insn_fault RISCV_PTR do_trap_insn_illegal RISCV_PTR do_trap_break RISCV_PTR do_trap_load_misaligned RISCV_PTR do_trap_load_fault RISCV_PTR do_trap_store_misaligned RISCV_PTR do_trap_store_fault RISCV_PTR do_trap_ecall_u /* system cal
리눅스 커널 기여(Contribution) - 패치 작성 및 패치 반영(Contribution) 확인하기
By Guillermo Austin Kim | 2019년 9월 4일 |
이전 시간에는 리눅스 커널 기여(Contribution) 하기 전에 준비해야 할 사항을 소개했습니다.- gmail 계정 생성- mutt 설치 및 설정 이번 시간에는 커널 패치를 작성해보고 패치를 리눅스 매인테이너(Maintainer)에게 보내는 과정을 소개합니다.그리고 업스트림(Upstream)된 패치를 확인하는 방법도 말씀드리겠습니다. 오류 코드 확인하기 먼저 패치를 작성하기 전 커널 코드를 볼까요?참고로 다음 함수는 AMD/PowerPlay 드라이버입니다.[drivers/gpu/drm/amd/powerplay/smumgr/smu8_smumgr.c]01 static int smu8_start_smu(struct pp_hwmgr *hwmgr)02 {03struct amdgpu_device *adev