第四十天:编译可加载模块

  linux刚刚开始的时候仅仅支持intel 386 ,后来不断的被移植到越来越多的平台上,包括ARM ,POWERPC,所有的代码设备驱动代码都编译到内核中,这明显不现实,这时候就需要通过内核模块的形式来加载驱动。当然模块不一定是驱动,也可以是为驱动提供某种功能。

  现在先编写一个简单的linux模块。

 1 #include <linux/init.h>
 2 #include <linux/module.h>
 3
 4 MODULE_LICENSE("GPL");
 5 MODULE_AUTHOR("BUNFLY");
 6
 7 int test_init()
 8 {
 9         printk("this is kernel init\n");
10
11         return 0;
12 }
13
14 void test_exit()
15 {
16         printk("bye bye\n");
17
18 }
19
20 module_init(test_init);
21 module_exit(test_exit);

       模块是动态加载到内核中的,属于内核的一部分,所以是没有main函数的,第20行模块初始化函数是一个回调函数,当加载模块命令insmod执行时会调用test_init函数。21行模块卸载函数同理。

  每个模块函数都要包括init.h module.h两个头文件。

  编写模块函数时,声明模块的授权协议,如果没有的话,编译器有警告的,如果在模块函数中调用的设备驱动模型的代码,就必须要指定为GPL协议,否则是不能加载到内核中。

    在test_init()中使用的是printk,而不是printf,两者区别是printk是内核使用的,它不支持浮点运算。printk可以指定输出的优先级。

  编写的模块要使用内核源码中的Makefile来编译。下面的Makefile就是指定内核源码Makefile路径,以及模块生成路径。

1 all:
2         make -C /home/bunfly/bunfly/source_code/linux-3.5 M=`pwd`
3
4 clean:
5         make -C /home/bunfly/bunfly/source_code/linux-3.5 M=`pwd`  clean
6
7 obj-m += test.o

 编译有三种情况:

    obj-不编入内核

    obj -y编入内核

    obj-m编译成模块

源码中为obj-(宏) ,其实,编译内核中的make menuconfig 或 make config 就是配置宏的值的。

这个程序中明显是使用obj-m编译成模块,后面的test.o 表示编译器会自动去寻找test.c或test.S文件。

  将test.c 和Makefile放在同一目录下,执行make,就会生成test.ko文件。

  将test.ko 移到4412开发板上,执行insmod test.ko 加载模块,

执行rmmod test卸载模块

  

 这就表示第一个模块程序编写成功。

  

时间: 2024-12-31 00:33:46

第四十天:编译可加载模块的相关文章

linux内核裁剪及编译可加载模块

一:linux内核裁剪: (1):编译内核源码: 在邦飞的课程学习已经接近尾声:这周的重点内容是内核驱动的编写,在编写驱动之前首先的了解linux内核源码,linux主要是由五个子系统组成:进程调度,内存管理,文件系统,网络接口以及进程间通信:下面是解压的linux内核源码文件: 下面对linux内核里面的文件进行简单的说明: arch目录中包含于体系结构有关的子目录和文件,arm的相关平台信息在arch/arm目录下. scripts目录中存放着对核心配置的脚本文件. crypto目录中包含着

简单的Linux 驱动模块编译,加载过程

简单的Linux 驱动模块编译,加载过程 2010-03-14 14:48:24|  分类: Driver |  标签: |字号大中小 订阅 本文记录我的第一个Linux设备驱动程序的编译过程.遇到问题的解决方法. 环境:2.4.18-14的内核,Linux内核源码:2.4.18.       Linux内核源码路径:/usr/src/linux(这个源码是从kernel.org网站download的2.4.18版本)        按照<linux设备驱动开发详解>一书中的步骤实现经典例子&

nginx php动态编译加载模块.

#Nginx动态编译加载模块步骤 #查看目前Nginx版本及编译模块 #[[email protected] ~]# /opt/app/lnmp/nginx-1.12.0/sbin/nginx -V #nginx version: nginx/1.12.0 #built by gcc 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC) #built with OpenSSL 1.0.2k  26 Jan 2017 #TLS SNI support enabled #c

Java--自定义Class并且在内存中编译,加载,实例化

本文的目的: 使用者在程序运行期间,可以动态的写Java Class,不需要生成任何.Class文件就可以完全在内存中编译,加载,实例化. 1.需要用到的组件介绍 1)JavaCompiler:用于编译Java Code. 2)CharSequenceJavaFileObject:用于保存Java Code,提供方法给JavaCompiler获取String形式的Java Code. 3)ClassFileManager:用于JavaCompiler将编译好后的Class文件保存在指定对象中.

commonJs的运行时加载和es6的编译时加载

参考 : https://www.cnblogs.com/jerrypig/p/8145206.html 1.commonJs的运行时加载 2.ES6编译时加载 原文地址:https://www.cnblogs.com/wfblog/p/9589934.html

jvm内存模型,java类从编译到加载到执行的过程,jvm内存分配过程

一.jvm内存模型 JVM 内存模型主要分为堆.程序计数器.方法区.虚拟机栈和本地方法栈 1.堆 1.1.堆是 JVM 内存中最大的一块内存空间. 1.2.该内存被所有线程共享,几乎所有对象和数组都被分配到了堆内存中. 1.3.堆被划分为新生代和老年代,新生代又被进一步划分为 Eden 和 Survivor 区,最后 Survivor 由 From Survivor 和 To Survivor 组成. 2.程序计数器(Program Counter Register) 程序计数器是一块很小的内存

Unity加载模块深度解析(Shader)

作者:张鑫链接:https://zhuanlan.zhihu.com/p/21949663来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 接上一篇 加载模块深度解析(二),我们重点讨论了网格资源的加载性能.今天,我们再来为你揭开Shader资源的加载效率. 这是侑虎科技第59篇原创文章,欢迎转发分享,未经作者授权请勿转载.同时如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨.(QQ群465082844) 资源加载性能测试代码 与上篇所提出的测试代码一样,我们

AngularJs 动态加载模块和依赖注入

最近项目比较忙额,白天要上班,晚上回来还需要做Angular知识点的ppt给同事,毕竟年底要辞职了,项目的后续开发还是需要有人接手的,所以就占用了晚上学习的时间.本来一直不打算写这些第三方的学习笔记,不过觉得按需加载模块并且成功使用这个确实是个好处,还是记录下来吧.基于本兽没怎么深入的使用requireJs,所以本兽不知道这个和requireJs有什么区别,也不能清晰的说明这到底算不算Angular的按需加载. 为了实现这篇学习笔记知识点的效果,我们需要用到: angular:https://g

Unity加载模块深度解析(网格篇)

在上一篇 加载模块深度解析(一)中,我们重点讨论了纹理资源的加载性能.这次,我们再来为你揭开其他主流资源的加载效率. 这是侑虎科技第53篇原创文章,欢迎转发分享,未经作者授权请勿转载.同时如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨.(QQ群465082844) 资源加载性能测试代码 与上篇所提出的测试代码一样,我们对于其他资源的加载性能分析同样使用该测试代码.我们将每种资源均制作成一定大小的AssetBundle文件,并逐一通过以下代码在不同设备上进行加载,以期得到不同硬件设备上的资