热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

最简单的helloworld模块编译加载(linux3.5内核源码树建立)

之前在VM8上安装了ubuntu12.10,通过uname-r命令可以知道该linux内核版本是3.5.0-17-generic,网上下了一个LDD3的PDF,自己也想建立和运行一

之前在VM8上安装了ubuntu12.10,通过uname -r命令可以知道该linux内核版本是3.5.0-17-generic,网上下了一个LDD3的PDF,自己也想建立和运行一个简单的模块(helloworld)。

首先建立相应版本的内核树。找到内核源码的位置

最简单的helloworld模块编译加载(linux3.5内核源码树建立)其中淡蓝色的压缩包是自己下载的。

通过执行 :apt-cache search linux-source 可以看到可以下载的源码包型号,选择适当的版本就可以下载了(80M左右的源码)。

执行:spt-get install linux-source-3.5.0开始下载。下载完成后会得到一个linux-source-3.5.0的目录。进入目录下,可以开始编译内核了。

执行make oldconfig 或者make menuconfig保存后。

执行:make 或直接 make bzImage。

成功后,在该目录下会生成一个绿色的vmlinux文件。然后开始执行编译模块和安装模块。

执行:make modules 

执行:make modules_install

完成后找到build:如下图

最简单的helloworld模块编译加载(linux3.5内核源码树建立)

 其中build,是我们随后编译模块文件时要使用到的,记住它的路径。到这里,内核编译完成了,sudo reboot重启下吧。

其次,自己写个简单的驱动吧。

最简单的helloworld模块编译加载(linux3.5内核源码树建立)

在写个简单的Makefile文件:

最简单的helloworld模块编译加载(linux3.5内核源码树建立)

分析:obj-m:=hello.o表示要构建的模块名为hello.ko。make会在内核中自动找到hello.c进行编译

KERNRLDIR指定了内核源代码的位置,其中保存有内核的顶层makfile文件。

也可以写成 $(MAKE) -C $(KERNRLDIR) M=$(PWD) modules  

M=$(PWD)指定了模块源代码的位置,modules目标指向obj-m变量中设定的模块。

执行:make

产生:

最简单的helloworld模块编译加载(linux3.5内核源码树建立)

 执行:insmod  ./hello.ko (将模块加载到内核中,即把该程序加载模块代码段和数据段到内核中)

终端上没有显示:(因为该消息进入了其中一个系统日志文件中,/var/log/xxx  实际的文件名字随linux发布而变化)

执行:lsmod | grep hello 可以查找到。

执行:cat /var/log/syslog 可以查看到输出的语句。

嘿嘿,hello简单的模块至此完成。使用完记得rmmod hello 把hello模块删除掉。(这也是驱动模块和应用程序的一大不同之处,应用程序退出时可以不管资源释放或者其他的清除工作,但是内核模块的退出函数必须通过撤销函数将其清除,否则,子系统重新引导之前某些东西就会残留在系统中。如果你的模块没有定于一个清理函数,内核是不会允许它被卸载的。)

 


推荐阅读
  • 201720181 20155315 《信息安全系统设计基础》实验四 外设驱动程序设计
    实验内容学习资源中全课中的“hqyj.嵌入式Linux应用程序开发标准教程.pdf”中的第十一章在Ubuntu完成资源中全课中的“hqyj.嵌入式Linux应用程序开发标准教程.p ... [详细]
  • 32位ubuntu编译android studio,32位Ubuntu编译Android 4.0.4问题
    问题一:在32位Ubuntu12.04上编译Android4.0.4源码时,出现了关于emulator的错误,关键是其Makefile里的 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • 本文介绍了Android中的assets目录和raw目录的共同点和区别,包括获取资源的方法、目录结构的限制以及列出资源的能力。同时,还解释了raw目录中资源文件生成的ID,并说明了这些目录的使用方法。 ... [详细]
  • 人工智能推理能力与假设检验
    最近Google的Deepmind开始研究如何让AI做数学题。这个问题的提出非常有启发,逻辑推理,发现新知识的能力应该是强人工智能出现自我意识之前最需要发展的能力。深度学习目前可以 ... [详细]
  • Linux 程序设计学习笔记----动手编写makefile文件
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 源码安装Nginx 解决报错
    CentOS8源码安装Nginx编译安装注意事项如果安装时不是使用的默认路径,则必须要修改PATH环境变量,以能够识别此程序的二进制文件路径 ... [详细]
  • 1.      准备工作: 程序:MinGW-3.1.0-1.exe     windows下的gcc,编译c语言的工具下载地址: http:umn.dl.sourceforge. ... [详细]
  • 编写一个简单的内核驱动模块时报错 “/lib/modules/3.13.032generic/bulid: 没有那个文件或目录。 停止。”...
    编写一个简单的内核驱动模块1staticinthello_init()2{3printk(“hello,Iaminkernelnow\n”);4return0;5}6voidadd ... [详细]
  • 操作系统RetHat9.0,存储设备华为3comEX1000在linux上建立能够识别盘阵的方法有三种1、HBA卡;2、TOE卡;3、is ... [详细]
author-avatar
邹飞邹飞邹飞
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有