博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
内核编程实例,多文件的Makefile
阅读量:6685 次
发布时间:2019-06-25

本文共 4829 字,大约阅读时间需要 16 分钟。

内核编程实例,多文件的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

转载地址:http://lfhao.baihongyu.com/

你可能感兴趣的文章
leetCode 81.Search in Rotated Sorted Array II (旋转数组的搜索II) 解题思路和方法
查看>>
免费云盘,为什么不用?
查看>>
java后台json如何传递到jsp中解析
查看>>
Dubbo -- 系统学习 笔记 -- 配置参考手册
查看>>
CentOS 搭建 Mysql MMM 高可用架构
查看>>
Android设计模式(七)--原型模式
查看>>
Zabbix监控JVM内存
查看>>
OAuth2.0学习(1-11)新浪开放平台微博认证-使用OAuth2.0调用微博的开放API
查看>>
java验证身份证号码是否有效源代码
查看>>
MyBatis3-配置使用log4j输出日志
查看>>
让小球跳起来
查看>>
常用存储器介绍
查看>>
P1807 最长路_NOI导刊2010提高(07)
查看>>
有下面33种症状,你就应该离开电脑到户外走走
查看>>
任正非对研究部门的方向指导
查看>>
树莓派——科大讯飞离线语音识别
查看>>
项目的坎坷一生(上)
查看>>
LeetCode139:Word Break
查看>>
thinkphp开发微信公众号时,验证基本配置提示请求url超时
查看>>
阿里云API网关(11)API的三种安全认证方式
查看>>