内核模块下载和编译、安装_习惯就好zz的博客-程序员宅基地

技术标签: LINUX环境编程  

开源力量学习笔记
下载内核

可以从网站git.kernel.org中找到自己感兴趣的分支
Linus的分支
  1. git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
下载完成后,可以用make localmodconfig来按照现有的kernel编译源代码

开始编译
  1. make -j6
编译完后安装
  1. make modules_install
  2. make install
然后修改grub2 ,默认fedora19第一个就是安装的内核。ubuntu可以用sudo update-grub
  1. cd /boot/grub2
  2. vim grub.cfg
重启一下就可以进编译好的 内核了。可以写个内核模块测试一下
  1. echo > main.c
  2. echo > Makefile
linux中底层有一个Kbuild,然后在各层中有kconfig.然后又对应一个Makefile
下面是一个简单的Makefile:
  1. obj-m = main.o

  2. all:
  3.         make -C /lib/modules/`uname -r`/build M=`pwd`
  4. clean:
  5.         rm -f *.o *.ko *.mod.c modules.order Module.symvers
make -C 后面是内核的目录,用``+shell可以获取内容。M应该是内核的源地址。

要使用内核的函数,必须只使用内核的导出函数。不能使用用户空间的任何Lib
-EXPORT_SYMBOL和EXPORT_SYMBOL_GPL
-或者在.h中实现的函数
编译有多个源文件的module
此时main.c文件中还是空的,加点东西试试吧
  1. #include <linux/module.h>

  2. MODULE_LICENSE("GPL");    //代码的说明
  3. MODULE_AUTHOR("Chen");
  4. MODULE_DESCRIPTION("The module is only used for test.");

  5. static __init int minit(void)    //如果函数只调用一次的函数可以用__init来修饰,调用完后可以free它
  6. {
  7.     printk("call %s.\n",__FUNCTION__);
  8.     return 0;
  9. }

  10. static __exit int mexit(void)    //退出的话就可以用__exit修饰
  11. {
  12.     printk("call %s.\n",__FUNCTION__);
  13. }

  14. module_init(minit)    //内核宏入口
  15. module_exit(mexit)    //内核宏退出
make后可以用insmod家在编译好的内核模块main.ko,卸载就是rmmod
然后通过dmesg看情况。

更进一步的话,可以再创建一个other.c
  1. #include <linux/module.h>

  2. void other_function(void)
  3. {
  4.     printk("call %s.\n",__FUNCTION__);
  5. }
然后在main.c中引用,当然我们还需要再改Makefile
  1. obj-m = test.o
  2. test-y = main.o other.o

  3. all:
  4.     make -C /lib/modules/`uname -r`/build M=`pwd`
  5. clean:
  6.     rm -f *.o *.ko *.mod.c modules.order Module.symvers
-y表示把mian.o和other.o生成test.o
编译多个源文件位于不同目录的module
如果other.o在src的文件目录下呢,那么test-y = main.o src/other.o
指定include.h位置
如果是other.h在include文件夹下,那么同样加上目录
  1. #ifndef __OTHER_H
  2. #define __OTHER_H

  3. extern void other_function(void);
  4. #endif
当然如果我们需要使用外部的库文件,文件路径没有那么固定。这时候就可以在Makefile中添加
  1. all:
  2.     make -C /lib/modules/`uname -r`/build EXTRA_CFLAGS=-I$(shell pwd)/include M=`pwd`
同时main.c中的#include "include/other.h"可以改成
  1. #include <other.h>
模块参数
我们可以用modinfo来看模块信息,如:
  1. [[email protected] linux]$ modinfo ./fs/fuse/fuse.ko
  2. filename: /home/chen/mygit/linux/./fs/fuse/fuse.ko     表示模块的绝对路径
  3. alias: devname:fuse                                    alias:别名
  4. alias: char-major-10-229
  5. alias: fs-fuseblk
  6. alias: fs-fuse
  7. license: GPL                                           支持GPL协议
  8. description: Filesystem in Userspace                   模块的描述
  9. author: Miklos Szeredi <[email protected].hu>             模块作者
  10. alias: fs-fusectl
  11. depends:                                               depends:表示fuse.ko模块所依赖的模块
  12. intree: Y
  13. vermagic: 3.18.0-rc5 SMP mod_unload                    vermagic:表示编译时对应的内核版本、硬件平台及GCC版本
  14. parm: max_user_bgreq:Global limit for the maximum number of backgrounded requests an unprivileged user can set (uint)    parm:相对应的调试参数,括号中表示参数的类型如uint
  15. parm: max_user_congthresh:Global limit for the maximum congestion threshold an unprivileged user can set (uint)
可以自己编写一个
  1. static unsigned int testpar = 0;
  2. module_param(testpar, uint, S_IRUGO | S_IWUSR)
  3. //然后在main函数中加
  4.     printk("testpar = %d.\n", testpar);
编译后就看到了
  1. [[email protected] test]$ modinfo tmain.ko
  2. filename: /home/chen/mygit/test/tmain.ko
  3. description: The module is only used for test.
  4. author: Chen
  5. license: GPL
  6. depends:
  7. vermagic: 3.18.0-rc5 SMP mod_unload
  8. parm: testpar:uint
然后我们就可以给模块参数 赋值了
  1. [[email protected] test]$ insmod tmain.ko
  2. [[email protected] test]$ rmmod tmain.ko
  3. [[email protected] test]$ insmod tmain.ko testpar=100
  4. [[email protected] test]$ dmesg
  5. [ 7389.378824] testpar = 0.                    //之前没赋值
  6. [ 7389.378830] call minit.
  7. [ 7389.378831] call other_function.
  8. [ 7509.541034] call mexit.
  9. [ 7529.539102] testpar = 100.                   //赋值之后
  10. [ 7529.539107] call minit.
  11. [ 7529.539108] call other_function.
编写和编译一个module之间有依赖的情况
首先把上面的模块变成m1,复制一个m2,删除其中的src ,在m 2中编译会有警告说函数未定义
这时就可以把m1编译出来的Module.symvers复制到m2中,编译就能通过。加载时需要先加载m1模块,再加载m2模块




<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
阅读(632) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ch122633/article/details/54348568

智能推荐

修改发布出来的exe的屏幕大小_Smart_zy的博客-程序员宅基地_修改exe窗口大小

一、目的1、想:修改发布出来的exe的屏幕大小当UE4发布出来exe后,想修改屏幕位置和大小,二、参考1、三、操作1、文件夹设置1、StudyPE+ x64.exe 设置名字不能一样1、运行结果四、注意1、只要exe导入dll一次,就无法再导入了,重新来一遍...

自定义View时,用到Paint Canvas的一些温故,PropertyAnimation中的ValueAnimator(动画四,“大大姐”的旋转跳跃no.2)..._weixin_33860722的博客-程序员宅基地

转载请注明出处王亟亟的大牛之路这些天都在说画view,view的一些动画,不知不觉已经2个礼拜了,这篇是讲的之前漏说的ValueAnimator。先补一下之间没有贴的Property Animation的框架Animator --ValueAnimator --ObjectAnimator --...

方阵的行列式【】_bitTsui的博客-程序员宅基地_方阵的行列式

文章目录数乘方阵的行列式方阵乘积的行列式逆矩阵的行列式数乘方阵的行列式当n阶方阵计算行列式时,记成|A|,读作A的行列式。方阵才有行列式方阵才有n阶的说法∣kA∣=kn∣A∣≠k∣A∣(n⩾2,k≠0,1)|kA|=k^{n}|A| \neq k|A|(n \geqslant 2,k \neq 0,1)∣kA∣=kn∣A∤​=k∣A∣(n⩾2,k̸​=0,1)方阵乘积的行列...

Fritzing 创建自定义元件_ton_tom的博客-程序员宅基地_fritzing元件大全

文章目录由矢量图创建元件由图片创建元件完成的元件注意由矢量图创建元件由图片创建元件源图使用inkscape编辑元件图启用生成失量图将之前导入的image删除启用网格方便pin脚放置设置尺寸绘制完成保存保存新编辑的元件到my parts 库完成的元件注意必须将插件列表中的每个针脚都赋值,否则后面的组件显示全红报错fritzing 组件库https://github.com/adafruit/Fritzing-Library/tree/master/p

java企业网站源码 后台springmvc SSM 前台静态引擎 代码生成器_chenlong9952的博客-程序员宅基地

java 企业网站源码 前后台都有 静态模版引擎, 代码生成器大大提高开发效率 前台: 支持三套模版, 可以在后台切换 点击:获取地址 QQ 313596790 官网 http://www.fhadmi...

详解recyclerview的分割线_上官若枫的博客-程序员宅基地

最近项目倒是不紧,就是前一阵子突然不知道该怎么学了,所以一直没写文章。一度陷入了迷茫期,一方面不能踏实下来,一方面感觉自己不会的东西太多,应该属于入门后的又一个迷茫期吧,不知道从何下手。这几天开始撸一个项目,虽然这个项目虽说是一个大三在校生写的。但是我仔细研究,确实写的不错,而且又是郭神推荐的。里面的好多东西都是之前没听说过的,毕竟知之甚少,那就踏踏实实的开始燥起来吧。相信recyclervi

随便推点

DAY11 背包入门_人活着就是为了牧之原翔子的博客-程序员宅基地

DAY11 背包入门一、背包问题是什么?二、类别1.01背包例题代码2.完全背包例题代码3.多重背包例题代码一、背包问题是什么?背包问题是将多个不同质量,不同体积的物体放入一个容积一定背包中,求这个背包最多可以装多重的东西二、类别1.01背包一个物体只有一个,每个物体只有0(不放入)和1(放入)两种状态例题QuestionMany years ago , in Teddy’s hometown there was a man who was called “Bone Collector

SAP HANA 存储过程中的IF While使用案例_aebe49167的博客-程序员宅基地

-- run 1_datatype_data.sql before running this script ALTER SESSION SET CURRENT_SCHEMA = SqlScriptDocumentation; drop procedure while_proc; CREATE PROCEDURE while_proc LANGUAGE SQLSCRIPT AS ...

【Luogu P3953】NOIP2017 day1T3 逛公园_NeosKnight的博客-程序员宅基地

题目链接题目描述策策同学特别喜欢逛公园。公园可以看成一张 N 个点 M 条边构成的有向图,且没有 自环和重边。其中1号点是公园的入口, N 号点是公园的出口,每条边有一个非负权值, 代表策策经过这条边所要花的时间。策策每天都会去逛公园,他总是从1号点进去,从 N 号点出来。策策喜欢新鲜的事物,它不希望有两天逛公园的路线完全一样,同时策策还是一个 特别热爱学习的好孩子,它不希望每...

SpringBoot学习:整合Hbase_大小鱼鱼鱼与鱼.的博客-程序员宅基地

所需pom依赖&lt;!--hbase依赖--&gt;&lt;hbase-client.version&gt;2.0.0&lt;/hbase-client.version&gt;&lt;lombak.version&gt;1.16.10&lt;/lombak.version&gt;&lt;dependency&gt; &lt;groupId&gt;org.apache.hbas...

c语言标准实现 pdf,C语言标准函式库.pdf_吴遇安的博客-程序员宅基地

C语言标准函式库CC語言標準函式庫u C-1 標準輸出輸入函數u C -2 字元檢查函數u C -3 字串函數 u C -4 數學函數 u C -5 日期/時間函數 u C -6 工具函數 2 C/C++程式設計範例教本C- 1 標準輸出輸入函數 FILE* fopen(const char* filename, const char* mode) :使用 mode 模式開啟參數 fil...

推荐文章

热门文章

相关标签