[라즈베리파이] 커널타이머 - 동적 타이머 실행(__mod_timer) 코드 분석
By Guillermo Austin Kim | 2018년 8월 10일 |
이제 add_timer()와 mod_timer() 함수들의 구현부를 살펴 보겠습니다. add_timer() 함수 구현부를 보면 mod_timer() 함수를 호출하니 기능적으로 add_timer() 함수와 mod_timer() 함수는 차이가 없습니다.void add_timer(struct timer_list *timer){ BUG_ON(timer_pending(timer)); mod_timer(timer, timer->expires);} int mod_timer(struct timer_list *timer, unsigned long expires){ return __mod_timer(timer, expires, false);} mod_timer() 함수는 __mod_timer() 함수를 호출하니 동
[라즈베리파이] 동기화 - 스핀락(spinlock): 스핀락 획득 두 번째 시도
By Guillermo Austin Kim | 2018년 12월 26일 |
스핀락 획득 두 번째 시도이전 시간에 스핀락을 누군가 획득했는데 다른 프로세스가 다시 스핀락을 획득할 때 동작을 알아봤습니다. 이번에는 다른 프로세스가 같은 스핀락 획득을 시도하는 상황을 그리면서 분석하겠습니다. 다시 분석할 _raw_spin_lock() 함수 코드를 같이 봅시다.1 80704b60 <_raw_spin_lock>:2 80704b60:e1a0c00d movip, sp3 80704b64:e92dd800 push{fp, ip, lr, pc}4 80704b68:e24cb004 subfp, ip, #45 80704b6c:e52de004 push{lr}; (str lr, [sp, #-4]!)6 80704b70:ebe82672 bl8010e540 &
[라즈베리파이][리눅스커널] in_interrupt() 함수란
By Guillermo Austin Kim | 2018년 6월 16일 |
in_interrupt() 함수란리눅스 커널이 실행할 때 수많은 함수가 각자 서로를 호출합니다. 어떤 함수는 프로세스 컨택스트에서 실행(커널 쓰레드)되는데 대부분 함수는 인터럽트 컨택스트, 즉 인터럽트 처리하는 도중 호출될 수 있습니다. 만약 현재 실행하는 코드가 인터럽트를 처리 중이면 더 빨리 처리해야겠죠? 인터럽트 서비스 루틴은 실행 중인 프로세스를 멈추고 동작하므로 인터럽트 컨택스트 조건에서만 신속하게 코드를 실행시키고 싶을 때가 있습니다. 그럼 현재 실행 중인 코드가 인터럽트 컨택스트 구간인지 어떻게 알 수 있을까요? in_interrupt()란 함수가 이 정보를 알려줍니다. 그럼 다음 패치를 함께 살펴 봅시다. diff --git a/drivers/md/dm-region-hash.c b/dr
4.8 스레드 정보(struct thread_info)
By Guillermo Austin Kim | 2019년 2월 3일 |
프로세스 상세 정보를 저장하는 자료구조는 태스크 디스크립터입니다. 이와 더불러 프로세스 세부 실행 정보를 저장하는 struct thread_info 자료구조가 있습니다. 커널이 프로세스를 생성할 때 프로세스마다 고유한 스택 공간을 부여합니다. 스택 최상단 주소에 struct thread_info 구조체 필드가 저장돼 있습니다. 이 구조체 필드는 커널이 프로세스를 제어할 때 필요한 중요 정보를 담고 있습니다.+ 프로세스 컨택스트 정보+ 선점 스케줄링 여부+ 컨택스트 스위칭 시 저장한 레지스터 세트 이번 절에서는 프로세스 동작을 표현하는 struct thread_info 구조체에 대해서 알아봅시다. struct thread_info 구조체 각 멤버에 대해 알아보기 전에 이 구조체가 프로세스 어느 주소에 위