본문 바로가기

Programming/Linux_Kernel

Linux Kernel 의 spin lock

spin_lock 에 대해서 깔끔하게 정리해 놓았다.

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을 해제하고, 인터럽트플래그를 복구하며, 인터럽트금지를 해제