简单构造和运行模块 --“hello world”

1.用户空间和内核空间

模块运行在内核空间,应用程序运行在用户空间。内核运行在最高优先级(超级用户态),应用程序的运行在最低优先级(用户态)。用户空间和内核空间不仅说明了两种模式具有不同的优先级等级,还说明每个模式都有自己的内核映射,也有自己的地址空间(虚拟的地址)。

         


2. HelloWorld 模块

Hello.c

---------------------------------------------------------------------------

#include<linux/init.h>

#include<linux/module.h>


staticchar *name = "world";

Statichowmany = 1;

//模块参数

module_param(name,charp,S_IRUGO);

module_param(howmany,int,S_IRUGO);


//hello_int前面的__init对内核是一种暗示,表示在初始化后函数将被丢掉

staticint __init hello_init(void)    

{                

   for(int i=0;i<howmany;i++)

          printk(KERN_ALERT"Hello,%s\n",name);

   return 0;

}

  //hello_exit前面的__exit对内核是一种暗示,表示只能在模块被卸载或是系统关闭时调用

static void __exit hello_exit(void)                                 

{

   printk(KERN_ALERT "Goodbye, cruelworld\n");

}

module_init(hello_init);                                  //模块初始化,注册初始化函数

module_exit(hello_exit);                                 //模块退出,注册模块清理函数


MODULE_LICENSE("DualBSD/GPL");

MODULE_AUTHOR("sunry");

MODULE_DESCRIPTION("hello world");

--------------------------------------------------------------------------


Makefile

-------------------------------------------------------------------------

obj-m:= hello.o                                                                //说明有一个模块要从目标文件hello.o中构建

//hello-objs:= file1.o file2.o                                           //如果hello.ko基于两个源文件file1.c,file2.c生成则如此

KERNELDIR=/usr/src/$(shell uname -r)/build

PWD:=$(shell pwd)

all:

       $(MAKE) -C $(KERNELDIR) M=$(PWD) modules

clean:

       rm *.mod.c *.o *.order *.symvers *.ko

-------------------------------------------------------------------------

操作

*********************************************

$sudomake

//调用Makefile,编译

$sudo insmod hello.ko    或 sudo insmod hello.koname="xxx" howmany=5

//打印信息没有出现在console上。 可以通过dmesg命令查看,或cat/var/log/syslog

$sudo rmmod hello

*********************************************

 

模块相关命令

modinfo                 //查看模块信息  (加载/未加载)  

insmod hello.ko     //加载模块到内核

modprob                //装载模块,同时装入指定模块所依赖的其他模块

lsmod                     //查看加载模块

rmmod hello        //卸载模块

 

模块参数

驱动程序有时会根据平台的不同需要配置一些参数。内核允许对程序驱动制定参数,可以在装载驱动程序时改变。可以在运行insmod或modprob命令时赋值。

 

例如:insmod hellop name="you" howmany=5

 


猜你喜欢

转载自blog.csdn.net/yxw_sunry/article/details/81042249