linux 内核驱动 入门,Linux驱动入门——几个简单的Linux 模块

模块一:

#include

#include

MODULE_LICENSE ("GPL");

int init_module (void)

{

printk (KERN_INFO "Hello world\n");

return 0;

}

void cleanup_module (void)

{

printk (KERN_INFO "Goodbye world\n");

}

///

编写相关的makefile文件

ifeq ($(KERNELRELEASE),)

#KERNELDIR ?= /home/lht/kernel2.6/linux-2.6.14

KERNELDIR ?= /lib/modules/$(shell uname -r)/build

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

.PHONY: modules modules_install clean

else

obj-m := hello.o

endif

makefile 文件的编写相对较复杂一些!但要自己尝试,逐渐攻破,为以后的开发做准备!

因为模块是要添加到内核只能过去的,因此,在权限方面应该是超级用户 : root

相关的编译命令如下:

首先:make

其次:通过insmod命令将模块添加到内核中

#insmod hello.ko  //ko是模块的后缀。

再次:通过lsmod命令查看是否添加模块到内核中

#lsmod | grep hello

最后: 通过rmmod删除添加的模块

#rmmod hello

结束后,查看源码,适当修改,掌握实验内容。

一下的几个模块只需改hello.c源文件,不需要修改makefile文件,同样的方式编译即可。

模块二:

#include

#include

#include

MODULE_LICENSE ("GPL");

static int __init hello_2_init (void)

{

printk (KERN_INFO "Hello world\n");

return 0;

}

static void __exit hello_2_exit (void)

{

printk (KERN_INFO "Goodbye world\n");

}

module_init (hello_2_init);

module_exit (hello_2_exit);

模块三:

#include

#include

#include

#define DRIVER_AUTHOR "Foo bar"

#define DRIVER_DESC   "A sample driver"

MODULE_LICENSE ("GPL");

MODULE_AUTHOR (DRIVER_AUTHOR);

MODULE_DESCRIPTION (DRIVER_DESC);

MODULE_SUPPORTED_DEVICE ("TestDevice");

static int __init hello_2_init (void)

{

printk (KERN_INFO "Hello world\n");

return 0;

}

static void __exit hello_2_exit (void)

{

printk (KERN_INFO "Goodbye world\n");

}

module_init (hello_2_init);

module_exit (hello_2_exit);

模块四:

#include

#include

#include

#include

#include

#define DRIVER_AUTHOR "Foobar"

#define DRIVER_DESC   "A sample driver"

MODULE_LICENSE ("GPL");

MODULE_AUTHOR (DRIVER_AUTHOR);

MODULE_DESCRIPTION (DRIVER_DESC);

MODULE_SUPPORTED_DEVICE ("TestDevice");

static short int myshort = 1;

static int myint = 420;

static long int mylong = 9999;

static char *mystring = "blah";

static int array[2]= {-1, -1};

static int arr_argc = 0;

module_param (myshort, short, 0000);

MODULE_PARM_DESC (myshort, "A short integer");

module_param (myint, int, 0000);

MODULE_PARM_DESC (myint, "An integer");

module_param (mylong, long, 0000);

MODULE_PARM_DESC (mylong, "A long integer");

module_param (mystring, charp, 0000);

MODULE_PARM_DESC (mystring, "A character string");

module_param_array (array, int, &arr_argc, 0000);

//module_param_array (array, int, arr_argc, 0000); //for kernel<2.6.10

MODULE_PARM_DESC (array, "An array of integers");

static int __init hello_2_init (void)

{

int i;

printk (KERN_INFO "myshort is a short integer: %hd\n", myshort);

printk (KERN_INFO "myint is an integer: %d\n", myint);

printk (KERN_INFO "mylong is a long integer: %ld\n", mylong);

printk (KERN_INFO "mystring is a string: %s\n\n", mystring);

for (i=0; i

printk (KERN_INFO "array[%d] = %d\n",i, array[i]);

printk (KERN_INFO "Got %d arguments in array\n", arr_argc);

return 0;

}

static void __exit hello_2_exit (void)

{

printk (KERN_INFO "hello driver cleaned up\n");

}

module_init (hello_2_init);

module_exit (hello_2_exit);

从上面的模块内容可以看出,源文件一直在改变,并且在功能上完善。

以上几个实例仅供参考。0b1331709591d260c1c78e86d0c51c18.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值