Ubuntu下内核编程之第一个模块helloworld[通俗易懂]

Ubuntu下内核编程之第一个模块helloworld[通俗易懂]模块是驱动开发的必经之路,这也是我们在前边要构建内核源码树的目的所在。因为模块属于kernel编程了,和用户空间的c语言变成不同。他要依附于内核源码树的存在而存在,下面就开始我们的第一个模块的编写吧。     Ubuntu下内核编程之第一个模块——我的叫jun_module。随你怎么起名。以下是建立的全过程:     1、首先肯定是编写模块的源代码,和Makefile。我们建立一个专用

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

      模块是驱动开发的必经之路,这也是我们在前边要构建内核源码树的目的所在。因为模块属于kernel编程了,和用户空间的c语言变成不同。他要依附于内核源码树的存在而存在,下面就开始我们的第一个模块的编写吧。

      Ubuntu下内核编程之第一个模块——我的叫jun_module。随你怎么起名。以下是建立的全过程:

      1、首先肯定是编写模块的源代码,和Makefile。我们建立一个专用目录,我这里是kernel_test,在里边需要创建jun_module.c 和 Makefile 。

 

Ubuntu下内核编程之第一个模块helloworld[通俗易懂]


 

      2、然后让我们看看源代码的内容都是什么:

      下边是jun_module.c


/* * 2011-9-13 * author:jun */ #include<linux/init.h> #include<linux/module.h> /* 编写模块必须要包含的头文件 */ //初始化函数 static int __init jun_init(void) { printk(KERN_ALERT"Hello there,I'm jun,and welcome to my blog Dreambegin.\n"); return 0; } //退出用来断后的函数 static void __exit jun_exit(void) { printk(KERN_ALERT"Goodbye,nice to see you.\n"); } //对模块函数进行绑定 module_init(jun_init); module_exit(jun_exit); //许可协议及作者信息、可以不设置 MODULE_LICENSE("Dual BSD/GPL"); MODULE_AUTHOR("Jun"); 


然后是Makefile:


obj-m += jun_module.o # XXX.o对应于你的XXX.c同时也是你的模块名称 all: make -C /usr/src/linux-headers-$(shell uname -r) M=$(shell pwd) modules # 这里通过uname -r命令获取系统信息,同时拼装出内核源码树的路径; # pwd获取当前文件夹,这就要求着在你进行make的时候要在源码目录下。 clean: make -C /usr/src/linux-headers-$(shell uname -r) M=$(shell pwd) clean # 原理同上 

这里对Makefile的一些语法和相关的shell细节不再嗷述,可以在网上找到相关文章。

创建好对应文件,我们就可以make了。

      $make

      效果如图,切记所在目录为程序源文件目录。


Ubuntu下内核编程之第一个模块helloworld[通俗易懂]


可见已经编译成功,目录下出现了一堆文件。这里的jun_module.ko 就是我们用来加载的编译好的模块了。

      通过下边命令进行加载:

      $sudo insmod ./jun_module.ko

      然后通过下边命令查看一下是否加载:

      $sudolsmod


Ubuntu下内核编程之第一个模块helloworld[通俗易懂]


啊!多么完美啊。

 

      然后用下面命令看一下模块在初始化时的输出吧:

      $dmesg

      经过一瞬间的刷屏,终端听到了你想看到的那一行上——[ 2974.417502] Hellothere,I’m jun,and welcome to my blog Dreambegin. 看,就是这样:


Ubuntu下内核编程之第一个模块helloworld[通俗易懂]


啊哈,OK了,卸载和查看退出信息的任务就交给你了,记着要卸载了这模块啊,刘它存在又没什么用。好了,今天就到这里。

网络支持:http://junkor.info


【程序源码及本文doc文档下载:点击进入下载页

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/184583.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 局域网文件传输软件[通俗易懂]

    局域网文件传输软件[通俗易懂]在公司实习了一个周,虽然很累,但也感觉有所得,此次项目是做一个局域网两台计算机之间的文件传输。我用的主要控件为winsock控件,用其TCP协议。至于用此控件连接两台计算机书上都有介绍,我主要介绍一下我传送文件的思想和方法:首先,将要传送的文件分成指定大小的N个包,大小不能超过8K因为TCP每次最多发送8K数据,最后一个包可能会小于其它包。然后在每个包加个包头,因为接收端需要通过包头知道传送过来的

    2022年6月4日
    36
  • 公众号:正确响应微信发送的Token验证「建议收藏」

    直接把下面代码复制到你要填写的url地址<?php//定义常量tokendefine(‘TOKEN’,’weixin’);//检查标签functioncheckSignature(){//先获取到这三个参数$signature=$_GET[‘signature’];$nonce=…

    2022年4月14日
    439
  • 鼠标滚轮编码器工作原理_速度编码器工作原理

    鼠标滚轮编码器工作原理_速度编码器工作原理鼠标滚轮一旦出现滚动跳动,不连贯,基本都要换,修鼠标会经常遇到,好奇之下想了解一下这个小东西的原理。滚轮一端插在这个转盘里面,我们滚动滚轮时候,转盘被带动旋转,产生脉冲信号,电脑依靠这个信号判断滚轮的旋转方向和速度。我们拆一个机械编码器来看看。就是这个小东西,特别简单有没有,一共就4个零件最左边是铁壳,上面一般会有厂家信息,安装高度,和寿命等比如这个,安装高度10毫米,寿命500万圈。PS:一般普通的鼠标,都是选用安装高度为11mm,但还是要自己量清楚。这里需要注意的是,安装

    2022年9月30日
    0
  • 什么是大数据架构?需要学什么内容?[通俗易懂]

    什么是大数据架构?需要学什么内容?[通俗易懂]大数据架构设计用来处理对传统数据库系统而言太大或太复杂的数据的引入、处理和分析。组织进入大数据领域的门槛各不相同,具体取决于用户的权限及其工具的功能。对某些组织来说,大数据可能意味着数百个GB的数据,而对另一些组织来说,大数据则意味着数百个TB的数据。随着处理大数据集的工具的发展,大数据的涵义也在不断地变化。慢慢地,这个术语更多的是指通过高级分析从数据集获取的价值,而不是严格地指数据的大小…

    2022年5月16日
    36
  • JAVA框架和技术

    JAVA框架和技术JAVA框架和技术

    2022年4月22日
    38
  • extjs中的flex_Extjs 教程「建议收藏」

    extjs中的flex_Extjs 教程「建议收藏」基本介绍ExtJS代表扩展JavaScript,是基于YUI(Yahoo用户界面)的sencha的JavaScript框架和产品。它基本上是一个具有现代UI的桌面应用程序开发平台。本教程完全理解ExtJS。这个参考将带你通过简单和实用的方法,同时学习ExtJS。适用人群本教程为初学者准备,帮助他们了解ExtJS的概念,以构建动态WebUI。学习前提对于本教程,读者应该具有HTML,CSS…

    2022年6月18日
    30

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号