Kernel / Kernel programming

AlwaysEden·2023년 12월 19일

CS

목록 보기
4/7
post-thumbnail

Kernel이란,

커널은
시스템을 구성하는데 필수적인 자원(Memory, File, Peripheral 등)을 관리하고
시스템을 운영하는데 필수적인 정책(Scheduling, Memory Allocation, File System 등)을 수행한다.

OS시간에 커널이라는 개념을 처음 배웠는데 당시에는 매우 추상적인 느낌이었다. 하지만 이번 학기에 IoT시스템 설계 수업을 들으며 Device Driver를 직접 만들며 커널에 대해서 몸으로 느끼는 기회가 되었다.

Kernel programming,

Device Driver를 만들기 위해서는 Kernel Level에서 프로그래밍 해야했었다. Device Driver는 시스템의 GPIO에 주소로 직접 접근해 Main peripheral 영역을 만졌어야했다. 그렇게 주소로 접근해서 Device Driver를 커널 모듈로 만든다. 모듈로 만드는 Makefile을 작성했는데 까먹으면 후회할 거 같아서 공유하겠다.

MODULE_FILES=iom_led_dd
TEST_PGM = test_iom_led_dd
obj-m += $(MODULE_FILES).o
CC := gcc

KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)

all: module test_pgm

module:
	$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
	@$(MAKE) -C $(KDIR) M=$(PWD) clean
	rm -rf Module.symvers modules.order
test_pgm:
	$(CC) -o $(TEST_PGM) $(TEST_PGM).c

이렇게 빌드 후, .ko파일을 insnod하면 시스템이 먹통이 되었다. 교수님과 코드 점검도 해보고 라이브러리도 점검해보았는데, 결론적으로 발견한 문제는 라이브러리에서 설정한 주소문제였다. 커널 프로그래밍은 아무런 방어막도 없이 프로그래밍하는 것이기 때문에 자칫 주소를 잘못 적어서 접근하면 그대로 시스템이 먹통이 된다. OS시간에나 듣던 주의사항들을 직접 저질러보니 꽤 심각한 일이라는 것을 알았다.

Legacy Master Address,

아 그리고 만약 메모리에 직접 접근해서 레지스터의 값을 변경시켜줘야하는 상황이라면 Legacy Master address가 있다는 것을 알아야한다. 라즈베리파이를 예로 들면 라즈베리파이1에서 하드웨어 설계자가 만든 메모리 구조가 있을 것이다. 그런데 라즈베리파이4까지 오면서 해당 메모리 구조보다 더 효율적이거나 더 많은 기능을 추가하고 싶다면 원래 메모리 구조를 수정하고 싶을 것이다. 하지만 이때 라즈베리파이4에서 메모리 구조를 변경시켜버린다면 기존 메모리 구조에서 작동하던 모든 SW나 HW들이 작동하지 못하게 된다. 그렇기 때문에 라즈베리파이4가 새로운 기능을 기존 메모리 구조에 추가하고 싶다면, 기존 메모리 구조를 유지하되, 해당 메모리 주소를 mapping하여 사용할 수 있는 새로운 가상화된 메모리 구조를 사용하게 된다. 그렇다면 연동성을 유지시키며 기능을 추가하거나 업그레이드 시킬 수 있다. 이러한 이유 때문에 메모리에 직접 접근하기 위해서 알아야하는 주소는 Legacy Master Address가 아니라 가상화된 메모리 주소인 것이다. 이 주소를 알아내기 위해서는 Product Documentation을 읽어야한다.

profile
컴퓨터 공학생입니다. 공부 하면서 겪은 문제들과 떠오르는 생각들을 써보려고합니다. 태클은 언제나 환영입니다. https://github.com/AlwaysEden

0개의 댓글