热门标签 | 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模块删除掉。(这也是驱动模块和应用程序的一大不同之处,应用程序退出时可以不管资源释放或者其他的清除工作,但是内核模块的退出函数必须通过撤销函数将其清除,否则,子系统重新引导之前某些东西就会残留在系统中。如果你的模块没有定于一个清理函数,内核是不会允许它被卸载的。)

 


推荐阅读
  • 本文详细介绍了如何在Linux系统(以CentOS为例)上彻底卸载Zimbra邮件系统,包括停止服务、删除文件和用户等步骤。 ... [详细]
  • 在 CentOS 6.4 上安装 QT5 并启动 Qt Creator 时,可能会遇到缺少 GLIBCXX_3.4.15 的问题。这是由于系统中的 libstdc++.so.6 版本过低。本文将详细介绍如何通过更新 GCC 版本来解决这一问题。 ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 为了在Hadoop 2.7.2中实现对Snappy压缩和解压功能的原生支持,本文详细介绍了如何重新编译Hadoop源代码,并优化其Native编译过程。通过这一优化,可以显著提升数据处理的效率和性能。此外,还探讨了编译过程中可能遇到的问题及其解决方案,为用户提供了一套完整的操作指南。 ... [详细]
  • 在项目开发过程中,掌握一些关键的Linux命令至关重要。例如,使用 `Ctrl+C` 可以立即终止当前正在执行的命令;通过 `ps -ef | grep ias` 可以查看特定服务的进程信息,包括进程ID(PID)和JVM参数(如内存分配和远程连接端口);而 `netstat -apn | more` 则用于显示网络连接状态,帮助开发者监控和调试网络服务。这些命令不仅提高了开发效率,还能有效解决运行时的各种问题。 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 本文探讨了如何通过编程手段在Linux系统中禁用硬件预取功能。基于Intel® Core™微架构的应用性能优化需求,文章详细介绍了相关配置方法和代码实现,旨在帮助开发人员有效控制硬件预取行为,提升应用程序的运行效率。 ... [详细]
  • 在Linux系统中,通过命令行查询计算机硬件配置是一项重要的技能。本文介绍了多种实用的命令和技巧,帮助用户高效地获取硬件信息。例如,可以通过 `cat /proc/cpuinfo | grep "physical id"` 命令来查看物理CPU的数量。此外,文章还涵盖了其他关键硬件组件的查询方法,如内存、磁盘和网络设备等。这些命令不仅适用于系统管理员,也适合普通用户了解自己的系统配置。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • 开发日志:201521044091 《Java编程基础》第11周学习心得与总结
    开发日志:201521044091 《Java编程基础》第11周学习心得与总结 ... [详细]
  • 在CentOS 7上部署WebRTC网关Janus
    在CentOS 7上部署WebRTC网关Janus ... [详细]
  • 如何使用R语言高效连接并操作MySQL数据库
    如何使用R语言高效连接并操作MySQL数据库 ... [详细]
  • 在Linux环境下进行C++代码调试是开发过程中不可或缺的一环。本文将详细介绍如何利用GDB等调试工具,结合实际案例,帮助初学者掌握高效的调试技巧,提升编程能力。内容涵盖环境配置、断点设置、变量查看及内存分析等方面,旨在为读者提供全面的调试指南。 ... [详细]
  • 本文探讨了在不解压的情况下,如何高效地从包含文本文件的.gz压缩文件中查找特定字符串的方法。通过利用特定的工具和技术,可以在保持文件压缩状态的同时,快速定位和检索所需信息,提高处理大规模数据集时的效率和性能。 ... [详细]
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社区 版权所有