본문 바로가기

전체 글

(518)
Exception: lr : rcu_do_batch+0x2dc at virtual address ffff0000312ebe00 from: https://lore.kernel.org/all/2aaa078a-100c-4974-be5b-b58a7f3a6dbb@kzalloc.com/ 콜 스택은 다음과 같습니다: [ 194.911744] Call trace: [ 194.911747] 0xffff0000312ebe00 (P) [ 194.911759] rcu_core+0x2a0/0x4e8 [ 194.911767] rcu_core_si+0x1c/0x30 [ 194.911773] handle_softirqs+0x1b4/0x588 [ 194.911782] run_ksoftirqd+0x5c/0xf8 [ 194.911787] smpboot_thread_fn+0x27c/0x490 [ 194.911794] kthread+0x2..
[인프런][강의할인 쿠폰-40%] Arm, RISC-V 아키텍처 + 리눅스 커널 (Arm, RISC-V 강의 + 리눅스 커널 강의) - [2025년] 2025년 새학기를 맞이해 (요청하시는 분들이 계셔서...) 인프런에 오픈한 강의에 대한 특별 할인 쿠폰(40%)을 블로그에 올립니다. ※ 인프런은 '꼭' 과정별 링크를 이용해 접속해 주세요!!! 쿠폰 유효기간: 3월 20일 ~ 4월 30일 (23시 59분) [Arm, RISC-V 아키텍처 시리즈] - 시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리 - 1부 저자 직강: 40% 할인쿠폰 100매 (할인 쿠폰 링크) https://inf.run/k8bGx - 시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리 - 2부 저자 직강: 40% 할인쿠폰 100매 (할인 쿠폰 링크) https://inf.run/tt9y4- 디버깅으로 배우는 RISC-V 아키텍처 -1부: 40%..
칩셋업체(Chipset vendor) 개발자와 협력할 때 주의해야 할 5가지 시스템 소프트웨어 개발 과정에서 다양한 업체들과 협력이 필요합니다. 아래 그림처럼 복잡한 생태계를 가지고 있으며, 특히 제품 개발 업체(OEM) 개발자들은 칩셋 업체 개발자들과 자주 협력합니다. 보통 OEM 업체는 칩셋 업체에게 기술 지원을 요청할 때 Service Request(SR)라는 ‘티케팅 서비스’를 사용합니다. 예를 들어, OEM 업체가 퀄컴의 SM8650 칩셋을 사용하고 있다고 가정해 봅시다. 어떤 기술 문제가 생겼을 때, 이메일로 지원을 요청할 수 있습니다. 하지만 대부분의 경우, 퀄컴 개발자는 “SR 티켓을 먼저 열어주세요”라고 답할 것입니다. 이는 퀄컴뿐 아니라 대부분의 칩셋 업체도 마찬가지입니다. 각 회사마다 정해진 기술 지원 절차가 있습니다. 칩셋 업체 개발자들과 네트워킹을 해 보면..
[RISC-V] 리눅스 커널 - local_irq_enable() 함수의 역할과 sstatus.sie (로컬 인터럽트 설정) 리눅스 커널에서는 로컬 인터럽트(local interrupt)를 활성화하거나 비활성화할 때 사용하는 API 함수들이 있습니다:  - local_irq_enable()  -  local_irq_disable() 코드 분석: preempt_schedule_irq() 함수이제 preempt_schedule_irq() 함수의 일부 코드를 살펴보겠습니다:asmlinkage __visible void __sched preempt_schedule_irq(void){ enum ctx_state prev_state; /* Catch callers which need to be fixed */ BUG_ON(preempt_count() || !irqs_disabled()); prev_state = exception_ente..
[RISC-V] 가상 메모리 시스템: satp 레지스터 (멀티 레벨 페이지 테이블, 강의 영상) RISC-V 아키텍처에서는 MMU를 지원하며, 멀티 레벨 페이지 변환을 지원합니다. 리눅스와 같은 Rich한 운영체제는 가상 메모리 시스템에서 실행되며, 소프트웨어가 바라보는 주소는 가상 주소입니다. 이 중에 1st lookup page table의 베이스 주소는 satp 레지스터를 사용해서 관리합니다. 상세한 동작 방식은 아래 강의 영상을 참고하세요:
[RISC-V] 인터럽트 콘트롤러(Interrupt Controller)의 구조 - PLIC, CLIC RISC-V 아키텍처에서는 2가지 타입의 인터럽트 콘트롤러가 있다:PLIC (Platform-level Interrupt Controller)CLIC (Core-local Interrupt Controller)아래 그림을 보면서 전체 구조를 확인하자:PLIC는 외부 퍼리퍼럴 디바이스에서 유발되는 인터럽트를 받아서, RISC-V Hart에 전달(Routing)하는 역할을 한다. RISC-V Hart(Core)는 인터럽트가 유발됐다는 사실을 확인한 후, 익셉션을 유발한다. CLIC는 RISC-V Hart 내부에 존재한다. 타이머나 Software generated interrupt를 유발하는데 주로 사용된다. CLIC를 통해서 인터럽트가 유발되면 RISC-V Hart는 역시 익셉션을 유발한다. 퍼리퍼럴에서 ..
[RISC-V] tp 레지스터 (Register)의 핵심 정보 - task_struct Background리눅스 커널은 함수와 자료 구조로 구성되어 있다. 자료 구조 중에서 가장 중요한 것은 무엇일까? 정답은 없지만, 많은 커널 개발자들은 task_struct 구조체라고 답할 것이다. task_struct는 프로세스의 속성 정보를 나타내는 구조체이다. task_struct 구조체의 주소만 알면 커널의 대부분의 정보를 확인할 수 있다. 예를 들면: -모든 프로세스의 task_struct 구조체 주소 -모든 프로세스의 콜 스택 -모든 프로세스별로 오픈한 파일 디스크립터 정보그런데 이러한 task_struct 구조체가 범용 레지스터에서 확인될 수 있다면 어떤 생각이 들까? 아마 다음과 같을 것이다: 디버깅 관점: 디버깅을 매우 효율적으로 할 수 있겠다. 보안 관점: 시스템의 중요한 정보를 레지스..
[Linux Kernel] RISC-V: swapper_pg_dir 변수를 이용한 satp 주소 찾기 배경RISC-V 아키텍처에는 여러 가지 CSR(Control and Status Register) 레지스터가 있습니다. 그중 하나가 satp 레지스터입니다. satp 레지스터의 역할은 무엇일까요? 첫 번째(1st) 페이지 테이블 엔트리의 주소를 저장하는 역할을 합니다. 만약 TRACE32 같은 디버깅 장비를 사용하면 satp 레지스터 값을 직접 확인할 수 있습니다. 하지만 TRACE32 없이 리눅스 커널 내부에서 satp 값을 확인하는 방법은 무엇일까요? 이 글에서는 그 방법에 대해서 상세히 다룹니다. 리눅스 커널: swapper_pg_dirsatp 값(첫 번째 페이지 테이블의 엔트리 주소)을 확인하려면 swapper_pg_dir 전역 변수의 가상 주소를 먼저 알아야 합니다. 왜 swapper_pg_di..