개요

  • printk() 함수에서 사용할 수 있는 formatting 정리해보기
  • 인데, printf() 에서도 사용할 수 있는 (POSIX 표준?) 애들은 제외한다.

Symbols/Function Pointers

  • 얘네들은 pointer 를 받아 원래의 symbol (변수명, 함수명 등) 으로 formatting 해주는 것이다.
FORMAT SPECIFIERSFORMATDESC
%pFversatile_init+0x0/0x110%p 랑 똑같이 나온다. 걍 포인터인듯
%pfversatile_init?? 이런건 없다는데?
%pSversatile_init+0x0/0x110함수 이름 + 뭐 같이 나오는데 뭔지는 모르겠음
%pSRversatile_init+0x9/0x110%pSR 과 똑같이 나온다.
%psversatile_init함수 이름만 간단하게
%pBprev_fn_of_versatile_init+0x88/0x88이전 콜스택의 함수이름?
  • 함 해보자
  • main.c:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
 
static int __init fn_init(void) {
	void* ptr = (void*)fn_init;
 
	printk(KERN_INFO "%p\n", ptr);
	printk(KERN_INFO "%pF\n", ptr);
	printk(KERN_INFO "%pf\n", ptr);
	printk(KERN_INFO "%pS\n", ptr);
	printk(KERN_INFO "%pSR\n", ptr);
	printk(KERN_INFO "%ps\n", ptr);
	printk(KERN_INFO "%pB\n", ptr);
 
	return 0;
}
 
static void __exit fn_exit(void) {
	printk("exited.");
}
 
MODULE_LICENSE("GPL");
module_init(fn_init);
module_exit(fn_exit);
  • Makefile
KERNELDIR	:= /lib/modules/$(shell uname -r)/build
PWD		:= $(shell pwd)

obj-m		:= practice.o
practice-objs	:= main.o

default:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
	$(MAKE) -C $(KERNELDIR) M=$(PWD) clean
  • 빌드 & 적재
make && sudo insmod ./practice.ko
  • 확인
sudo journalctl -k