Linux内核模块编程之Helloworld(初级)
2017-05-22 19:37
288 查看
注意printk那里,KERN_ALERT和打印消息之间是没有逗号的,搞得劳资查了半天才发现一直没有提示信息的原因
下面我们来写Makefile(命名为makefile我的会提示错误),-C 去内核源码目录下读取Makefile,m=返回当前路径执行当前目录下的Makefile
。我觉得Makefile这个文件挺6的,该文件会根据xx.o查找相应的xx.c文件
那么如何运行呢,首先make
现在进行加载模块,首先在当前终端
c4ad
我在另一个终端的执行过程就是进入该目录,然后执行insmod ./hello.ko 然后第一个终端就会显示Hello,world。在执行rmmod hello 就会显示Goodbye, cruel world
但是!根据系统版本的不同还是什么其他原因,有时候信息在/var/log/messages 里看到,使用dmesg可以看到
或者是在加载或者移除模块这里看到
也可以像下面这么写,注意,uname -r那里是使用的反引号就是tab键上面的那个键,$(PWD)当前工作目录,clean清除,打印信息是显示在另一个终端的,例如我就是在物理机上使用ssh链接虚拟机centos7,然后执行下面的命令,而在虚拟机的终端上则会显示打印的那几条信息
#include <linux/init.h> #include <linux/module.h> MODULE_LICENSE("Dual BSD/GPL");//MODULE_LICENSE()指明认证方式,现在支持的有:“GPL” “GPL v2" "GPL and additional rights" "Dual BSD/GPL" "Dual MIT/GPL" "Dual MPL/GPL" "Proprietary",这是内核2.6里新添加的,实验发现它不是必需的。 static int hello_init(void) { printk(KERN_ALERT "Hello, World\n");//printk是内核级别的打印函数,KERN_ALERT是指该条信息是警告信息 return 0; } static int hello_exit(void) { printk(KERN_ALERT "Goodbye, cruel world\n"); } module_init(hello_init);//模块入口 module_exit(hello_exit);//模块出口
下面我们来写Makefile(命名为makefile我的会提示错误),-C 去内核源码目录下读取Makefile,m=返回当前路径执行当前目录下的Makefile
。我觉得Makefile这个文件挺6的,该文件会根据xx.o查找相应的xx.c文件
TARGET=hello KDIR=/usr/src/kernels/3.10.0-514.el7.x86_64 //找到内核文件所在路径,系统不同路径也不同,可以使用find / -name kernel查找 PWD=$(shell pwd) //这个是指执行shell命令pwd,即用PWD记录当前路径 obj-m=$(TARGET).o default: make -C $(KDIR) M=$(PWD) modules
那么如何运行呢,首先make
[04:21:42] make make -C /usr/src/kernels/3.10.0-514.el7.x86_64 M=/root/kernel modules make[1]: Entering directory `/usr/src/kernels/3.10.0-514.el7.x86_64' CC [M] /root/kernel/hello.o /root/kernel/hello.c: In function ‘hello_exit’: /root/kernel/hello.c:14:1: warning: no return statement in function returning non-void [-Wreturn-type] } ^ In file included from /root/kernel/hello.c:1:0: /root/kernel/hello.c: In function ‘__exittest’: include/linux/init.h:305:4: warning: return from incompatible pointer type [enabled by default] { return exitfn; } \ ^ /root/kernel/hello.c:17:1: note: in expansion of macro ‘module_exit’ module_exit(hello_exit); ^ Building modules, stage 2. MODPOST 1 modules CC /root/kernel/hello.mod.o LD [M] /root/kernel/hello.ko make[1]: Leaving directory `/usr/src/kernels/3.10.0-514.el7.x86_64' [04:21:45] ls hello.c hello.ko hello.mod.c hello.mod.o hello.o Makefile modules.order Module.symvers
现在进行加载模块,首先在当前终端
c4ad
[04:21:47] tail -f /var/log/messages May 22 04:01:01 bogon systemd: Started Session 727 of user root. May 22 04:01:01 bogon systemd: Starting Session 727 of user root. May 22 04:10:01 bogon systemd: Started Session 728 of user root. May 22 04:10:01 bogon systemd: Starting Session 728 of user root. May 22 04:18:35 bogon kernel: Hello, World//在另一个终端执行insmod ./hello.ko才会出现这个 May 22 04:18:49 bogon kernel: Goodbye, cruel world//在另一个终端执行rmmod hello才会出现这个 May 22 04:20:01 bogon systemd: Started Session 729 of user root. May 22 04:20:01 bogon systemd: Starting Session 729 of user root. May 22 04:20:01 bogon kernel: Hello, World May 22 04:20:11 bogon kernel: Goodbye, cruel world May 22 04:22:06 bogon kernel: Hello, World
我在另一个终端的执行过程就是进入该目录,然后执行insmod ./hello.ko 然后第一个终端就会显示Hello,world。在执行rmmod hello 就会显示Goodbye, cruel world
但是!根据系统版本的不同还是什么其他原因,有时候信息在/var/log/messages 里看到,使用dmesg可以看到
[root@bogon kernel]# dmesg|tail -5 [ 123.690748] test: module verification failed: signature and/or required key missing - tainting kernel [ 876.865300] Hello, World [ 908.638904] Goodbye, cruel world [ 1235.101965] e1000: ens33 NIC Link is Down [ 1241.118672] e1000: ens33 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None [root@bogon kernel]#
或者是在加载或者移除模块这里看到
也可以像下面这么写,注意,uname -r那里是使用的反引号就是tab键上面的那个键,$(PWD)当前工作目录,clean清除,打印信息是显示在另一个终端的,例如我就是在物理机上使用ssh链接虚拟机centos7,然后执行下面的命令,而在虚拟机的终端上则会显示打印的那几条信息
[root@bogon modules]# cat first.c #include<linux/kernel.h> #include<linux/module.h> int init_module(void){ printk(KERN_ALERT "hi,this is bp\n"); return 0; } void cleanup_module(void){ printk(KERN_ALERT "goobye bp\n"); } [root@bogon modules]# cat Makefile obj-m=first.o default: make -C /usr/src/kernels/`uname -r` M=$(PWD) modules clean: make -C /usr/src/kernels/`uname -r` M=$(PWD) clean [root@bogon modules]# make make -C /usr/src/kernels/`uname -r` M=/root/modules modules make[1]: Entering directory `/usr/src/kernels/3.10.0-514.el7.x86_64' Building modules, stage 2. MODPOST 1 modules make[1]: Leaving directory `/usr/src/kernels/3.10.0-514.el7.x86_64' [root@bogon modules]# modinfo first.ko//查看模块信息 filename: /root/modules/first.ko rhelversion: 7.3 srcversion: 2523BB278E7311D9141E7F4 depends: vermagic: 3.10.0-514.el7.x86_64 SMP mod_unload modversions [root@bogon modules]# insmod first.ko [root@bogon modules]# rmmod first [root@bogon modules]# ls a.c a.mod.o first.ko first.o hello.mod.c Makefile a.ko a.o first.mod.c hello.c hello.mod.o modules.order a.mod.c first.c first.mod.o hello.ko hello.o Module.symvers [root@bogon modules]# make clean make -C /usr/src/kernels/`uname -r` M=/root/modules clean make[1]: Entering directory `/usr/src/kernels/3.10.0-514.el7.x86_64' CLEAN /root/modules/.tmp_versions CLEAN /root/modules/Module.symvers make[1]: Leaving directory `/usr/src/kernels/3.10.0-514.el7.x86_64' [root@bogon modules]# ls a.c first.c hello.c Makefile [root@bogon modules]#
相关文章推荐
- Linux内核模块编程之Helloworld!
- Linux内核模块编程之helloworld
- Linux内核模块编程-HelloWorld
- Google V8编程详解(二)HelloWorld
- 从零开始iOS8编程【HelloWorld】
- Android jni/ndk编程一:jni初级认识与实战体验
- OpenCV2计算机视觉应用编程手册(自学版)初级四
- 第一次尝试用python来编程实现“helloworld”,顺利成功,过程中遇到几个小问题
- ADO数据库编程详解(C++)----初级入门篇
- OpenCL学习笔记(三):OpenCL安装,编程简介与helloworld
- linux内核模块编程2
- AI 系统首次实现真正自主编程,完爆初级程序员
- ATL编程初级教程(图文事例)(VS2005)
- Ubuntu下内核编程之第一个模块helloworld
- 书生教你cocos2d-x-用helloworld讲解cocos2d-x的编程思路与要点 推荐
- Javascript & DHTML 实例编程(教程)(四)初级实例篇2―动画
- Linux内核模块编程入门
- Linux内核模块编程
- IOS 初级开发入门教程(二)第一个HelloWorld工程及StoryBoard使用
- linux下jni编程指南之——HelloWorld