1.  内核模块简介

Linux 内核的 整 体结构 非 常 庞 大 ,其 包 含 的 组 件也 非 常多 , 如 何使用 需 要 的 组 件 呢?

方 法 一 : 把 所有的 组 件都 编译 进 内核 文 件, 即 :zImage 或bzImage , 但 这样会 导 致 两 个 问 题 : 一是 生 成的 内核 文 件 过大 ;二 是 如果 要 添 加 或 删 除某 个 组 件, 需 要重 新 编译 整 个内核

方法二:使用内核模块, 内核 文 件(zImage 或bzImage) 本 身 并不 包 含 某 组 件 , 而 是 在该 组 件 需要 被 使用的 时 候 ,以模块的方式动 态地 添 加 到 正 在 运行 的内核中

2. 内核 模块 具 有 如下特 点 :

? 模块 本 身 并 不 被编译 进 内核 文 件( zImage 或者bzImage )

? 可以 根 据 需 求 , 在内核 运行 期 间 动 态 的安 装 或 卸 载

3. 范 例(hello world)

#include

#include

static int hello_init(void)

{

printk(KERN_WARNING"Hello, world !\n");

return 0;

}

static void hello_exit(void)

{

printk(KERN_INFO "Goodbye, world\n");

}

module_init(hello_init);

module_exit(hello_exit);

4. 程序结构说明

模块加载函数(必需):安 装 模块 时 被系统 自 动 调 用的 函 数 , 通 过module_init 宏 来指定,以上例子,指定的加载的函数就是hello_init

模块卸载函数(必须):卸 载 模块 时 被系统 自 动 调 用的 函 数 , 通 过module_exit 宏 来 指定 ,以上例子,指定的加载的函数就是hello_exit

5.pritk函数说明

printk函数和printf的函数实现的功能是一样的,只不过一个运行在内核态,一个运行在用户态。

用printk函数打印时候,内核会根据日志级别,可能把消息打印到当前的控制台上, 这个控制台通常是一个字符模式的终端、一个串口打印机或是一个并口打印机。这些消息正常输出的前提是:日志输出级别小于控制台日志级别(在内核中数字越小优先级越高)。如果没有指定打印级别,默认的基本是<4>,即是KERN_WARNING级别,其定制可以再/kernelprintk.c中找到。

日志级别一共有8个级别,printk的日志级别定义如下(在include/linux/kernel.h中):

#define KERN_EMERG      0

#define KERN_ALERT      1

#define KERN_CRIT       2

#define KERN_ERR        3

#define KERN_WARNING    4

#define KERN_NOTICE     5

#define KERN_INFO       6

#define KERN_DEBUG      7

通过读写/proc/sys/kernel/printk文件可读取和修改控制台的日志级别

#cat /proc/sys/kernel/printk

441

7

上面显示的4个数据分别对应控制台日志级别、默认的消息日志级别、最低的控制台日志级别和默认的控制台日志级别

可以修改上面的数据修改控制台的打印级别

备注:ubuntu 图形化界面是无法打印到控制台的,printk打印的是控制台,也就是/dev/console,而图形界面中的终端,其实是把stdin,stdout,stderr三个文件重定向了一下。所以printk是无法再图形界面中的终端中显示的,当然可以再/var/log/syslog或者用dmesg查看。

6.  模块makefile编写,makefile名字必须命名为Makefile,否则编译通过不了,下面这个makefile会被编译两次,第一次KERNELRELEASE为空,去运行

KDIR下面的makefile,接着会重新调用自己的Makefile,编译成功,产生hello.o,hello.ko两个文件

ifneq ($(KERNELRELEASE),)

obj-m := hello.o//根据自己的模块修改

else

KDIR := /lib/modules/2.6.32-21-generic/build//根据自己lib/modules/下面自己内核版本库填写

all:

make -C $(KDIR) M=$(PWD) modules

clean:

rm -f *.ko *.o *.mod.o *.mod.c *.symvers

endif

7. 加载 模块insmod

insmod hello.ko

可以通过lsmod  | grep hello查看自己刚刚加载的内核模块

8. 卸载模块rmmod

rmmod hello

原文:http://blog.csdn.net/nanfenglei23/article/details/42294183

linux内核添加模块,linux中添加内核模块相关推荐

  1. Linux内核LED模块分析(二)

    Linux内核LED模块分析(二) 上次分析到那里后,还是有些同志说看不懂,那我就继续分析一把我认为不需要继续分析的东西吧.上回分析了 led_cdev和trigger的关系后就没有继续说了.有同志还 ...

  2. 【Linux 内核】编译 Linux 内核 ⑦ ( 安装内核模块 | 安装内核 | 重启系统 | 查看当前内核版本 )

    文章目录 一.安装内核模块 二.安装内核 三.重启系统 四.查看当前内核版本 一.安装内核模块 确保 Linux 内核编译完成 , 没有任何报错之后 ; 参考 [Linux 内核]编译 Linux 内 ...

  3. 编译linux内核成vmlinuz,Linux内核编译与安装

    原标题:Linux内核编译与安装 Linux内核是一个用C语言写成的,符合POSIX标准的类Unix操作系统,内核是操作系统中最基本的一部分,提供了众多应用程序访问计算机硬件的机制.Linux内核的一 ...

  4. 【Linux 内核】编译 Linux 内核 ① ( 下载指定版本的 Linux 内核源码 | Linux 内核版本号含义 | 主版本号 | 次版本号 | 小版本号 | 稳定版本 )

    文章目录 一.下载 Linux 内核 1.下载最新版本 Linux 内核 2.下载指定版本 Linux 内核 二.Linux 内核版本号含义 一.下载 Linux 内核 1.下载最新版本 Linux ...

  5. 编译3.0的linux内核,1-3-编译Linux内核

    1-3-编译Linux内核 1.将Linux源码包拷贝到共享文件夹. 2.进入共享文件夹. 3.解压,命令#tar xvfj Kernel_3.0.8_TQ210_for_Linux_v2.2.tar ...

  6. linux内核精髓:精通linux内核必会的75个绝技,Linux内核精髓精通Linux内核必会的75个绝技 PDF 高清扫描版...

    经过近20年的发展,Linux操作系统已经成为当今最成功的开源软件之一,使用广泛,影响深远.随着Linux操作系统功能的不断丰富和完善,Linux内核的源代码也从最初的几万行增加到如今的数百万行,庞大 ...

  7. linux内核基本模型,Linux设备模型(1)_基本概念

    Linux设备模型(1)_基本概念 作者:wowo 发布于:2014-2-27 17:01 分类:统一设备模型 1. 前言 在"Linux内核的整体架构"中,蜗蜗有提到,由于Lin ...

  8. linux内核 can总线,Linux Canbus调试笔记

    http://blog.csdn.net/flydream0/article/details/8161418 CAN总线在嵌入式Linux下驱动程序的实现 http://www.21ic.com/ap ...

  9. 手机linux内核版本了解,Linux内核版本介绍与查询

    Linux内核版本命名在不同时期有着不同的规范,在涉及到Linux版本问题时经常容易混淆,主线版本/稳定版/长期支持版本经常搞不清楚,本文主要记录下内核版本命名的规则以及如何查看Linux系统版本信息 ...

  10. 编译Linux内核没有zImage,Linux 编译系统的简单介绍与内核编译安装

    这里不只是讲怎样编译.安装Linux内核的,更主要的是介绍内核的编译系统和各个重要的文件.最后还利用学到的编译.安装Linux内核去修改Linux的01调度变成随机调度.如果你只是需要编译.安装内核的 ...

最新文章

  1. php smarty关闭缓存,php+Smarty的缓存操作
  2. jop怎么读音英语怎么说_“秀恩爱”英语怎么说?可不是“show love”
  3. 【跃迁之路】【535天】程序员高效学习方法论探索系列(实验阶段292-2018.07.25)...
  4. CentOS 初体验一:VMWare 安装 CentOS
  5. Android获取当前位置的三种方式及其使用方法
  6. 论文小综 | Using External Knowledge on VQA
  7. python非贪婪匹配_Python中关于正则表达式非贪婪以及多行匹配功能详解
  8. 搜狐视频怎么开启自动连播
  9. 信息学奥赛C++语言: 商品排序
  10. 西部数码虚拟服务器备案,虚拟主机备案才能使用吗
  11. 贪婪模式与非贪婪模式
  12. SQL对字符串进行排序
  13. sql 触发器嵌套条件_SQL Server中的嵌套触发器
  14. 互联网金融的前世、今生和未来-系列三(今生):一场跨界的战争
  15. 6 rethad 自定义硬盘_Windows10必备6款优质软件,每个都是神器
  16. linux的adsl拨号上网,详细讲解Linux系统下ADSL拨号上网的方法
  17. ACM常用算法模版(常用函数与STL、重要公式与定理)
  18. 重定向--Linux bash
  19. 「运维有小邓」ADAudit Plus(AD域审计工具)的主要优势?
  20. GrabCut图像分割

热门文章

  1. centos7安装git踩坑记
  2. 6.pragma pack
  3. 浏览器控制台console
  4. [转载] Java中使用new构造数组时会不会自动调用类的默认构造函数
  5. IDEA创建xml文件
  6. java连接oracle数据库jdbc
  7. 返回表对象的方法之一--bulk collect into
  8. 局域网电脑Sql2008 R2无法连接到localhost 解决方案
  9. jsonp实现跨域问题
  10. CentOS 6.4 中yum命令安装php5.2.17