kernel 模块与简单 hello 模块
Kernel 模块与简单 hello 模块
kernel 模块的简介
Linux 内核进行扩展时,例如编写驱动程序、netfilter功能等,最方便的方式是通过编写模块,然后加载到内核中。由于 kernel 模块已加载到内核,因此如果模块出现错误,将导致内核出错甚至系统崩溃。所以,一般建议在测试内核模块时,如果与设备无关的模块(非驱动程序等),最好是在虚拟机中进行。
大多数 Linux 发行版本都没有把 Linux 编译成一个整个文件,而是把非核心的子系统,如驱动程序等,编译成 kernel 模块,并在启动时加载。模块的目录一般是 /lib/modules/<内核版本>/
目录下。内核版本号通过 $(uname -r)
获取。
加载内核模块时,可通过 modprobe
(从默认路径搜索并加载) 或 insmod
(指定模块路径)
# 加载 intel wifi 驱动
sudo modprobe iwlwifi
# 或
sudo insmod "/lib/modules/$(uname -r)/kernel/drivers/net/wireless/iwlwifi/iwlwifi.ko"
用 lsmod 命令查看已加载的模块
lsmod
而从内核中把模块删除则通过 rmmod
命令
sudo rmmod iwlwifi
编写 hello 示例模块
内核模块也是通过 C 编写和编译的本机代码,只是由于它需要被 Linux 模块加载框架来载入,因此需要特殊的模块注册处理才能生效。内核模块能直接访问内核的功能,比一般的 C 编程要更加小心,预防出现 BUG 和安全问题。
编写内核模块时,使用的头文件为 /lib/modules/$(uname -r)/build/include
(通常 Linux 头文件在安装 kernel-image 同时安装,在一些发行版上 build
链接到 /usr/src/linux-headers-$(uname-r)/
)。
先看看一个简单的 hello 模块
/*
* hello.c
* 简单的 hello 内核模块
*/
#include <linux/module.h> /* 所有模块使用 module.h */
#include <linux/kernel.h> /* 包含内核常用的函数声明等 */
#include <linux/init.h> /* 进行内存初始化和清理 */
MODULE_AUTHOR("fengyc");
MODULE_DESCRIPTION("This is a demo.");
MODULE_VERSION("0.0.1");
MODULE_LICENSE("GPL");
static int __init hello_init(void)
{
printk(KERN_INFO "Hello, world!\n");
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_INFO "Goodbye, world!\n");
}
module_init(hello_init);
module_exit(hello_exit);
所有的模块都需要到 module.h 头文件,使用 module_init()
module_exit()
函数来注册模块入口和退出处理。这里的代码逻辑很简单,就是在模块加载时,打印 Hello, world!
,以及在退出时打印 Goodbye, world!
(由于代码运行在内核空间里面,不能直接使用用户空间的 print 函数,而要使用内核中的 printk 函数)
编译时通过一个 Makefile 文件进行,把这个 Makefile 文件置于 hello.c 同一目录下(Makefile 中使用 tab 作为分隔符 )
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 即可生成模块 hello.ko
。现在可通过 modinfo 命令查看模块信息
modinfo hello.ko
然后通过 insmod / rmmod 命令加载、卸载模块,并用 dmesg 查看内核的环形缓存区( kernel ring buffer )的信息( printk 输出到了这里)
sudo insmod hello.ko
sudo rmmod hello
dmesg
如果一切顺利,就可以看到 hello.ko 模块的输出。而有个这个基本的代码框架,就可以继续深入,使用 netlink 作为接口,进行用户空间与内核空间的通信,并调用内核的功能,实现在用户态无法完成的动作。
p.s. 为了更好地使用 GUI 的协助,可使用参考使用 eclipse 内核开发环境 http://blog.chinaunix.net/uid-24512513-id-3183457.html
kernel 模块与简单 hello 模块的更多相关文章
- kernel 4.4.12 外部模块Makefile 脚本编写
kernel 4.4.12 最简单module的编译 上一篇博客上面有一个最简单的模块源代码,今天就上一个Makefile,运行make 就可以编译一个外部的模块. vim Makefile 这个是我 ...
- 【模块化编程】理解requireJS-实现一个简单的模块加载器
在前文中我们不止一次强调过模块化编程的重要性,以及其可以解决的问题: ① 解决单文件变量命名冲突问题 ② 解决前端多人协作问题 ③ 解决文件依赖问题 ④ 按需加载(这个说法其实很假了) ⑤ ..... ...
- Python函数篇(6)-常用模块及简单的案列
1.模块 函数的优点之一,就是可以使用函数将代码块与主程序分离,通过给函数指定一个描述性的名称,并将函数存储在被称为模块的独立文件中,再将模块导入主程序中,通过import语句允许在当前运行的程序 ...
- Python-常用模块及简单的案列
1.模块 函数的优点之一,就是可以使用函数将代码块与主程序分离,通过给函数指定一个描述性的名称,并将函数存储在被称为模块的独立文件中,再将模块导入主程序中,通过import语句允许在当前运行的程序 ...
- Python_selenium中类函数模块的简单介绍
Python_selenium中类函数模块的简单介绍 一.demo1.py的代码如下所示 #coding:utf-8 class ClassA(object): string = "这是一个 ...
- 关于其它模块的设计,有非常多须要自己去构建和完毕,在这里就简单地举几个样例来看看其它模块的设计。我们要做的就是有更改password模块,客户选择模块和关于本软件模块。更改password模块用来更改管理员的password,客户选择对话框模块用来选择已加入的客户,关于本软件模块用来说明客户管理系统的一些必要信息和制作人的信息。
五,其它模块设计 关于其它模块的设计,有非常多须要自己去构建和完毕,在这里就简单地举几个样例来看看其它模块的设计. 我们要做的就是有更改password模块.客户选择模 ...
- node.js当中的http模块与url模块的简单介绍
一.http模块的简单介绍 node.js当中的http内置模块可以用于创建http服务器与http客户端. 1.引包 const http = require('http'); 2.创建http服务 ...
- python制作简单excel统计报表2之操作excel的模块openpyxl简单用法
python制作简单excel统计报表2之操作excel的模块openpyxl简单用法 # coding=utf-8 from openpyxl import Workbook, load_workb ...
- 进程、requests模块的简单使用
一.进程 1.进程间数据不共享 import multiprocessing data_list = [] def task(arg): data_list.append(arg) print(dat ...
随机推荐
- 平易近人、兼容并蓄——Spark SQL 1.3.0概览
自2013年3月面世以来,Spark SQL已经成为除Spark Core以外最大的Spark组件.除了接过Shark的接力棒,继续为Spark用户提供高性能的SQL on Hadoop解决方案之外, ...
- MS14-082引起的问题
经常看报道说打了微软的某某补丁出了什么什么问题,但是本人从未亲身经历过,直到MS14-082这个Office补丁的出现,让我也切身体会了一番,有点中奖的感觉. 具体参见: https://suppor ...
- 3种用组策略将域帐号加入本地管理员组的方法_jinifly_新浪博客
次当前系统域帐号是怎么在第一次登录时,自动加入域客户端本地管理员组的?我猜不外乎就是脚本.计算机策略或虚拟机初始化的自动应答脚本,结果系统的前任同事找到了答案--GPO的用户策略(确切讲是用户首选项) ...
- 3. PHP
安装: apt-get install php5-fpm php5-mysql 配置: vi /etc/php5/fpm/php.ini cgi.fix_pathinfo=0 vi /etc/ ...
- Win2003+Powershell2.0下无权限解锁账号
在GE环境下,我通过图形界面ADUC可以解锁一个员工账号,但是通过powershell命令却提示权限不足,咋回事? PS C:\Users\814072> Unlock-ADAccount ...
- 【液晶模块系列基础视频】4.2.X-GUI图形界面库-画矩形函数简介
[液晶模块系列基础视频]4.2.X-GUI图形界面库-画矩形函数简介 ============================== 技术论坛:http://www.eeschool.org 博客地址: ...
- CSS3系列:魔法系列
一.三角形 #wrap div{ margin: 0 auto; } .triangle_three { height:0px; width:0px; border-bottom:50px solid ...
- maven常用插件总结
maven本质上是一个插件框架,几乎所有的功能都是通过各种各样的插件来实现的.maven默认会依据项目类型自动把构建时的各阶段(Lifecycle和phase)自动绑定(Lifecycle Mappi ...
- [ZZ] Deferred Rendering and HDR
http://www.gamedev.net/topic/496785-deferred-rendering-and-hdr/ Quote: Original post by jstrohYeah I ...
- Web前端开发:什么是页面重回(repaints)与回流(reflow)
前言:什么是重绘与回流? 重绘(repaints)是一个元素外观的改变所触发的浏览器行为,例如改变vidibility.outline.背景色等属性.浏览器会根据元素的新属性重新绘制,使元素呈现新的外 ...