内核编程实例,多文件的Makefile
内核编程实例,多文件的Makefile
经典的hello word测试
- ////# cat hello.c
- #include <linux/module.h>
- #include <linux/kernel.h>
- #include <linux/init.h>
- static int __init hl_init( void )
- {
- printk("Hello,World! init\n");
- return 0;
- }
- static void __exit hl_cleanup( void )
- {
- printk("Goodbye, World! cleanup\n");
- }
- module_init(hl_init);
- module_exit(hl_cleanup);
- MODULE_LICENSE("GPL");
经典的由单个c文件产生模块的Makefile。
- # cat Makefile
- obj-m += hello.o
- CURRENT_PATH := $(shell pwd) #模块所在的当前路径
- LINUX_KERNEL := $(shell uname -r) #Linux内核源代码的当前版本
- LINUX_KERNEL_PATH := /usr/src/kernels/$(LINUX_KERNEL) #Linux内核源代码的绝对路径
- all:
- make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules #编译模块了
- clean:
- make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean #清理
编译
Make
就产生了hello.ko。安装
insmod hello.ko
卸载
rmmod hello
查看log
dmesg
- ................
- [12238.051159] Hello,World! init
- [12242.458122] Goodbye, World! cleanup
[]中的是时间戳。
多文件
我升级下,两个文件,hello.c和timer.c ,就是每隔一秒输出点东西来,开始输出hello init, 退出时输出exit。
hello.c
- #include <linux/module.h>
- #include <linux/kernel.h>
- #include <linux/init.h>
- extern void timer_exit(void);
- extern int timer_init(void);
- static int __init hl_init( void )
- {
- printk("Hello,World! init\n");
- timer_init();
- return 0;
- }
- static void __exit hl_cleanup( void )
- {
- timer_exit();
- printk("Goodbye, World! cleanup\n");
- }
- module_init(hl_init);
- module_exit(hl_cleanup);
- MODULE_LICENSE("GPL");
timer.c
- #include <linux/timer.h>
- static struct timer_list my_timer;
- //定时函数
- void tm_say(unsigned long arg){
- printk( "timer do >>>>>>\n");
- mod_timer(&my_timer,jiffies+HZ);
- }
- //初始化模块和定时器
- int timer_init(void)
- {
- init_timer(&my_timer);
- my_timer.data=0;
- my_timer.function =tm_say;
- my_timer.expires = jiffies+HZ;
- //定时一秒钟
- add_timer(&my_timer);
- printk(KERN_EMERG "timer_k module inserted\n");
- return 0;
- }
- void timer_exit(void)
- {
- del_timer(&my_timer);
- printk("timer_k module exited\n");
- }
Makefile
- obj-m := hhh.o
- hhh-objs := hello.o timer.o
- KERNELBUILD := /lib/modules/`uname -r`/build
- default:
- echo " BUILD kmod"
- make -C $(KERNELBUILD) M=$(shell pwd) modules
- clean:
- make -C $(KERNELBUILD) M=$(shell pwd) clean
关键就是,target_name后面的"-objs"的指引。
编吧,make , insmod hhh.ko 等下 再 rmmod hhh 看看 dmes
- [16324.230095] Hello,World! init
- [16324.230095] timer_k module inserted
- [16325.232644] timer do >>>>>>
- [16326.237437] timer do >>>>>>
- [16327.244518] timer do >>>>>>
- [16328.247633] timer do >>>>>>
- [16329.248125] timer do >>>>>>
- [16329.864092] timer_k module exited
- [16329.864092] Goodbye, World! cleanup
经典的hello word测试
- ////# cat hello.c
- #include <linux/module.h>
- #include <linux/kernel.h>
- #include <linux/init.h>
- static int __init hl_init( void )
- {
- printk("Hello,World! init\n");
- return 0;
- }
- static void __exit hl_cleanup( void )
- {
- printk("Goodbye, World! cleanup\n");
- }
- module_init(hl_init);
- module_exit(hl_cleanup);
- MODULE_LICENSE("GPL");
经典的由单个c文件产生模块的Makefile。
- # cat Makefile
- obj-m += hello.o
- CURRENT_PATH := $(shell pwd) #模块所在的当前路径
- LINUX_KERNEL := $(shell uname -r) #Linux内核源代码的当前版本
- LINUX_KERNEL_PATH := /usr/src/kernels/$(LINUX_KERNEL) #Linux内核源代码的绝对路径
- all:
- make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules #编译模块了
- clean:
- make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean #清理
编译
Make
就产生了hello.ko。安装
insmod hello.ko
卸载
rmmod hello
查看log
dmesg
- ................
- [12238.051159] Hello,World! init
- [12242.458122] Goodbye, World! cleanup
[]中的是时间戳。
多文件
我升级下,两个文件,hello.c和timer.c ,就是每隔一秒输出点东西来,开始输出hello init, 退出时输出exit。
hello.c
- #include <linux/module.h>
- #include <linux/kernel.h>
- #include <linux/init.h>
- extern void timer_exit(void);
- extern int timer_init(void);
- static int __init hl_init( void )
- {
- printk("Hello,World! init\n");
- timer_init();
- return 0;
- }
- static void __exit hl_cleanup( void )
- {
- timer_exit();
- printk("Goodbye, World! cleanup\n");
- }
- module_init(hl_init);
- module_exit(hl_cleanup);
- MODULE_LICENSE("GPL");
timer.c
- #include <linux/timer.h>
- static struct timer_list my_timer;
- //定时函数
- void tm_say(unsigned long arg){
- printk( "timer do >>>>>>\n");
- mod_timer(&my_timer,jiffies+HZ);
- }
- //初始化模块和定时器
- int timer_init(void)
- {
- init_timer(&my_timer);
- my_timer.data=0;
- my_timer.function =tm_say;
- my_timer.expires = jiffies+HZ;
- //定时一秒钟
- add_timer(&my_timer);
- printk(KERN_EMERG "timer_k module inserted\n");
- return 0;
- }
- void timer_exit(void)
- {
- del_timer(&my_timer);
- printk("timer_k module exited\n");
- }
Makefile
- obj-m := hhh.o
- hhh-objs := hello.o timer.o
- KERNELBUILD := /lib/modules/`uname -r`/build
- default:
- echo " BUILD kmod"
- make -C $(KERNELBUILD) M=$(shell pwd) modules
- clean:
- make -C $(KERNELBUILD) M=$(shell pwd) clean
关键就是,target_name后面的"-objs"的指引。
编吧,make , insmod hhh.ko 等下 再 rmmod hhh 看看 dmes
[16324.230095] Hello,World! init
- [16324.230095] timer_k module inserted
- [16325.232644] timer do >>>>>>
- [16326.237437] timer do >>>>>>
- [16327.244518] timer do >>>>>>
- [16328.247633] timer do >>>>>>
- [16329.248125] timer do >>>>>>
- [16329.864092] timer_k module exited
- [16329.864092] Goodbye, World! cleanup
内核编程实例,多文件的Makefile的更多相关文章
- 《天书夜读:从汇编语言到windows内核编程》八 文件操作与注册表操作
1)Windows运用程序的文件与注册表操作进入R0层之后,都有对应的内核函数实现.在windows内核中,无论打开的是文件.注册表或者设备,都需要使用InitializeObjectAttribut ...
- HDFS简单编程实例:文件合并
下图显示了HDFS文件系统中路径为“localhost:50070/explorer.html#/user/hadoop”的目录中所有的文件信息: 对于该目录下的所有文件,我们将执行以下操作: 首先, ...
- Win64 驱动内核编程-29.强制解锁文件
强制解锁文件 强制解锁因其他进程占用而无法删除的文件. 1.调用 ZwQuerySystemInformation 的 16 功能号来枚举系统里的句柄 2.打开拥有此句柄的进程并把此句柄复制到自己的进 ...
- linux内核模块编程实例
linux内核模块编程实例 学号:201400814125 班级:计科141 姓名:刘建伟 1.确定本机虚拟机中的Ubuntu下Linux的版本 通过使用命令uname -a/uname -r/una ...
- 初探linux内核编程,参数传递以及模块间函数调用
一.前言 我们一起从3个小例子来体验一下linux内核编程.如下: 1.内核编程之hello world 2.模块参数传递 3.模块间 ...
- 如何搭建Visual Studio的内核编程开发环境
最近正在看<寒江独钓——Windows内核安全编程>这本书,感觉这本书非常好,有兴趣的朋友可以买来看看,有关这本书的信息请参考:http://www.china-pub.com/19559 ...
- Linux内核编程规范与代码风格
source: https://www.kernel.org/doc/html/latest/process/coding-style.html translated by trav, travmym ...
- Android 开发手记一NDK编程实例
在Android上,应用程序的开发,大部分基于Java语言来实现.要使用c或是c++的程序或库,就需要使用NDK来实现.NDK是Native Development Kit的简称.它是一个工具集,集成 ...
- 内核源码之Kconfig和Makefile
转自:http://www.cnblogs.com/image-eye/archive/2011/08/28/2156005.html 内核源码之Kconfig和Makefile Linux内核源码树 ...
随机推荐
- [置顶] HMM Tutorial 隐马尔科夫模型
有一个月没有写博客了,这一个月系统的学习了HMM model. 上周周五做了个report 感觉还好. 所以把Slide贴上来.
- 2008r2 做windows域控制器
新配一个: 1.装DNS服务. 2.装domain管理. config domain: 客户端172.16.1.34 ping zyctest
- Android--pendingIntent & Intent
PendingIntent pendingIntent字面意义:等待的,未决定的Intent.要得到一个pendingIntent对象,使用方法类的静态方法 getActivity(Context, ...
- 【转】java--final
1.final数据 许多程序设计语言都有自己的办法告诉编译器某个数据是“常数”.常数主要应用于下述两个方面: (1) 编译期常数,它永远不会改变 (2) 在运行期初始化的一个值,我们不希望它发生变化 ...
- django学习之Model(一)
认认真真学Django,从现在开始. 学习资料来源于官方网站:https://docs.djangoproject.com/en/1.6/ 1-新建一个models.py from django.db ...
- 《Python简明教程》总结
Python经典教程<Python简明教程> 目录: 为什么Python 安装Python 体验Python Python数据类型 运算符与表达式 控制流 函数 模块 数据结构 解决问题 ...
- C++ 左值 右值
最近在研究C++ 左值 右值,搬运.收集了一些别人的资料,供自己记录和学习,若以后看到了更好的解释,会继续补充.(打“?”是我自己不明白的地方 ) 参考:<Boost程序库探秘——深度解析C ...
- 基于visual Studio2013解决C语言竞赛题之1015日期计算
题目 解决代码及点评 /* 15. 已知某年不是闰年,给定该年某一天的月份和日期, 求这一天是该年的第几天. */ #include <stdio.h> #incl ...
- MongoDB---性能优化---(1)
MONGODB数据架构 升级解决.计划 发现问题 应用server用户数的突然涌入,创建server反应慢 检查server,我发现,每次反应非常慢,至30ops 检查过程 .发现数据库查询缓 ...
- 用Delphi进行word开发
使用以CreateOleObjects方式调用Word 实际上还是Ole,但是这种方式能够真正做到完全控制Word文件,能够使用Word的所有属性,包括自己编写的VBA宏代码.------------ ...