内核编程实例,多文件的Makefile

经典的hello word测试

  1. ////# cat hello.c
  2. #include <linux/module.h>
  3. #include <linux/kernel.h>
  4. #include <linux/init.h>
  5. static int __init hl_init( void )
  6. {
  7. printk("Hello,World! init\n");
  8. return 0;
  9. }
  10. static void __exit hl_cleanup( void )
  11. {
  12. printk("Goodbye, World! cleanup\n");
  13. }
  14. module_init(hl_init);
  15. module_exit(hl_cleanup);
  16. MODULE_LICENSE("GPL");

经典的由单个c文件产生模块的Makefile。

  1. # cat Makefile
  2. obj-m += hello.o
  3. CURRENT_PATH := $(shell pwd) #模块所在的当前路径
  4. LINUX_KERNEL := $(shell uname -r) #Linux内核源代码的当前版本
  5. LINUX_KERNEL_PATH := /usr/src/kernels/$(LINUX_KERNEL) #Linux内核源代码的绝对路径
  6. all:
  7. make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules #编译模块了
  8. clean:
  9. make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean #清理

编译

Make
就产生了hello.ko。

安装

insmod hello.ko

卸载

rmmod hello

查看log

dmesg

    1. ................
    2. [12238.051159] Hello,World! init
    3. [12242.458122] Goodbye, World! cleanup
[]中的是时间戳。

多文件
我升级下,两个文件,hello.c和timer.c ,就是每隔一秒输出点东西来,开始输出hello init, 退出时输出exit。
hello.c

  1. #include <linux/module.h>
  2. #include <linux/kernel.h>
  3. #include <linux/init.h>
  4. extern void timer_exit(void);
  5. extern int timer_init(void);
  6. static int __init hl_init( void )
  7. {
  8. printk("Hello,World! init\n");
  9. timer_init();
  10. return 0;
  11. }
  12. static void __exit hl_cleanup( void )
  13. {
  14. timer_exit();
  15. printk("Goodbye, World! cleanup\n");
  16. }
  17. module_init(hl_init);
  18. module_exit(hl_cleanup);
  19. MODULE_LICENSE("GPL");

timer.c

  1. #include <linux/timer.h>
  2. static struct timer_list my_timer;
  3. //定时函数
  4. void tm_say(unsigned long arg){
  5. printk( "timer do >>>>>>\n");
  6. mod_timer(&my_timer,jiffies+HZ);
  7. }
  8. //初始化模块和定时器
  9. int timer_init(void)
  10. {
  11. init_timer(&my_timer);
  12. my_timer.data=0;
  13. my_timer.function =tm_say;
  14. my_timer.expires = jiffies+HZ;
  15. //定时一秒钟
  16. add_timer(&my_timer);
  17. printk(KERN_EMERG "timer_k module inserted\n");
  18. return 0;
  19. }
  20. void timer_exit(void)
  21. {
  22. del_timer(&my_timer);
  23. printk("timer_k module exited\n");
  24. }

Makefile

  1. obj-m := hhh.o
  2. hhh-objs := hello.o timer.o
  3. KERNELBUILD := /lib/modules/`uname -r`/build
  4. default:
  5. echo " BUILD kmod"
  6. make -C $(KERNELBUILD) M=$(shell pwd) modules
  7. clean:
  8. make -C $(KERNELBUILD) M=$(shell pwd) clean

关键就是,target_name后面的"-objs"的指引。
编吧,make , insmod hhh.ko 等下 再 rmmod hhh 看看 dmes

  1. [16324.230095] Hello,World! init
  2. [16324.230095] timer_k module inserted
  3. [16325.232644] timer do >>>>>>
  4. [16326.237437] timer do >>>>>>
  5. [16327.244518] timer do >>>>>>
  6. [16328.247633] timer do >>>>>>
  7. [16329.248125] timer do >>>>>>
  8. [16329.864092] timer_k module exited
  9. [16329.864092] Goodbye, World! cleanup

经典的hello word测试

  1. ////# cat hello.c
  2. #include <linux/module.h>
  3. #include <linux/kernel.h>
  4. #include <linux/init.h>
  5. static int __init hl_init( void )
  6. {
  7. printk("Hello,World! init\n");
  8. return 0;
  9. }
  10. static void __exit hl_cleanup( void )
  11. {
  12. printk("Goodbye, World! cleanup\n");
  13. }
  14. module_init(hl_init);
  15. module_exit(hl_cleanup);
  16. MODULE_LICENSE("GPL");

经典的由单个c文件产生模块的Makefile。

  1. # cat Makefile
  2. obj-m += hello.o
  3. CURRENT_PATH := $(shell pwd) #模块所在的当前路径
  4. LINUX_KERNEL := $(shell uname -r) #Linux内核源代码的当前版本
  5. LINUX_KERNEL_PATH := /usr/src/kernels/$(LINUX_KERNEL) #Linux内核源代码的绝对路径
  6. all:
  7. make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules #编译模块了
  8. clean:
  9. make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean #清理

编译

Make
就产生了hello.ko。

安装

insmod hello.ko

卸载

rmmod hello

查看log

dmesg

    1. ................
    2. [12238.051159] Hello,World! init
    3. [12242.458122] Goodbye, World! cleanup
[]中的是时间戳。

多文件
我升级下,两个文件,hello.c和timer.c ,就是每隔一秒输出点东西来,开始输出hello init, 退出时输出exit。
hello.c

  1. #include <linux/module.h>
  2. #include <linux/kernel.h>
  3. #include <linux/init.h>
  4. extern void timer_exit(void);
  5. extern int timer_init(void);
  6. static int __init hl_init( void )
  7. {
  8. printk("Hello,World! init\n");
  9. timer_init();
  10. return 0;
  11. }
  12. static void __exit hl_cleanup( void )
  13. {
  14. timer_exit();
  15. printk("Goodbye, World! cleanup\n");
  16. }
  17. module_init(hl_init);
  18. module_exit(hl_cleanup);
  19. MODULE_LICENSE("GPL");

timer.c

  1. #include <linux/timer.h>
  2. static struct timer_list my_timer;
  3. //定时函数
  4. void tm_say(unsigned long arg){
  5. printk( "timer do >>>>>>\n");
  6. mod_timer(&my_timer,jiffies+HZ);
  7. }
  8. //初始化模块和定时器
  9. int timer_init(void)
  10. {
  11. init_timer(&my_timer);
  12. my_timer.data=0;
  13. my_timer.function =tm_say;
  14. my_timer.expires = jiffies+HZ;
  15. //定时一秒钟
  16. add_timer(&my_timer);
  17. printk(KERN_EMERG "timer_k module inserted\n");
  18. return 0;
  19. }
  20. void timer_exit(void)
  21. {
  22. del_timer(&my_timer);
  23. printk("timer_k module exited\n");
  24. }

Makefile

  1. obj-m := hhh.o
  2. hhh-objs := hello.o timer.o
  3. KERNELBUILD := /lib/modules/`uname -r`/build
  4. default:
  5. echo " BUILD kmod"
  6. make -C $(KERNELBUILD) M=$(shell pwd) modules
  7. clean:
  8. make -C $(KERNELBUILD) M=$(shell pwd) clean

关键就是,target_name后面的"-objs"的指引。
编吧,make , insmod hhh.ko 等下 再 rmmod hhh 看看 dmes 
[16324.230095] Hello,World! init

  1. [16324.230095] timer_k module inserted
  2. [16325.232644] timer do >>>>>>
  3. [16326.237437] timer do >>>>>>
  4. [16327.244518] timer do >>>>>>
  5. [16328.247633] timer do >>>>>>
  6. [16329.248125] timer do >>>>>>
  7. [16329.864092] timer_k module exited
  8. [16329.864092] Goodbye, World! cleanup

内核编程实例,多文件的Makefile的更多相关文章

  1. 《天书夜读:从汇编语言到windows内核编程》八 文件操作与注册表操作

    1)Windows运用程序的文件与注册表操作进入R0层之后,都有对应的内核函数实现.在windows内核中,无论打开的是文件.注册表或者设备,都需要使用InitializeObjectAttribut ...

  2. HDFS简单编程实例:文件合并

    下图显示了HDFS文件系统中路径为“localhost:50070/explorer.html#/user/hadoop”的目录中所有的文件信息: 对于该目录下的所有文件,我们将执行以下操作: 首先, ...

  3. Win64 驱动内核编程-29.强制解锁文件

    强制解锁文件 强制解锁因其他进程占用而无法删除的文件. 1.调用 ZwQuerySystemInformation 的 16 功能号来枚举系统里的句柄 2.打开拥有此句柄的进程并把此句柄复制到自己的进 ...

  4. linux内核模块编程实例

    linux内核模块编程实例 学号:201400814125 班级:计科141 姓名:刘建伟 1.确定本机虚拟机中的Ubuntu下Linux的版本 通过使用命令uname -a/uname -r/una ...

  5. 初探linux内核编程,参数传递以及模块间函数调用

    一.前言                                  我们一起从3个小例子来体验一下linux内核编程.如下: 1.内核编程之hello world 2.模块参数传递 3.模块间 ...

  6. 如何搭建Visual Studio的内核编程开发环境

    最近正在看<寒江独钓——Windows内核安全编程>这本书,感觉这本书非常好,有兴趣的朋友可以买来看看,有关这本书的信息请参考:http://www.china-pub.com/19559 ...

  7. Linux内核编程规范与代码风格

    source: https://www.kernel.org/doc/html/latest/process/coding-style.html translated by trav, travmym ...

  8. Android 开发手记一NDK编程实例

    在Android上,应用程序的开发,大部分基于Java语言来实现.要使用c或是c++的程序或库,就需要使用NDK来实现.NDK是Native Development Kit的简称.它是一个工具集,集成 ...

  9. 内核源码之Kconfig和Makefile

    转自:http://www.cnblogs.com/image-eye/archive/2011/08/28/2156005.html 内核源码之Kconfig和Makefile Linux内核源码树 ...

随机推荐

  1. FineReport实现Java报表主题分析的效果图

    Java报表-財务主题-EVA经济附加 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmVzdF9yZXBvcnQ=/font/5a6L5L2T/font ...

  2. xp每天定时关机命令

    at 00:00 /every:M,T,W,Th,F,S,Su shutdown -s -t 120 能够把00:00改成你想要每天定时关机的时间,120是指关机倒计时的秒数,也能够更改 M,T,W, ...

  3. 【开源框架】Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发,欢迎各位网友补充完善

    链接地址:http://www.tuicool.com/articles/jyA3MrU 时间 2015-01-05 10:08:18  我是程序猿,我为自己代言 原文  http://blog.cs ...

  4. BZOJ 4143: [AMPPZ2014]The Lawyer( sort )

    水题... 排序搞出每天的会议有哪些, 然后再按照会议的开始时间和结束时间排序, 最晚开始的和最早结束的会议不是同一场而且最晚开始的时间>最早结束的会议就有可能方案 -------------- ...

  5. net异步编程之await

    net异步编程之await 初探asp.net异步编程之await   终于毕业了,也顺利进入一家期望的旅游互联网公司.27号入职.放肆了一个多月没写代码,好方啊. 另外一下观点均主要针对于await ...

  6. Python 数据分析(一) 本实验将学习 pandas 基础,数据加载、存储与文件格式,数据规整化,绘图和可视化的知识

    第1节 pandas 回顾 第2节 读写文本格式的数据 第3节 使用 HTML 和 Web API 第4节 使用数据库 第5节 合并数据集 第6节 重塑和轴向旋转 第7节 数据转换 第8节 字符串操作 ...

  7. 【iOS发展-53】实例探究:scrollView使用方法和解决方案无法滚动核心

    案例效果: (1)基本的就是练习scrollView的使用方法.界面里面的其它元素基本都是UIView和UIButton堆砌起来的. (2)主要用代码实现.当然,能够先用storyboard拖个scr ...

  8. hive怎样处理多分隔符数据

    问题描写叙述:     大数据维稳需求中,客户提供的測试数据为多个字符做分隔符('|#'),在pig中会直接报错,hive中仅仅认第一个分隔符. 因为数据量比較大(160G),在文本中替换成单个字符分 ...

  9. log4net使用流程

    前面大致介绍了一下log4net的概述和结构.既然都清楚了,下面我来介绍一下如何使用log4net. 使用流程 1.这里所说的使用流程就是使用log4net.dll,首先要根据你的平台来找出对应的版本 ...

  10. perl 继承 @ISA

    12.5 类继承 对Perl的对象剩下的内容而言,从一个类继承另外一个类并不需要给这门语法增加特殊的语法,当你调用一个方法的时候, 如果Perl在调用者的包里找不到这个字过程,那么他就检查@ISA数组 ...