gun_cc 发表于 2012-09-27 21:14

关于第一个模块化编程HelloWorld的详细介绍

      笔者刚刚接触linux设备驱动,今天按照LDD3的第一个HelloWorld模块化编程实践了一下,期间遇到很多问题,因而想和大家详尽的介绍一下每一步步骤,希望对初学linux设备驱动的朋友有些许帮助,介于笔者刚刚接触linux设备驱动才两天,本帖中的一些错误,希望大家不吝指出。
      一、先要取得一个linux的操作系统,笔者的是mint12(其实基本上有终端的linux发行版都可以),打开终端,切换超级用户,到www.kernel.org上去下载一份linux的内核源代码,要是想在本机上运行一定要下载和本机内核版本一样的源码进行编译(关于高版本能否兼容低版本,笔者还没试,在笔者验证后会与大家共享),我在这里下载了                      linux-2.6.29.4.tar.bz2。
   二、 在根目录下建立一个文件夹,叫linux-2.6.29.4,命令为“mkdir /linux-2.6.29.4”,用mv命令,将下载到的源码压缩包移动进去,用“tar -jxvf linux-2.6.29.4.tar.bz2”解压,此时,在 /linux-2.6.29.4/ linux-2.6.29.4/目录内存放的就是 linux-2.6.29.4的源码(记住这个路径,会在Makefile中用到)。
   三、对内核编译一次(关于内核的配置和编译这里就不提了,请查阅相关资料)。
   四、在用户目录下建立一个.c文件,笔者建立的是“vi /home/rhyme/C/hello.c”,此后会进入vi编辑界面,此时可以输入如下的c语言代码:
#include<linux/init.h>
#include<linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int hello_init()
{
      printk(KERN_ALERT "Hello,World!\n");
      return;
}
static void hello_exit()
{
      printk(KERN_ALERT "Goodbye World!\n");
}
module_init(hello_init);
module_exit(hello_init);
然后按“esc”后输入“:wq”退出。
      五、编写一个Makefile(注意与.c文件在同一个文件夹),“vi Makefile”,输入以下内容:
ifeq ($(KERNELRELEASE),)
      KERNELDIR ?=/linux-2.6.29.4/linux2.6.29.4                     #这个就是上述安放源码的路径#
      PWD :=$(shell pwd)
modules:
      &(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
      &(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
clean:
      rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c tmp_versions
else
      obj-m :=hello.o
endif
然后输入“esc”后输入“:wq”保存退出。
      六、.ko文件的编译。回到存放.c文件和Makefile文件的目录中,然后输入make命令进行编译,看到提示信息后代表编译完成,此时输入ls命令后会看到有个叫“hello.ko”的文件,此文件就是编译好的文件。
   七、若要加载此模块,必须切换成与编译的源码(笔者上文提及的“linux-2.6.29.4”)相同的内核(关于用高版本内核源码编译的文件能否在低版本的linux系统上运行,请等待笔者考证)。
页: [1]
查看完整版本: 关于第一个模块化编程HelloWorld的详细介绍