5-内核开发-/proc File System 学习

5-内核开发-/proc File System 学习

课程简介:
Linux内核开发入门是一门旨在帮助学习者从最基本的知识开始学习Linux内核开发的入门课程。该课程旨在为对Linux内核开发感兴趣的初学者提供一个扎实的基础,让他们能够理解和参与到Linux内核的开发过程中。

课程特点:
1. 入门级别:该课程专注于为初学者提供Linux内核开发的入门知识。无论你是否具有编程或操作系统的背景,该课程都将从最基本的概念和技术开始,逐步引导学习者深入了解Linux内核开发的核心原理。

2. 系统化学习:课程内容经过系统化的安排,涵盖了Linux内核的基础知识、内核模块编程、设备驱动程序开发等关键主题。学习者将逐步了解Linux内核的结构、功能和工作原理,并学习如何编写和调试内核模块和设备驱动程序。

3. 实践导向:该课程强调实践,通过丰富的实例和编程练习,帮助学习者将理论知识应用到实际的Linux内核开发中。学习者将有机会编写简单的内核模块和设备驱动程序,并通过实际的测试和调试来加深对Linux内核开发的理解。

4. 配套资源:为了帮助学习者更好地掌握课程内容,该课程提供了丰富的配套资源,包括教学文档、示例代码、实验指导和参考资料等。学习者可以根据自己的学习进度和需求,灵活地利用这些资源进行学习和实践。

无论你是计算机科学专业的学生、软件工程师还是对Linux内核开发感兴趣的爱好者,Linux内核开发入门课程都将为你提供一个扎实的学习平台,帮助你掌握Linux内核开发的基础知识,为进一步深入研究和应用Linux内核打下坚实的基础。

这一讲主要讲述如何/proc/ 文件系统


有时候,我们后端开发工程师经常会用各种命令去check Linux 服务器机器配置,例如命令:
cat /proc/cpuinfo ,cat /proc/meminfo 但是你想过他们的原理是怎么样的吗?今天讲的这个/proc 文件系统就与这个命令有关。让我们一起来浅显的了解下吧。(后面我们计划定义自己的基于 proc/原理的内核模块)


(1) 介绍

 /proc 文件系统是一个伪文件系统,它提供有关正在运行的 Linux 内核的信息。它最初旨在允许轻松访问有关进程的信息(因此得名),但现在它被内核的每一小
 部分使用,这些小部分有一些有趣的信息要报告。


(2) 常见文件

/proc 文件系统中的一些有用文件包括:

  • /proc/cpuinfo:包含有关 CPU 的信息,例如型号、速度和缓存大小。
  • /proc/meminfo:包含有关内存使用情况的统计信息,例如总内存量、已用内存量和空闲内存量。
  • /proc/uptime:包含有关系统已运行时间的统计信息。
  • /proc/loadavg:包含有关系统负载平均值的统计信息。
  • /proc/diskstats:包含有关磁盘活动和 I/O 统计信息的统计信息。
  • /proc/net/dev:包含有关网络设备和流量的统计信息。
  • /proc/version:包含有关正在运行的内核的版本和编译信息。

此外 /proc 文件系统还可以用于控制某些内核功能。例如,您可以使用 /proc/sys/kernel/printk
文件来更改内核日志记录级别,这个printk 前几节课程中的代码中多次用到。


/proc 文件系统是一个额外的机制,内核和内核模块可以使用它向进程发送信息。
它最初设计为一种轻松访问有关进程信息的方法(例如进程列表、状态和资源使用情况)。
现在,内核中的每个组件都可以使用 /proc 文件系统来报告任何有趣的信息。


内核是操作系统的核心,负责管理硬件、内存和进程。内核模块是可加载到内核中的代码模块,用于添加
额外的功能(例如设备驱动程序或文件系统支持)。

/proc 文件系统为内核和内核模块提供了一种与进程通信的方法。进程可以读取 /proc 文件系统中
的文件以获取有关内核和系统的信息。

因此,/proc 文件系统是一个非常有用的工具,可用于监视系统、诊断问题和控制内核行为。

(3)实现


那么如何实现一个简单的/proc 下的模块呢?


首先
(a)需要实现定义

 proc_ops proc_file_fops 
proc_dir_entry *our_proc_file; 

(a)模块初始化和清理函数:

procfs1_init():此函数在模块加载到内核时调用。它使用 proc_create() 函数创建 /proc/helloworld 文件。如果无法创建文件,该函数将打印错误消息并返回错误代码。
procfs1_exit():此函数在模块从内核卸载时调用。它使用 proc_remove() 函数删除 /proc/helloworld 文件。


(a)文件操作结构:

proc_file_fops:此结构定义了 /proc/helloworld 文件的文件操作。它包含一个条目 proc_read,该条目是处理来自用户空间程序的读取请求的函数。


(a)读取函数:

procfile_read():当用户空间程序从 /proc/helloworld 文件读取时调用此函数。它将字符串 "HelloWorld!\ " 复制到用户空间程序提供的缓冲区中。


全部代码如下:

hello.c 

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/proc_fs.h>
#include <linux/uaccess.h>
#include <linux/version.h>#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 6, 0)
#define HAVE_PROC_OPS
#endif#define procfs_name "helloworld"static struct proc_dir_entry *our_proc_file;static ssize_t procfile_read(struct file *file_pointer, char __user *buffer,size_t buffer_length, loff_t *offset)
{char s[13] = "HelloWorld!\n";int len = sizeof(s);ssize_t ret = len;if (*offset >= len || copy_to_user(buffer, s, len)) {pr_info("copy_to_user failed\n");ret = 0;} else {pr_info("procfile read %s\n", file_pointer->f_path.dentry->d_name.name);*offset += len;}return ret;
}#ifdef HAVE_PROC_OPS
static const struct proc_ops proc_file_fops = {.proc_read = procfile_read,
};
#else
static const struct file_operations proc_file_fops = {.read = procfile_read,
};
#endifstatic int __init procfs1_init(void)
{our_proc_file = proc_create(procfs_name, 0644, NULL, &proc_file_fops);if (NULL == our_proc_file) {proc_remove(our_proc_file);pr_alert("Error:Could not initialize /proc/%s\n", procfs_name);return -ENOMEM;}pr_info("/proc/%s created\n", procfs_name);return 0;
}static void __exit procfs1_exit(void)
{proc_remove(our_proc_file);pr_info("/proc/%s removed\n", procfs_name);
}module_init(procfs1_init);
module_exit(procfs1_exit);MODULE_LICENSE("GPL");

Makefile

obj-m += hello.oCFLAGS := -Wall -O2all:make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modulesclean:make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

在 /proc 文件系统下创建的模块可以利用工作交互机理来处理来自用户空间进程的请求。

/proc 文件系统是一个伪文件系统,它允许用户空间进程访问内核信息和控制内核行为。在 /proc 文件系统下创建的模块可以导出文件和目录,用户空间进程可以通过这些文件和目录与模块进行交互。

当用户空间进程访问模块导出的文件时,模块可以安排一个工作请求来处理请求。工作请求将被添加到一个工作队列中,并且工作队列线程将执行工作请求。

例如,一个在 /proc 文件系统下创建的模块可以导出一个文件,该文件允许用户空间进程读取内核中的某个数据结构。当用户空间进程读取该文件时,模块可以安排一个工作请求来获取数据结构并将其内容复制到一个缓冲区中。工作队列线程将执行工作请求,并将数据复制到缓冲区中。然后,用户空间进程可以从缓冲区中读取数据。

通过这种方式,/proc 文件系统下的模块可以利用工作交互机理来处理用户空间进程的请求,而无需阻塞调用进程。

运行效果:

peach@peach-VirtualBox:~/ProcModule$ make
make -C /lib/modules/5.15.0-105-generic/build M=/home/peach/ProcModule modules
make[1]: Entering directory '/usr/src/linux-headers-5.15.0-105-generic'CC [M]  /home/peach/ProcModule/hello.oMODPOST /home/peach/ProcModule/Module.symversCC [M]  /home/peach/ProcModule/hello.mod.oLD [M]  /home/peach/ProcModule/hello.koBTF [M] /home/peach/ProcModule/hello.ko
Skipping BTF generation for /home/peach/ProcModule/hello.ko due to unavailability of vmlinux
make[1]: Leaving directory '/usr/src/linux-headers-5.15.0-105-generic'

执行安装 insmod  

然后验证:


(4)总结


总体而言,/proc 文件系统是一个非常有用的工具,可用于获取有关正在运行的 Linux 系统的信息和控制某些内核功能。

(5)参考

The Linux Kernel Module Programming Guide (sysprog21.github.io)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/827812.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

经典案例|使用Supabase解决可视化大屏项目的常见问题

敏博科技专业致力于应急管理行业&#xff0c;提供以物联网技术和感知预警算法模型为核心的先进产品和解决方案。应急管理行业的业务非常繁多和复杂&#xff0c;很多时候都需要在短时间内交付出稳定高效的业务系统。如下两张图某市的安全生产监测预警系统 MemFire Cloud应用开…

Redis入门到通关之Redis数据结构-Hash篇

文章目录 ☃️ 概述☃️底层实现☃️源码☃️其他 欢迎来到 请回答1024 的博客 &#x1f353;&#x1f353;&#x1f353;欢迎来到 请回答1024的博客 关于博主&#xff1a; 我是 请回答1024&#xff0c;一个追求数学与计算的边界、时间与空间的平衡&#xff0c;0与1的延伸的后…

模型部署的艺术:让深度学习模型跃入生产现实

模型部署的艺术&#xff1a;让深度学习模型跃入生产现实 1 引言 1.1 部署的意义&#xff1a;为何部署是项目成功的关键 在深度学习项目的生命周期中&#xff0c;模型的部署是其成败的关键之一。通常&#xff0c;一个模型从概念构思、数据收集、训练到优化&#xff0c;最终目的…

电子信息制造工厂5G智能制造数字孪生可视化平台,推进数字化转型

电子信息制造工厂5G智能制造数字孪生可视化平台&#xff0c;推进数字化转型。5G智能制造数字孪生可视化平台利用5G网络的高速、低延迟特性&#xff0c;结合数字孪生技术和可视化界面&#xff0c;为电子信息制造工厂提供了一种全新的生产管理模式。不仅提升生产效率&#xff0c;…

SpringBoot学习之Kafka下载安装和启动【Windows版本】(三十四)

一、配置Java环境变量 打开CMD输入java -version检查java环境变量是否配置正确,如果配置正确在CMD窗口输入java -version应该输出如下: ​ 怎么配置Java环境变量这里我就不赘叙了,网上教程很多,请读者自行搜索操作。 二、下载Kafka 1、Kafka官网地址:Apache Kafka,…

解决DataGrip连接MySQL8时出现时区错误问题

解决办法&#xff1a;在url后面拼接时区参数 ?serverTimezoneAsia/Shanghai

DS进阶:AVL树和红黑树

一、AVL树 1.1 AVL树的概念 二叉搜索树&#xff08;BST&#xff09;虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找元素相当于在顺序表中搜索元素&#xff0c;效率低下。因此&#xff0c;两位俄罗斯的数学家G.M.Adelson-…

easyx库的学习(鼠标信息)

前言 本次博客是作为介绍easyx库的使用&#xff0c;最好是直接代码打到底&#xff0c;然后看效果即可 代码 int main() {initgraph(640, 480, EX_SHOWCONSOLE|EX_DBLCLKS);setbkcolor(RGB(231, 114, 227));cleardevice();//定义消息结构体ExMessage msg { 0 };//获取消息wh…

大语言模型微调过程中的 RLHF 和 RLAIF 有什么区别?

目前想要深入挖掘大型语言模型&#xff08;LLM&#xff09;的全部潜力需要模型与我们人类的目标和偏好保持一致。从而出现了两种方法&#xff1a;来自人类反馈的人力强化学习&#xff08;RLHF&#xff09;和来自人工智能反馈的人工智能驱动的强化学习&#xff08;RLAIF&#xf…

FPGA秋招-笔记整理(1)

一、关键路径 关键路径通常是指同步逻辑电路中&#xff0c;组合逻辑时延最大的路径&#xff08;这里我认为还需要加上布线的延迟&#xff09;&#xff0c;也就是说关键路径是对设计性能起决定性影响的时序路径。也就是静态时序报告中WNS&#xff08;Worst Nagative Slack&…

如何从架构层面降低公有云多可用区同时故障的概率

阿里云和腾讯云都曾出现过因一个组件故障而导致所有可用区同时瘫痪的情况。本文将探讨如何从架构设计的角度减小故障域&#xff0c;在故障发生时最小化业务损失&#xff0c;并以 Sealos 的稳定性实践为例&#xff0c;分享经验教训。 抛弃主从&#xff0c;拥抱点对点架构 从腾…

Linux之yum和vim的使用

一、yum的使用 yum 后面跟install要安装的文件名&#xff1a; 若你要安装的文件已经存在&#xff0c;则会出现&#xff1a; 要删除文件&#xff1a; yum remore文件名即可删除 在我们安装完lrzsz之后&#xff0c;可以用rz指令和sz指令&#xff1a; rz指令可以从window窗口中…

鸿蒙OpenHarmony【小型系统运行案例】 (基于Hi3516开发板)

运行 启动系统 在完成Hi3516DV300的烧录后&#xff0c;还需要设置BootLoader引导程序&#xff0c;才能运行OpenHarmony系统。 在Hi3516DV300任务中&#xff0c;单击Configure bootloader&#xff08;Boot OS&#xff09;进行配置即可。 说明&#xff1a; DevEco Device Tool…

MT8788智能模块简介_MTK联发科安卓核心板方案厂商

MT8788安卓核心板是一款具备超高性能和低功耗的4G全网通安卓智能模块。该模块采用联发科AIOT芯片平台&#xff0c;供货周期长。 MT8788核心板搭载了12nm制程的四个Cortex-A73处理器核心和四个Cortex-A53处理器核心&#xff0c;最高主频可达2.0GHz。板载内存容量可选为4GB64GB(也…

《系统架构设计师教程(第2版)》第15章-面向服务架构设计理论与实践-05-SOA设计模式

文章目录 1. 服务注册表模式1.1 服务注册表1.2 SOA治理功能1.3 注册表中的配置文件 2. 企业服务总线&#xff08;ESB&#xff09;模式3. Synchro ESB3. 微服务模式3.1 概述3.2 微服务架构模式方案3.2.1 聚合器微服务1&#xff09;概述2&#xff09;几种特殊的聚合微服务 3.2.2 …

Ubuntu20.04安装redis5.0.7

redis下载命令&#xff1a; wget https://download.redis.io/releases/redis-5.0.7.tar.gz 解压到 opt目录下 tar -zxvf redis-5.0.7.tar.gz -C /opt apt install -y gcc # 安装gccapt install make # 安装make 后面执行make一直报错 make报错后清除&#xff1a; make …

parallels desktop19.3最新版本软件新功能详细介绍

Parallels Desktop是一款运行在Mac电脑上的虚拟机软件&#xff0c;它允许用户在Mac系统上同时运行多个操作系统&#xff0c;比如Windows、Linux等。通过这款软件&#xff0c;Mac用户可以轻松地在同一台电脑上体验不同操作系统的功能和应用程序&#xff0c;而无需额外的硬件设备…

分布式与一致性协议之拜占庭将军问题(三)

拜占庭将军问题 叛将先发送消息 如果是叛将楚先发送作战消息&#xff0c;干扰作战计划&#xff0c;结果会有所不同吗&#xff1f; 在第一轮作战信息协商中&#xff0c;楚向苏秦发送作战指令"进攻",向齐、燕发送作战指令"撤退"&#xff0c;如图所示(当然还…

腾讯云向量数据库-RAG介绍2

1.chunk拆分对最终效果的影响 2.改进知识的拆分方案 3.AI套件 4.相似性检索的关键&#xff1a;embedding技术 嵌入技术是相似性检索的关键&#xff0c;它能够将数据转换为向量表示&#xff0c;并通过比较向量之间的相似性来实现相似性检索&#xff1b;embedding&#xff1a;将…

Jackson 2.x 系列【30】Spring Boot 集成之数据脱敏

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Jackson 版本 2.17.0 本系列Spring Boot 版本 3.2.4 源码地址&#xff1a;https://gitee.com/pearl-organization/study-jaskson-demo 文章目录 1. 概述2. 实现思路3. 案例演示3.1 脱敏规则3.2 自…