[리눅스커널][스케줄링] 커널 모드 중 인터럽트 발생으로 선점 스케줄링 실행
By Guillermo Austin Kim | 2019년 2월 9일 |
유저 프로세스 실행 도중 인터럽트가 발생하면 __irq_usr 이란 레이블에서 선점 스케줄링 조건을 점검합니다. 마찬가지로 커널 모드에서 어떤 코드가 실행 도중 인터럽트가 발생할 때 선점 스케줄링(Preemptive Scheduling)을 시도합니다. 이번 소절에서 커널 모드에서 인터럽트가 발생했을때 선점 스케줄링 세부 동작을 살펴봅니다. 다음 블록 다이어그램을 같이 봅시다. 커널 모드에서 코드 실행 중 인터럽트가 발생하면 __irq_svc 이란 인터럽트 벡터로 프로그램 카운터를 브랜치합니다. 위 블록 다이어그램은 커널 모드에서 프로세스가 실행 도중 선점 스케줄링되는 흐름도입니다.커널 모드에서 선점 스케줄링은 다음 과정으로 실행합니다. 1. 인터럽트가 발생해서 __irq_svc 인터럽트 벡터 실행
[라즈베리파이] 프로세스 - 스케줄링(Preemption): 커널 모드 인터럽트 발생
By Guillermo Austin Kim | 2018년 9월 16일 |
이번에는 커널 모드에서 인터럽트가 발생했을때 스케줄링(Preemption)하는 동작을 살펴봅니다. 커널 모드에서 커널 프로세스가 실행 중 인터럽트가 발생하면 __irq_svc 이란 인터럽트 벡터로 PC를 바꿉니다.__irq_svc 코드를 봅시다.[https://elixir.bootlin.com/linux/v4.14.49/source/arch/arm/kernel/entry-armv.S]1 __irq_svc:2 svc_entry3 irq_handler45 #ifdef CONFIG_PREEMPT6 ldr r8, [tsk, #TI_PREEMPT] @ get preempt count7 ldr r0, [tsk, #TI_FLAGS] @ get flags8 teq r8, #0 @ if preempt count
ARM64 - 프로세스(Process) preempt_disable(), preemption 스케줄(Schedule) 조건 분석
By Guillermo Austin Kim | 2017년 12월 25일 |
아래 제 블로그에서 ARM32 아키텍처에서 preempt_disable() 매크로 함수를 호출하면 __irq_svc 벡터에서 svc_preempt 함수를호출하지 않아, preemption이 수행되지 않는다고 확인했어요.http://rousalome.egloos.com/9964816 이번에는 ARM64(Aarch64) 아키텍처에서는 어떤 코드로 구현 되는지 살펴 볼께요. ARM64(Aarch64) 아키텍처는 ARM32 아키텍처와는 다르게 아예 어떤 코드가 실행이 되던 current_thread_info을 읽어올 수 있는 Instruction을 제공해요.코드는 아래와 같은데, "mrs" 명령어로 스택 Top 주소를 가져오네요. current_thread_info()가 호출될 때 속도를 더 빠르게 하기 위
[라즈베리파이] 프로세스 - 스케줄링(Preemption): 유저 공간 실행 중 인터럽트 발생
By Guillermo Austin Kim | 2018년 9월 16일 |
이번에는 인터럽트가 발생했을때 스케줄링(Preemption)하는 동작을 살펴봅니다. 우리는 그 동안 schedule() 함수를 호출했을때만 스케줄링이 실행하는지 알고 있습니다. 그것은 맞는 말입니다.그런데, 인터럽트가 발생했을때 스케줄링이 실행된다는 사실은 잘 모릅니다. 이 사실을 알면 많은 레이스 컨디션 발생 원인을 알 수 있습니다. 이제부터 __irq_usr이란 인터럽트 벡터부터 __schedule() 함수가 실행하는 코드 흐름을 알아보겠습니다. 유저 공간에서 프로세스 실행 도중 인터럽트가 발생하면 인터럽트 벡터로 __irq_usr이란 레이블을 실행합니다.먼저 __irq_usr 코드를 보겠습니다. 인터럽트 처리가 아키텍처에 의존적이니 어셈블리 코드로 구현됐습니다.[https://elixir.boo