본문 바로가기

전체 글

(515)
[인프런][강의할인 쿠폰-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%..
[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..
[리눅스] insmod 명령어로 드라이버 설치 시 커널 내부 동작 디버깅해보기(ftrace) - (v6.6, Aarch64) 이전에 다음 글에서 insmod 명령어를 통해 모듈 타입 디바이스 드라이버가 설치될 때,커널 내부 함수가 어떤 흐름으로 작동하는지 코드를 리뷰했습니다.[리눅스] 드라이버: module_init 키워드로 지정한 함수가 호출되는 원리 - sys_finit_module()이어서 이번 시간에는 ftrace를 통해 hello_module_init() 함수가 어떻게 호출되는지 살펴보겠습니다.insmod 명령어로 디바이스 드라이버를 설치할 때의 전체 흐름먼저 다음 그림은 insmod 명령어로 디바이스 드라이버를 설치할 때의 전체 흐름을 나타냅니다.그림의 윗 부분에서 '유저 공간'으로 표기된 부분을 봅시다. insmod가 실행되어 시스템 콜이 발생되는 흐름을 확인할 수 있습니다. 이어서 그림 아랫 부분을 따라가 보면 ..
[리눅스] 커널 모듈 타입 디바이스 드라이버 설치해보기 (v6.6, Aarch64) Overview리눅스는 2가지 타입의 디바이스 드라이버를 지원합니다.   * 모듈식   * 빌트인 식모듈 타입의 디바이스 드라이버는 리눅스 시스템이 부팅한 다음 드라이버를 설치하듯 시스템에 동적으로 적재됩니다. 빌트인 타입 디바이스 드라이버는 커널 이미지에 디바이스 드라이버 코드가 포함되는 방식이죠.사실, 많은 리눅스 시스템에서는 모듈 타입 디바이스 드라이버를 적용합니다. 리눅스 서버와 같이 항상 켜져서 동작해야 하는 경우 동적으로 디바이스 드라이버를 적재할 수 있기 때문입니다.이번 시간에는 라즈베리 파이에서 모듈 타입 디바이스 드라이버를 설치하는 방법을 소개합니다.환경 설정모듈 타입 디바이스 드라이버를 컴파일하려면 리눅스 시스템은 이를 빌드할 수 있는 환경이 구축돼 있어야 합니다.그런데, 아래 포스팅에..
[리눅스] 드라이버: module_init 키워드로 지정한 함수가 호출되는 원리 - sys_finit_module() 리눅스에서 실행 중인 디바이스 드라이버는 2가지 타입 중 하나입니다.     ● 모듈 식 디바이스 드라이버     ● 빌트인 식 디바이스 드라이버 모듈식 디바이스 드라이버가 설치 될 때 리눅스 내부에서 어떤 방식으로 동작하는지 살펴보겠습니다. 이 중에 모듈 형태의 디바이스 드라이버는 다음과 같은 명령어를 사용하면 리눅스에 설치할 수 있습니다. 가장 간단한 모듈식 디바이스 드라이버 코드  먼저 가장 간단한 형태의 모듈식 디바이스 드라이버의 소스를 봅시다. #include  #include  #include  MODULE_LICENSE("Dual BSD/GPL"); static int hello_init(void) {   printk(" Hello world!\n");     return 0; } stati..