Linux内核模块编程

Linux内核模块编程——Hello World 一、实验环境: 环境配置:VMware® Workstation 15 Pro、ubuntu Desktop 18.10、内存 2GB、处理器数量2、每个处理器内核数量1、硬盘大小30GB……还有一个就是用的咱们Xidian的源(因为校内不需要流量啊,而且还很快!) 二、知识储备: 1)什么是内核模块编程? 你说你学习Linux内核模块编程,你最起码得知道什么是内核模块编程这个概念吧,那我就简单的... 阅读详情

Linux内核模块编程

      首先就是学习Linux的模块编程,照着书上的例子实现Hello.ko也经历一番波折,凡事只有自己亲自尝试过,才知道个中细节如何啊。以下记录我完成这个简单模块的编写,加载,卸载的全过程及要注意的地方。

在任意一个地方创建一个hello.c文件,里面就写如下内容:

/* hello.c */  #include <linux/init.h>  #include <linux/module.h>  MODULE_LICENSE("Dual BSD/GPL");    static int hello_init(void)  {       printk(KERN_ALERT "Hello, World/n");       return 0;  }    static int hello_exit(void)  {       printk(KERN_ALERT "Goodbye, cruel world/n");  }    module_init(hello_init);  module_exit(hello_exit); 

这个模块什么也不干,只是在模块加载时打印一条信息,卸载时也打印一条信息。麻雀虽小,但五脏具全,MODULE_LICENSE()指明认证方式,现在支持的有:“GPL” “GPL v2" "GPL and additional rights" "Dual BSD/GPL" "Dual MIT/GPL" "Dual MPL/GPL" "Proprietary",这是内核2.6里新添加的,实验发现它不是必需的。module_init()指明模块的入口,这是必需的;module_exit()指明模块的出口,这也是必需的。

编译使用make的扩展功能,在与hello.c同一目录下创建一个Makefile文件,内容如下:

/* Makefile */  TARGET=hello  KDIR=/usr/src/linux-headers-2.6.31-19-generic  PWD=$(shell pwd)  obj-m:=$(TARGET).default:       make -C $(KDIR) M=$(PWD) modules 

其中TARGET指明了目标文件的名字,KDIR指明了引用头文件的位置,请根据具体情况修改该文件。不过有几点要说明,模块的编译需要有一个内核源码的目录结构,如果有内核源码当然更好,直接把KDIR改为源码的路径就OK了。当然只有一个内核目录结构也就可以了,毕竟需要的只是头文件,及一些编译脚本,在Linux各发行版的/usr/src/下是有这样一个目录结构的,比如我的系统为Ubuntu9.10,内核为2.6.31-19的通用版,在/usr/src/下就有linux-headers-2.6.31-19-generic这样一个目录。所以我使用KDIR=/usr/src/linux-headers-2.6.31-19-generic。其实还有一个目录名为linux-headers-2.6.31-19,而且你会发现linux-headers-2.6.31-19-generic里的大部分文件只是指向linux-headers-2.6.31-19的一些链接,不过linux-headers-2.6.31-19里面默认缺少一些编译模块所需要的文件,不要使用它。

接下来,你只要使用make命令,就可以进行编译了,make会为你处理好一切,它会根据KDIR找到编译所需要的文件。如果你运气好的话,你的当前目录下就会成生hello.o hello.mod.o hello.mod.c modules.order Module.markers Module.symvers hello.ko,当然可爱的hello.ko就是我们想要的。到此你的模块已经成功生成了,接下来便可以加载这个模块看看效果了。

使用insmod ./hello.ko来加载模块,如果你遇到insmod: error inserting 'hello.o'  :-l invalid module format这样的错误,不用惊慌,并不是你的模块有问题,而是你当前运行的内核版本与你编译链接的头文件版本不一致,所以会出现格式不对的问题。此时,你可以更换系统内核,也可以下载一个与系统版本一致的内核源码重新编译该模块。如果你没有遇到任何问题,也没有打印出任何信息,那么恭喜你,你的内核加载成功了,你可以使用lsmod命令来罗列出当前你系统加载的所有模块,相信你在列表中会找到hello的。你可能会疑惑,为什么没有如我们想像中的那样,打印出"Hello, World"?呵呵,这是因为printk并不会把打印内容打印到你当面的终端,要知道模块是运行在内核态的,而你所能面对的是用户态,内核态的打印信息需要通过log或者dmesg命令来查看,想看到打印結果,最简单的方法是敲入dmesg命令,你就可以看到你所希望看到的信息了,同时,你也可以打开/var/log/message这个文件进行查看。

最后,使用rmmod hello来卸载模块,同样,使用dmesg可以看到打印出的"Goodbye, cruel world"。

Linux内核模块编程基础知识 内核Kernel)在计算机科学中是操作系统最基本的部分,主要负责管理系统资源。它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并由内核决定一个程序在什么时候对某部分硬件操作多长时间。直接对硬件操作是非常复杂的。所以内核通常提供一种硬件抽象的方法,来完成这些操作。通过进程间通信机制及系统调用,应用进程可间接控制所需的硬件资源(特别是处理器及IO设备)。/* 源文件myownfunc.c */");return 0;"); 阅读详情

相关推荐

Linux tcp通讯demo

本文件中包含两个文件TCP客户端client.c和TCP服务器server.c 文件用gcc即可完成编译 先运行服务器端,在运行客户端,可从客户端向服务器端发送数据,当输入“1”,结束连接,客户端释放连接,退出程序,服务器端释放当前连接,继续进入监听状态,等待新的连接 本程序适合linux下的Socket编程新手,有助更好的理解TCP协议和socket编程

LSM内核模块实现demo

一、demo编写 1. 基本步骤 确定hook点,这一步在原理解析中有分析,主要是根据sys_call,确定hook调用点 按照自己的逻辑结构将hook函数实现,函数名可以不一样(我这里是实现的inode_create),可以根据想要实现的hook进行编写 int huhu_inode_create (struct inode *dir, struct dentry *dentry, umode_t mode) { printk ("[+huhu] call [inode_create] by p

huzai9527的博客 1107

NI采集卡 linux下C/C++语言demo

这年头,有个示例程序是多么的重要,节省了大量时间。

编写内核模块小Demo

基于Linux系统的内核编程小Demo. 编写Linux内核模块的demo及注意事项 设计一个简单的内核demo 内核模块代码的编译 扩展 内核模块的参数 编译多个内核模块 内核符号表——全局共享函数接口与变量 编写Linux内核模块的demo及注意事项. 什么是内核模块呢? 首先内核是一个操作系统的最基础部分,它是一个向所有外部...

大大棋的博客 607

eclipse开发linux内核/驱动/应用测试实例

原文地址:https://www.cnblogs.com/diio/p/11832940.html Garlan和Shaw将软件架构风格分为五大类,数据流风格、调用/返回风格、独立构件风格、虚拟机风格和仓库风格。其中: (1)数据流风格包括批处理序列架构风格和管道/过滤器架构风格; (2)调用/返回风格包括主程序/子程序架构风格、数据抽象和面向对象架构风格和层次结构架构风格; (3)独立构件风格包括进程通信架构风格和事件驱动的架构风格; (4)虚拟机风格包括解释器架构风格和基于规则的系统; (5

2332

内核模块编译加载问题

为什么80%的码农都做不了架构师?>>> ...

weixin_33875839的博客 255

linux学习demo--6.20-7.3

linux学习demo

weixin_44799213的博客 264

小白学Linux内核模块编程

Linux内核模块编程Linux内核模块编程是一个很重要的知识点。尤其是编写底层驱动程序时,一定会涉及到它。内核模块编程也是Tiger哥学习Linux时第一节课所接触的知识。由此可以看出它的important,也可以看出其实它很easy。一前言:1.什么是内核模块1>内核模块是具有独立功能的程序。它可以被单独编译,但是不能单独运行,它的运行必须被链接到内核作为内核的一部分在内核空间中运行。 2> 模块编程内核版本密切相连,因为不同的内核版本中某些函数的函数名会有变化。因此模块编程也可以说是内核编程。3>特

冀博 2万+

linux内核模块编程

先给自己打个广告,本人的微信公众号正式上线了,搜索:张笑生的地盘,主要关注嵌入式软件开发,股票基金定投,足球等等,希望大家多多关注,有问题可以直接留言给我,一定尽心尽力回答大家的问题 ** 一 what ** 1. 什么是linux内核模块编程内核模块是具有独立功能的程序,它可以被单独编译,但是不能单独运行,它的运行必须被链接到内核作为内核的一部分在kerne space中运行。 模块编程...

myselfzhangji的博客 663

linux系统编程_Linux系统之内核模块编程

作者:nai_dev原文地址: https://blog.csdn.net/qq_41246458/article/details/1061518201什么是模块 模块是具有独立功能的程序,它可以被单独编译,但不能独立运行。它在运行时被链接到内核作为内核的一部分在内核空间运行。 模块通常由一组函数和数据结构组成,用来实现一种文件系统、一个驱动程序或其他内核上层的功能。 ...

weixin_39653761的博客 153

linux内核模块编程入门

linux内核

yangliuhepanpan的专栏 595

linux内核模块编程指南

The Linux Kernel Module Programming GuidePeter Jay SalzmanMichael BurianOri PomerantzCopyright © 2001 Peter Jay SalzmanThe Linux Kernel Module Programming Guide is a free book; you may reproduce and/o

Make Progress Everyday! 2340

Linux内核模块编程系列2

内核

个人博客 993

linux内核模块有没有main,Linux内核模块编程

Linux内核模块编程是一个很重要的知识点。尤其是编写底层驱动程序时,一定会涉及到它。内核模块编程也是Tiger哥学习Linux时第一节课所接触的知识。由此可以看出它的important,也可以看出其实它很easy。一前言:1. 什么是内核模块1> 内核模块是具有独立功能的程序。它可以被单独编译,但是不能单独运行,它的运行必须被链接到内核作为内核的一部分在内核空间中运行。2> 模块编程...

weixin_36181191的博客 392

Linux 内核模块编程

Linux 内核模块编程是一个很重要的知识点。尤其是编写底层驱动程序时,一定会涉及到它。内核模块编程也是 Tiger哥学习 Linux 时第一节课所接触的知识。由此可以看出它的 important, 也可以看出其实它很 easy 。 一前言: 1. 什么是内核模块 1> 内核模块是具有独立功能的程序。它可以被单独编译,但是不能单独运行,它的运行必须被链接到内核作为内核的一部分在内

IT的乐章 755

linux——内核模块编程

编写内核模块并简单使用

qq_62909771的博客 552
上一篇: Linux内核防火墙的包过滤机制
下一篇: S3C6410 MFC decode H.264流程
willand1981
博客等级 码龄17年 136粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值