티스토리 뷰
땅파서 남주자 오늘은 리눅스 커널에서 사용하는 printk함수의 포맷 문자열에 대해 알아보도록 하겠습니다. 리눅스 커널이 대부분 C언어로 작성되어 있지만 어플리케이션과 다르게 libc를 사용하지 못하기 때문에 라이브러리가 없다고 볼수 있습니다. 단지 커널 이미지 내에 포함된 함수들만 사용 가능하다고 볼 수 있습니다. 하지만 다양한 서브시스템과 유용한 함수들이 이미 잘 작성되어 있으니 차근차근 찾아서 쓰는 재미가 있습니다.
printk는 printf와 비슷하지만 차이가 있다면 %f, %e등 실수(floating point)형에 대해 캐스팅을 지원하지 않습니다. 리눅스 커널내에서는 실수에 대한 연산을 여러 이유가 있겠지만 대표적으로 성능상의 이유로 지원하지 않습니다.
거두절미하고 예시부터 먼저 보겠습니다.
첫번째 정수형은 사이즈별로 int, long, long long을 지원합니다. 이 부분은 C언어의 printf와 동일하기 때문에 많은 설명이 필요없을것 같습니다. long의 경우 플랫폼에 따라 32비트일때는 4바이트, 64비트일때는 8바이트로 처리됩니다.
타입 |
캐스팅 문자 |
int |
%d or %x |
unsigned int |
%u or %x |
long |
%ld or %lx |
unsigned long |
%lu or %lx |
long long |
%lld or %llx |
unsigned long long |
%llu or %llx |
두번째로 포인터 출력시에는 %p의 포맷문자를 사용하고 위의 예제에서는 실행되고 있는 example_printk_init함수의 주소를 출력한 예시입니다. 함수의 이름은 함수의 포인터를 의미합니다.
세번째는 심볼을 출력하는 경우로 %pF의 포맷문자를 사용합니다. 위의 예제에서는 example_printk_init함수의 주소를 ptr에 저장했다가 심볼로 출력한 예제입니다. 결과와 같이 포인터에 해당하는 심볼을 확인할 수 있습니다.
네번째는 바이트 버퍼를 덤프하는 경우로 %*ph의 포맷문자를 사용합니다. 이 포맷문자를 사용하는 경우 파라메터 목록에 출력할 버퍼의 크기와 버퍼의 포인터, 2개의 파라메터를 넘겨야 합니다. 위의 예제에서는 raw_buf를 0x01로 초기화 하고 10바이트를 덤프해 보았습니다. 두번째와 같이 포맷문자에 크기를 명시하는 방법으로도 가능합니다.
다섯번째는 맥어드레스 출력하는 예제입니다. 포맷문자로 %pM을 사용하고 넘겨주는 버퍼의 크기는 6바이트에 맞추어 사용합니다.
여섯, 일곱번째는 IPv4, IPv6주소를 출력하는 예제입니다. 각각 %pI4, %pI6을 사용하고 in_addr, in6_addr의 구조체의 포인터를 파라메터로 사용함을 알수 있습니다. 주소에 저장된 주소값은 네트워크 오더를 사용합니다.
여덟번째도 마찬가지로 IP주소를 출력하는 예제입니다. 하지만 이 경우는 IP주소와 포트가 함께 출력되는 형식으로 %pISpc의 포맷문자를 사용합니다. 이 경우는 sockaddr_in의 구조체를 사용합니다.
지금까지 커널모듈 개발시 가장 많이 사용하면서 유용한 몇가지 포맷에 대해 알아보았습니다. 이 외에도 printk에서는 다양한 기능과 형식을 제공합니다. 자세한 정보는 커널 소스 디렉토리의 Documentation/printk_formats.txt 문서를 참조해 보세요.
마지막으로 아래는 위의 소스를 빌드하여 실행시킨 결과입니다.
'Linux Kernel' 카테고리의 다른 글
리눅스 커널 패치 작업(1) - 패치 적용 (0) | 2022.12.11 |
---|---|
리눅스 커널 모듈을 만들어 보자 (0) | 2017.04.21 |
리눅스 커널 컴파일과 적용 (0) | 2017.04.17 |
리눅스 커널 최신버전 다운받기 (0) | 2017.04.15 |
- Total
- Today
- Yesterday
- printk
- Linux
- 맥주소
- 수식
- Mathjax
- 리눅스 커널
- 리눅스 patch 명령
- 커널프로그래밍
- 맥주소출력
- 커널모듈
- 커널다운로드
- 시그모이드
- patch
- 커널개발
- Sigmoid
- 커널 컴파일
- 커널 패치
- 웹수식
- 커널컴파일
- 커널분석
- Kernel
- 커널
- 버퍼덤프
- 리눅스커널
- Linux Kernel
- 커널빌드
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |