首页 > 系统相关 >Linux kernel 模块开发&构建学习

Linux kernel 模块开发&构建学习

时间:2023-04-28 18:44:26浏览次数:59  
标签:kernel 模块 虚拟机 https Linux world com hello

主要是学习下kernel 模块的玩法,代码来自社区

简单kernel 代码

  • hello_world.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 void hello_exit(void)
{
 printk(KERN_ALERT "Goodbye, cruel world\n");
}
module_init(hello_init);
module_exit(hello_exit); 
  • Makefile
ifneq ($(KERNELRELEASE),)
 
# In kbuild context
module-objs := hello_world.o
obj-m := hello_world.o
 
CFLAGS_hello_world.o := -DDEBUG
 
else
# In normal make context
KDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
 
.PHONY: modules
modules:
    $(MAKE) -C $(KDIR) M=$(PWD) modules
 
.PHONY: clean
clean:
    $(MAKE) -C $(KDIR) M=$(PWD) clean
 
endif

构建

因为使用的是mac 系统,构建需要一个linux 虚拟机,我使用了centos的,对于虚拟机的启动基于了utm 工具,具体
创建虚拟机部分可以参考相关文章,或者utm官方文档,同时因为默认的内核没开启共享,所以只能使用scp 工具了
对于创建的虚拟机同时使用默认的网络策略

  • 虚拟机环境准备
    需要安装kernel 开发包以及gcc 编译工具
 
yum install kernel-devel-$(uname -r) gcc -y
  • 拷贝文件

可以使用scp

 

  • 构建
 
cd /opt/kernel
make

 

  • 加载内核模块
insmod ./hello_world.ko

日志

 

查看加载的模块

  • 卸载模块
 
rmmod  hello_world

说明

以上是一个简单的内核模块编译以及加载学习,同时也包含了如何进行构建

参考资料

https://github.com/d0u9/Linux-Device-Driver/tree/master/eg_01_hello_world
https://github.com/martinezjavier/ldd3
https://docs.getutm.app/guest-support/linux/#drivers
https://github.com/PacktPublishing/Linux-Device-Drivers-Development
https://www.cnblogs.com/rongfengliang/p/17362332.html
https://virtio-fs.gitlab.io/
https://www.kernel.org/doc/html/v5.9/driver-api/driver-model/driver.html
https://virtio-fs.gitlab.io/design.html
https://libvirt.org/kbase/virtiofs.html
https://github.com/libfuse/libfuse
https://github.com/oasis-tcs/virtio-spec

标签:kernel,模块,虚拟机,https,Linux,world,com,hello
From: https://www.cnblogs.com/rongfengliang/p/17362946.html

相关文章

  • Linux 上安装Lua
    Linux上安装Lua $wgethttp://www.lua.org/ftp/lua-5.2.3.tar.gz$tarzxflua-5.2.3.tar.gz$cdlua-5.2.3$makelinuxtest 报错:/usr/lib/gcc/x86_64-neoshine-linux/4.1.2/../../../../lib64/libreadline.so:undefinedreferenceto`PC'/usr/lib/gcc/x86_64-neoshine......
  • linux 7zip压缩软件
    linux7zip压缩软件 yuminstallp7zip  P7ZIP的使用  创建压缩包:7zaa-t7ztest.7z*,此命令将目录中的所有文件压缩到test.7z中。  解开压缩包:7zaXtest.7z,此命令用于将test.7z中的文件提取出来。可使用-t来指明压缩格式。 ......
  • Linux中输入输出重定向中2>&1的使用(转)
    Linux中输入输出重定向中2>&1的使用(转) 实例 1)command2>errfile:command的错误重定向到文件errfile。2)command2>&1|...:command的错误重定向到标准输出,错误和标准输出都通过管道传给下个命令。3)var=`command2>&1`:command的错误重定向到标准输出,错误和标准输出都赋值给va......
  • Linux安装Nginx
    前言:老规矩,linux安装软件的目录都是data目录 1.进入data目录,创建nginx目录并进入该目录cd/datamkdirnginxcdnginx 2.yum在线安装一些基础环境yuminstallpcreyuminstallpcre-develyuminstallzlibyuminstallzlib-develyuminstallopensslyum......
  • 12 Linux的伙伴系统和SLAB分配器
    伙伴系统: buddy物理内存页面管理算法,最先源自Sun公司的Solaris操作系统;Linux后来也引入了伙伴系统;表示一个物理内存页面:Linux定义了一个page结构体,大量使用了c的union联合体定义结构字段,其大小取决于结构体里面占用内存最大的变量决定;好处是信息量很多,占用内存很少;一个page......
  • 嵌入式Linux的Qt
    链接:https://www.jianshu.com/p/99e620c678dc嵌入式Linux的Qt在嵌入式Linux系统上,可以使用多个平台插件:EGLFS,LinuxFB,DirectFB或Wayland。但是,这些插件的可用性取决于Qt的配置方式。EGLFS是许多主板上的默认插件。如果不合适,请使用QT_QPA_PLATFORM环境变量来请求另一个插件。......
  • paramiko遍历嵌套文件夹上传到linux服务器,并执行sh脚本
    场景:由于工作原因,开发打包后都要上传包到对应linux服务器,并执行对应shell脚本,替换包内配置文件,启动服务。换包频率过于频繁,因此需要实现一种不用打开xshell、xftp的方法,直接将包放在本地文件,双击exe运行所有操作,以节省时间,想到使用python的paramiko、pyinstaller模块实现。功......
  • 记录一下linux-kafka命令
    使用工具:puTTY下载地址:DownloadPuTTY-afreeSSHandtelnetclientforWindowsloginas:rootroot@*******'spassword:Lastlogin:FriApr2814:54:262023from10.10.16.80[root@kafka272c41~]#cd..[root@kafka272c41/]#ls-a....autorelabelbinboot......
  • Linux常用命令
    #uname-a#查看内核/操作系统/CPU信息#head-n1/etc/issue#查看操作系统版本#cat/proc/cpuinfo#查看CPU信息#hostname#查看计算机名#lspci-tv#列出所有PCI设备#lsusb-tv#列出所有USB设备#lsmod#列出加载的内核模块#env#查看环境变量#free-m#查看......
  • Linux开机启动服务配置
     chkconfig命令可以管理在7个不同级别下是否启动某个服务,建议manchkconfig,这是一个普通但必须掌握的命令。1、使用chkconfig--list命令观察ftp的启动状态,按照你的描述,应该是在35级别启动了。(若一页显示不完,可结合catmoreless之类的命令,或者利用管道符加grep过滤出vsft......