linux内核编程demo
来源:互联网 发布:spring切面编程 编辑:程序博客网 时间:2024/06/03 17:41
第二、linux内核编程在编译的时候,不同于用户态下的编程;可以直接使用gcc编译器编译链接,就能够成为可执行的;而是需要编写一个Makefile文件,不是makefile!!这里牵扯到很多的内核态下的东西,具体的我也没弄清楚!详细的会在后面和大家分享。
hello.c 文件
#include <linux/module.h>#include <linux/kernel.h>#include <linux/init.h>static int __init lkp_init(void);static int __exit lkp_exit(void);static int __init lkp_init(void){printk("<1>Hello ,Word!\n");return 0;}static int __exit lkp_exit(void){printk("<2>Hello,Word exit\n");return 0;}module_init(lkp_init);module_exit(lkp_exit);
TARGET=helloKDIR=/usr/src/linux-headers-4.2.0-27-genericPWD=$(shell pwd)obj-m:=$(TARGET).oall:make -C $(KDIR) M=$(PWD) modulesclean:rm -rf *.o *.mod.c *.ko *.symvers *order *.markers *-
其中TARGET指明了目标文件的名字,KDIR指明了引用头文件的位置,请根据具体情况修改该文件。不过有几点要说明,模块的编译需要有一个内核源码的目录结构,如果有内核源码当然更好,直接把KDIR改为源码的路径就OK了。当然只有一个内核目录结构也就可以了,毕竟需要的只是头文件,及一些编译脚本,在Linux各发行版的/usr/src/下是有这样一个目录结构的,比如我的系统为Ubuntu9.10,内核为2.6.31-19的通用版,在/usr/src/下就有linux-headers-2.6.31-19-generic这样一个目录。所以我使用KDIR=/usr/src/linux-headers-2.6.31-19-generic。其实还有一个目录名为linux-headers-2.6.31-19,而且你会发现linux-headers-2.6.31-19-generic里的大部分文件只是指向linux-headers-2.6.31-19的一些链接,不过linux-headers-2.6.31-19里面默认缺少一些编译模块所需要的文件,不要使用它。
接下来,你只要使用make命令,就可以进行编译了,make会为你处理好一切,它会根据KDIR找到编译所需要的文件。如果你运气好的话,你的当前目录下就会成生hello.o hello.mod.o hello.mod.c modules.order Module.markers Module.symvers hello.ko,当然可爱的hello.ko就是我们想要的。到此你的模块已经成功生成了,接下来便可以加载这个模块看看效果了。
使用insmod ./hello.ko来加载模块,如果你遇到insmod: error inserting 'hello.o' :-l invalid module format这样的错误,不用惊慌,并不是你的模块有问题,而是你当前运行的内核版本与你编译链接的头文件版本不一致,所以会出现格式不对的问题。此时,你可以更换系统内核,也可以下载一个与系统版本一致的内核源码重新编译该模块。如果你没有遇到任何问题,也没有打印出任何信息,那么恭喜你,你的内核加载成功了,你可以使用lsmod命令来罗列出当前你系统加载的所有模块,相信你在列表中会找到hello的。你可能会疑惑,为什么没有如我们想像中的那样,打印出"Hello, World"?呵呵,这是因为printk并不会把打印内容打印到你当面的终端,要知道模块是运行在内核态的,而你所能面对的是用户态,内核态的打印信息需要通过log或者dmesg命令来查看,想看到打印結果,最简单的方法是敲入dmesg命令,你就可以看到你所希望看到的信息了,同时,你也可以打开/var/log/message这个文件进行查看。
最后,使用rmmod hello来卸载模块,同样,使用dmesg可以看到打印出的"Goodbye, cruel world"。
make
生成内核模块文件hello.ko
测试执行:
sudo insmod hello.ko
查看日志:
sudo dmesg -c
卸载内核模块
sudo rmmod hello.ko
sudo dmesg -c
参考:http://blog.chinaunix.net/uid-26281173-id-2856305.html
源码下载:
- linux内核编程demo
- linux 内核线程demo
- linux内核demo
- Linux内核编程 -- 从HelloWord到基于NetFilter的Linux驱动Demo
- Linux多线程编程 Demo
- linux内核及内核编程
- linux shell编程入门demo
- linux系统编程-一个demo
- Linux 内核编程风格
- Linux内核编程导读
- GPIO Linux内核编程
- Linux内核编程
- LINUX内核编程风格
- Linux内核模块编程
- Linux内核模块编程
- Linux内核编程tips
- Linux 内核编程学习
- Linux内核模块编程
- Android内存泄露浅析
- teamviewer ,ps下载链接
- iOS面试题1
- C++引入外部txt文件内容的方法
- Linux makefile 教程 非常详细,且易懂 .
- linux内核编程demo
- 前端面试题--2016.10.09
- 在Centos 6.6环境使用系统自带的internal-sftp搭建SFTP服务器。
- Rails — devise 发送修改密码邮件
- 第五周项目4-数制转换
- Android中webView加载H5绑定cookie
- Android状态栏禁止下拉异常分析
- 第七周项目4队列数组
- 第5周项目4 数制转换