_RAW_SPIN_LOCK

포스트: 4
Tags

Posts

4 posts

[라즈베리파이] 동기화 - 스핀락(spinlock): 첫 번째 스핀락 해제 시 동작(1)

Guillermo Austin Kim|2018년 12월 26일

스핀락을 해제할 때는 spin_unlock() 함수를 호출하는데 스핀락 인스턴스의 owner를 +1만큼 증감한다고 알고 있습니다.static inline void arch_spin_unlock(arch_spinlock_t *lock){smp_mb();lock->tickets.owner++;dsb_sev();}spin_unlock() 함수를 호출하면 여러 인라인 형태 함수로 연결되는데 실제 동작은 arch_spin_unlock() 함수가 수행합니다. [1] 번 프로세스가 스핀락을 해제할 때 스핀락 인스턴스인 owner를 +1증감합니다. [2] 프로세스는 Busy-waiting 동작으로 스핀락 인스턴스의 owner가 0x2가 될 때까지 무한루프를 돌고 있는 상태였습니다. 그런데 [2]번 프

[라즈베리파이] 동기화 - 스핀락(spinlock): 스핀락 획득 두 번째 시도

Guillermo Austin Kim|2018년 12월 26일

스핀락 획득 두 번째 시도이전 시간에 스핀락을 누군가 획득했는데 다른 프로세스가 다시 스핀락을 획득할 때 동작을 알아봤습니다. 이번에는 다른 프로세스가 같은 스핀락 획득을 시도하는 상황을 그리면서 분석하겠습니다. 다시 분석할 _raw_spin_lock() 함수 코드를 같이 봅시다.1 80704b60 :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 &

[라즈베리파이] 동기화 - 스핀락(spinlock): 스핀락 획득 첫 번째 시도

Guillermo Austin Kim|2018년 12월 25일

스핀락을 소개했을 때 그림을 다시 소개합니다. 위 그림이 실행할 때 실제 어셈블리 코드를 어떻게 동작하는지 알아보려는 겁니다.다음 소절에 분석하려는 스핀락 인스턴스 owner는 0x1이고 next는 0x2입니다. 이미 스핀락을 획득한 다른 프로세스가 임계 영역을 실행 중이기 때문입니다. 이번에는 누군가 스핀락을 획득한 경우 스핀락이 어떻게 동작하는지 알아보겠습니다. r0는 0xb93b4a78이고 이 메모리 공간에 0x00020001 값이 있습니다. r3은 0x00020001로 변경됩니다. r3에 ticket owner와 next를 모두 저장한 겁니다. next가 owner보다 1만큼 크니 누군가 스핀락을 획득한 상태입니다. 분석하려는 _raw_spin_lock() 함수를 다시 소개합니다.1 807

[라즈베리파이] 동기화 - 스핀락(spinlock): spin_lock() 어셈블리 코드 분석

Guillermo Austin Kim|2018년 12월 25일

이전 시간에 인라인 어셈블리 코드를 살펴봤는데, 이번에는 어셈블리 코드를 분석하겠습니다. 실제 ARM 프로세서 입장에서 스핀락을 어떻게 실행하는지 정확히 파악하려면 어셈블리 코드를 봐야 합니다. 어셈블리 코드를 분석해야 스핀락 핵심 개념을 알 수 있다는 겁니다. 이전 절에 다룬 내용을 이해했으면 그리 어렵지 않습니다. 분석하려는 코드는 다음과 같습니다.1 80704b60 :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, #-