Guillermo Austin Kim

Sources

Posts

998 posts

[리눅스커널] Arm64: Preemption 3가지 함수 실행 흐름 (v5.4)

Guillermo Austin Kim|2021년 7월 21일

1. 커널 코드 실행 도중(인터럽트 핸들러를 처리한 시점): Preemption el1_irq 레이블에서 arm64_preempt_schedule_irq 함수를 호출함 ... irq_handler #ifdef CONFIG_PREEMPT ldr x24, [tsk, #TSK_TI_PREEMPT] // get preempt countalternative_if ARM64_HAS_IRQ_PRIO_MASKING /* * DA_F were cleared at start of handling. If anything is set in DAIF, * we come back from an NMI, so skip preemption */ mrs x0, daif orr x24, x24, x0alternative_els

'디버깅을 통해 배우는 리눅스 커널의 구조와 원리'- 2021년 대한민국학술원 우수학술도서(자연과학 분야) 선정

Guillermo Austin Kim|2021년 7월 20일

'디버깅을 통해 배우는 리눅스 커널의 구조와 원리' 책이 2021년 대한민국학술원 우수학술도서(자연 과학 분야)에 선정됐습니다. 자연 과학 분야의 우수 도서로 선정된 책 목록을 보면 책의 상업성을 떠나 학술적으로 가치가 있는 책으로 보이는데, 이런 목록 중에 제가 쓴 책이 있어 참 기쁩니다. 대학민국 학술원 리눅스 커널은 IT 분야로 볼 수도 있지만, 소프트웨어의 근간을 이루는 운영체제의 핵심 기반 기술이라 자연 과학 학술 분야로 선정된 듯 합니다. 이 책을 많이 읽어주신 개발자님들과 취준생 분들에게 감사의 말씀을 드리고 싶고요. 앞으로 개발자님들과 취준생 분들에게 유익한 콘텐츠(리눅스 커널, Arm 프로세스)를 블로그와 유튜브에 꾸준히 올리겠습니다. 감사합니다

[Arm프로세서] AAPCS: Armv8 아키텍처에서 AAPCS 관련 레지스터

Guillermo Austin Kim|2021년 7월 12일

Armv8 아키텍처의 AAPCS를 구성하는 주요 개념은 Armv7 아키텍처와 거의 유사합니다. 6장에서 다룬 내용을 요약하면 다음과 같습니다. * 서브 루틴을 호출하면 프로세스의 스택 공간에 레지스터를 푸시한다. * 'bl [주소]' 명령어를 실행해 서브 루틴으로 분기하면 Arm 프로세서는 링크 레지스터인 R14에 복귀할 주소를 업데이트한다. * 서브 루틴을 호출할 때 전달되는 인자는 R0-R3 레지스터에 저장된다. * 함수의 리턴값은 R0 레지스터에 저장된다. 위에서 설명한 내용을 Armv8 아키텍처 관점으로 다음과 같이 바꿔서 말할 수 있습니다. * 서브 루틴을 호출하면 프로세스의 스택 공간에 레지스터를 푸시한다. * 'bl [주소]' 명령어를 실행해 서브 루

[Arm프로세서] AAPCS: Armv7: 매우 자주 호출되는 함수는 inline 키워드로 선언

Guillermo Austin Kim|2021년 7월 12일

이번 장에서 서브 루틴을 호출하면 다음과 같은 동작을 수행한다고 배웠습니다. * R0~R3 레지스터에 함수의 인자를 저장 * 서브 루틴은 push와 pop 명령어를 사용해 링크 레지스터를 백업 * 서브 루틴에서 반환하는 값을 R0 레지스터에 저장 이번 장에서 소개된 add_func() 함수를 호출하는 과정에서 실행되는 어셈블리 명령어는 요약하면 다음과 같습니다. 01 10498: e51b100c ldr r1, [fp, #-12]02 1049c: e51b0008 ldr r0, [fp, #-8]03 104a0: ebffffe3 bl 10434...04 000

[Arm프로세서] AAPCS: Armv7: 함수 반환형은 워드 단위로 지정

Guillermo Austin Kim|2021년 7월 5일

함수를 반환하는 자료형은 워드 단위로 제한하는 것이 좋습니다. 워드형인 경우 반환값은 R0 레지스터에 저장하나, 데이터가 워드 범위를 벗어난 경우 R0와 R1레지스터에 반환값을 나눠서 처리하기 때문입니다. [정보]위에서 언급한 워드형이 무엇인지 알아봅시다. 워드(word)는 어셈블리 명령어로 연산 결과를 레지스터에 저장할 수 있는 데이터 단위입니다. 그렇다면 함수가 반환하는 타입이 무엇인지 파악하려면, 함수 선언부의 가장 앞 부분을 보면 됩니다. 예를 들어 이번 소절에서 소개한 add_func() 함수는 int 형의 인자를 반환합니다. int add_func(int a, int b, int c, int d, int e); 대부분 함수가 반환하는 자료형은 워드 타입으로, int, unsinged int