内核编程实例,多文件的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内核源码树 ...
随机推荐
- libgdx, mouse 关节
鼠标与body的交互就靠这个mouse 关节了. 在使用中:主要分成3步: 步1:mouseDown : 这个时期,调用world->QueryAABB.它有一个回调接口,并依据鼠标指针指定一个 ...
- SimpleDateFormat使用具体解释
public class SimpleDateFormat extends DateFormat SimpleDateFormat 是一个以国别敏感的方式格式化和分析数据的详细类. 它同意格式化 ...
- MVC整个样例的源代码
以下就是整MVC样例的源代码: #windows应用程序 #开发者:蔡军生(QQ:9073204) 深圳 2014-9-24 #使用类来描写叙述 from ctypes import * from c ...
- Java中的异常详解
一.异常定义 阻止当前方法或作用域继续执行的问题,称为异常 二.异常分析 所有不正常类都继承Throwable类,这个类主要有两个子类Error类和Exception类.Error指系统错误 ...
- easyui只选择年份月份的插件---SimpleCanleder
<td>日期</td> <td> <input type="text" id="search_begindate" s ...
- Hiddenfield控件
本文转自:http://www.cnblogs.com/weicleer/archive/2012/11/26/2788722.html ASP.NET2.0 HiddenField控件(1)2007 ...
- .net嵌入c#代码(投票练习)
.net嵌入c#代码(投票练习) <%@ Page Language="C#" AutoEventWireup="true" CodeFile=" ...
- 在Qt中如何使用QtDesigner创建的UI文件
使用Qt有一些时间了,一直在IDE环境(qtcreator和VS2003+集成器)中使用,自然少了很多麻烦的步骤.但是在享受这种便利的同 时,我们也失去了理解更多知识背后的点滴.在IDE中,如果我们要 ...
- JAVA学习笔记 -- 数据结构
一.数据结构的接口 在Java中全部类的鼻祖是Object类,可是全部有关数据结构处理的鼻祖就是Collection和Iterator接口,也就是集合与遍历. 1.Collection接口 Colle ...
- 公钥password学中的素数以及对称加密
password学.一向被人们觉得门槛非常高,特别高端...这也是实际,可是这决不意味着普通人无法了解它的精髓.对于喜欢画圆的人来讲,即便是理解了password技术背后的哪怕一点理论,也是激 ...