IN_INTERRUPT

Category
아이템: 
포스트 갯수4

[리눅스커널] 비트 마스크를 어셈블리 코드로 빨리 읽는 방법 - HARDIRQ_MASK, SOFTIRQ_MASK, NMI_MASK

By Guillermo Austin Kim | 2019년 5월 11일 | 
이번에는 비트 마스크를 C 코드가 아닌 어셈블리 코드로 읽는 방법을 소개합니다. in_interrupt() 함수 소개 in_interrupt() 함수는 현재 프로세스가 인터럽트 컨택스트인지 알려주는 기능입니다.[https://elixir.bootlin.com/linux/v4.19.30/source/include/linux/preempt.h]#define in_interrupt() (irq_count()) in_interrupt() 함수 코드를 보면 irq_count() 함수로 치환됩니다.[https://elixir.bootlin.com/linux/v4.19.30/source/include/linux/preempt.h]#define irq_count() (preempt_count() & (HAR

[라즈베리파이][리눅스커널] in_interrupt() 함수란

By Guillermo Austin Kim | 2018년 6월 16일 | 
in_interrupt() 함수란리눅스 커널이 실행할 때 수많은 함수가 각자 서로를 호출합니다. 어떤 함수는 프로세스 컨택스트에서 실행(커널 쓰레드)되는데 대부분 함수는 인터럽트 컨택스트, 즉 인터럽트 처리하는 도중 호출될 수 있습니다. 만약 현재 실행하는 코드가 인터럽트를 처리 중이면 더 빨리 처리해야겠죠? 인터럽트 서비스 루틴은 실행 중인 프로세스를 멈추고 동작하므로 인터럽트 컨택스트 조건에서만 신속하게 코드를 실행시키고 싶을 때가 있습니다. 그럼 현재 실행 중인 코드가 인터럽트 컨택스트 구간인지 어떻게 알 수 있을까요? in_interrupt()란 함수가 이 정보를 알려줍니다. 그럼 다음 패치를 함께 살펴 봅시다. diff --git a/drivers/md/dm-region-hash.c b/dr

[라즈베리파이] 인터럽트 디버깅 - in_interrupt #CS

By Guillermo Austin Kim | 2018년 6월 4일 | 
in_interrupt 함수는 현재 구동 중인 프로세스 스택 Top 주소에 위치한 current_thread_info()->preempt_count 멤버이며 인터럽트 서비스 루틴이 실행되기 전 __irq_enter 함수에서 HARDIRQ_OFFSET를 더하고 인터럽트 서비스 루틴이 종료되면 해제합니다. 이제 커널 소스를 조금 수정해서 라즈베리안에서는 in_interrupt 매크로 값이 뭔지 확인하겠습니다. 인터럽트 핸들러에 아래 코드를 반영하고 로그를 받아보면 in_interrupt() 함수 리턴값을 볼 수 있습니다.diff --git a/drivers/mmc/host/bcm2835-sdhost.c b/drivers/mmc/host/bcm2835-sdhost.cindex 273b1be05..5f5

[라즈베리파이][리눅스커널]인터럽트 컨택스트란 (1) #CS

By Guillermo Austin Kim | 2018년 3월 2일 | 
인터럽트 컨택스트란인터럽트 컨택스트란 용어가 좀 낯설진 않나요? 그래서 인터럽트 컨택스트를 배우기 전에 우선 컨택스트란 용어를 배울 필요가 있습니다. 혹시 컨텍스트 스위칭이란 단어 들어보신 적이 있나요? 리눅스 커널에서 많이 쓰는 용어인데요. 어렵게 설명하면 컨텍스트란 현재 실행하고 있는 레지스터 묶음을 의미합니다. ARM 프로세스에서는 15개의 레지스터(r0부터 pc)가 있다고 알고 있죠? 이 레지스터 중에 현재 실행 중인 코드 주소를 담고 있는 pc(Program Counter)란 레지스터가 있는데요. 만약 현재 커널이 start_kernel이란 함수를 실행하고 있는데 이 함수의 주소가 0xC000D000이면 pc란 레지스터는 0xC000D000 주소를 담고 있습니다. 이렇게 PC 레지스터를 포함한