ARM64- 스택 푸쉬(Stack Push) Userspace -> Kernel Space
By Guillermo Austin Kim | 2017년 12월 25일 |
유저 스페이스에서 커널 스페이스로 전환하려면 시스템 콜을 호출해야 한다 것은 마르고 닳도록 들었죠?이번에는 ARM64 Architecture에서 EL0 ->EL1로 변환될 시, Stack을 어떻게 Push하는 지 살펴볼께요. "rild"란 프로세스의 콜스택을 예를 들어 볼 께요. 잘 보면, 유저 공간에서 sendto란 시스템 콜을 호출했다는 걸 알 수 있네요.-000|do_mem_abort()-001|el1_da(asm) -->|exception-002|ch_pop_remote_rx_intent()-003|glink_tx_common()-004|glink_txv()-005|ipc_router_glink_xprt_write()-006|msm_ipc_router_write_pkt(inline)-00
arm instruction(명령어) - push & 스택 푸쉬
By Guillermo Austin Kim | 2018년 3월 28일 |
push & 스택 푸쉬리눅스 커널 함수를 어셈블리 코드로 열어보면 바로 push란 명령어가 눈에 보입니다. 그럼 정말 맞는지 샘플 코드를 볼까요? 아래 코드는 리눅스 커널 핵심 함수입니다. 각 함수에서 가장 먼저 실행되는 명령어가 push죠.NSR:C0FF413C|__schedule: push {r4-r11,r14}NSR:C0FF4140| add r11,r13,#0x20 ; r11,r13,#32NSR:C0FF4144| ldr r3,0xC0FF4948 NSR:C017B0C4|handle_irq_event_percpu: push {r0-r2,r4-r11,r14}NSR:C017B0C8|
[Arm프로세서] AAPCS: Armv7: 함수를 호출하기 위한 디자인
By Guillermo Austin Kim | 2021년 5월 24일 |
Armv7 아키텍처 관점으로 AAPCS를 보통 SP 레지스터와 LR 레지스터가 어떻게 바뀌는지 기준으로 설명합니다. 하지만 실제 거의 대부분 임베디드 혹은 시스템 개발자들은 SP와 LR 레지스터를 설정하는 어셈블리 코드를 입력하지 않습니다. 그 이유는 대부분 C 프로그래밍으로 코딩을 하기 때문입니다. SP와 LR 레지스터를 보면 낯설게 느끼기 마련입니다. 이번 절에서는 실제 함수를 호출하는 예시 코드와 함께, 함수를 호출하면 SP와 LR 레지스터가 어떻게 바뀌는지 알아보겠습니다. 함수를 호출될 때의 세부 동작 원리 파악하기 여러분이 다음과 같은 함수를 작성했다고 가정하겠습니다. 01 int add_func(int x, int y)02 {03 int result = x + y;04 prin
[Arm프로세서] 캐시(Cache): Direct-Mapped 캐시 구조
By Guillermo Austin Kim | 2022년 6월 12일 |
Direct-Mapped 캐시는 가장 단순한 캐시 구조입니다. 사실 이전 절에서 다뤘던 캐시의 구조는 모두 Direct-Mapped 입니다. 이번에는 다음 그림을 보면서 Direct-Mapped 캐시의 구조 배워봅시다. 그림 17.9 Direct-Mapped 캐시의 구조 그림 왼쪽 부분은 캐시, 오른쪽 부분은 메인 메모리의 주소 공간을 나타냅니다. 먼저 왼쪽 부분에 있는 캐시를 보면 캐시 라인은 8개이며 각각 라인은 메모리 주소에 바로 매핑됩니다. Direct-Mapped 캐시는 그림과 같이 구조가 간단하므로 하드웨어 관점으로 회로를 간단하게 구성할 수 있습니다. 또한 데이터를 빠르게 검색할 수 있습니다. 그런데 Direct-Mapped 캐시는 캐시 히트 비율이 떨어진다는 단점이 있습니다. 각각