Guillermo Austin Kim

Sources

Posts

998 posts

[리눅스커널] 동기화: 스핀락(spinlock) 처리 흐름도 알아보기

Guillermo Austin Kim|2019년 9월 12일

스핀락을 분석할 때 스핀락을 획득한 후 임계 영역을 실행할 때 바뀌는 자료구조를 함께 파악하는 것이 중요합니다. 이번에 스핀락을 관리하는 spinlock_t 구조체를 다시 보면서 스핀락 자료 구조를 설명을 드리겠습니다.(spinlock_t *) (spinlock_t*)0xb7e0eb00 (struct raw_spinlock) rlock = ( (arch_spinlock_t) raw_lock = ( (u32) slock = 0x134C134C, (struct __raw_tickets) tickets = ( (u16) owner = 0x134C, (u16) next = 0x134C)))) 위와 같이 spinlock_t 구조체는 서로 다른 아키텍처에서 스핀

[리눅스커널] 동기화: 스핀락(spinlock)을 쓰는 예제 코드 살펴보기

Guillermo Austin Kim|2019년 9월 11일

스핀락을 표현하는 구조체를 확인했으니 스핀락을 어떤 방식으로 획득하고 해제하는지 살펴보겠습니다. 예제 코드를 보기 전에 spin_lock() 함수와 spin_unlock() 함수의 선언부를 소개합니다. 이번에는 스핀락을 획득할 때 쓰는 spin_lock()와 함수의 선언부를 보겠습니다.static __always_inline void spin_lock(spinlock_t *lock); 입력 인자는 포인터 타입 lock 변수이며 spinlock_t 구조체입니다. 함수 선언부가 void이니 반환 값은 없습니다. __always_inline 매크로로 선언했으니 커널 함수 내에서 자주 호출되는 함수임을 알 수 있습니다. 다음은 스핀락을 해제할 때 쓰는 spin_unlock()와 함수의 선언부를 봅시다

[리눅스커널] 동기화: 스핀락 자료구조 알아보기

Guillermo Austin Kim|2019년 9월 11일

스핀락 구조체나 자료구조는 다음과 같은 관점으로 분석하면 이해가 빠릅니다.  스핀락을 획득하거나 해제할 때 어떤 필드가 바뀔까? 스핀락을 획득했다고 어떻게 판단할까? 이 점을 염두하고 스핀락을 표현하는 자료구조를 분석하겠습니다. 다음은 스핀락을 표현하는 자료구조인 spinlock_t 구조체 선언부입니다.[https://elixir.bootlin.com/linux/v4.19.30/source/include/linux/spinlock_types.h]1 typedef struct spinlock {2 union {3 struct raw_spinlock rlock;4 };5 } spinlock_t; spinlock_t은 struct spinlock 자료형이며 struct raw_spinlock

[리눅스커널] 시스템 콜: 시그널 전달 및 스케줄링 실행 조건 점검

Guillermo Austin Kim|2019년 9월 7일

이번 소절에서는 다음 레이블의 어셈블리 코드를 분석합니다.  ret_fast_syscall 레이블 slow_work_pending 레이블 코드  do_work_pending() 위에서 언급된 함수를 분석하면 시스템 콜 핸들링을 마친 후 커널이 시그널 전달과 선점 스케줄링 실행 조건을 어떻게 점검하는지 파악할 수 있습니다. ret_fast_syscall 레이블 코드 분석하기 시스템 콜 핸들러 실행 마무리 후 유저 공간으로 복귀하는 동작의 출발점은 ret_fast_syscall 레이블입니다. 먼저 ret_fast_syscall 레이블 코드를 분석하겠습니다.[https://elixir.bootlin.com/linux/v4.19.30/source/arch/arm/kernel/entry-common

[리눅스커널] 시스템 콜: ret_fast_syscall 레이블 전체 흐름도

Guillermo Austin Kim|2019년 9월 6일

이번에는 ret_fast_syscall 레이블 전체 실행 흐름도를 살펴보겠습니다.다음 그림은 ret_fast_syscall 레이블에서 no_work_pending 레이블까지 동작 흐름도입니다. [그림 11.9] ret_fast_syscall 레이블 실행 흐름도 위 그림에서 보이듯 ret_fast_syscall 레이블의 핵심 동작은 시스템 콜 실행을 종료하고 유저 공간으로 복귀하는 것입니다. 각 단계 별로 어떤 동작을 하는지 살펴봅시다. 1 단계: ret_fast_syscall 레이블 실행프로세스 최상단 주소에 있는 struct thread_info 구조체 flag 필드가 _TIF_WORK_MASK 인지 점검합니다. 아닐 경우 다음 조건으로 처리합니다. 1> TIF_SYSCALL_WORK