Linux驅動入門——幾個簡單的Linux 模塊

模塊一:

#include <linux/module.h>
#include <linux/kernel.h>

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 <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>

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 <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>

#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 <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/stat.h>

#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<arr_argc; 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);


從上面的模塊內容可以看出,源文件一直在改變,並且在功能上完善。

以上幾個實例僅供參考。

發佈了14 篇原創文章 · 獲贊 5 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章