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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 深入理解双亲委派机制及作用「建议收藏」

    java双亲委派机制及作用一、什么是双亲委派机制当某个类加载器需要加载某个.class文件时,它首先把这个任务委托给他的上级类加载器,递归这个操作,如果上级的类加载器没有加载,自己才会去加载这个类。二、类加载器BootstrapClassLoader(启动类加载器)c++…

    2022年4月17日
    76
  • 检测计算机命令,磁盘检测命令chkdsk的使用方法

    检测计算机命令,磁盘检测命令chkdsk的使用方法经常看到有很多朋友在系统开机的时候因系统自检程序时间过长而往往直接跳过磁盘检测 而直接跳过这种心急的想法有时候会引来大祸患 今天我们介绍的 chkdsk 命令是系统自带的系统修复命令 可以帮助我们解决很多常见问题 它可以帮助恢复系统文件 有时可以延缓硬盘的寿命 对此想要有了解的朋友跟随小编一起来看看吧 磁盘检测的原因多是由于系统检测到磁盘数据调用错误或者数据文件丢失而自发引起的一种自我保护措施 使用磁

    2025年6月19日
    5
  • 数据库分区表[通俗易懂]

    数据库分区表[通俗易懂]数据库分区表(一)什么情况下需要分区,准备需要分区的数据   什么数据库需要进行分区?首先看一下我们的案例:2010年6月我们六期IT开发团队接到一个XX全国连锁店的餐饮系统,经过一周的敏捷开发之后,XX餐饮系统正式上线了,由于该软件的功能强大,操作简单,功能灵活等特性,很快在全国各地铺展开来。XX餐饮店的美食也颇受顾客的喜爱,有的店每天的收入高达1W元人民币,每天这么多的收入,那么每天要

    2022年5月3日
    44
  • 获得sql server的table的表结构 — 转到word中

    获得sql server的table的表结构 — 转到word中

    2021年11月15日
    43
  • Tar命令之增量备份

    Tar命令之增量备份

    2021年5月30日
    112
  • gcc常用命令_C语言编译过程几个步骤

    gcc常用命令_C语言编译过程几个步骤常用选项一个c文件要经过如下处理才能变成可执行文件Step1:预编译gcc-E-ohello.ihello.cStep2:编译gcc-S-ohello.shello.iStep3:汇编gcc-c-ohello.ohello.sStep4:连接gcc-ohellohello.o如果要一步到位gcc-ohellohello.c…

    2022年10月10日
    5

发表回复

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

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