2.6 컴 파일 커 널 module

이전에 우 리 는 어떻게 커 널 모듈 컴 파일 을 완성 합 니까?모듈 컴 파일 을 어떻게 하 는 지 소개 했다.오늘 여기 서 2.6 커 널 에서 커 널 모듈 에 대한 컴 파일 방법 을 계속 소개 합 니 다.커 널 모듈 을 컴 파일 하 는 방법 은 일반 프로그램 을 컴 파일 하 는 방법 과 약간 다 릅 니 다. 커 널 소스 트 리 의 계층 디 렉 터 리 에 Makefile 이 존재 하 는 것 을 발견 할 수 있 습 니 다. 즉, 이러한 Makefile 은 계층 별로 구성 되 어 있 습 니 다. 기 존의 커 널 버 전에 서 커 널 모듈 을 컴 파일 하 는 것 이 비교적 번 거 로 우 므 로 이러한 Makefile 에 대해 많은 변경 을 해 야 합 니 다. 2.6 의 커 널 은 "kbuild"컴 파일 시스템 을 사용 합 니 다.이러한 문 제 를 간소화 하 였 습 니 다. kbuild 에 대해 서 는 커 널 소스 트 리 의/Documentation/kbuild/modules. txt 를 참고 하 십시오.
컴 파일 하기 전에 원본 파일 이 필요 할 것 입 니 다. 이 원본 파일 들 은 커 널 소스 트 리 에 놓 을 수도 있 고 커 널 소스 트 리 이외 의 모든 곳 에 놓 을 수도 있 습 니 다. 원본 파일 에 존재 하 는 디 렉 터 리 에 따라 두 가지 컴 파일 방법 이 존재 합 니 다. 원본 트 리 와 소스 트 리 밖 에 있 습 니 다.
원본 트 리 에서 모듈 컴 파일 하기
공식 커 널 모듈 의 소스 코드 는 모두 모듈 (구동) 형식 으로 구성 되 어 있 습 니 다. 커 널 소스 트 리 의 drivers 디 렉 터 리 에 가면 char, usb, block 같은 하위 디 렉 터 리 를 볼 수 있 습 니 다. 그러면 커 널 소스 트 리 에 파일 을 추가 할 때 도 이러한 분류 에 따라 분류 하 는 규칙 을 스스로 파악 하 는 것 이 좋 습 니 다.
다음은 앞의 'hello, World' 라 는 간단 한 모듈 을 예 로 들 어 커 널 소스 트 리 에서 커 널 모듈 을 어떻게 컴 파일 하 는 지 살 펴 보 겠 습 니 다.
1. 하위 디 렉 터 리 를 새로 만 들 지 않 음
(1) 커 널 소스 트 리 에 있 는 drivers 디 렉 터 리 에서 c 소스 프로그램 을 편집 합 니 다. hello. c. (2) drivers 디 렉 터 리 의 Makefile 파일 을 수정 합 니 다. 추가: obj - m + = hello. o (3) 커 널 을 다시 컴 파일 합 니 다 (소스 트 리 루트 디 렉 터 리 로 돌아 가 $sudo make 를 실행 합 니 다).
이렇게 해서 drivers 디 렉 터 리 에 이러한 몇 개의 파일 이 더 나 왔 습 니 다. hello. mod. c, hello. mod. o, hello. o, hello. ko. hello. ko 는 컴 파일 된 모듈 입 니 다.
2, 새 하위 디 렉 터 리
원본 파일 이 많 으 면 drivers 디 렉 터 리 에 하위 디 렉 터 리 를 새로 만 들 수 있 습 니까? 아니면 hello, World 를 예 로 들 수 있 습 니까?
(1) 커 널 소스 트 리 의 drivers 디 렉 터 리 에 hello 하위 디 렉 터 리 를 새로 만 들 고 hello. c 를 hello 디 렉 터 리 에 넣 습 니 다. (2) drivers 디 렉 터 리 의 Makefile 파일 을 수정 하고 추가: obj - m + = hello/(3) hello 디 렉 터 리 에 Makefile 파일 을 새로 만 듭 니 다. 내용 은: obj - m + = hello. o (4) 커 널 을 다시 컴 파일 합 니 다 (원본 트 리 루트 디 렉 터 리 로 돌아 가 $sudo make 를 실행 합 니 다).
이렇게 하면 새로 생 성 된 모듈 파일 은 hello 디 렉 터 리 에 있 습 니 다.
커 널 소스 트 리 에서 커 널 모듈 을 컴 파일 할 경우, 하위 디 렉 터 리 를 새로 만 들 지 않 으 면 현재 디 렉 터 리 의 Makefile 만 수정 해 야 합 니 다. 그렇지 않 으 면 현재 새로 만 든 하위 디 렉 터 리 에 Makefile 을 새로 만 들 고, 상위 디 렉 터 리 의 Makefile 을 수정 하여 kbuild 가 새 하위 디 렉 터 리 에 들 어 갈 수 있 도록 해 야 합 니 다.
원본 트 리 외 컴 파일 모듈
아니면 위의 hello, World 를 예 로 들 면 현재 디 렉 터 리 에 hello. c 가 있 습 니까?
(1) 먼저 모듈 코드 가 있 는 디 렉 터 리 에 Makefile 을 새로 만 듭 니 다. 내용 은:
obj-m := hello.o
(2) make 명령 을 이렇게 호출 합 니 다.
$ sudo make -C/usr/local/src/kernel/linux-2.6.16.20 SUBDIRS=$PWD modules
여기/usr/local/src/kernel/linux - 2.6.16.20 은 커 널 소스 트 리 가 있 는 디 렉 터 리 입 니 다.
- C 는 make 를 - C 가 지정 한 디 렉 터 리 로 먼저 전환 하 라 고 요구 합 니 다. SUBDIRS (SUBDIRS 대신 M 을 사용 할 수도 있 습 니 다) 는 make 를 커 널 모듈 을 컴 파일 하기 전에 현재 디 렉 터 리 로 돌아 가게 합 니 다.
전체 컴 파일 과정 은 실제로 - C 가 지정 한 커 널 소스 트 리 를 실행 하 는 Makefile 이 며, SUBDIR 을 통 해 컴 파일 할 커 널 소스 파일 의 디 렉 터 리 를 지정 합 니 다.
명령 행 입력 간소화
make 를 호출 할 때마다 이 매개 변 수 를 입력 하 는 것 이 비교적 번 거 롭 습 니 다. 이렇게 Makefile 을 바 꾸 어 간소화 할 수 있 습 니 다.
 
obj - m + = hello. oall: make - C/lib/modules/$(shell uname - r)/build M = $(PWD) modules clean: make - C/lib/modules/$(shell uname - r)/build M = $(PWD) clean 이렇게 현재 디 렉 터 리 에서 $sudo make 를 호출 하면 위의 작업 을 수행 할 수 있 습 니 다. $sudo make clean 을 호출 하면 새로 생 성 된 모든 파일 을 삭제 합 니 다.
위의 Makefile 은 커 널 소스 트 리 가 있 는 디 렉 터 리 를 이렇게 확인 합 니 다. 먼저/lib/modules 디 렉 터 리 에 가면 커 널 버 전 이름 의 디 렉 터 리 를 볼 수 있 습 니 다. 디 렉 터 리 에 build 파일 이 있 습 니 다. 커 널 소스 트 리 를 가리 키 는 기호 연결 입 니 다. 어떤 커 널 버 전의 디 렉 터 리 에 들 어 가 는 지 어떻게 확인 합 니까?이것 은 $uname - r 를 통 해 확인 할 수 있 습 니 다. 현재 커 널 을 실행 하고 있 는 버 전 을 지적 합 니 다.
이 Makefile 을 더욱 간소화 할 수 있 습 니 다.

  
  
  
  
  1. obj-m :hello.o  
  2. KERNELDIR ?= /lib/modules/$(shell uname -r)/build  
  3. PWD := $(shell pwd)  
  4. default:   
  5. $(MAKE) -C $(KERNELDIR) M=$(PWD) modules  
  6. clean:   
  7. $(MAKE) -C $(KERNELDIR) M=$(PWD) clean 

 
이렇게 하면 Makefile 에서 커 널 코드 트 리 의 디 렉 터 리 를 한 번 또 한 번 지정 하지 않 아 도 됩 니 다.
위의 예 에 서 는 모든 코드 가 한 파일 에 있 는 상황 만 논 의 했 습 니 다. 만약 코드 가 여러 소스 파일 에 분포 되 어 있다 면, 예 를 들 어 file1. c, file2. c, hello. ko 를 생 성 합 니 다. Makefile 을 이렇게 써 야 합 니 다.

  
  
  
  
  1. obj-m :hello.o  
  2. hello-objs :file1.o file2.o 


. ko 파일 을 만 드 는 것 이 목적 이지 만 Makefile 에. o 라 고 쓰 여 있 습 니 다!

좋은 웹페이지 즐겨찾기