간단 한 실례 설명 linux 모듈 컴 파일 절차

본 고 는 Liux 모듈 에 직접 들 어가 컴 파일 할 것 입 니 다.물론 소개 하 는 과정 에서 초보 자 들 이 이해 할 수 있 도록 필요 한 주석 을 추가 하 겠 습 니 다.이 글 을 쓰 는 이 유 는 주로 책 을 배우 면 전체 과정 을 배 우 는 데 시간 이 오래 걸 릴 수 있 기 때 문 입 니 다. 책 을 읽 으 면 학습 과정 이 고 제 글 은 교육 과 같 기 때 문 입 니 다.그래서 실천 성과 총 결 성 이 강하 다.본 고 를 통 해 모듈 과 모듈 Makefile 을 컴 파일 하 는 기본 지식 을 배 울 수 있 습 니 다.그리고 모듈 을 불 러 오기 (마 운 트 해제) 하고 시스템 메시지 에 대한 지식 을 보기;성명: 본 고 는 초보 자 에 게 쓰 여 있 습 니 다. 만약 당신 이 Liux 모듈 컴 파일 의 고수 라면 제 글 의 오류 와 부족 을 지적 해 주 십시오. 첫 번 째 단 계 를 준비 해 주 십시오. 소스 코드 를 준비 하려 면 먼저 Liux 형식 에 맞 는 모듈 파일 을 작성 해 야 합 니 다. 그래 야 우리 의 모듈 컴 파일 을 시작 할 수 있 습 니 다.원본 파일 my mod. c 가 있다 고 가정 합 니 다.원본 코드 는 다음 과 같 습 니 다: my mod. c
#include <linux/module.h>    /*           */
#include <linux/init.h>        /*   module_init() module_exit()   */
#include <linux/moduleparam.h>/*   module_param() */
MODULE_AUTHOR("Yu Qiang");
MODULE_LICENSE("GPL"); 
static int nbr = 10;
module_param(nbr, int, S_IRUGO);

static int __init yuer_init(void)
{
    int i;
    for(i=0; i<nbr; i++)
    {
        printk(KERN_ALERT "Hello, How are you. %d
", i); } return 0; } static void __exit yuer_exit(void) { printk(KERN_ALERT"I come from yuer's module, I have been unlad.
"); } module_init(yuer_init); module_exit(yuer_exit);

우리 의 원본 파일 은 준비 한 것 이 많 지 않 습 니 다. 이것 이 바로 Liux 아래 모듈 의 기본 구조 입 니 다.9 줄 은 우리 의 기호 변 수 를 내 보 내 는 nbr 입 니 다.이렇게 하면 이 모듈 을 불 러 올 때 이 변수의 값 을 동적 으로 수정 할 수 있 습 니 다.잠시 후 시연 하 겠 습 니 다.yuer_init () 함 수 는 모듈 을 불 러 올 때 실 행 됩 니 다. 출력 결 과 를 통 해 우리 모듈 이 불 러 올 수 있 는 지 여 부 를 볼 수 있 습 니 다.
두 번 째 단계: Makefile 파일 작성
    
우선 우리 Makefile 의 원본 파일 을 보고 설명 하 겠 습 니 다.
Makefile
obj-m := modules.o                   
\# 생 성 할 모듈 이름
     
modules-objs:= 
mymod
.o        
\# 이 모듈 이름 을 만 드 는 데 필요 한 대상 파일
KDIR :=/lib/modules/`uname -r`/build
PWD := $(shell pwd)
default:
make -C $(KDIR) M=$(PWD) modules
clean:
rm -rf *.o .* .cmd *.ko *.mod.c .tmp_versions
지금 제 가 이 Makefile 을 설명해 드릴 게 요.소문 자 Makefile 이 아 닌 대문자 Makefile 임 을 기억 하 세 요.
obj - m: 이 변 수 는 어떤 모듈 모듈 의 형식 을 obj - m: = < 모듈 명 >. o 라 고 주장 할 지 지정 합 니 다.
modules - objs: 이 변 수 는 모듈 modules 에 필요 한 대상 파일 형식 요 구 를 설명 합 니 다.   <모듈 명 > - objs: = < 대상 파일 >
       메모: 모듈 의 이름 은 대상 파일 과 같은 이름 을 가 져 올 수 없습니다.여기 서 모듈 이름 을 my mod 로 만 들 수 없다 면;
KDIR   :이것 은 우리 가 실행 하고 있 는 운영 체제 커 널 컴 파일 디 렉 터 리 입 니 다.컴 파일 모듈 에 필요 한 환경
M=     :원본 파일 의 위 치 를 지정 합 니 다.
PWD   :이것 은 현재 작업 경로 $(셸)   )make 의 내 장 된 함수 입 니 다. 셸 명령 을 수행 하 는 데 사 용 됩 니 다.
STEP 3: 컴 파일 모듈
현재 우 리 는 우리 가 필요 로 하 는 원본 파일 과 해당 하 는 Makefile 을 준 비 했 습 니 다. 우 리 는 이제 컴 파일 할 수 있 습 니 다. 터미널 에서 원본 파일 디 렉 터 리 에 들 어가 make 를 입력 하 십시오.
실행 결과:
    make[1]: Entering directory `/usr/src/linux-headers-2.6.24-24-generic'
    CC [M] /home/yuqiang/  /mymodule/mymodules.o
    LD [M] /home/yuqiang/  /mymodule/modules.o
    Building modules, stage 2.
    MODPOST 1 modules
    CC      /home/yuqiang/  /mymodule/modules.mod.o
    LD [M] /home/yuqiang/  /mymodule/modules.ko
    make[1]: Leaving directory `/usr/src/linux-headers-2.6.24-24-generic'

STEP 4: 모듈 불 러 오기/마 운 트 해제
위의 컴 파일 에서 볼 수 있 습 니 다. modules. ko 가 생 성 되 었 습 니 다. 이것 이 바로 우리 의 모듈 입 니 다. 이제 우 리 는 불 러 올 수 있 습 니 다.
먼저 터미널 에 입력:
sudo insmod modules.ko
이제 우리 모듈 로드 에 성 공 했 는 지 볼 까요?
터미널 에 입력:
dmesg | tail -12   
이것 은 커 널 출력 정 보 를 보 는 뜻 입 니 다. tail - 12 는 마지막 12 개 를 표시 합 니 다.
결 과 는 다음 과 같 습 니 다.
    [17945.024417] sd 9:0:0:0: Attached scsi generic sg2 type 0
    [18046.790019] usb 5-8: USB disconnect, address 9
    [19934.224812] Hello, How are you. 0
    [19934.224817] Hello, How are you. 1
    [19934.224818] Hello, How are you. 2
    [19934.224820] Hello, How are you. 3
    [19934.224821] Hello, How are you. 4
    [19934.224822] Hello, How are you. 5
    [19934.224824] Hello, How are you. 6
    [19934.224825] Hello, How are you. 7
    [19934.224826] Hello, How are you. 8
    [19934.224828] Hello, How are you. 9

보 셨 죠? 우리 모듈 의 초기 화 함수 yuer init () 가 성공 적 으로 실행 되 었 습 니 다. 우리 모듈 이 불 러 온 것 을 설명 합 니 다.
이제 모듈 을 다시 마 운 트 해제 해 봅 시다.
터미널 에 입력:
sudo rmmod modules
터미널 에 입력:
dmesg | tail -3
[19934.224826] Hello, How are you. 8
[19934.224828] Hello, How are you. 9
[20412.046932] I come from yuer's module, I have been unlad.

인쇄 된 정보 에서 볼 수 있 듯 이 모듈 의 종료 함수 가 실행 되 었 습 니 다. 모듈 이 성공 적 으로 마 운 트 해제 되 었 음 을 설명 합 니 다. 현재 위치 에 서 는 모듈 의 컴 파일 에서 컴 파일 실행 까지 전체적으로 인식 한 셈 입 니 다. 앞으로 깊이 있 는 학습 에 도움 이 될 것 입 니 다. 모듈 과 관련 된 것 을 살 펴 보 겠 습 니 다.간단 한 조작 들
다섯 번 째 단계: 모듈 을 불 러 올 때 매개 변 수 를 전달 합 니 다.
터미널 에 입력:
sudo insmod module_name.ko nbr=4
터미널 에 입력:
dmesg | tail -6
결 과 는 다음 과 같 습 니 다.
[20800.655694] Hello, How are you. 9
[21318.675593] I come from onefile module, I have been unlad.
[21334.425373] Hello, How are you. 0
[21334.425378] Hello, How are you. 1
[21334.425380] Hello, How are you. 2
[21334.425381] Hello, How are you. 3

이렇게 하면 모듈 을 불 러 올 때 동적 으로 변 수 를 설정 하 는 것 을 볼 수 있 습 니 다. 함수 의 순환 을 4 번 만 초기 화 했 습 니 다.
모듈 이 그 변 수 를 설정 할 수 있 는 지 어떻게 아 느 냐 고 물 을 수 있 습 니 다. 물론 변 수 를 설정 하지 않 고 한 번 불 러 올 수 있 습 니 다. 그리고 터미널 에 ls/sys/module/< modules name >/parameters/를 입력 하여 볼 수 있 습 니 다. 여기 서 우 리 는 이렇게 입력 했 습 니 다.
터미널 에 입력:
ls/sys/moedle/modules/parameters/
결과 보이 기:
nbr
만약 우리 의 모듈 로드 가 성공 한다 면, 마지막 으로 우 리 는 modinfo 를 통 해 우리 의 모듈 정 보 를 볼 수 있 습 니 다. 다음 과 같 습 니 다.
터미널 에 입력:
sudo modinfo modules.ko
    결과 보이 기:
filename:       modules.ko
license:        GPL
author:         Yu Qiang
srcversion:     20E9C3C4E02D130E6E92533
depends:        
vermagic:       2.6.24-24-generic SMP mod_unload 586 
parm:           nbr:int

본문 요약:
    이 글 은 모듈 작성 과 관련 된 과정 을 하나의 선형 방식 으로 설명 하기 때문에 이 과정 에서 발산 할 수 있 는 부분 이 많 습 니 다. 예 를 들 어:
MODULE AUTHOR ("Yu Qiang") 라 고 썼 을 때 또 있다 고 생각 했 을 거 예요.
     MODULE DESCRIPTION (모듈 용도 에 대한 간단 한 설명);
    
MODULE VERSION (모듈 의 버 전 문자열);
    
MODULE ALIAS (모듈 의 별명);
    
...
module param (nbr, int, S IRUGO) 에 썼 을 때 또 있다 고 생각해 야 합 니 다.
     EXPORT SYMBOL (name); 모듈 의 함 수 를 내 보 낼 수 있 습 니 다. 이것 도 모듈 이 작성 한 최종 목적 입 니 다.
...
insmod 와 modinfo 를 사용 할 때.
    
depmod     로 딩 가능 모듈 의 의존성 을 분석 하고 modules. dep 파일 과 맵 파일 을 생 성 합 니 다.
    
modprobe
   
Linux 커 널 추가 삭제 모듈
...
만약 에 전문 적 인 Liux 모듈 개발 자가 되 려 면 많은 길 을 가 야 합 니 다. 여러분 의 것 에 달 려 있 습 니 다. 여러분 의 학습 이 순 조 롭 기 를 바 랍 니 다.
저 는 Liux 관련 전문가 가 아 닙 니 다. 저 는 그냥 Liux 관련 개발 자 입 니 다. (읽 고 있 습 니 다)저의 목적 도 간단 합 니 다. 여러분 께 방법 을 소개 해 드 리 고 싶 습 니 다. 여러분 들 이 공부 할 때 많은 시행 착 오 를 겪 지 않 기 를 바 랍 니 다. 개인 능력 에 한계 가 있 기 때문에 오류 와 단점 이 있 을 수 있 으 니 개의 치 마 세 요. 발견 되 시 면 제 가 바로 수정 하 겠 습 니 다. 여러분 들 의 학습 에 편리 하도록 하 겠 습 니 다.
본문 출처: "물 있 는 곳 에 여유 가 있다"
글 은 20065562 's Blog 에서 전재 되 었 습 니 다. 여 기 를 클릭 하여 원문 을 보십시오.

좋은 웹페이지 즐겨찾기