2022. 6. 2. 16:51ㆍBE/Linux
설치
리눅스 드라이버 작업을 수행할 때는 슈퍼 유저로 작업한다.
출처 : https://junshim.github.io/linux kernel study/Linux_Kernel_Compile/
sudo apt-get install build-essential libncurses5 libncurses5-dev bin86 kernel-package libssl-dev bison flex libelf-dev
build-essential
은 개발에 필요한 기본 라이브러리와 헤더 파일 등을 포함한다. 없으면 컴파일이 안될 수 있다. 추가로 ncurses 라이브러리들을 빌드하여 설치할 때 필요하다고 한다.
libncurses5
, libncurses5-dev
: Developer's libraries for ncurses. ncurses (new curses) is a programming library providing an application programming interface (API) that allows the programmer to write text-based user interfaces in a terminal-independent manner
bin86
: 16-bit x86 assembler(명령어를 기계어로 변환) and loader(컴퓨터에 프로그램을 읽어 넣기 위한 프로그램 루틴).
kernel-package
: The kernel-package package use to automate the routine steps required to compile and install a different (custom) kernel.
libssl-dev
: SSL 개발에 필요한 라이브러리와 헤더파일등을 가지고 있다. SSL(Secure Sockets Layer은 암호화 기반 인터넷 보안 프로토콜입니다. SSL은 현재 사용 중인 TLS 암호화의 전신입니다. SSL/TLS를 사용하는 웹사이트의 URL에는 "HTTP" 대신 "HTTPS"가 있습니다.
bison
: 들소라는 뜻. bison은 GNU 파서 생성기로 yacc를 개선하고 대체하기 위해 만들어졌다. 이 프로그램 도구는 LALR 방식으로 작성된 문법을 처리하고 해석하여 C 코드로 만들어 준다. 파서와 더불어 어휘 분석기(lexical analyzer)가 필요하기 때문에 Lex나 flex 같은 어휘 분석기 생성기가 같이 쓰인다.
flex
: flex는 《fast lexical analyzer generator》의 줄임말로 lex의 기능을 개선한 자유 소프트웨어
이다. 주로 bison과 쌍을 이루어 구문 분석기를 만드는 데 사용된다.
libelf-dev
: elf 파일을 다루기 위한 라이브러리. ELF(Executable and Linkable Format)는 실행 파일, 목적 파일, 공유 라이브러리 그리고 코어 덤프를 위한 표준 파일 형식이다(링커를 통해서 나온 실행파일 정도). 1999년 86open 프로젝트에 의해 x86 기반 유닉스, 유닉스 계열 시스템들의 표준 바이너리 파일 형식으로 선택되었다.
출처 : https://kyulingcompany.wordpress.com/2017/10/06/ncurses-02-우분투에-ncurses-개발-환경-설치하기/
출처 : https://en.wikipedia.org/wiki/Ncurses
출처 : https://packages.ubuntu.com/bionic/bin86
출처 : https://leechwin.tistory.com/entry/Ubuntu-libssldev
출처 : https://www.cloudflare.com/ko-kr/learning/ssl/what-is-ssl/
출처 : https://ko.wikipedia.org/wiki/GNU_bison
출처 : https://ko.wikipedia.org/wiki/Flex_(어휘분석기)
출처 : https://ko.wikipedia.org/wiki/ELF_파일_형식
출처 : https://kkhipp.tistory.com/174
hello.c
vim hello.c
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init(void)
{
printk(KERN_ALERT "Hello, world\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "Goodbye, cruel world\n");
}
module_init(hello_init);
module_exit(hello_exit);
linux/init.h
: module init(), module_exit() 매크로 정의를 위한 헤더. 자세한 내용은 아래 참고. https://github.com/torvalds/linux/blob/master/include/linux/init.h
linux/module.h
: necessary for every kernel module.
module_init()
: insmod와 같이 커널 모듈을 로드할 때 수행할 초기화 루틴을 지정한다.
module_exit()
: rmmod와 같이 커널 모듈을 언로드 할 때 수행할 종료 루틴을 지정한다.
static void method(void)
: 같이 링크되는 것들 가운데 같은 이름의 메서드는 없다. 해당 메소드는 유일하다.
MODULE_LICENSE()
: 라이선스 표시. 커널 모듈은 다른 시스템/유저 프로그램에 비해 큰 영향력을 지닌다. 그래서 커널 모듈에 최소한 커널 작성자에 대한 정보가 포함되도록 한다. "이 모듈은 이 라이선스의 규칙을 따랐습니다." 라고 말하는 거라 이해하면 된다.
라이선스 종류 | 의미 |
---|---|
GPL | GNU Public License v2 이상 |
GPL v2 | GNU Public License v2 |
GPL and additional rights | GNU Public License v2와 추가 권한 |
Dual BSD/GPL | GPL v2 또는 BSD 라이선스 |
Dual MPL/GPL | GPL v2 또는 Mozilla 라이선스 |
Proprietary | 공개하지 않음, 비자유 소프트웨어 |
printk(KERN_ALERT "Hello, world\n");
: C function from the Linux kernel interface that prints messages to the kernel log.
KERN_ALERT
는 로그 레벨이다. 레벨을 지정하지 않으면 정리되지 않는 수많은 로그를 봐야 한다. 로그를 여러 레벨로 나눠서 필요한 로그를 효율적으로 관리한다.
출처 : https://wogh8732.tistory.com/303
출처 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=wndrlf2003&logNo=70175139977
출처 : https://swingswing.tistory.com/146
출처 : https://m.blog.naver.com/bocholt/120067609006
출처 : https://en.wikipedia.org/wiki/Printk
Makefile
출처 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=wndrlf2003&logNo=70175139977
출처 : https://bowbowbow.tistory.com/12
출처 : https://wogh8732.tistory.com/303
출처 : https://ashesmin.tistory.com/7
출처 : https://velog.io/@woodstock1993/Makefile
Makefile을 만들어 사용하는 이유
The
make
utility automatically determines which pieces of a large program need to be recompiled, and issues commands to recompile them.
크기가 커진 프로그램은 조각을 낸다.
조각을 내는 이유는 많다.
조각을 내지 않으면 일부를 수정해도 전체를 다시 컴파일해야 한다는 점도 하나의 이유다.
make
를 사용하면 컴퓨터가 어떤 부분을 컴파일할지, 어떤 부분을 컴파일하지 않을지 스스로 판단해 컴파일한다.
수정과 리컴파일이 쉬워지고 이는 곧 크기가 큰 프로그램을 운영하기 쉬어진다.
리눅스 디바이스 드라이버를 만들면서 make
명령어를 사용하는 이유는 커널도 하나의 프로그램이고 충분히 그 크기가 크기 때문이다.
커널을 모듈화 하면 커널의 수정과 확장을 편하게 한다.
수정 시 필요한 모듈만 다시 컴파일하면 되기 때문이다.
이때 make
명령어를 사용하면 자동으로 어떤 모듈을 리컴파일할지 판단해 컴파일을 진행해준다.
출처 : https://www.gnu.org/software/make/manual/make.html#toc-An-Introduction-to-Makefiles
'BE > Linux' 카테고리의 다른 글
2022-06-05 리눅스_디바이스_드라이버_3 (0) | 2022.06.05 |
---|---|
2022-06-05 Makfile_이해 (0) | 2022.06.05 |
리눅스 apt 서버 변경 (0) | 2022.05.17 |
2022-05-12 리눅스_디바이스_드라이버_1 (0) | 2022.05.12 |
2022-05-09 awk_정리 (0) | 2022.05.09 |