一个简单的内核模块包括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

一个简单的内核模块实现和使用相关推荐

  1. 在Linux下写一个简单的驱动程序

    目录 一个简单的驱动 编写驱动程序 驱动程序的Makefile 驱动程序的测试程序 驱动程序的编译 加载驱动 init函数 创建节点 PS:/proc/devices 与 /dev的区别 运行上层应用 ...

  2. netfilter编程实例——一个简单的防火墙

    一.iptables防火墙netfilter介绍 Linux 防火墙包含两部分,内核 netfilter 和用户空间工具 iptables.管理员通过 iptables 工具集和内核打交道,将防火墙规 ...

  3. 一个简单的字符驱动程序

    一.背景 为了了解设备驱动程序的框架,在此编写一个简单的字符驱动程序,以此来对驱动程序的框架进行一个简单的了解. 二.设备驱动程序 所谓设备驱动程序,其实就是计算机硬件与外部设备进行通信的接口.由于硬 ...

  4. 编写一个简单的linux kernel rootkit

    一.前言 linux kernel rootkit跟普通的应用层rootkit个人感觉不大,个人感觉区别在于一个运行在用户空间中,一个运行在内核空间中:另一个则是编写时调用的API跟应用层rootki ...

  5. Linux内核驱动学习(一)编写最简单Linux内核模块HelloWorld

    文章目录 准备工作 什么是内核模块 编写 hello.c 模块编译 相关指令 测试结果 模块加载 模块卸载 准备工作 在进行以下操作前,首先我准备了一台电脑,并且安装了虚拟机,系统是Ubuntu16. ...

  6. 聊聊高并发(十六)实现一个简单的可重入锁

    可重入锁指的是假设一个线程已经获得了一个锁,那么它能够多次进入这个锁,当然前提是线程须要先获得这个锁. 可重入锁是最常使用的锁.Java的内置锁就是可重入锁,使用synchronizedkeyword ...

  7. 用php做一个简单的汇率,vue实现简单实时汇率计算功能

    最近在自己摸索vue的使用,因为相对于只是去看教程和实例,感觉不如自己动手写一个demo入门来的快.刚好看到小程序中有一个简单但是很精致的应用极简汇率,而且它的表现形式和vue的表现形式很像,于是想着 ...

  8. python编写赛车游戏单机版_使用Python中OrderedDict模拟一个简单的竞速游戏排名

    上一篇,我们梳理了Python中关于字典排序的一些常用方法(杂乱无章的数据结构如何进行排序,简明讲述Python字典排序那些事).其中,我们讲到了Python的collections模块中的Order ...

  9. 编写一个最简单的.php,学习猿地- 说明 如果我们要编写一个简单的PHP脚本,需要学习哪些...

    说明 如果我们要编写一个简单的 PHP 脚本,需要学习哪些基础知识呢? PHP 基础 PHP 脚本可放置于文档中的任何位置. 标准 的 PHP 脚本以 <?php 开头,以 ?> 结尾: ...

最新文章

  1. 安永创新中心落子北京,聚焦5G技术赋能企业数字化转型
  2. vue 文字上下循环滚动_基于 Vue 无缝滚动组件Vue-Seamless-Scroll
  3. 【联邦学习】FATE 集群部署 step1
  4. Java常用类集接口以及实现方式总结
  5. python pandas合并多个excel_python pandas合并多个excel(xls和xlsx)文件(弹窗选择文件夹和保存文件)...
  6. Spring Cloud 入门 之 Hystrix 篇(四)
  7. 从考勤管理需求说起,聊聊场景的思维“工具”
  8. Elasticsearch高级查询2:ES 高级查询
  9. mybatis 存储过程 tmp_count_MyBatis框架介绍及实战操作
  10. mysql lamp 配置命令总结
  11. labview的RS232驱动程序
  12. c语言题目tcl是什么意思,TCL语言简述
  13. 如何备考软考中级-系统集成项目管理工程师
  14. FPGA编程入门:Quartus II 设计1位全加器
  15. DWORD WINAPI
  16. PS怎么压缩图片大小而像素不变
  17. iPhone模拟器突然开始运行非常慢
  18. 微软Win8Server2012各版本安装密匙序列号
  19. 高中数学竞赛与自主招生内部练习试题
  20. mac蓝牙鼠标总是自己断开_完美的解决方案:解决Mac蓝牙鼠标和键盘经常断开的问题...

热门文章

  1. java贪心算法 区间调度_贪心算法-区间调度问题解之证明(示例代码)
  2. es写入数据的工作原理是什么啊?es查询数据的工作原理是什么啊?
  3. C++——运算符重载operator
  4. LeetCode-笔记-112、路径总和
  5. 【带你重拾Redis】Redis事务
  6. calabash-android教程,自动化测试工具_Calabash-android调研
  7. 使用PHP导入和到处CSV文件
  8. 为什么在notebook里面还是显示torch_torch.utils.cpp_extension对c++/cuda进行拓展
  9. apk转换ipa在线转换工具_gif转换工具
  10. 南京工业大学python考试题库_程序设计语言(Python程序设计)答案