加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Linux内核模块module的加载详细过程

(2018-07-14 18:07:22)
标签:

内核模块的加载过程

module

insmod

rmmod

分类: arm_linux

内核模块的加载:

内核模块的加载会使用到系统的内核源码目录,这里我们可以找到内核源码的目录:

cd /usr/src

ls -l

http://s16/mw690/002ydbfVzy7m1Plxsu3df&690

这里会看到,我们装的Ubuntu里面是有这两个文件夹,可以理解为这两个文件夹是相关的,为了不让用户对源文件代码破坏,这里分成两个文件夹

一个是  linux-headers-3.13.0-24

第二个是  linux-headers-3.13.0-24-generic

其中第一个文件夹 linux-headers-3.13.0-24里面主要是存放内核的源代码 如下图所示:

http://s3/mw690/002ydbfVzy7m1Pn7Jo6a2&690

第二个文件夹linux-headers-3.13.0-24-generic里面主要存放配置.config 或者其他的一些配置文件,如下图所示:

http://s5/mw690/002ydbfVzy7m1PmXIIkd4&690


第二个文件夹里面的内容多半是以软连接的形式指向了内核源码文件夹。

当我们需要编译一个内核的时候需要指定到linux-headers-3.13.0-24-generic这个位置

例如我们写了一段hello_module.c的模块内容如下:

#include "linux/init.h"

#include "linux/module.h"

MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(void)

{

    printk(KERN_ALERT"Hello World enter\n");

    return 0;

}

static void hello_exit(void)

{

    printk(KERN_ALERT"Hello world exit\n");

}

module_init(hello_init);

module_exit(hello_exit);

MODULE_AUTHOR("SOMEBODY");

MODULE_DESCRIPTION("A simple test ");

 

 

写了一个Makefile的内容如下:

obj-m :=hello_module.o

 

 

使用命令 make -C /usr/src/linux-headers-3.13.0-24-generic M=$(pwd) modules

http://s15/mw690/002ydbfVzy7m1Pn2yo69e&690


将刚刚写的hello_module.c编译一遍,会在当前的目录下生成hello_module.ko的文件。

 

使用insmod hello_module.ko可以加载模块到内核里面去

使用rmmod hello_module.ko可以卸载模块。

 

在目录/var/log下面的syslog信息里面可以查看到内核的一些printk

http://s15/mw690/002ydbfVzy7m1Pnm7W6ce&690

 

至此,完成了一个完整的内核模块加载到内核的过程。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有