Eclipse를 사용하여 커널 2.6 용 "Hello World"장치 드라이버 작성


9

우분투에서 간단한 장치 드라이버를 작성하려고합니다. Eclipse (또는 드라이버 프로그래밍에 적합한 더 나은 IDE)를 사용 하여이 작업을 수행하고 싶습니다. 코드는 다음과 같습니다.

#include <linux/module.h>

static int __init hello_world( void )
{
  printk( "hello world!\n" );
  return 0;
}

static void __exit goodbye_world( void )
{
  printk( "goodbye world!\n" );
}

module_init( hello_world );
module_exit( goodbye_world );

내 노력

몇 가지 연구를 한 후 드라이버 개발에 Eclipse CTD 를 사용하기로 결정했습니다 (멀티 스레딩 디버깅 도구를 지원하는지 확실하지는 않습니다). 그래서 나는 :

  1. VMWare 가상 머신에 Ubuntu 11.04 데스크탑 x86 설치
  2. Synaptic Package Manager를 사용하여 linux-headers-2.6.38-8 설치 eclipse-cdt
  3. 생성 된 C Project이름 TestDriver1과 코드를 복사 - 붙여 넣기,
  4. 기본 빌드 명령 make을 다음 사용자 정의 빌드 명령으로 변경했습니다.

make -C /lib/modules/2.6.38-8-generic/build M=/home/isaac/workspace/TestDriver1

문제

이클립스를 사용 하여이 프로젝트를 빌드하려고하면 오류가 발생합니다. 빌드 로그는 다음과 같습니다.

**** 프로젝트 TestDriver1에 대한 구성 디버그 빌드 ****

-C /lib/modules/2.6.38-8-generic/build M = / home / isaac / workspace / TestDriver1 모두 작성

확인 : '/usr/src/linux-headers-2.6.38-8-generic'디렉토리 입력

확인 : *** vmlinux', needed by모든 대상을 지정하는 규칙이 없습니다 '. 중지.

확인 : '/usr/src/linux-headers-2.6.38-8-generic'디렉토리 떠나기

흥미롭게 도이 프로젝트를 빌드 하는 shell대신 사용할 때 오류가 발생하지 않습니다 eclipse. 를 사용하기 위해 포함을 shell만들고 위 명령을 사용하여 빌드합니다.Makefileobj-m += TestDriver1.omake

따라서 일식에 문제가 있어야합니다 Makefile. vmlinux현재 아키텍처가 x86 인 동안 아키텍처 (?) 또는 무언가를 찾고 있을 수 있습니다. 아마도 VMWare 때문일까요?

내가 이해했듯이 eclipsemakefile을 자동으로 작성하고 수동으로 수정하면 나중에 오류가 발생하거나 관리가 makefile어려워집니다.

그렇다면 어떻게이 프로젝트를 이클립스에서 컴파일 할 수 있습니까?

답변:


5

나는 당신과 거의 같은 위치에 있습니다. 지침에 따라 커널 자체와 단일 모듈을 빌드하는 데 성공했습니다.

Eclipse가 전체 커널이 아닌 특정 드라이버를 컴파일하도록 3 단계 (40 ~ 42)를 주요 기사에 추가했습니다.

  1. Eclipse와 CDT를 다운로드하여 설치하십시오.
  2. 커널을 구성하고 빌드하여 정의 CONFIG_*하고 생성하십시오 autoconf.h. Eclipse 다운로드 및 설치 전후에 수행 할 수 있습니다.
  3. 올바른 커널 소스가 있는지 확인하십시오 (예 : 올바른 git 브랜치에 있는지 확인). 나중에 다른 지점을 체크 아웃해도 괜찮지 만 소스를 다시 인덱싱해야하며 약 20 분이 걸립니다.
  4. Eclipse를 시작하십시오.
  5. 클릭 File-> New->C Project
  6. 같은 프로젝트 이름을 입력하십시오 my_kernel
  7. Use default location 상자를 체크 해제하고 커널의 루트 디렉토리를 Location 상자에 입력하십시오.
  8. 프로젝트 유형 : 분할 창에서 Makefile 프로젝트를 클릭하고 빈 프로젝트를 선택하십시오.
  9. 오른쪽에서 Linux GCC
  10. Advanced settings...를 클릭 하면 속성 대화 상자가 나타납니다.
  11. 왼쪽에서 리소스를 선택한 다음 텍스트 파일 인코딩 섹션에서 기타를 선택 ISO-8859-1하고 상자에서 적용을 클릭하십시오.
  12. C/C++ General왼쪽 에서 선택을 엽니 다 .
  13. 클릭 Preprocessor Include Paths
  14. GNU C언어 목록에서 선택
  15. CDT User Setting Entries설정 항목 목록에서 선택
  16. Add...을 클릭하십시오 . 왼쪽 상단 드롭 다운에서 전 처리기 매크로 파일을 선택하고 오른쪽 상단 드롭 다운에서 프로젝트 경로를 선택한 include/generated/autoconf.h다음 파일 텍스트 상자에 입력하십시오 . (참고 : 이전 커널 [2.6.36 이전?]의 위치는 autoconf.h입니다 include/linux/autoconf.h)
  17. 또한 사용중인 다른 매크로 파일을 추가하십시오.
  18. 인덱서 클릭
  19. 프로젝트 특정 설정 사용 상자를 선택하십시오.
  20. 빌드에 포함되지 않은 색인 소스 파일을 선택 취소하십시오.
  21. 색인을 생성 할 파일 상자를 지우십시오.
  22. 왼쪽의 경로 및 기호를 클릭하십시오.
  23. 포함 탭을 선택한 다음 GNU C
  24. 클릭 Add...
  25. Workspace...를 클릭 한 다음 커널의 include 디렉토리를 선택하십시오
  26. 다른 Add, Workspace 및 add을 추가하십시오 arch/architecture/include(예 :arch/powerpc/include
  27. # Symbols탭을 클릭 하십시오
  28. 클릭 Add...
  29. 이름을 __KERNEL__
  30. 값을로 설정하고 1확인을 클릭하십시오.
  31. 소스 위치 탭을 클릭하십시오
  32. 프로젝트의 트위스 티를 클릭하십시오.
  33. 필터 항목을 선택하고 필터 편집 ...을 클릭하십시오.
  34. 다중 추가 ...를 클릭 한 다음 사용하지 않을 커널 소스의 모든 arch / * 디렉토리 (예 : 사용중인 아키텍처가 아닌 모든 디렉토리)를 선택하십시오.
  35. 해당 대화 상자를 닫으려면 확인 및 확인을 다시 클릭하십시오.
  36. 속성 대화 상자에서 확인을 클릭하십시오.
  37. C 프로젝트 대화 상자에서 완료를 클릭하십시오.
  38. 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 색인을 선택한 다음 재 빌드를 선택하십시오.
  39. 완료하는 데 약 20 분 정도 걸립니다.
  40. 프로젝트 설정을 열고 C/C++ build -> Behaviour (tab)
  41. 체크 Build (Incremental buil)체크 박스를하고 (내 경우에는 텍스트 상자에 모듈 경로를 추가 M=drivers/servo/dynamixel).
  42. 넌 모듈은 준비가되어 당신이 커널을 컴파일 (41)를 반복하고 교체 할 때 M=..all.

1

이클립스로 드라이버 개발을하고 싶다면 다른 방법으로해야합니다.

automake, autogen, pkg-config 등을 따라하고 autotools 프로젝트를 작성하여 Eclipse로 가져와야합니다. eclipse-cdt는 그렇지 않으면 'autotools-plugin'을 설치하기 위해 놓친 것을 제공해야합니다 (정확한 이름이 확실하지 않은 경우 메모리에서 작성).

eclipse-cdt가 괜찮은 Makefile을 관리 할 수 ​​있다는 생각을 버리고 C는 불행히도 또는 고맙게도 Java가 아닙니다.


감사. autotools플러그인을 곧 확인하겠습니다 . 드라이버 프로그래밍을위한 더 나은 IDE를 알고 있습니까? 내가 (리눅스에 경험이없는 게으른 VS 사용자) 관리 할 수 ​​있다고 생각 makefile합니까? 가 makefile큰 프로젝트에 정말 관리 s는?
Isaac Isaac

나도 게으른 VS 사용자 였고 autotools 마스터 링에 가파른 학습 곡선이 있다는 것을 인정해야하지만 Linux뿐만 아니라 매우 가치가 있습니다. Eclipse는 최고의 IDE 중 하나이지만 autotools 프로젝트는 너무 다양하여 IDE가 모든 가능성을 파싱 할 수는 없습니다. 제대로하려면 geany를 시도하고 VS6을 좋아하지만 항상 명령 줄 컴파일에 능숙하다면 anjuta와 codelite를 사용해보십시오.
aquaherd

1

Linux 드라이버 프로그래밍에 익숙하지 않아서 DKMS라는 커널 모듈 (공식 Linux 트리에는 없음)을 배포하는 새로운 방법이 있다는 것을 알았습니다. 모듈은 소스로 설치되며 DKMS는 각 커널에 대해 컴파일을 처리합니다. 이는 모듈의 Makefile이 수동으로 작성되고 소스는 autotools에 포함되지 않음을 의미합니다.

http://linux.dell.com/dkms/

업데이트 ...

DKMS가 http://en.community.dell.com/techcenter/os-applications/w/wiki/2463.linux-projects.aspx 로 이동

이 자습서 / DKMS에 대한 빠른 소개 (Dell 프로젝트 페이지 링크) : Linux Journal article , Power Solutions paper , Ottawa Linux Symposium paper

빠른 드라이버 배포에 사용되는 DKMS 예를 들어 Ubuntu 컴퓨터에서 DKMS를 사용하는 커널 모듈은 다음과 같습니다.

dkms status

bcmwl, 6.20.155.1+bdcom, 3.5.0-41-generic, x86_64: installed
bcmwl, 6.20.155.1+bdcom, 3.5.0-42-generic, x86_64: installed
bcmwl, 6.20.155.1+bdcom, 3.5.0-43-generic, x86_64: installed
nvidia, 313.26, 3.5.0-42-generic, x86_64: installed
nvidia, 313.26, 3.5.0-43-generic, x86_64: installed
vboxhost, 4.3.0, 3.5.0-42-generic, x86_64: installed
vboxhost, 4.3.0, 3.5.0-43-generic, x86_64: installed

이것은 내가 전에 작성한 코드이며 DKMS Hello World로 유용 할 수 있습니다. https://github.com/sneetsher/RTD-DM5408-Driver-Port-for-Linux


1

1>이 명령으로 시도 할 수 있습니다

"make"-> "/ usr / bin / make"

/usr/bin/make -C /lib/modules/2.6.38-8-generic/build M=/home/isaac/workspace/TestDriver1

디렉토리 저장소에 2> 안녕하세요 단어 코드를 작성 파일 이름 "Makefile"

obj-m := NameofyourHelloWold.o 

KDIR  := /lib/modules/2.6.38-8-generic/build

PWD   := $(shell pwd)

default:
    $(MAKE) -C $(KDIR) M=$(PWD) modules
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.