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


    内核编程实例,多文件的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 ");
    8.     return 0;
    9. }
    10. static void __exit hl_cleanup( void )
    11. {
    12.     printk("Goodbye, World! cleanup ");
    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 ");
    9.     timer_init();
    10.     return 0;
    11. }
    12. static void __exit hl_cleanup( void )
    13. {
    14.     timer_exit();
    15.     printk("Goodbye, World! cleanup ");
    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 >>>>>> ");
    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 ");
    18.     return 0;
    19. }
    20. void timer_exit(void)
    21. {
    22.     del_timer(&my_timer);
    23.     printk("timer_k module exited ");
    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 ");
    8.     return 0;
    9. }
    10. static void __exit hl_cleanup( void )
    11. {
    12.     printk("Goodbye, World! cleanup ");
    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 ");
    9.     timer_init();
    10.     return 0;
    11. }
    12. static void __exit hl_cleanup( void )
    13. {
    14.     timer_exit();
    15.     printk("Goodbye, World! cleanup ");
    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 >>>>>> ");
    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 ");
    18.     return 0;
    19. }
    20. void timer_exit(void)
    21. {
    22.     del_timer(&my_timer);
    23.     printk("timer_k module exited ");
    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
  • 相关阅读:
    HTML5的智能提示在VisualStudio2010
    浏览器的缓存机制
    等待资源(wait_resource)解码(完整版)
    对quartz的总结
    利用Spring动态对Quartz定时任务管理
    Tomcat源码分析(一)服务启动
    深入分析 Java 中的中文编码问题
    企业搜索引擎开发之连接器connector(一)
    SpringQuartz (一)
    Quartz 项目应用笔记
  • 原文地址:https://www.cnblogs.com/timssd/p/4781168.html
Copyright © 2020-2023  润新知