当前位置: 首页 > 编程日记 > 正文

Linux内核模块编程入门

针对2.6内核的Linux系统,需要你的机器上已经安装了kernel-devel这个包,也就是编译模块所必须的东西:内核的头文件和一些Makefile。

一,Hello World程序:
[code:1:fbc83fc10a]/*file: hello.c*/
#ifndef __KERNEL__
#define __KERNEL__
#endif
#ifndef MODULE
#define MODULE
#endif
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>

static int hello_init(void)
{
printk(KERN_ALERT "Hello, The fucking crazy world\n");
return 0;
}

static void hello_exit(void)
{
printk(KERN_ALERT "Bye, The fucking crazy world!\n");
}

module_init(hello_init);
module_exit(hello_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("albcamus <albcamus@163.com>");[/code:1:fbc83fc10a]

2.6内核的kbuild子系统跟2.4相比有本质的改变。我们下面尝试两种方式编译这个程序:
1, 你可以在本目录下这样写一个Makefile
[code:1:fbc83fc10a]obj-m := hell.o
clean:
rm -rf *.o .*.cmd *.ko *.mod.c .tmp_versions[/code:1:fbc83fc10a]
然后用这样的命令行编译:
make -C /lib/modules/`uname -r`/build M=`pwd` modules
这时ls一下,就能看到生成了很多文件,其中hello.ko就是我们需要的内核模块。
2, 专业点儿,Makefile这样写:
[code:1:fbc83fc10a]obj-m := hello.o
KERNELBUILD := /lib/modules/`uname -r`/build
default:
make -C $(KERNELBUILD) M=$(shell pwd) modules
clean:
rm -rf *.o .*.cmd *.ko *.mod.c .tmp_versions[/code:1:fbc83fc10a]
然后只要make一下就可以了。

插入模块用insmod命令:
insmod ./hello.ko
这时候大家可能会问:为什么我的屏幕上没有见到输出?这个是console的日志记录级别和你printk消息时指定的级别(本例中指定为KERN_ALERT,为次高,仅次于KERN_EMERG)决定的。无论如何,你可以tail 或者cat看看系统日志的最后几行,系统日志一般为/var/log/messages,或者直接用dmesg命令,肯定能看到输出了。

二,头文件问题。
C程序员都知道,要使用某个外部的函数,应当#include某个头文件,这个头文件包含了那个函数的原型(prototype)。内核的头文件在include/下,其中include/asm是个符号链接,指向你所用内核的具体的体系结构目录,比方说我的系统是i386的,那么include/asm就指向include/asm-i386 。
内核编程中我们不能链接libc库,不能使用libc库中的函数,所以很有些麻烦。一些重要的函数,象strcpy/strcmp/snprintf等,kernel也为我们实现并导出(export)了,而我们需要#include相关的头文件,在include/linux和include/asm中,你需要自己寻找你所要使用的函数在哪个头文件中声明,并将其#include进来。

相关文章:

2021中国国际消费电子博览会和青岛国际软件融合创新博览会盛大开幕

9月24日&#xff0c;备受瞩目的2021中国国际消费电子博览会(简称“电博会”)和青岛国际软件融合创新博览会(简称“软博会”)在青岛国际会展中心盛大开幕。国家工信部原副部长杨学山&#xff0c;国家工信部信息技术发展司副司长江明涛&#xff0c;中国机电产品进出口商会秘书长郭…

oracle 11g wm_concat 、 listagg 函数的使用(合并数据)

方法一 wn_concat() 函数 1、把以下图中Name一样的数据合并为一条&#xff0c;而且NO的值要这样显示如 C.1,C.2 2、实现这种效果的操作如下&#xff0c;先把Name的值进行分组&#xff08;group by&#xff09;&#xff0c;再把NO的值用 wm_concat()函数合并起来&#xff08;注意…

使用Cacti监控你的网络Cacti的安装

声明&#xff1a;本系列文档出自石头记&#xff0c;如若转载请注明出处&#xff0c;本人保留文档的所有权&#xff0c;并欢迎转载。本系列文档的其他部分链接如下&#xff1a;一、概述及Cacti的工作流程二、Cacti的安装三、Cacti的使用四、Cacti脚本及模板五、Cacti插件六、Cac…

AI 被当做炒作工具?

编译 | 禾木木 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 上班路上由于高峰期&#xff0c;眼看就要迟到了&#xff0c;这个时候会想“如果汽车能自动完成这种高度重复的动作&#xff0c;我就可以在路上参加我的会议了”。但是你必须每几秒踩一次油门&#xff0…

毕业五年后差距

毕业五年后差距正如"打工皇帝"唐骏说&#xff1a;"我觉得有两种人不要跟别人争利益和价值回报。第一种人就是刚刚进入企业的人&#xff0c;头5年千万不要说你能不能多给我一点儿工资&#xff0c;最重要的是能在企业里学到什么&#xff0c;对发展是不是有利……&…

我的新技术博客

我是一个技术小白&#xff0c;我开启一片新的空间转载于:https://blog.51cto.com/13526168/2048988

Varnish使用小结

文章原始出处和作者信息及 本声明http://iyubo.blogbus.com/logs/35085709.html此日志会随时更新&#xff0c;当然&#xff0c;是随着我的应用积累:) 实现静态文件压缩 Varnish itself does not compress or decompress objects, although that has been on our wish list fo…

EF 通用数据层类

EF 通用数据层父类方法小结 转载&#xff1a;http://www.cnblogs.com/yq-Hua/p/4165344.html MSSql 数据库 数据层 父类 增删改查&#xff1a; using System; using System.Collections.Generic; using System.Data; using System.Data.Entity; using System.Data.Entity.Infra…

最新的B站弹幕和评论爬虫,你们要的冰冰来啦!

作者 | 周萝卜 来源 | 萝卜大杂烩 最近想爬下B站的弹幕和评论&#xff0c;发现网上找到的教程基本都失效了&#xff0c;毕竟爬虫和反爬是属于魔高一尺、道高一丈的双方&#xff0c;程序员小哥哥们在网络的两端斗智斗勇&#xff0c;也是精彩纷呈。 当然了&#xff0c;对于爬虫…

K:java中的序列化与反序列化

Java序列化与反序列化是什么&#xff1f;为什么需要序列化与反序列化&#xff1f;如何实现Java序列化与反序列化&#xff1f;以下内容将围绕这些问题进行展开讨论。 Java序列化与反序列化 简单来说Java序列化是指把Java对象转换为字节序列的过程&#xff1b;而Java反序列化是指…

千万级并发HAproxy均衡负载系统介绍

Haproxy介绍及其定位 HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理&#xff0c;支持虚拟主机&#xff0c;它是免费、快速并且可靠的一种解决方案。根据官方数据&#xff0c;其最高极限支持10G的并发。 HAProxy特别适用于那些负载特大的web站点&#xff0c; 这些…

中国的“Databricks”们:打造AI基础架构,我们是认真的

AI落地最大的驱动因素是基础架构的升级。 近年来&#xff0c;大数据分析、AI等领域一直备受关注&#xff0c;常有引人关注的融资事件发生。美国数据科学公司Databricks刚刚在今年8月底完成了16亿美元H轮融资&#xff0c;其最新估值高达380亿美元&#xff0c;相比7个月前G轮融资…

更改git bash默认的路径

在打开git bash时&#xff0c;每次都是在C:\Uer路径下&#xff0c;每次都需要先用cd命令转换到自己需要工作的路径&#xff08;cd /f/dss&#xff09;。修改打开git bash 时的默认的路径就可以不用每次都使用cd命令转换到需要管理的目录。 修改默认路径方法&#xff1a;右击Gi…

Gradle入门系列(4):创建二进制发布版本

本文由 伯乐在线 - JustinWu 翻译。未经许可&#xff0c;禁止转载&#xff01; 英文出处&#xff1a;petrikainulainen。欢迎加入翻译组。 在创建了一个实用的应用程序之后&#xff0c;我们可能想将其与他人分享。其中一种方式就是创建一个可以从网站上下载的二进制文件。 这篇…

什么是A记录、MX记录、CNAME记录

什么是A记录&#xff1f; A (Address) 记录是用来指定主机名&#xff08;或域名&#xff09;对应的IP地址记录。用户可以将该域名下的网站服务器指向到自己的web server上。同时也可以设置域名的子域名。通俗来说A记录就是服务器的IP,域名绑定A记录就是告诉DNS,当你输入域名的…

Graph + AI 2021中国峰会:TigerGraph与行业共探图与AI应用前景

由企业级可扩展图分析平台TigerGraph主办的第二届“Graph AI中国峰会”将于10月20日线上举办&#xff0c;本届主题为“图创未来无界精彩”。作为全球唯一一个专注于图技术的行业峰会&#xff0c;“Graph AI峰会”自开办以来&#xff0c;受到数据行业专家及应用领域伙伴的持续…

rrdtool数据备份与迁移

rrdtool 显示错误ERROR: This RRD was created on another architecture rrdtool数据备份与迁移1.在原服务器生成xml文件 …

Format specifies type 'id' but the argument has type 'NSError *__autoreleasing *

我想打印error&#xff0c;但是出现了标题中的错误&#xff0c;代码如下&#xff1a; -(id)yobee_responseObjectForResponse:(NSURLResponse *)response data:(NSData *)data error:(NSError *__autoreleasing *)error { if (error) { NSLog("url ----> %\n error %&…

域名解析和cdn 原理

用户访问未使用CDN缓存网站的过程为: 1)、用户向浏览器提供要访问的域名&#xff1b; 2)、浏览器调用域名解析函数库对域名进行解析&#xff0c;以得到此域名对应的IP地址&#xff1b; 3)、浏览器使用所得到的IP地址&#xff0c;域名的服务主机发出数据访问请求&#xff1b; 4)…

首批 iPhone 13 用户直呼太“坑”:​拍照有马赛克、不能用高刷、还与 Apple Watch “失联”?...

整理 | 郑丽媛出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;iPhone 13 到底香不香&#xff0c;早在 9 月 15 号的苹果秋季发布会上给了我们答案。对此&#xff0c;自然是仁者见仁智者见智&#xff1a;有人认为 iPhone 13 “加量不加价”挺划算&#xff0c;有人则…

《javascript语言精粹》读书笔记(一)

为什么80%的码农都做不了架构师&#xff1f;>>> 第一章 精华 任何语言都有其精华的部分和鸡肋的部分&#xff0c;javascript也不例外&#xff0c;而且鸡肋的部分还很多。但javascript的流行却不受他的质量影响。javascript为何如此流行&#xff1f;因为他是web浏览…

WPF 与Surface 2.0 SDK 亲密接触–LibraryContainer 篇

最近比较懒惰一直都没写东西&#xff0c;再不写笔里的墨水就快干了。看过前面关于LibraryStack 和LibraryBar 的介绍后&#xff0c;大家可能已经对Library 控件系列有了进一步了解&#xff0c;本篇将继续介绍LibraryContainer&#xff0c;它其实就是LibraryStack、LibrayBar 的…

Transformer 代码完全解读!

作者 | 安晟&闫永强来源 | Datawhale本篇正文部分约10000字&#xff0c;分模块解读并实践了Transformer&#xff0c;建议收藏阅读。2017年谷歌在一篇名为《Attention Is All You Need》的论文中,提出了一个基于attention(自注意力机制)结构来处理序列相关的问题的模型&am…

php后台开发(二)Laravel框架

php后台开发&#xff08;二&#xff09;Laravel框架 为了提高后台的开发效率&#xff0c;往往需要选择一套适合自己的开发框架&#xff0c;因此&#xff0c;选择了功能比较完善的Laravel框架&#xff0c;仔细学来&#xff0c;感觉和Python语言的框架Django非常类似。 Laravel框…

Redis的介绍

Redis的介绍数据库主要类型有对象数据库&#xff0c;关系数据库&#xff0c;键值数据库等等&#xff0c;对象数据库太超前了&#xff0c;现阶段不提也罢&#xff1b;关系数据库就是平常说的MySQL&#xff0c;PostgreSQL这些熟的不能再熟的东西&#xff0c;至于键值数据库则是本…

从源代码编译里程碑的 ICS ROM

从源代码编译里程碑的 ICS ROM 操作系统选择 Ubuntu 10.04&#xff0c; 可以用虚拟机&#xff1b;安装 Android SDK &#xff0c; 并更新&#xff1b;打开命令行窗口&#xff0c; 输入下面的命令&#xff0c; 准备编译环境&#xff1a; sudo apt-get install git-core gnupg f…

Varnish purges 缓存清除

Varnish的缓存清除非常复杂。无论是Varnish的清除方式还是清除时候使用的语法规则等&#xff0c;都是比较复杂。为了理解他&#xff0c;我花费了不少时间&#xff0c;现在我很高兴我知道怎么来解释给大家听了。 1、Varnish有两种方式来清除缓存&#xff0c;其中一种方式是通过命…

如何快速搭建智能人脸识别系统

作者 | 小白来源 | 小白学视觉网络安全是现代社会最关心的问题之一&#xff0c;确保只有特定的人才能访问设备变得极其重要&#xff0c;这是我们的智能手机设有两级安全系统的主要原因之一。这是为了确保我们的隐私得到维护&#xff0c;只有真正的所有者才能访问他们的设备。基…

全局唯一ID生成方案

2019独角兽企业重金招聘Python工程师标准>>> 全局唯一ID生成方案对比 - http://cenalulu.github.io/mysql/guid-generate/ 转载于:https://my.oschina.net/meilihao/blog/386264

大型互联网 b2b b2c o2o 电子商务云平台

技术解决方案 开发语言&#xff1a; java、j2ee 数据库&#xff1a;mysql JDK支持版本&#xff1a; JDK1.6、JDK1.7、JDK1.8版本 核心技术&#xff1a;分布式、云服务、微服务、服务编排等。 核心架构&#xff1a; 使用Spring Cloud分布式微服务云架构进行服务化开发&#xff0…