KERNEL
Posts
183 posts[라즈베리파이] 동기화 - 스핀락(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) 소개
리눅스 커널에서 가장 많이 쓰는 동기화 기법 중 하나가 스핀락입니다. 먼저 스핀락의 특징을 알아봅시다. 1. 뮤텍스락 비해 구현 복잡도가 낮습니다.2. spin_lock_irq(), spin_lock_irq_save() 등등 추가 기능이 포함된 함수를 제공합니다.3. 스핀락 구현부는 아키텍처에 의존적입니다. ARM, ARM64 그리고 x86 CPU에 따라 구현부가 다릅니다. 스핀락 동작을 제대로 이해하기 위해선 어셈블리 코드를 분석해야 합니다. 임계 영역에 특정 프로세스에 접근하기 위해서 임계 영역 코드 구간에 스핀락을 걸어 다른 프로세스 접근을 막아야 합니다. 이를 위해 다음과 같은 함수를 호출해야 합니다.static DEFINE_SPINLOCK(static_spinlock);void kernel_fu
[라즈베리파이] 동기화 - 커널 동기화 기법 소개
이전 시간에 Race가 발생하는 3가지 대표적인 상황을 확인했습니다. 이어서 이번에 커널 동기화 기법을 소개하고 그 특징을 알아봅니다. 이전에 소개했던 그림을 다시 보겠습니다. 임계 영역에 A와 B 프로세스가 접근하는 상황입니다. 두 커널 동기화 기법인 스핀락과 뮤텍스의 차이점을 비교하면서 동기화 기법에 대해 살펴보겠습니다. 스핀락과 뮤텍스의 가장 큰 차이점은 위 그림 [6] 번호 밑 박스에 표시돼 있습니다. 이미 락(Lock)을 다른 프로세스가 획득하고 있을 때 기다리는 방법입니다. 스핀락은 다른 일(스케줄링)을 안 하고 화장실 밖에서 계속 기다립니다. 이를 Busy-Wait라고 설명합니다. 뮤텍스는 자신을 대기열에 등록하고 자신을 UNINTERRUPTIBLE 상태로 바꾼 다음 휴면에
[라즈베리파이] 동기화 - 인터럽트 발생으로 레이스 컨디션 발생
이번에는 인터럽트 발생으로 Race가 발생하는 경우를 알아보겠습니다. 그동안 어떤 함수도 인터럽트가 발생하면 실행을 멈추고 인터럽트 벡터로 프로그램 카운터를 이동하고 인터럽트 핸들러와 서브 루틴을 실행합니다. 그런데 인터럽트 발생하기 전에 실행을 멈춘 함수가 인터럽트가 발생해서 다시 실행할 수 있습니다. 이를 확인하기 위해 다음 패치 코드를 입력합시다.diff --git a/mm/slub.c b/mm/slub.c--- a/mm/slub.c+++ b/mm/slub.c@@ -3740,10 +3740,42 @@ static int __init setup_slub_min_objects(char *str) __setup("slub_min_objects=", setup_slub_min_objects); 1 +ex



