免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 723 | 回复: 0
打印 上一主题 下一主题

模块编写 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-29 23:25 |只看该作者 |倒序浏览

                基本介绍
1.1设计目的
学习模块机制。这是现代操作系统常用的功能。程序员可用模块动态地增加内核的功能。编写一个模块,将它作为Linux内核空间扩展来执行,并报告内核的xtime变量值。
1.2基础知识
内核模块是Linux内核向外部提供的一个插口,其全称为动态可加载内核模块(Loadable Kernel Module,LKM),我们简称为模块。Linux内核之所以提供模块机制,是因为它本身是一个单内核(monolithic kernel)。单内核的最大优点是效率高,因为所有的内容都集成在一起,但其缺点是可扩展性和可维护性相对较差,模块机制就是为了弥补这一缺陷。
1.3什么是模块
模块是具有独立功能的程序,它可以被单独编译,但不能独立运行。它在运行时被链接到内核作为内核的一部分在内核空间运行,这与运行在用户空间的进程是不同的。模块通常由一组函数和数据结构组成,用来实现一种文件系统、一个驱动程序或其他内核上层的功能。
第2章 模块编写
2.1模块功能介绍
    本模块为一个简单的模块,主要功能:
在插入模块时在日志文件中打印,如下:
            
[ 5765.788509] hello,insert success!!! yeah[ 5765.788513]  xtime is: I have no idea!!! ^-^在卸载模块时在日志文件中打印,如下:
   
[ 5877.543305] Sorry, I did nothing for print xtime. I must leave now! Bye ^-^简单的测试一下,本内核是否对加载模块支持。
2.2模块源代码:
1.文件结构:
lzel@lzel-laptop:~/works/driver/clockmodule/1$ ls
clockmodules.c  Makefile
lzel@lzel-laptop:~/works/driver/clockmodule/1$
2.clockmodules.c源代码:
lzel@lzel-laptop:~/works/driver/clockmodule/1$ cat clockmodules.c
#include  /* 内核关键头文件*/
#include  /* 模块头文件*/
#include  /* 初始化头文件*/
#include  /* 建立proc文件必加头文件*/
#define MODULE_NAME "xtime" /* 打算在/proc建立文件的文件名*/
static int __init clockmodules_init(void) /* 初始化模块执行的函数*/
{
    printk(KERN_INFO"hello,insert success!!! yeah\n xtime is: I have no idea!!! ^-^\n"); /* 打印一些信息*/
    return 0;
}
static void __exit clockmodules_exit(void) /* 卸载模块时要执行的函数*/
{
    printk(KERN_INFO"Sorry, I did nothing for print xtime. I must leave now! Bye ^-^\n"); /* 打印一些信息*/
}
module_init(clockmodules_init); /* 注册模块新增功能*/
module_exit(clockmodules_exit); /* 注销模块新增功能*/
MODULE_LICENSE("Dual BSD/GPL"); /* 模块的发布声明*/
MODULE_AUTHOR("lzel"); /* 模块作者*/
lzel@lzel-laptop:~/works/driver/clockmodule/1$
3.Makefile文件:
lzel@lzel-laptop:~/works/driver/clockmodule/1$ cat Makefile
#
# Copyleft (C) 2009 lizeliang
#
# /1/Makefile
#
# DATE: 3.20.2009
#
# REV:1.0.A
#
# PLATFROM: Linux/Unix
#
# REV LIST:
#     DATE: 3.22.2009
#     BY: lizeliang
#     MODIFICATION: standard more
#
# target
TARGET= clockmodules
# variable
KERNEL= `uname -r`
KDIR= /usr/src/linux-headers-$(KERNEL)
PWD= `pwd`
obj-m:= $(TARGET).o
# make
default:
    make -C $(KDIR) M=$(PWD) modules
# clean
clean:
    make -C $(KDIR) M=$(PWD) clean
   
#End of Makefile
lzel@lzel-laptop:~/works/driver/clockmodule/1$
2.3模块编译
1.编译
lzel@lzel-laptop:~/works/driver/clockmodule/1$ make
make -C /usr/src/linux-headers-`uname -r` M=`pwd` modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.27-11-generic'
  CC [M]  /home/lzel/works/driver/clockmodule/1/clockmodules.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/lzel/works/driver/clockmodule/1/clockmodules.mod.o
  LD [M]  /home/lzel/works/driver/clockmodule/1/clockmodules.ko
make[1]: Leaving directory `/usr/src/linux-headers-2.6.27-11-generic'
lzel@lzel-laptop:~/works/driver/clockmodule/1$ ls
clockmodules.c   clockmodules.mod.c  clockmodules.o  Module.markers  Module.symvers
clockmodules.ko  clockmodules.mod.o  Makefile        modules.order   xtime_one.doc
lzel@lzel-laptop:~/works/driver/clockmodule/1$
注:红色的.ko文件为要加载的目标文件(红色为故意着色)。
2.查看模块信息:
lzel@lzel-laptop:~/works/driver/clockmodule/1$ modinfo clockmodules.ko
filename:       clockmodules.ko
author:         lzel
license:        Dual BSD/GPL
srcversion:     82E6CC2979C30D1BEFF888A
depends:        
vermagic:       2.6.27-11-generic SMP mod_unload modversions 586
lzel@lzel-laptop:~/works/driver/clockmodule/1$
2.4模块运行:
2.4.1加载模块
1.加载:
lzel@lzel-laptop:~/works/driver/clockmodule/1$ sudo insmod clockmodules.ko
[sudo] password for lzel:
lzel@lzel-laptop:~/works/driver/clockmodule/1$
2.确认加载:
lzel@lzel-laptop:~/works/driver/clockmodule/1$ lsmod | head -n 10
Module                  Size  Used by
clockmodules            9472  0
af_packet              25728  0
i915                   38528  2
drm                    86056  3 i915
binfmt_misc            16904  1
sco                    18308  2
bridge                 56980  0
stp                    10628  1 bridge
bnep                   20480  2  
lzel@lzel-laptop:~/works/driver/clockmodule/1$
3.查看日志信息
lzel@lzel-laptop:~/works/driver/clockmodule/1$ dmesg | tail -n 2
[ 7656.647767] hello,insert success!!! yeah
[ 7656.647771]  xtime is: I have no idea!!! ^-^
lzel@lzel-laptop:~/works/driver/clockmodule/1$
2.4.2卸载模块:
1.卸载:
lzel@lzel-laptop:~/works/driver/clockmodule/1$ sudo rmmod clockmodules
2.确认加载:
lzel@lzel-laptop:~/works/driver/clockmodule/1$ lsmod | head -n 10
Module                  Size  Used by
af_packet              25728  0
i915                   38528  2
drm                    86056  3 i915
binfmt_misc            16904  1
sco                    18308  2
bridge                 56980  0
stp                    10628  1 bridge
bnep                   20480  2
rfcomm                 44432  0
lzel@lzel-laptop:~/works/driver/clockmodule/1$
3.查看日志信息:
lzel@lzel-laptop:~/works/driver/clockmodule/1$ dmesg | tail -n 1
[ 8280.621956] Sorry, I did nothing for print xtime. I must leave now! Bye ^-^
lzel@lzel-laptop:~/works/driver/clockmodule/1$
2.5总结:
    由于曾经写过一些模块,所以这个模块写的非常容易,只是在写Makefile时遇到了一些小问题,查了一下以前的资料就解决了。

               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/73569/showart_1884011.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP