Lecture 4 Debugging Technique & LKM Embedded Software Lab. Daejun Park, Eunsoo Park
Debugging Technique-printk Kernel Print 함수 C 라이브러리의 printf() 함수와 유사하게 동작 커널에서 언제 어디서나 호출 가능 커널 부팅 프로세스의 printk가 사용 불가능한 상황에서도 대체사항 존재 early_printk()
Debugging Technique-ftrace To enable make menuconfig Kernel function tracer /sys/kernel/debug/tracing echo 1 > tracing_on echo ext4 > set_event cat trace_pipe or cat trace
Debugging Technique-strace $ strace command Command로 인해 발생하는 system call과 parameter를 사용자에게 보여줌 System call? 운영 체제의 커널이 제공하는 서비스에 대해, 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스이다. 사용자 모드에 있는 응용 프로그램이 커널의 기능을 사용할 수 있도록 하는 것. 시스템 호출을 부르면 사용자 모드에서 커널 모드로 바뀐다 커널에서 시스템 호출을 처리하면 커널 모드에서 사용자 모드로 바뀌어 작업을 계속한다.
Debugging Technique-proc cpuinfo devices filesystems meminfo version /proc/[PID] 각 프로세스의 정보를 알려줌 status
LKM LKM? 왜 모듈이 필요한가? Loadable Kernel Module의 약자 동적으로 Link되는 커널 컴포넌트 모든 구성요소를 한 번에 몰아넣고 사용하는 것은 비효율적! 커널 소스 코드에서 미처 지원하지 않는 (ex-NVIDIA) 하드웨어 디바이스의 경우 Driver를 동적으로 설치하여야 함.
LKM 사용 예시 3. User Process는 Device와 직접 닿아있지 않으므로, Driver를 User application으로 할 수 없음. 4. Loadable Module로 Driver를 구현하고 기존 커널에 삽입함으로써 해당 Device를 사용가능 1. 추가 2. 커널이 해당 Device 지원 X
LKM의 특징 Kernel Code들과 Dependency를 보임. Module Symbol Table이 존재 3가지 상태 Kernel 코드 내의 Function, Struct 등을 비교적 자유롭게 사용 가능. Module Symbol Table이 존재 Kernel Symbol Table과는 별개 3가지 상태 MODULE_STATE_LIVE, MODULE_STATE_COMING, MODULE_STATE_GOING License GPL 라이선스 (커널 라이선스)를 사용해야 보다 많은 Kernel symbol을 export받을 수 있음 Module간의 Dependency B Module이 A Module의 요소를 사용할 때에, A가 먼저 Insert되어야 함
Symbol Table Kernel Symbol Table: 커널에서 사용하는 모든 Symbol (함수, 변수, 자료구조 이름)들을 가지고 있음. Module Symbol Table: 모듈에서 사용하는 모든 Symbol들을 가지고 있음. EXPORT_SYMBOL( $(symbol_name))으로 Symbol을 Module Symbol Table에 등록 가능. 커널은 GPL-exported symbol들을 별도로 관리.
Module 구현 Module Code 작성 Module Object 파일로 컴파일 해당 파일을 커널 코드를 참조하여 빌드 결과로 나온 *.ko 파일을 insmod를 이용하여 Module 삽입 lsmod로 Module 검색 rmmod로 Module 삭제
insmod and rmmod insmod, rmmod는 모듈을 관리하기 위한 External program 본 프로그램들은 init_module(), delete_module()이라는 시스템 콜을 호출하여 Module을 Link. 활성화된 모듈을 보는 것은 ‘lsmod’
Module Code 구현 http://nyx.skku.ac.kr의 oslab_module.c 참고
환경변수 설정 build.sh 참고 KDIR은 Kernel이 설치된 Directory를 의미 ARCH는 Target Device의 Architecture를 의미
Build Tool (Makefile) 설정 Makefile이란 Build Tool인 make program을 사용하기 위해 Build 규칙을 기술하는 파일 obj-m += oslab_module.o는 oslab_module.o라는 object 파일을 빌드에 사용하겠다는 의미. $(MAKE)는 make program 실행 명령어 $(KDIR)은 KDIR이라는 환경변수를 사용하겠다라는 의미 ${shell pwd}는 Terminal상의 pwd 명령어 결과 값을 사용하겠다는 의미 cf) pwd의 출력 결과는 현재 디렉토리의 위치 make 옵션 설명 Linux 명령어의 ‘-’는 옵션을 의미 -C: 무언가를 하기 전에 Driectory를 변경 make modules를 하되 KDIR의 디렉토리를 참조하고 현재 디렉토리의 코드들을 빌드할 것이라는 의미.
결과 간단한 Module 구현 결과
HW2 Built-in Module 구현 Built-in Module을 사용하면? 참고 오늘 배운 모듈은 Loadable Kernel Module을 구현하여 insmod를 통해 직접 커널에 Link하는 작업을 하였다. 그러나, 해당 모듈을 커널이 항시 지원하도록 하기 위하여 커널 코드에 해당 모듈 코드를 아예 Built-in 시켜놓는 방법이 있다. Built-in Module을 사용하면? 매번 insmod하는 번거로움을 없앨 수 있다. Module Loading Overhead가 없다. 그러나, 동적으로 삽입하지 않으므로 커널을 재 빌드하여야 한다. 참고 driver/ 소스들을 참고할 것. 구현 후, 커널 재빌드하고 빌드 이미지 및 모듈을 Odroid에 인스톨할 것. 결과는 어떻게 구현하였는지 1Page 내의 보고서와 결과 스크린샷을 조교에게 이메일로 제출.