2022-06-02 리눅스_디바이스_드라이버_2

2022. 6. 2. 16:51BE/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://askubuntu.com/questions/1362959/what-is-kernel-package-why-we-need-to-install-kernel-package-or-why-we-have-t

출처 : 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/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://hyeyoo.com/83

출처 : 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://hyeyoo.com/83

출처 : 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