内核模块下载和编译、安装
来源:互联网 发布:软件外包开发 编辑:程序博客网 时间:2024/05/22 02:05
开源力量学习笔记
下载内核
可以从网站git.kernel.org中找到自己感兴趣的分支
Linus的分支
下载完成后,可以用make localmodconfig来按照现有的kernel编译源代码
开始编译
编译完后安装
然后修改grub2,默认fedora19第一个就是安装的内核。ubuntu可以用sudo update-grub
重启一下就可以进编译好的内核了。可以写个内核模块测试一下
linux中底层有一个Kbuild,然后在各层中有kconfig.然后又对应一个Makefile
下面是一个简单的Makefile:
make -C 后面是内核的目录,用``+shell可以获取内容。M应该是内核的源地址。
要使用内核的函数,必须只使用内核的导出函数。不能使用用户空间的任何Lib
-EXPORT_SYMBOL和EXPORT_SYMBOL_GPL
-或者在.h中实现的函数
编译有多个源文件的module
此时main.c文件中还是空的,加点东西试试吧
make后可以用insmod家在编译好的内核模块main.ko,卸载就是rmmod
然后通过dmesg看情况。
更进一步的话,可以再创建一个other.c然后在main.c中引用,当然我们还需要再改Makefile -y表示把mian.o和other.o生成test.o
编译多个源文件位于不同目录的module
如果other.o在src的文件目录下呢,那么test-y = main.o src/other.o
指定include.h位置
如果是other.h在include文件夹下,那么同样加上目录
当然如果我们需要使用外部的库文件,文件路径没有那么固定。这时候就可以在Makefile中添加
同时main.c中的#include "include/other.h"可以改成
模块参数
我们可以用modinfo来看模块信息,如:
可以自己编写一个
编译后就看到了
然后我们就可以给模块参数赋值了
编写和编译一个module之间有依赖的情况
首先把上面的模块变成m1,复制一个m2,删除其中的src,在m2中编译会有警告说函数未定义
这时就可以把m1编译出来的Module.symvers复制到m2中,编译就能通过。加载时需要先加载m1模块,再加载m2模块
下载内核
可以从网站git.kernel.org中找到自己感兴趣的分支
Linus的分支
- git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
开始编译
- make -j6
- make modules_install
- make install
- cd /boot/grub2
- vim grub.cfg
- echo > main.c
- echo > Makefile
下面是一个简单的Makefile:
- obj-m = main.o
- all:
- make -C /lib/modules/`uname -r`/build M=`pwd`
- clean:
- rm -f *.o *.ko *.mod.c modules.order Module.symvers
要使用内核的函数,必须只使用内核的导出函数。不能使用用户空间的任何Lib
-EXPORT_SYMBOL和EXPORT_SYMBOL_GPL
-或者在.h中实现的函数
编译有多个源文件的module
此时main.c文件中还是空的,加点东西试试吧
- #include <linux/module.h>
- MODULE_LICENSE("GPL"); //代码的说明
- MODULE_AUTHOR("Chen");
- MODULE_DESCRIPTION("The module is only used for test.");
- static __init int minit(void) //如果函数只调用一次的函数可以用__init来修饰,调用完后可以free它
- {
- printk("call %s.\n",__FUNCTION__);
- return 0;
- }
- static __exit int mexit(void) //退出的话就可以用__exit修饰
- {
- printk("call %s.\n",__FUNCTION__);
- }
- module_init(minit) //内核宏入口
- module_exit(mexit) //内核宏退出
然后通过dmesg看情况。
更进一步的话,可以再创建一个other.c
- #include <linux/module.h>
- void other_function(void)
- {
- printk("call %s.\n",__FUNCTION__);
- }
- obj-m = test.o
- test-y = main.o other.o
- all:
- make -C /lib/modules/`uname -r`/build M=`pwd`
- clean:
- rm -f *.o *.ko *.mod.c modules.order Module.symvers
编译多个源文件位于不同目录的module
如果other.o在src的文件目录下呢,那么test-y = main.o src/other.o
指定include.h位置
如果是other.h在include文件夹下,那么同样加上目录
- #ifndef __OTHER_H
- #define __OTHER_H
- extern void other_function(void);
- #endif
- all:
- make -C /lib/modules/`uname -r`/build EXTRA_CFLAGS=-I$(shell pwd)/include M=`pwd`
- #include <other.h>
我们可以用modinfo来看模块信息,如:
- [chen@localhost linux]$ modinfo ./fs/fuse/fuse.ko
- filename: /home/chen/mygit/linux/./fs/fuse/fuse.ko 表示模块的绝对路径
- alias: devname:fuse alias:别名
- alias: char-major-10-229
- alias: fs-fuseblk
- alias: fs-fuse
- license: GPL 支持GPL协议
- description: Filesystem in Userspace 模块的描述
- author: Miklos Szeredi <miklos@szeredi.hu> 模块作者
- alias: fs-fusectl
- depends: depends:表示fuse.ko模块所依赖的模块
- intree: Y
- vermagic: 3.18.0-rc5 SMP mod_unload vermagic:表示编译时对应的内核版本、硬件平台及GCC版本
- parm: max_user_bgreq:Global limit for the maximum number of backgrounded requests an unprivileged user can set (uint) parm:相对应的调试参数,括号中表示参数的类型如uint
- parm: max_user_congthresh:Global limit for the maximum congestion threshold an unprivileged user can set (uint)
- static unsigned int testpar = 0;
- module_param(testpar, uint, S_IRUGO | S_IWUSR)
- //然后在main函数中加
- printk("testpar = %d.\n", testpar);
- [chen@localhost test]$ modinfo tmain.ko
- filename: /home/chen/mygit/test/tmain.ko
- description: The module is only used for test.
- author: Chen
- license: GPL
- depends:
- vermagic: 3.18.0-rc5 SMP mod_unload
- parm: testpar:uint
- [chen@localhost test]$ insmod tmain.ko
- [chen@localhost test]$ rmmod tmain.ko
- [chen@localhost test]$ insmod tmain.ko testpar=100
- [chen@localhost test]$ dmesg
- [ 7389.378824] testpar = 0. //之前没赋值
- [ 7389.378830] call minit.
- [ 7389.378831] call other_function.
- [ 7509.541034] call mexit.
- [ 7529.539102] testpar = 100. //赋值之后
- [ 7529.539107] call minit.
- [ 7529.539108] call other_function.
首先把上面的模块变成m1,复制一个m2,删除其中的src,在m2中编译会有警告说函数未定义
这时就可以把m1编译出来的Module.symvers复制到m2中,编译就能通过。加载时需要先加载m1模块,再加载m2模块
0
上一篇:linux实用技巧:你该使用ctags查找源码了
下一篇:3.18内核的sk_buff
相关热门文章
- c++防止隐藏的拷贝构造...
- Linux内核模块LKM编译-自制Mak...
- 关于内核模块的挂载后的最终虚...
- 关于内核模块挂载出现“no sym...
- 存在依赖关系的内核模块的编译...
- linux 常见服务端口
- xmanager 2.0 for linux配置
- 【ROOTFS搭建】busybox的httpd...
- openwrt中luci学习笔记
- 什么是shell
- linux dhcp peizhi roc
- 关于Unix文件的软链接
- 求教这个命令什么意思,我是新...
- sed -e "/grep/d" 是什么意思...
- 谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
评论热议
0 0
- 内核模块下载和编译、安装
- 编译安装linux内核模块
- 编译、裁剪、安装、删除 Ubuntu内核和模块管理
- ubuntu虚拟机下内核模块的编译和安装
- UBuntu下载编译安装内核
- Opencv3.0和contribute模块的下载 编译 安装
- 下载和编译Android内核
- Linux内核编译以及perfctr模块安装
- 安装内核模块的编译环境
- 内核编译 & 模块编译
- 2.6内核编译模块内容和解释
- Linux 内核编译步骤和模块加载
- raspberry内核编译和模块开发
- Ubuntu12.04: 下载,编译Android2.6.29内核goldfish,将新编译的内核和镜像安装至模拟器
- Linux内核编译和安装
- Linux内核编译和安装
- linux驱动程序安装2种方式(模块方式 和 直接编译进内核)
- linux内核模块编译和安装--kni module移植的makefile
- AT&T资料(留着以后能看)
- linux内核 asmlinkage宏
- android编译环境配置总结
- linux应用编程学习(5)管道
- linux实用技巧:你该使用ctags查找源码了
- 内核模块下载和编译、安装
- 3.18内核的sk_buff
- 不可睡眠锁:自旋锁spinlock编码学习
- 8.可变对象(无序表和有序表——含java库中应用)
- LoRa笔记02 LoRa sx1276 sx1278的发射功率研究
- 不可睡眠锁:RCU read-copy-updat
- 可睡眠锁 互斥量、信号量、读写信号量、完成变量
- c++中使用Ctags
- 原子操作
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
pubgmobile国际服下载
pubgmobile国际服
国际残疾人日
北京大兴国际机场招聘
王楠当选国际田联理事
大兴国际机场线票价
大兴国际机场招聘
郑州国际马拉松赛
1960年国际不承认中国登顶珠峰
国际象棋玩法入门图解
刺激战场国际服下载
国际诗酒文化大会
首都国际机场
北京首都国际机场
国际象棋规则
师大二附国际班
长江国际速递
硅藻泥国际品牌
kaplan国际学院
国际安保公司
按摩椅国际品牌
国际能源机构
乾源国际广场
国际金融中心
世包国际中心
国际有限公司
化学品国际货运
北师大国际班
国际成品油价格
国际包裹怎么寄
谢伯恩国际学院
实时国际油价
陆国明
国青
国青0-1越南
国青3-2逆转缅甸
91国青
领克是哪国的品牌
国风美少年
国风塑业
国风