라즈베리파이
Posts
191 posts[라즈베리파이] 동기화 - 스핀락(spinlock): 스핀락 중복 획득 시 동작
이전 시간까지 스핀락을 획득하고 해제하는 기본 동작만을 확인했습니다. 실전 개발에서는 스핀락을 다른 프로세스가 접근하는 동작에서 예상치 못한 문제를 볼 수 있습니다. ftrace 로그로 커널을 디버깅하면 스핀락을 바로 획득할 때 보다 스핀락을 얻지 못해 기다리는 빈도가 훨씬 높습니다. 스핀락을 제대로 이해하려면 스핀락을 누군가 획득한 다음 다른 프로세스가 같은 스핀락을 얻기 위해 기다릴 때 어떤 동작을 하는지 상세히 분석할 필요가 있습니다. 그동안 이미 분석한 어셈블리 코드는 될 수 있는 대로 넘어가고 스핀락 중복 획득 시 스핀락이 어떤 동작을 하는지 초점을 맞춰서 코드를 살펴보겠습니다.
[라즈베리파이] 동기화 - 스핀락(spinlock): spin_lock() 어셈블리 코드 분석
이전 시간에 인라인 어셈블리 코드를 살펴봤는데, 이번에는 어셈블리 코드를 분석하겠습니다. 실제 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, #-
[라즈베리파이] 동기화 - 스핀락(spinlock): spin_unlock() 함수 분석
이번에는 스핀락을 해제하는 spin_unlock() 함수 코드를 살펴보겠습니다. spin_unlock() 함수도 spin_lock() 함수와 마찬가지로 여러 함수로 치환돼 do_raw_spin_unlock() 함수를 호출합니다.[https://elixir.bootlin.com/linux/v4.14.43/source/include/linux/spinlock.h]static __always_inline void spin_unlock(spinlock_t *lock){raw_spin_unlock(&lock->rlock);} void __lockfunc _raw_spin_unlock(raw_spinlock_t *lock){__raw_spin_unlock(lock);} static inline v
[라즈베리파이] 동기화 - 스핀락(spinlock): spin_lock() 함수 분석
스핀락을 획득할 때 쓰는 spin_lock()와 함수의 선언부를 봅시다.static __always_inline void spin_lock(spinlock_t *lock); 입력 인자는 포인터 타입 lock 변수이며 spinlock_t 구조체입니다. lock이란 변수가 가르키는 메모리 공간에 스핀락 인스턴스가 있는 겁니다. 함수 선언부가 void이니 반환 값은 없습니다. __always_inline 매크로로 선언했으니 커널 함수 내에서 자주 호출되는 함수임을 알 수 있습니다. 다음은 스핀락을 해제할 때 쓰는 spin_unlock()와 함수의 선언부를 봅시다.static __always_inline void spin_unlock(spinlock_t *lock); spin_lock() 함수와 마찬가지로


