一个内核模块的helloworld

helloworld.c

#include <linux/kernel.h>
#include <linux/module.h>
static int __init helloworld_init(void)
{
printk("<0>""helloworld!\n");
return 0;
}
static void __exit helloworld_exit(void)
{
printk("<0>""byebye!\n");
}
module_init(helloworld_init);
module_exit(helloworld_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("haoning");

Makefile

ifneq ($(KERNELRELEASE),)

obj-m := helloworld.o
else

PWD := $(shell pwd)
KVER ?= $(shell uname -r)
KDIR := /lib/modules/$(KVER)/build
all:
$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
rm -rf *.cmd *.o *.mod.c *.ko *.mod.o *.ko.unsigned modules.order Module.symvers
endif



make
[code="java"]
# make
make -C /lib/modules/2.6.32-431.11.2.el6.x86_64/build M=/data/haoning/kernel modules
make[1]: Entering directory `/usr/src/kernels/2.6.32-431.11.2.el6.x86_64'
CC [M] /data/haoning/kernel/helloworld.o
Building modules, stage 2.
MODPOST 1 modules
CC /data/haoning/kernel/helloworld.mod.o
LD [M] /data/haoning/kernel/helloworld.ko.unsigned
NO SIGN [M] /data/haoning/kernel/helloworld.ko
make[1]: Leaving directory `/usr/src/kernels/2.6.32-431.11.2.el6.x86_64'
#
[/code]

[code="java"]
# ls
helloworld.c helloworld.ko helloworld.ko.unsigned helloworld.mod.c helloworld.mod.o helloworld.o Makefile modules.order Module.symvers
#

# insmod helloworld.ko
#
Message from syslogd@mytest at Jun 4 19:30:47 ...
kernel:helloworld!

# rmmod helloworld.ko

Message from syslogd@mytest at Jun 4 19:31:02 ...
kernel:byebye!
#
[/code]

tailf /var/log/messages
查看日志

obj-m 意思是将后面跟的东西编译成内核模块。相对应还有:
obj-y 编译进内核
obj-n 不编译

hello.o 为模块名称
hello.o-objs 为模块依赖的文件名
KID 指定了内核源码的路径
PWD
为当前路径
-C 选项的作用是指将当前工作目录转移到你所指定的位置。
“M=”
选项的作用是,当用户需要以某个内核为基础编译一个外部模块的话,
需要在make modules 命令中加入“M=dir”,程序会自动到你所指定的dir目录中查找模块源码,
将其编译,生成KO文件
学习使用turtlebot2——ROS上安装turtlebot2 安装环境:    安装Ubuntu 14.04版本和ROS Indigo    参考:http://wiki.ros.org/turtlebot/Tutorials安装步骤    有两种安装方法,一种直接的安装命令,另外一种源码编译安装,区别在于:直接安装命令是安装在电脑默认路径/opt/ros/indigo/share里面不便于更改代码,因为默认路径下文件一般有访问权限,无法直接更改,需要使用s... 阅读详情

相关推荐

别再混淆了!一文彻底搞懂STM32的BootROM、BootLoader和启动模式(附启动流程图)

本文深入解析STM32的启动机制,详细讲解BootROM、BootLoader与启动模式的区别与联系,并提供实战指南。通过清晰的启动流程图和配置示例,帮助开发者彻底理解STM32启动流程,解决常见的启动问题,提升嵌入式开发效率。

weixin_33728268的博客 537

内核模块开发日记(一)helloworld

本教程通过从基础到高级的完整知识脉络,配合代码实例与最佳实践,为开发者构建了系统的内核模块开发知识体系。建议结合官方文档(kernel.org/doc)和《Linux设备驱动程序》(O'Reilly)深化理论学习,同时通过QEMU模拟环境进行安全实验。

心若微尘的博客 491

血管分割中的直径平衡难题:从clDice到cbDice的演进与实践

本文探讨了血管分割中的直径平衡难题,详细分析了从clDice到cbDice的技术演进与实践。通过引入半径感知权重和边界对齐惩罚,cbDice在保持拓扑完整性的同时提升了几何敏感度,显著改善了细小血管的分割效果。文章还分享了在nnU-Net中实现cbDice的工程细节,包括GPU加速骨架提取和多任务损失组合策略,为医学影像分析提供了重要参考。

weixin_29170327的博客 239

【Linux内核】内核模块编程helloworld与makefile编译安装

编程内核的helloworld模块,以及makefile文件进行编译和运行

zq563100792的博客 2703

ai数字人系统部署

这段代码实现了基本的语音交互闭环,用户通过语音输入问题,数字人识别语音后进行自然语言理解并生成回复,再将回复转换为语音输出。但实际应用中的 AI 数字人系统更为复杂,如形象渲染需专业图形引擎(如 Unity、Unreal Engine),自然语言处理也会涉及更复杂的模型微调及多轮对话管理等。一个完整的 AI 数字人系统涵盖形象生成、自然语言处理、动作控制等多个复杂功能,下面为你提供一个 Python 示例,整合多个库来实现数字人基础功能,包括语音交互、简单的自然语言理解以及通过虚拟形象展示对话。

weixin_ggwwsscc的博客 369

MarkDown简介(深度解析MarkDown用法)

欢迎使用Markdown编辑器写博客 本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图片上传 LaTex数学公式 UML序列图和流程图 离线写博客 导入导出Markdown文件 丰富的快捷键 快捷键 加粗 Ctrl + B 斜体 Ctrl + I...

酷酷的旭 7341

Linux内核编程Hello World

_init和__initdata告诉内核这些函数和数据只在初始化期间使用,一旦初始化完成,它们就不再需要,从而可以释放掉它们占用的内存,从而提高系统的性能和效率。将函数helloworld_init注册为当前内核模块的初始化函数,当这个内核模块被加载到系统中时,内核会自动调用这个函数来完成其初始化工作。__exit告诉内核这些函数只在模块卸载时使用,一旦模块被卸载,它们就不再需要,从而可以释放掉它们占用的内存,从而提高系统的性能和效率。是一个 Linux 内核模块中的宏,用于声明模块的许可证信息。

qq_53928256的博客 1318

CODESYS Softmotion(一)功能介绍

一、CODESYS SoftMotion RTE SL产品 1.1 CODESYS Runtime SL 产品家族介绍 目前支持的主流厂商的硬件产品,让部署在上面的成为实时设备。 对于Windows系统,根据需求选择对应的Runtime: RTE极大的提高了实时性,适合进行运动控制,同时RTE还支持了多个主从站协议: 还可以选择可选的功能(Single License): RTE对硬件和系统有要求,如果你需要硬件功能,那么网卡会有最低要求。 1.2 RTE的下载和安装 在官网http://codes

Fishfishfishfishcat 2万+

Linux内核编程《一》

1、首先选择Linux系统这里以Centos7.4系统为例: 2、安装好编译环境:yum, make,gcc,vim; 3、新建一个文件夹 注意: Makefile 文件的命名注意M需要大写,否则会报错。 在Makefile文件中make命令前应为tab制表符。 hello.c文件内容为: //必要的头文件 #include <linux/module.h> #i...

白清羽的博客 1095

2025华为od机试真题B卷【版本管理】JavaScript实现

在 软件版本管理中,版本号由点分割的数字组成,例如 1.2.3 和 2.8。现在,你需要编写一个函数,计算两个版本号之间的可用版本号个数。这里的可用版本号指的是所有满足 version1<x<version2的版本号x的个数。若 version1 >=version2 返回0.,

MISAYAONE的博客 254

Python 爬虫实战:赛事分析平台构建与比赛数据抓取

在体育赛事日益丰富的今天,对比赛数据的收集与分析对于运动员、教练团队以及体育爱好者都具有重要意义。通过构建一个赛事分析平台,我们可以系统地抓取、整理和展示各类比赛数据,为用户提供全面的赛事洞察。本文将深入讲解如何利用 Python 爬虫技术实现这一平台的构建,涵盖从目标网站分析到数据可视化展示的全过程。

u014481728的博客 3180

Linux内核驱动学习---编写最简单Linux内核模块HelloWorld

以下内容来源于 https://blog.youkuaiyun.com/lihaoweiV/article/details/6602261 https://blog.youkuaiyun.com/sh21_/article/details/60878812 https://blog.youkuaiyun.com/u010632165/article/details/86541941 https://blog.youkuaiyun.com/FallingU/article/details/76166194 什么是内核模块 模块是可以根据实际需要可以动态加

weixin_46048542的博客 1733

【DaVinci Configurator专题】-5-通过Data Mapping自动创建CAN信号关联的Port并添加到APP SWC

目录 1 导入CAN Matrix变更后的Arxml文件 2 自动创建CAN信号关联的APP Port 3 CAN信号与App SWC的接口映射/连接 4 结尾 <--返回「实战篇」博文-总目录--> <--返回「Autosar从入门到精通-实战篇」专栏主页--> 关键词: DaVinci Developer DaVinci Configurator Pro ARXML AUTOSAR System Description Network Explorer 1

「汽车电子助手」的博客 5128

一个HelloWorld的简单内核模块例子

注:编译驱动的条件:1、交叉工具链2、内核源码包(驱动的版本和内核源码的版本一致)3、源码包需要配置编译过 注:如需要帮助,可以参考内核源码中modules.txt文件(内核源码树/Documentation/kbuild/modules.txt) 编写模块的注意事项: 1.模块运行需要初始化及退出。 module_init(test_init); module_exit(test_...

weixin_30347009的博客 125

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

第一个helloworld内核模块

第一个helloworld内核模块 1 源码: first_mod.c /* first_mod.c My first kernel module. */#include <linux/module.h> /* Needed by all modules */ #include <linux/kernel.h> /* Needed for KERN_INFO*/ MODULE_LICENSE("D

混沌的博客 616

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

编译第一个内核模块helloworld

【4】开始make # make 输出类似以下消息: make -C /lib/modules/2.6.28-11-generic/build M=/home/wk/hello modules make[1]: 正在进入目录 `/usr/src/linux-headers-2.6.28-11-generic' Building modules, stage 2. MODPOST 1 m

Miles的专栏 743

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Linux内核模块的插入和删除

陈莉君老师Linux内核分析与应用课程,一个helloworld内核模块的插入和删除。 目录 编写helloworld.c 一个内核模块大致架构: 编写Makefile 插入模块指令: 删除模块: 编写helloworld.c 代码如下: #include<unistd.h>//主要对一些系统调用的封装 #include<linux/module.h>//支持内核的模块机制 static int __init lkm_init(void)//__in

weixin_42011277的博客 531

Linux内核模块初探——HelloWorld

本文通过学习宋宝华老师的《Linux设备驱动开发详解》第四章而写的学习笔记,感谢这本好书 一、为什么要有内核模块 因为Linux内核架构庞大,组件很多,如果我们把所有需要功能都编译到Linux内核中,就会导致内核很大,并且当我们要在现有内核中添加或删除功能时都要重新编译内核。 Linux使用了模块(Module)这一种机制,模块不用编译进内核映像,模块可以被加载和卸载,如果被加载就和内核中其...

Zach_z的博客 1118

第四章Linux内核模块之一(内核模块简介)

本章导读Linux设备驱动会以内核模块的形式出现,学会编写Linux内核模块编程是学习Linux设备驱动的先决条件。4.1 Linux内核模块简介Linux内核的整体架构非常庞大,其包含的组件也非常多。怎样把需要的部分都包含在内核中呢?一种方法是把所有需要的功能都编译到Linux内核中。这会导致两个问题,一是生成的内核会很大,二是如果要在现有的内核中新增或删除功能,将不得不重新编译内核。有没有另一...

xiezhi123456的博客 667

Linux内核模块入门HelloWold

本文主要是介绍怎么编写一个最简单的Linux内核模块“HelloWold”。

hanshiying007的博客 2090

Helloworld内核模块的开发

一.Helloworld内核模块的开发    1.hellomod.c程序源代码 #include #include   static int moduletest_init(void) {   printk(“Helloworld!\n”);   return 0; }   static void moduletest_exit(void) {  printk(“Goo

即使没有翅膀,心也要飞翔! 803

开始写一个内核模块

建立和运行模块 从hello world开始,一个完整的内核模块helloword.c如下: #include<linux/init.h> //module_init 和 module_exit 的头文件 #include<linux/module.h> //这个头文件包含了许多符号与函数的定义,这些符号与函数多与加载模块有关 MODULE_LICENSE("Dua...

wogezheerne的博客 308

Linux内核模块开发实例学习

虚拟机跑linux,CentOS5.5 内核版本:  注:以下程序只是在我机器上测试通过,但代码不一定合理或高效,只是想了解一下内核模块的开发流程,以及工作流程 例子来源于网络,在此表示感谢 [root@localhost module]# cat /proc/version Linux version 2.6.18-194.el5xen (mockbuild@builder16.cen

tuoliheng的专栏 626

Linux内核模块编译、加载&卸载及查看运行结果

[size=medium]这里我仅使用了最简单的代码HelloWorld #include #include MODULE_LICENSE("Dual BSD/GPL"); static int hello_init(void) { printk(KERN_EMERG "Hello World enter!\n"); return 0; } static ...

Linux学堂 593

内核模块之hello world

  Linnx提供了非常丰富的网络,IO等内核API,可以很方便开发驱动模块。典型的应用程序有一个main函数,内核模块只需要一个初始化,退出函数。下面看下第一个hello world内核模块。   一. 准备环境 #uname -a 2.6.32-431.el6.x86_64 #yum -y install kernel-devel.x86_64 #开发内核必须安装对应...

specialsun的专栏 373

linux内核模块实现教程,Linux内核分析(二)----内核模块简介|简单内核模块实现...

Linux内核分析(二)昨天我们开始了内核的分析,网上有很多人是用用源码直接分析,这样造成的问题是,大家觉得很枯燥很难理解,从某种意义上来说linux系统本身就是由一个个模块构成的,所以我会结合内核模块的设计,去分析内核,从而达到对linux内核的理解。今天我们会分析到以下内容:1.Linux内核模块简介2.简单内核模块实现lLinux内核模块简介1.何为内核模块在上一篇博文中我们先通过内核配置,...

weixin_36360005的博客 224
上一篇: kindle kterm笔记
下一篇: jspwebshell
linux内核控
博客等级 码龄19年 41粉丝 638原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值