内核编程实例,多文件的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内核源码树 ...
随机推荐
- 利用JNI技术在Android中调用C++形式的OpenGL ES 2.0函数
1. 打开Eclipse,File-->New-->Project…-->Android-->AndroidApplication Projec ...
- Java 找出四位数的全部吸血鬼数字 基础代码实例
/** * 找出四位数的全部吸血鬼数字 * 吸血鬼数字是指位数为偶数的数字,能够由一对数字相乘而得到,而这对数字各包括乘积的一半位数的数字,当中从最初的数字中选取的数字能够随意排序. * 以两个 ...
- Domain(AD) 管理
新建账户 文件夹权限管理
- xcode4.5.1、iphone5、ios6 使用记录
链接地址:http://blog.sina.com.cn/s/blog_6123f9650101dmo7.html 1.修改工程名:直接选中工程名点一下,就像修改名称夹名称一样简单了. 2.导入旧 ...
- SGU 415. Necessary Coins ( 背包dp )
题意大概是:给出N个硬币, 面值为a_i, 问要凑成X元哪些硬币是不可或缺的.1 ≤ N ≤ 200, 1 ≤ x ≤ 10^4 直接枚举, 然后就是01背包了. 为了不让复杂度多乘个N, 我们就从左 ...
- 关于负数的isdigit()判断
-->the start 今天写作业的时候突然想到,一直使用isdigit()方法来处理用户的输入选择是不是数字,但是如果用户输入的是负数呢,会不会导致bug? 然后我就试了一下,居然不报错.. ...
- Linux开机启动十步骤
启动第一步--加载BIOS 启动第二步--读取MBR 启动第三步--Boot Loader 启动第四步--加载内核 启动第五步--用户层init依据inittab文件来设定运行等级 启动第六步--in ...
- html5新特性:利用history的pushState等方法来解决使用ajax导致页面后退和前进的问题
一.背景 使用ajax,可以实现不需要刷新整个页面就可以进行局部页面的更新.这样可以开发交互性很强的富客户端程序,减少网络传输的内容.但长期以来存在一个问题,就是无法利用浏览器本身提供的前进和后退按钮 ...
- splinter python浏览器自动化操作,模拟浏览器的行为
Splinter可以非常棒的模拟浏览器的行为,Splinter提供了丰富的API,可以获取页面的信息判断当前的行为所产生的结果 最近在研究网站自动登录的问题,涉及到需要实现浏览器自动化操作,网上有 ...
- php 上传文件代码
通过 PHP,能够把文件上传到server.里面加入一些图片的推断,假设不加推断文件的类型就能够上传随意格式的文件. 为了站点的安全,肯定不让上传php文件,假设有人进入你的后台,上传了一个php文件 ...