Chinaunix首页 | 论坛 | 博客
  • 博客访问: 928117
  • 博文数量: 146
  • 博客积分: 3321
  • 博客等级: 中校
  • 技术积分: 1523
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-29 10:32
文章分类

全部博文(146)

文章存档

2014年(2)

2013年(5)

2012年(4)

2011年(6)

2010年(30)

2009年(75)

2008年(24)

分类: LINUX

2009-08-07 18:15:58

今天学习了一下简单的内核模块编程。感觉很有意思,现在就简单记录一下。

    Linux的这种模块机制有效的控制了内核的大小,他可以将一些并不是必需的功能直接编译到内核中,而是以模块的形式进行组织。这样我们要在现有的内核中增加或删除一些功能时就不需要重新编译内核了。模块本身并不会编译到内核映像中,这样就有效的控制了内核的大小

下面我们就来写一个简单的内核模块

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

static int hello_init(void)
{
    printk(KERN_ALERT"Hello Modules!\n");
    return 0;
}
static void hello_exit(void)
{
    printk(KERN_ALERT"Good bye!\n");
}
MODULE_LICENSE("GPL");
module_init(hello_init);
module_exit(hello_exit);

   这个简单的模块之包含了内核模块加载函数、卸载函数和对GPL权限的声明描述信息。接下来我们编写一个makefile文件来编译这个模块。

Makefile:



obj-m += hello.o
all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

然后输入make进行编译。
  编译完成之后我们就可以加载模块了,加载模块和卸载模块需要在root权限下执行。
sudo insmod hello.ko
这样我们就成功加载了模块。
   这时我们可以输入lsmod进行查看。可以看到我们提交的hello模块已经在正常工作了。
along@along-laptop:~/code/modules$ lsmod
Module                  Size  Used by
hello                   9344  0
binfmt_misc            16776  1
ppdev                  15620  0
bridge                 56212  0
stp                    10500  1 bridge

卸载模块我们可以使用 sudo rmmod hello

   如果我们是在字符模式下工作,那么加载和卸载模块时我们会在屏幕上分别看到  Hello Modules!和Good bye!这两个字符串。如果我们是在窗口系统下工作,很有可能我们看不到任何的输出。这是因为此时他将系统信息输出到了日志文件中。我们可以在/var/log/messges文件中查看(或者用命令dmesg也可以查看),当然此时的信息就可能不是我们期望的字符串了(至少在我这里是这样的)。要想加载和卸载模块时看到字符串的输出,我们可以Ctrl+Alt+F1切换到字符模式下重新加载和卸载模块进行实验。

阅读(902) | 评论(1) | 转发(0) |
0

上一篇:Gtk 环境配置

下一篇:udev实现原理

给主人留下些什么吧!~~

dengjin2009-10-31 20:54:27

你好,我也在学习linux系统编程和内核方面的东西,只是不是很清楚方向,你是西安哪所高校的,交流一下可以吗