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


相关推荐

  • VS2010编写动态链接库DLL和单元测试,转让DLL测试的正确性

    VS2010编写动态链接库DLL和单元测试,转让DLL测试的正确性

    2022年1月4日
    47
  • 微软ASP.NET网站部署指南(10):迁移至SQL Server[通俗易懂]

    微软ASP.NET网站部署指南(10):迁移至SQL Server

    2022年2月2日
    38
  • Linux 内核定时器实验

    Linux 内核定时器实验Linux时间管理和内核定时器简介50.1.1内核时间管理简介学习过UCOS或FreeRTOS的同学应该知道,UCOS或FreeRTOS是需要一个硬件定时器提供系统时钟,一般使用Systick作为系统时钟源。同理,Linux要运行,也是需要一个系统时钟的,至于这个系统时钟是由哪个定时器提供的,笔者没有去研究过Linux内核。Linux内核中有大量的函数需要时间管理,比如周期性的调度程序、延时程序、对于我们驱动编写者来说最常用的定时器。硬件定时器提

    2022年7月26日
    9
  • Ubuntu安装jdk8的两种方式[通俗易懂]

    Ubuntu安装jdk8的两种方式[通俗易懂]安装方式:1):通过ppa(源)方式安装.2):通过官网安装包安装.JDK官网下载地址一:使用ppa(源)方式安装:1):添加ppa源sudoadd-apt-repositoryppa:webupd8team/javasudoapt-getupdate2):安装oracle-java-installer(jdk8版本)sudoapt-getinstallorac…

    2022年7月12日
    12
  • input file获取文件路径

    input file获取文件路径html代码段:<inputtype=”file”@change.prevent.stop=”upload”>vue中script代码段:data(){fileName:”},methods:{upload(event){letfiles=event.target.files[0];th…

    2022年7月25日
    132
  • 运行时常量池与字符串常量池_常量池是什么

    运行时常量池与字符串常量池_常量池是什么文章目录1)方法区包含哪些内容?2)运行时常量池存在什么地方?3)取消永久代后,方法区的实现?4)字符串常量池和运行时常量池究竟去了哪里?4)元空间是什么?5)关于为什么移除永久代?5)补充        我们知道在JDK1.8中取消了永久代,区而代之使用了元空间来实现方法区。话虽如此,但是关于字符串常量池和运行时常量池的模棱两可的说法一直都是争论不休的。1)方法区包含哪些内容?方法区包含哪些内容,摘录自《java虚拟机规

    2022年7月28日
    1

发表回复

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

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