驱动-Hello,World

Simple Source Code

/* 内核模块: ModuleHelloWorld.c * 我们的第一个内核模块 * */

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

/* init function */
static int __init hello_init(void)              // 模块初始化函数,模块装载时被调用
{
    printk("<0>" "(init)Hello,World!\n");   // 打印一条信息
    return 0;
}

/* exit function */
static void __exit hello_exit(void)             // 模块退出清除函数,模块卸载时被调用
{
    printk(KERN_ALERT "(exit)Hello,World!\n");  // 打印一条信息
}

module_init(hello_init);                        // 设置模块初始化函数
module_exit(hello_exit);                    // 设置模块退出时清除函数

MODULE_LICENSE("GPL");              // 设置内核模块版权协议
MODULE_AUTHOR("ZhaoYu");                // 设置内核模块作者
MODULE_DESCRIPTION("A Hello World Module"); //模块描述

Makefile

ifneq ($(KERNELRELEASE),)
  obj-m := ModuleHelloWorld.o
else
  KERNELDIR ?= /lib/modules/$(shell uname -r)/build
  PWD := $(shell pwd)
default:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) clean
endif

Run and Result

root@zy:/home/zy/code/linux_kernel/drivers/ModuleHelloWorld# make
make -C /lib/modules/3.13.0-24-generic/build M=/home/zy/code/linux_kernel/drivers/ModuleHelloWorld modules
make[1]: 正在进入目录 `/usr/src/linux-headers-3.13.0-24-generic' CC [M] /home/zy/code/linux_kernel/drivers/ModuleHelloWorld/ModuleHelloWorld.o Building modules, stage 2. MODPOST 1 modules CC /home/zy/code/linux_kernel/drivers/ModuleHelloWorld/ModuleHelloWorld.mod.o LD [M] /home/zy/code/linux_kernel/drivers/ModuleHelloWorld/ModuleHelloWorld.ko make[1]:正在离开目录 `/usr/src/linux-headers-3.13.0-24-generic'
root@zy:/home/zy/code/linux_kernel/drivers/ModuleHelloWorld# ls
Makefile             ModuleHelloWorld.mod.c  modules.order
ModuleHelloWorld.c   ModuleHelloWorld.mod.o  Module.symvers
ModuleHelloWorld.ko  ModuleHelloWorld.o
root@zy:/home/zy/code/linux_kernel/drivers/ModuleHelloWorld# insmod ModuleHelloWorld.ko
root@zy:/home/zy/code/linux_kernel/drivers/ModuleHelloWorld# dmesg | tail -n 1
[24749.498300] <0>(init)Hello,World!
root@zy:/home/zy/code/linux_kernel/drivers/ModuleHelloWorld# rmmod ModuleHelloWorld
root@zy:/home/zy/code/linux_kernel/drivers/ModuleHelloWorld# dmesg | tail -n 1
(exit)Hello,World!
root@zy:/home/zy/code/linux_kernel/drivers/ModuleHelloWorld# modinfo ModuleHelloWorld.ko
filename:       /home/zy/code/linux_kernel/drivers/ModuleHelloWorld/ModuleHelloWorld.ko
description:    A Hello World Module
author:         ZhaoYu
license:        GPL
srcversion:     36186A471C90CB2505C981E
depends:        
vermagic:       3.13.0-24-generic SMP mod_unload modversions 686 

如上所示,编译,加载和卸载驱动之后,通过dmesg都可以看到对应的打印消息.通过这个简单的例子,我们可以学习驱动模块的基本编写流程.

你可能感兴趣的:(内核)