内核编程之第一个模块

本文介绍了如何在Ubuntu上进行内核模块的开发,包括编写hello.c文件,创建Makefile,然后编译生成mymodule.ko模块。通过sudo insmod加载模块,使用sudo rmmod卸载,并利用dmesg查看内核消息。
摘要由CSDN通过智能技术生成

第一个模块的编写与编译

编写与编译

1、在ubuntu目录下新建文件夹modules,在文件夹下新建文件hello.c文件

$mkdir modules

$cd modules

$touch hello.c

$vi hello.c

hello.c代码如下:
        #include <linux/init.h>
        #include <linux/module.h>
        MODULE_LICENSE("Dual BSD/GPL");
        /*类似声明如下
        MODULE_AUTHOR                  // 声明作者

        MODULE_DESCRIPTION             // 对这个模块作一个简单的描述,这个描述是"human-readable"的

        MODULE_VERSION                 // 这个模块的版本

        MODULE_ALIAS                   // 这个模块的别名

        MODULE_DEVICE_TABLE            // 告诉用户空间这个模块支持什么样的设备
        */
        // 模块初始化函数声明与实现
        static int hello_init(void)
        {
            printk(KERN_INFO "Hello World!\n");
            return 0;
        }
        // 模块移除函数声明与实现
        static void hello_exit(void)
        {
            printk(KERN_INFO "Hello exit!\n");
        }
        /* 注意函数没有void参数声明的话在ubunt14.10中报警告:
        warning: function declaration isn’t a prototype
        */

        module_init(hello_init);
        module_exit(hello_exit);

2、在hello.c文件目录下,新建Makefile文件

$touch Makefile

$vi Makefile

Makefile文件内容如下:
    KERNEL_DIR:=/lib/modules/$(shell uname -r)/build
    PWD:=$(shell pwd)

    mymodule-objs:=hello.o

    obj-m:=mymodule.o
    #( 切记不要使用module作为对象名,否则加载模块出错 )

    default:
        $(MAKE) -C $(KERNEL_DIR) M=$(PWD) modules
    clean:
          rm -f *.ko *.o *.mod.o *.mod.c *.symvers

3、执行编译,生成mymodule.ko文件

$make

编译输出结果如下:
make -C /lib/modules/3.16.0-59-generic/build M=/home/harry/harry/kernel_test/Mymodule modules
make[1]: Entering directory `/usr/src/linux-headers-3.16.0-59-generic'
  CC [M]  /home/harry/harry/kernel_test/Mymodule/hello.o
  LD [M]  /home/harry/harry/kernel_test/Mymodule/module.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/harry/harry/kernel_test/Mymodule/module.mod.o
  LD [M]  /home/harry/harry/kernel_test/Mymodule/module.ko
make[1]: Leaving directory `/usr/src/linux-headers-3.16.0-59-generic'   

hello.c文件分析

包含头文件:

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

函数声明:

static int mymodele_init(void);
static void mymodule_exit(void);
提示: function without void declaration will display error:   
        warning: function declaration isn’t a prototype

内核调用

module_init(mymodule_init);
module_exit(mymodule_exit);

模块安装与卸载

通过

$sudo insmod mymodule.ko

为linux添加模块

除此之外,

$sudo rmmod myodule

用于卸载模块

$dmesg

用来显示内核环缓冲区(kernel-ring buffer)内容,内核将各种消息存放在这里。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值