Chinaunix首页 | 论坛 | 博客
  • 博客访问: 263449
  • 博文数量: 29
  • 博客积分: 1680
  • 博客等级: 上尉
  • 技术积分: 533
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-17 14:38
文章分类

全部博文(29)

文章存档

2014年(2)

2012年(3)

2011年(9)

2008年(15)

我的朋友

分类: LINUX

2008-05-10 17:07:22

目标:在Linux系统下写出第一个驱动程序
平台:fedora 7.0
书籍:《Linux Device drivers》
简介:
    就是学习各种语言的编程一样,第一个要编写的程序都是hello world。Linux下的驱动程序,也是从hello world开始写起的。需要完成的工作包括:源代码的编写、编写Makefile文件、编译和运行。
    
源代码编写:
    在终端环境下,运行vi编写代码,代码如下(文件名hello.c):
  1 #include
/*在fedora 6.0下添加#include */
  2 #include
  3
  4 MODULE_LICENSE("Dual BSD/GPL");
  5
  6 static int hello_init(void)
  7 {
  8         printk(KERN_ALERT "Hello,World\n");
  9         return 0;
 10 }
 11
 12 static void hello_exit(void)
 13 {
 14         printk(KERN_ALERT "Goodbye,cruel world\n");
 15 }
 16
 17 module_init(hello_init);
 18 module_exit(hello_exit);

编写Makefile文件:
   在编写源代码后,要考虑怎样将源代码编译成能够转载到内核中的可执行模块。这个工作需要编写一个Makefile文件,把源代码编译成可执行的模块。
    Makefile文件内容:
#linux derive develop
#makefile

ifneq ($(KERNELRELEASE),)
        obj-m :=hello.o
else
        KDIR :=/lib/modules/$(shell uname -r)/build
        PWD :=$(shell pwd)

default:
        $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
endif

编译与运行:
    切换到root用户,在终端的hello.c和Makefile文件所在的目录下运行Make命令,然后演示装载和卸载模块。
命令操作如下:
[root@localhost ldd3]# make
make -C /lib/modules/2.6.21-1.3194.fc7/build SUBDIRS=/home/silentdawn/ldd3 modules
make[1]: Entering directory `/usr/src/kernels/2.6.21-1.3194.fc7-i686'
  Building modules, stage 2.
  MODPOST 1 modules
make[1]: Leaving directory `/usr/src/kernels/2.6.21-1.3194.fc7-i686'
[root@localhost ldd3]# insmod ./hello.ko
[root@localhost ldd3]# rmmod hello
    注意:在fedora 7.0下insmod命令在/sbin目录下,这个路径不在环境变量PATH中,所以或者用绝对路径来运行insmod,或者在环境变量PATH下添加/sbin路径。添加/sbin路径的方法就是在root用户目录下的.bashrc文件的最后一行添加PATH=/sbin:$PATH,保存退去,运行source .bashrc命令,生效该路径。


后记:
后面在fedora 6.0操作系统下,重新编译上面的文件发现时,会出现如下的错误:
make -C /lib/modules/2.6.18-1.2798.fc6/build SUBDIRS= modules
make[1]: Entering directory `/usr/src/kernels/2.6.18-1.2798.fc6-i686'
  CHK     include/linux/version.h
  CHK     include/linux/utsrelease.h
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/basic/docproc
  HOSTCC  scripts/genksyms/genksyms.o
  HOSTCC  scripts/genksyms/lex.o
  HOSTCC  scripts/genksyms/parse.o
  HOSTLD  scripts/genksyms/genksyms
  CC      scripts/mod/empty.o
  HOSTCC  scripts/mod/mk_elfconfig
  MKELF   scripts/mod/elfconfig.h
  HOSTCC  scripts/mod/file2alias.o
  HOSTCC  scripts/mod/modpost.o
  HOSTCC  scripts/mod/sumversion.o
  HOSTLD  scripts/mod/modpost
  HOSTCC  scripts/kallsyms
  HOSTCC  scripts/pnmtologo
  HOSTCC  scripts/conmakehash
make[2]: *** 没有规则可以创建“arch/i386/kernel/msr.o”需要的目标“arch/i386/kernel/msr.c”。 停止。
make[1]: *** [arch/i386/kernel] 错误 2
make[1]: Leaving directory `/usr/src/kernels/2.6.18-1.2798.fc6-i686'
make: *** [default] 错误 2

   在网络乱查没有找到详细的解释,看到一篇文章中的实例有包含#include
这个头件,就试着添加这个头件到上面的hello.c中,重新编译就不会出现上面的问题,具体的解释还不知道。

阅读(3323) | 评论(0) | 转发(0) |
0

上一篇:硬盘接口类型

下一篇:bochs使用

给主人留下些什么吧!~~