内核编程实例,多文件的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
时间: 2024-08-03 06:03:31

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

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

下图显示了HDFS文件系统中路径为“localhost:50070/explorer.html#/user/hadoop”的目录中所有的文件信息: 对于该目录下的所有文件,我们将执行以下操作: 首先,从该目录中过滤出所有后缀名不为".abc"的文件. 然后,对过滤之后的文件进行读取. 最后,将这些文件的内容合并到文件“hdfs://localhost:9000/user/hadoop/merge.txt”中. 代码如下: 1 package mergeFile; 2 3 import

Linux文件编程实例

//捕获fopen调用中的错误 #include <stdio.h> #include <errno.h> #include <string.h> #define MYFILE "missing.txt" int main(  ) { FILE* fin; fin=fopen( MYFILE,"r" ); if( fin==(FILE*)NULL ) { printf( "%s: %s\n",MYFILE,st

Linux 内核编程 or 内核模块编程的文件读写与信号传输问题

Linux内核编程时,内核代码执行只能直接访问内存上的数据,硬盘上的文件系统必须通过间接的方式才能被内核读写.一般内核操作文件读写的方式有三种:1.通过/proc/文件作为桥梁完成硬盘文件系统与内核的交互:2.通过ioctl方式实现交互:3.直接利用虚拟文件系统的函数vfs_read().vfs_write()读写文件.三种方式的具体实现方法网上有很多详细教程,可以参考.这里对三种方法做出比较. proc机制是一种很老的文件读写方式,通用性好,实现也算成熟,使用时需要自己实现内核上层的读写函数,

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

一.前言                                  我们一起从3个小例子来体验一下linux内核编程.如下: 1.内核编程之hello world 2.模块参数传递 3.模块间函数调用 二.准备工作                           首先,在你的linux系统上面安装linux头文件,debian系列: 1 $:sudo apt-get install linux-headers-`uname -r` 安装后,在你的/lib/modules/目录下有你刚

内核编程学习小结

The road to success was trial and error development, recompilation, and lots of crashes. 寒假过去一个月,计划很多时候也没法跟上.不过总体上来说,还是学习和收获了一些东西的.过去的事情不能改变,所以也不必过于纠结和懊悔.假期的前期还计划对英语进行系统性的学习,我个人任务是画错时间,用错力了,看专业英语的时间完全可以用开翻译与内核编程有关的开发文档,这样更有意义一些,在发现问题后也没办法放下,这是很不好的一个缺

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

http://www.cnblogs.com/yuuyuu/p/5119891.html ZC: 疑问,最后的 模块kernel_mod 调用 模块kernel_fun的函数fun,是成功的OK的.但是 模块kernel_mod 怎么就知道 它调用的就是 模块kernel_fun的fun函数?如果 又有一个 模块kernel_fun01它也导出了fun函数,此时 模块kernel_mod调用fun的话调用的是哪一个模块的fun函数? (ZC: 测试了一下,两个模块 有相同的导出函数的话,在 加载

linux内核编程

这些天在学习linux内核编程,就在这里小小的show以下. 首先编写如下的linux代码.并命名为hello.c 这里你应该注意亮点: 第一.linux内核编程,不同于普通的用户态下的编程:有一个入口的main函数:这里的"main"函数是module_init();同时还有一个善后处理的函数:module_exit(). 第二.linux内核编程在编译的时候,不同于用户态下的编程:可以直接使用gcc编译器编译链接,就能够成为可执行的:而是需要编写一个Makefile文件,不是mak

内存管理单元编程实例【转】

转自:http://blog.chinaunix.net/uid-29091195-id-4020919.html 一.MMU初步了解    概念:内存管理单元(memory management unit),简称MMU    主要作用:负责虚拟地址到物理地址之间的转换             提供硬件机制的内存访问权限检查        发展由来:由于程序的大小逐步发展到大于内存的大小这一问题的出现    导致了虚拟存储器的产生,虚拟存储器的基本思想是:数据.堆栈的总    大小可以超越物理存

Linux内核编程-0:来自内核的 HelloWorld

Linux内核编程一直是我很想掌握的一个技能.如果问我为什么,我也说不上来. 也许是希望有一天自己的ID也出现在内核开发组的邮件列表里?或是内核发行文件的CREDITS文件上? 也许是吧.其实更多的,可能是对于底层的崇拜,以及对于内核的求索精神. 想到操作系统的繁杂,想到软件系统之间的衔接,内心觉得精妙的同时,更是深深的迷恋. 所以从这篇文章开始,我要真正的走进Linux内核里了,让代码指引我,去奇妙的世界一探究竟. 在这篇文章中,一起来对内核说Hello World. 本次的编程环境: Cen