Lcd 에 control data 를 보내기 위해서 spin_lock_irqsave() 를 사용해 보았다.
보통은 저 함수가 인터럽트를 disable 해주기 때문에 인터럽트 핸들러에서 주로 사용된다고 한다.
그렇다면 disable 된 인터럽트들은 어떻게 되는 것일까?
누구 아는 사람?!!
원문 : http://blog.naver.com/ryswin?Redirect=Log&logNo=140043664262
* spin_lock_irqsave()와 spin_lock_irq()
둘다 interrupt를 disable 시킨 이후에 spin lock을 획득하는 것은 동일하지만,
spin_lock_irqsave()는 CPU의 flag 레지스터를 보관했다가
spin_unlock_irqrestore()로 복구할 수 있다.
* spin_lock()과 spin_lock_irq()의 차이는
spin_lock()은 interrupt를 disable하지 않기 때문에
interrupt handler(top half)에서는 사용할 수 없다.
대신 이때는 spin_lock_irq()나 spin_lock_irqsave()를 사용해야 한다.
* spin_lock_bh()
같은 종류의 softirq는 여려 CPU에서 동시에 실행될 수 있기 때문에
([ksoftirqd/CPUn] 커널 쓰레드가 softirq의 실행을 담당한다.)
softirq를 disable한 이후에 spin lock을 획득한다.
원래 이 함수의 이름은 spin_lock_softirq() 정도가 되어야 맞겠지만
예전 커널의 흔적이 아직 남아있다.
* 그리고, spin_lock()은
spin lock으로 보호해야 할 데이터가
interrupt handler(top half)에서도, softirq handler에서도 접근하지 않고
단지 그 외의 일반적인 커널 코드에서만 접근한다면
interrupt disable, softirq disable 같은 overhead 없이 spin lock을 얻을때 사용한다.
spinlock_t - SpinLock을 위한 자료구조
spin_lock(slp) - SpinLock을 획득
spin_unlock(slp) - SpinLock을 해제
spin_lock_init(slp) - SpinLock을 해제된 상태로 초기화
spin_trylock(slp) - SpinLock을 획득하기위해 시도를 하고, 성공하면 1, 실패하면 0을 돌려줌
spin_unlock_wait(slp) - SpinLock이 풀릴 때까지 기다린다.
spin_lock_irq(slp) - 인터럽트를 금지시키고, SpinLock을 획득
spin_unlock_irq(slp) - SpinLock을 해제하고, 인터럽트금지를 해제
spin_lock_irqsave(slp, flags) - 인터럽트플래그를 저장하고, 인터럽트를 금지하고, SpinLock을 획득
spin_unlock_irqrestore(slp, flags) - SpinLock을 해제하고, 인터럽트플래그를 복구하며, 인터럽트금지를 해제
'Programming > Linux_Kernel' 카테고리의 다른 글
udev debuging 방법 (0) | 2009.04.13 |
---|---|
Linux kernel compile 시 stdio.h / stdlib.h 애러 (0) | 2009.01.21 |
kernel 에서 ntoa 사용하기 (2) | 2008.12.02 |
[Linux][kernel] __user 키워드 (0) | 2008.11.28 |
arm 에서 system call 을 호출할때 4개 이상의 파라미터를 어떻게 처리하는가? (1) | 2008.11.20 |