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)
上一篇 2022年10月8日 下午1:36
下一篇 2022年10月8日 下午1:46


相关推荐

  • OpenClaw(windows)部署记录并接入飞书

    OpenClaw(windows)部署记录并接入飞书

    2026年3月13日
    4
  • 回文串分割

    回文串分割回文串分割 PalindromePa 难度 Hard 备注 回文串知识 出自 leetcode 题目描述 Givenastring partitionssu Returnthemin Forexample givens aab Return

    2026年3月17日
    2
  • 和黑客斗争的 6 天![通俗易懂]

    和黑客斗争的 6 天![通俗易懂]互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找Sql注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都…

    2022年6月11日
    33
  • 【spring-kafka】@KafkaListener详解与使用

    【spring-kafka】@KafkaListener详解与使用说明从2.2.4版开始,您可以直接在注释上指定Kafka使用者属性,这些属性将覆盖在使用者工厂中配置的具有相同名称的所有属性。您不能通过这种方式指定group.id和client.id属性。他们将被忽略;可以使用#{…​}或属性占位符(${…​})在SpEL上配置注释上的大多数属性。比如:@KafkaListener(id=”consumer-id”,topics=”SHI_TOPIC1″,concurrency=”${listen.concurrency:3}”,

    2022年10月14日
    3
  • APP启动流程解析

    APP启动流程解析前言当我们点击手机屏幕上的软件图标时 就可以打开这个软件 看似很简单的过程其实包含了许多的底层交互 看了还不明白 欢迎来打我 一 启动流程简介首先要知道的是 手机屏幕其实就是一个 Activity 我们专业点将其称为 Launcher 相信做过车载设备开发的朋友肯定不会陌生 Launcher 是手机厂商提供的 不同的手机厂商比拼的就是 Launcher 的设计 当然我们自己也可以去编写 Lau

    2026年3月18日
    2
  • 2021年华东杯_西华大学西华杯

    2021年华东杯_西华大学西华杯前言本次比赛还是发现了自己很多问题,希望以后能改善吧。。。签到+AGYAbABhAGcAewBkAGgAYgBfADcAdABoAH0-utf-7编码http://toolswebtop.com/text/process/decode/UTF-7flag{dhb_7th}project题目附件发现是工程文件,按日期排序只有一个新的exe文件,那考点肯定就在这了运行exe生成了一个zip打开解压缩的文件发现有三部分编码base64quoted-printablebase64转

    2022年10月11日
    4

发表回复

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

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