一个简单的内核模块实现和使用
一个简单的内核模块包括3个要素
1、MODULE_LICENSE("Dual BSD/GPL"); //模块许可声明
2、module_init(s5pv210_led_init); //模块加载入口声明
3、module_exit(s5pv210_led_exit); //模块卸载入口声明
代码实现:hello_world.c
#include <linux/kernel.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL"); //模块许可声明
static int hello_world_init(void)
{
printk("hello_world init\n");
return 0;
}
static void hello_world_exit(void)
{
printk("hello_worldexit\n");
}
module_init(hello_world_init); //模块加载入口声明
module_exit(hello_world_exit); //模块卸载入口声明
Makefile:
ifeq ($(KERNELRELEASE),) /* 如果KERNELRELEASE 未定义则执行下面语句
(KERNELRELEASE 是内核源码的顶层Makefile定义的变量,在第一次读取执行此Makefile时,KERNELRELEASE没有被定义)*/
KERNELDIR ?= /home/linux/store/linux-3.14 //对应内核源码目录
PWD := $(shell pwd)
all: //make 时从该目标执行
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules /* -C $(KERNELDIR) 跳转到内核源码目录下读取那里的Makefile
M=$(PWD) 返回到当前目录继续读入、执行当前的Makefile,而此时 KERNELRELEASE已被定义
故执行下面的obj-m := hello.o 生成.ko 模块文件
最后的modules 它指向的是读入的kernel顶层Makefile里的modules
*/
clean: //清除编译生成的文件
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions Module* modules* a.out
else
obj-m := hello_world.o //指定编译的文件名
endif
转载于:https://blog.51cto.com/yyqqi/1678842
一个简单的内核模块实现和使用相关推荐
- 在Linux下写一个简单的驱动程序
目录 一个简单的驱动 编写驱动程序 驱动程序的Makefile 驱动程序的测试程序 驱动程序的编译 加载驱动 init函数 创建节点 PS:/proc/devices 与 /dev的区别 运行上层应用 ...
- netfilter编程实例——一个简单的防火墙
一.iptables防火墙netfilter介绍 Linux 防火墙包含两部分,内核 netfilter 和用户空间工具 iptables.管理员通过 iptables 工具集和内核打交道,将防火墙规 ...
- 一个简单的字符驱动程序
一.背景 为了了解设备驱动程序的框架,在此编写一个简单的字符驱动程序,以此来对驱动程序的框架进行一个简单的了解. 二.设备驱动程序 所谓设备驱动程序,其实就是计算机硬件与外部设备进行通信的接口.由于硬 ...
- 编写一个简单的linux kernel rootkit
一.前言 linux kernel rootkit跟普通的应用层rootkit个人感觉不大,个人感觉区别在于一个运行在用户空间中,一个运行在内核空间中:另一个则是编写时调用的API跟应用层rootki ...
- Linux内核驱动学习(一)编写最简单Linux内核模块HelloWorld
文章目录 准备工作 什么是内核模块 编写 hello.c 模块编译 相关指令 测试结果 模块加载 模块卸载 准备工作 在进行以下操作前,首先我准备了一台电脑,并且安装了虚拟机,系统是Ubuntu16. ...
- 聊聊高并发(十六)实现一个简单的可重入锁
可重入锁指的是假设一个线程已经获得了一个锁,那么它能够多次进入这个锁,当然前提是线程须要先获得这个锁. 可重入锁是最常使用的锁.Java的内置锁就是可重入锁,使用synchronizedkeyword ...
- 用php做一个简单的汇率,vue实现简单实时汇率计算功能
最近在自己摸索vue的使用,因为相对于只是去看教程和实例,感觉不如自己动手写一个demo入门来的快.刚好看到小程序中有一个简单但是很精致的应用极简汇率,而且它的表现形式和vue的表现形式很像,于是想着 ...
- python编写赛车游戏单机版_使用Python中OrderedDict模拟一个简单的竞速游戏排名
上一篇,我们梳理了Python中关于字典排序的一些常用方法(杂乱无章的数据结构如何进行排序,简明讲述Python字典排序那些事).其中,我们讲到了Python的collections模块中的Order ...
- 编写一个最简单的.php,学习猿地- 说明 如果我们要编写一个简单的PHP脚本,需要学习哪些...
说明 如果我们要编写一个简单的 PHP 脚本,需要学习哪些基础知识呢? PHP 基础 PHP 脚本可放置于文档中的任何位置. 标准 的 PHP 脚本以 <?php 开头,以 ?> 结尾: ...
最新文章
- 安永创新中心落子北京,聚焦5G技术赋能企业数字化转型
- vue 文字上下循环滚动_基于 Vue 无缝滚动组件Vue-Seamless-Scroll
- 【联邦学习】FATE 集群部署 step1
- Java常用类集接口以及实现方式总结
- python pandas合并多个excel_python pandas合并多个excel(xls和xlsx)文件(弹窗选择文件夹和保存文件)...
- Spring Cloud 入门 之 Hystrix 篇(四)
- 从考勤管理需求说起,聊聊场景的思维“工具”
- Elasticsearch高级查询2:ES 高级查询
- mybatis 存储过程 tmp_count_MyBatis框架介绍及实战操作
- mysql lamp 配置命令总结
- labview的RS232驱动程序
- c语言题目tcl是什么意思,TCL语言简述
- 如何备考软考中级-系统集成项目管理工程师
- FPGA编程入门:Quartus II 设计1位全加器
- DWORD WINAPI
- PS怎么压缩图片大小而像素不变
- iPhone模拟器突然开始运行非常慢
- 微软Win8Server2012各版本安装密匙序列号
- 高中数学竞赛与自主招生内部练习试题
- mac蓝牙鼠标总是自己断开_完美的解决方案:解决Mac蓝牙鼠标和键盘经常断开的问题...
热门文章
- java贪心算法 区间调度_贪心算法-区间调度问题解之证明(示例代码)
- es写入数据的工作原理是什么啊?es查询数据的工作原理是什么啊?
- C++——运算符重载operator
- LeetCode-笔记-112、路径总和
- 【带你重拾Redis】Redis事务
- calabash-android教程,自动化测试工具_Calabash-android调研
- 使用PHP导入和到处CSV文件
- 为什么在notebook里面还是显示torch_torch.utils.cpp_extension对c++/cuda进行拓展
- apk转换ipa在线转换工具_gif转换工具
- 南京工业大学python考试题库_程序设计语言(Python程序设计)答案