【操作系统】实验八 proc文件系统

简介: 【操作系统】实验八 proc文件系统

😘欢迎关注:👍点赞🙌收藏✍️留言

🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要,有问题可在评论区提出,感谢支持!!!

实验八

实验目的

通过加载内核模块,为/proc文件系统创建以下内容:

  • 一个名叫proc_test的子目录。
  • 一个名叫current的文件,只读,读出的内容是读它的进程的情况。
  • 一个名叫current_too的链接,指向current。
  • 一个名叫hello的文件,可读可写。读出的内容是上次写的内容前面加两句话。

实验准备

  1. 复制文件到工作目录:
  • 使用将 proc_test.c 文件复制到工作目录。

  1. 进入工作目录:
  • 进入工作目录。

编译内核模块

  1. 编译 proc_test.c 模块:
  • 编写proc_test.c代码
#include <linux/sched.h>
#include <linux/init_task.h>
#include <linux/module.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/uaccess.h>

#define MAX_LENGTH 1024

static char hello_content[MAX_LENGTH] = "hello world\n";  // 初始化一个长度为 1024 的字符数组,并赋值 "hello world\n"


//用于处理对 /proc/proc_test/hello 文件的写操作。它从用户空间接收数据并将其复制到内核空间的 hello_content 数组中,偏移量为12。如果写入的字符数超过了数组长度,会返回错误。
static ssize_t hello_proc_write(struct file *file, const char __user *buffer, size_t count, loff_t *pos) {
    if (count > MAX_LENGTH - 1)  // 如果写入的字符数大于 MAX_LENGTH - 1,则返回错误
        return -EINVAL;
    if (copy_from_user(hello_content + 12, buffer, count))  // 将用户空间的数据复制到内核空间的 hello_content 数组中,偏移量为 12
        return -EFAULT;
    hello_content[count + 12] = '\0';  // 在 hello_content 数组中写入字符串结束符'\0'
    return count;  // 返回成功写入的字符数
}
//用于处理对 /proc/proc_test/hello 文件的读操作。它将 hello_content 的内容输出到 seq_file 结构体中,从而在读取文件时显示出来。
static int hello_proc_show(struct seq_file *m, void *v) {
    seq_printf(m, "%s", hello_content);  // 将 hello_content 的内容输出到 seq_file 结构体 m 中
    return 0;
}
//用于打开 /proc/proc_test/hello 文件。它调用 single_open 函数来打开文件,并指定 hello_proc_show 函数来显示文件内容。
static int hello_proc_open(struct inode *inode, struct file *file) {
    return single_open(file, hello_proc_show, NULL);  // 打开 proc 文件,调用 hello_proc_show 函数来显示内容
}
//定义了对 /proc/proc_test/hello 文件的操作集合,包括打开、读取、写入、定位和释放文件。
static const struct proc_ops hello_proc_ops = {
    .proc_open = hello_proc_open,  // 打开文件操作
    .proc_read = seq_read,  // 读取文件操作
    .proc_write = hello_proc_write,  // 写文件操作
    .proc_lseek = seq_lseek,  // 文件定位操作
    .proc_release = single_release,  // 释放文件操作
};
//用于处理对 /proc/proc_test/current 文件的读操作。它输出当前进程的相关信息,如进程ID、优先级、进程名等。
static int current_proc_show(struct seq_file *m, void *v) {
    struct task_struct *cur = current;

    seq_printf(m, "进程ID: %d\n", cur->pid);  // 输出进程ID
    seq_printf(m, "优先级: %d\n", cur->prio);  // 输出进程优先级
    seq_printf(m, "静态优先级: %d\n", cur->static_prio);  // 输出静态优先级
    seq_printf(m, "正常优先级: %d\n", cur->normal_prio);  // 输出正常优先级
    seq_printf(m, "策略: %d\n", cur->policy);  // 输出进程调度策略
    seq_printf(m, "进程名: %s\n", cur->comm);  // 输出进程名

    return 0;
}
//用于打开 /proc/proc_test/current 文件。它调用 single_open 函数来打开文件,并指定 current_proc_show 函数来显示文件内容。
static int current_proc_open(struct inode *inode, struct file *file) {
    return single_open(file, current_proc_show, NULL);  // 打开 proc 文件,调用 current_proc_show 函数来显示内容
}
// 定义了对 /proc/proc_test/current 文件的操作集合,包括打开、读取、定位和释放文件。
static const struct proc_ops current_proc_ops = {
    .proc_open = current_proc_open,  // 打开文件操作
    .proc_read = seq_read,  // 读取文件操作
    .proc_lseek = seq_lseek,  // 文件定位操作
    .proc_release = single_release,  // 释放文件操作
};
//模块的初始化函数,它在内核加载模块时被调用。它创建了一个名为 /proc/proc_test 的目录,并在其中创建了文件 current、current_too 和 hello。
static int __init proc_test_init(void) {
    struct proc_dir_entry *test_dir;

    test_dir = proc_mkdir("proc_test", NULL);  // 创建一个目录 /proc/proc_test
    proc_create("current", 0, test_dir, &current_proc_ops);  // 在 /proc/proc_test 目录下创建一个名为 "current" 的文件
    proc_symlink("current_too", test_dir, "current");  // 在 /proc/proc_test 目录下创建一个名为 "current_too" 的符号链接,指向 "current"
    proc_create("hello", 0666, test_dir, &hello_proc_ops);  // 在 /proc/proc_test 目录下创建一个名为 "hello" 的文件,可读可写权限为 0666

    return 0;
}
//模块的退出函数,它在内核卸载模块时被调用。它移除了之前创建的 /proc/proc_test 目录及其下的文件。
static void __exit proc_test_exit(void) {
    remove_proc_entry("proc_test/current", NULL);  // 移除 /proc/proc_test 目录下的文件 "current"
    remove_proc_entry("proc_test/current_too", NULL);  // 移除 /proc/proc_test 目录下的文件 "current_too"
    remove_proc_entry("proc_test/hello", NULL);  // 移除 /proc/proc_test 目录下的文件 "hello"
    remove_proc_entry("proc_test", NULL);  // 移除 /proc/proc_test 目录
}

MODULE_LICENSE("GPL");  // 指定模块的许可证为 GPL
module_init(proc_test_init);  // 指定模块的初始化函数
module_exit(proc_test_exit);  // 指定模块的退出函数
  • 使用makefile文件编译内核模块。
obj-m:=proc_test.o
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD       := $(shell pwd)
default:
        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
  • 使用make命令编译

make

加载内核模块

  1. 加载编译后的模块:
  • 使用insmod加载模块。

insmod proc_test.ko

  1. 检查是否加载成功:
  • 使用lsmod命令检查模块是否加载。

lsmod | grep proc_test

  1. 检查是否创建了 /proc/proc_test 目录:
  • 进入/proc目录查看。
cd /proc
ls

  1. 检查 /proc/proc_test 目录下是否创建了三个文件:
  • current、current_too 和 hello。
cd /proc/proc_test
ls

查看和操作文件内容

  1. 查看 current 文件的内容:
  • 使用more命令查看。

more current

  1. 查看 current_too 文件的内容:
  • 使用more命令查看。

more current_too

  1. 查看 hello 文件的内容:
  • 使用more命令查看。

more hello

  1. 写入 hello 文件:
  • 使用echo命令将数据输入到hello文件。

  1. 再次查看 hello 文件的内容:
  • 使用more命令查看。

more hello

卸载内核模块

  1. 卸载加载的内核模块:
  • 使用rmmod卸载模块。

rmmod proc_test

  1. 检查是否卸载成功:
  • 使用lsmod命令检查模块是否卸载。

lsmod | grep proc_test


相关文章
|
2月前
|
存储 算法 安全
操作系统之文件系统的奥秘
【9月更文挑战第19天】本文将深入探索操作系统中不可或缺的组件——文件系统,揭示其工作原理与实现细节。我们将通过浅显的语言和生动的比喻,一步步解析文件系统如何组织数据、管理存储空间,并确保数据的完整性和安全性。文章不仅适合初学者构建基础概念,也能帮助有经验的开发者更深入地理解文件系统的高级特性。
|
12天前
|
存储 安全 大数据
深入浅出操作系统:文件系统的秘密
【10月更文挑战第35天】本文将揭示文件系统背后的奥秘,从其基本概念到复杂的实现机制。我们将一起探索文件系统的结构和原理,并了解它如何影响我们的日常计算体验。通过简单的例子和比喻,文章旨在使读者对文件系统有一个清晰而深刻的理解,就像甘地所言:“你必须成为你希望在世界上看到的改变。”让我们一起成为理解操作系统的先行者。
|
2月前
|
存储 缓存 文件存储
探索操作系统中的文件系统管理
【9月更文挑战第25天】在数字世界的海洋中,操作系统是指引我们航行的灯塔。它不仅管理着硬件资源,还维护着软件的秩序。本文将深入探讨操作系统中一个至关重要的部分——文件系统管理。我们将从基础概念出发,逐步深入到文件系统的设计与实现,最后通过代码示例来直观展示文件系统的操作。让我们一起揭开文件系统管理的神秘面纱,理解其背后的逻辑与奥秘。
|
3月前
|
编解码 Linux 程序员
深度探索Linux操作系统 —— 构建根文件系统2
深度探索Linux操作系统 —— 构建根文件系统
45 12
|
3月前
|
Linux Shell 网络安全
深度探索Linux操作系统 —— 构建根文件系统1
深度探索Linux操作系统 —— 构建根文件系统
54 6
|
3月前
|
存储 人工智能 数据管理
深入理解Linux操作系统之文件系统管理探索人工智能:从理论到实践的旅程
【8月更文挑战第30天】在探索Linux的无限可能时,我们不可避免地会遇到文件系统管理这一核心话题。本文将深入浅出地介绍Linux文件系统的基础知识、操作命令及高级技巧,帮助你更有效地管理和维护你的系统。从基础概念到实践应用,我们将一步步揭开Linux文件系统的神秘面纱。
|
4月前
|
弹性计算 运维
阿里云操作系统智能助手OS Copilot实验测评报告
**OS Copilot 产品体验与功能反馈摘要** 运维人员发现OS Copilot易上手,文档清晰,助其高效排查故障(8/10分)。愿意推荐并参与开源开发。亮点在于知识问答,能快速筛选答案。相较于竞品,优点是新手友好、文档清晰,但功能扩展性待增强。期望增加系统错误排查与解决方案,并集成ECS等,以优化系统安装流程。
阿里云操作系统智能助手OS Copilot实验测评报告
|
3月前
|
存储 算法 Unix
OS—文件系统
OS—文件系统
54 0
|
4月前
|
弹性计算 运维 自然语言处理
阿里云操作系统智能助手OS Copilot实验测评报告
OS Copilot是针对Linux的智能助手,助力学习、运维及编程。用户界面直观,自然语言交互方便新手。官方文档详尽,但初次配置略复杂,适合学生和开发者。在提高代码编写和调试效率、系统学习上得分高,功能亮点包括代码生成、问答和命令执行。用户期待更多操作系统支持、自动错误分析和系统排查功能。
184 3
|
16天前
|
安全 Linux 数据安全/隐私保护
Vanilla OS:下一代安全 Linux 发行版
【10月更文挑战第30天】
38 0
Vanilla OS:下一代安全 Linux 发行版

热门文章

最新文章

下一篇
无影云桌面