Linux Kernel(4.19) Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

110187
803
94439


[리눅스커널] 시간관리: 동적 타이머 자료구조 struct list 소개 7장. 타이머관리

동적 타이머 초기화 과정을 살펴보기 전 동적 타이머 자료구조인 struct timer_list 구조체를 소개합니다.
[https://github.com/raspberrypi/linux/blob/rpi-4.19.y/include/linux/timer.h]
01 struct timer_list {
02 struct hlist_node entry;
03 unsigned long expires;
04 void (*function)(struct timer_list *);
05 u32 flags;
06
07 #ifdef CONFIG_LOCKDEP
08 struct lockdep_map lockdep_map;
09 #endif
10 };

구조체 각 필드들의 의미를 살펴보겠습니다.

struct hlist_node entry;
해시 링크드 리스트입니다. timer_bases 전역 변수에 동적 타이머를 등록할 때 쓰입니다.

unsigned long expires;
동적 타이머 만료 시각을 저장합니다. 이 시각에 커널 시스템 타이머가 동적 타이머의 핸들러 함수를 호출합니다. 이 값의 단위는 HZ입니다.

void (*function)(struct timer_list *); 
동적 타이머 핸들러 함수 주소를 저장하는 필드입니다. 
call_timer_fn() 함수에서 이 필드에 접근해 동적 타이머 핸들러를 호출합니다.

u32 flags;
타이머 설정 필드이며 다음 값 중 하나입니다. 
[https://github.com/raspberrypi/linux/blob/rpi-4.19.y/include/linux/timer.h]
#define TIMER_CPUMASK 0x0003FFFF
#define TIMER_MIGRATING 0x00040000
#define TIMER_BASEMASK (TIMER_CPUMASK | TIMER_MIGRATING)
#define TIMER_DEFERRABLE 0x00080000
#define TIMER_PINNED 0x00100000
#define TIMER_IRQSAFE 0x00200000
#define TIMER_ARRAYSHIFT 22
#define TIMER_ARRAYMASK 0xFFC00000

위 플래그를 OR 비트 연산한 결과를 flags 필드에 저장합니다.

라즈비안은 CONFIG_LOCKDEP 컨피그가 선언돼 있지 않으므로 lockdep_map 필드는 컴파일되지 않습니다. 즉, lockdep_map 필드는 struct timer_list 구조체에 포함되지 않습니다.

    그렇다면 동적 타이머를 초기화하면 struct timer_list 중 어느 필드가 바뀔까요? 

flags만 업데이트됩니다. 

리눅스 커널 버전에 따라 동적 타이머를 초기화하는 범위가 다릅니다. 라즈비안에서 구동하는 커널 4.19.30 버전에서 flags 필드만 바꿉니다.


#커널 시간관리 목차
커널 타이머 관리 주요 개념 소개
jiffies란
커널 타이머 제어
동적 타이머 초기화
동적 타이머 등록하기
동적 타이머는 누가 언제 실행하나?
라즈베리파이 커널 타이머 실습 및 로그 분석

"혹시 궁금점이 있으면 댓글로 질문 남겨주세요. 아는 한 성실히 답글 올려드리겠습니다!"


핑백

덧글

댓글 입력 영역