内核编程实例,多文件的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内核源码树 ...
随机推荐
- Android Dialog详解
前言 欢迎大家我分享和推荐好用的代码段~~ 声明 欢迎转载,但请保留文章原始出处: CSDN:http://www.csdn.net ...
- 亚马逊带Marketplace product code的image无法再mount到其他镜像上
这是对已发布镜像的保护么?难道对其进行修改的路彻底断掉了? 以volume形式attach也不行,dd成raw再读取也读不了,敢问路在何方呢 If a volume has an AWS Market ...
- Shell基础一
Shell指令: shell识别三种基本命令:内建命令.Shell函数以及外部命令: 内建命令就是由shell本身所执行的命令.有些命令是由于其必要性才内建的:例如:cd.read: 另一种内建命令的 ...
- c#取出LDAP SearchResult所有属性
string aaa = System.Threading.Thread.CurrentPrincipal.Identity.Name; DirectorySearcher ds = new Dire ...
- android的事件分发机制理解
android的事件分发机制理解 1.事件触发主要涉及到哪些层面的哪些函数(个人理解的顺序,可能在某一层会一次回调其它函数) activity中的dispatchTouchEvent .layout中 ...
- BZOJ 2429: [HAOI2006]聪明的猴子( MST )
水题, 求MST即可. -------------------------------------------------------------------------------- #includ ...
- Python 第七篇:异步IO\数据库\队列\缓存
Gevent协程 Select\Poll\Epoll异步IO与事件驱动 Python连接Mysql数据库操作 RabbitMQ队列 Redis\Memcached缓存 Paramiko SSH Tws ...
- 新鲜出炉的Using Qt 3D to visualize music
http://blog.qt.io/blog/2016/01/27/using-qt-3d-visualize-music/
- hive怎样处理多分隔符数据
问题描写叙述: 大数据维稳需求中,客户提供的測试数据为多个字符做分隔符('|#'),在pig中会直接报错,hive中仅仅认第一个分隔符. 因为数据量比較大(160G),在文本中替换成单个字符分 ...
- 极限挑战—C#+ODP 100万条数据导入Oracle数据库仅用不到1秒
链接地址:http://www.cnblogs.com/armyfai/p/4646213.html 要:在这里我们将看到的是C#中利用ODP实现在Oracle数据库中瞬间导入百万级数据,这对快速批量 ...