当前位置: 首页 > news >正文

MIT6.828 Lab2-3 Sysinfo

目录

  • 一、实验内容
  • 二、实验过程
    • 2.1 已有的代码
    • 2.2 需补充内容
      • /kernel/kalloc.c修改(剩余内存计算的函数)
      • /kernel/proc.c修改(统计进程数量的函数)
      • /kernel/defs.h修改
      • 添加/kernel/sysinfo.c文件
      • /kernel/syscall.h修改
      • /kernel/syscall.c修改
      • /user/user.h修改
      • /user/usys.pl修改
      • Makefile修改(编译)
  • 三、测试结果

一、实验内容

  • 添加一个系统调用sysinfo用以收集系统运行时的信息
  • sysinfo只用一个参数(struct sysinfo),详见kernel/sysinfo.h
  • 使用内核填充struct sysinfo
  • 提供了sysinfotest用以测试效果,通过会输出sysinfotest: OK

二、实验过程

2.1 已有的代码

  • sysinfotest.c文件部分内容
// 主函数
144 int
145 main(int argc, char *argv[])
146 {
147   printf("sysinfotest: start\n");
148   testcall();
149   testmem();
150   testproc();
151   printf("sysinfotest: OK\n");
152   exit(0);
153 }//testcall()78 void79 testcall() {80   struct sysinfo info;8182   if (sysinfo(&info) < 0) {83     printf("FAIL: sysinfo failed\n");84     exit(1);85   }8687   if (sysinfo((struct sysinfo *) 0xeaeb0b5b00002f5e) !=  0xffffffffffffffff) {88     printf("FAIL: sysinfo succeeded with bad argument\n");89     exit(1);90   }91 }

此文件主要处理struct sysinfo结构体记录的信息,sysinfo的信息由内核进行记录,因此要进行系统调用操作。
在kernel文件中,官方提供了sysinfo.h,未提供sysinfo.c,需要自行编写。

//sysinfo.h
1 struct sysinfo {
2   uint64 freemem;   // amount of free memory (bytes)
3   uint64 nproc;     // number of process
4 };

sysinfo.c需要完成将运行中的系统信息写入sysinfo结构体中,此结构体为内核态结构体,最后还需传递到用户态。
按照官方提示,在kernel/kalloc.c中添加一个函数用以收集剩余内存;在kernel/proc.c中添加函数用以收集进程数量。

2.2 需补充内容

/kernel/kalloc.c修改(剩余内存计算的函数)

 // kernel/kalloc.c86 uint6487 kcollect_free(void)88 {89   acquire(&kmem.lock);9091   uint64 free_bytes = 0;92   struct run *r = kmem.freelist;93   while(r){94     free_bytes += PGSIZE;95     r = r->next;96   }9798   release(&kmem.lock);99   return free_bytes;
100 }

/kernel/proc.c修改(统计进程数量的函数)

在proc.c文件中添加统计进程数量的函数,通过遍历proc[]数组实现

690 // kernel/proc.c
691 int
692 collect_proc_num(void)
693 {
694   int num = 0;
695   struct proc *p;
696   for(p = proc; p < &proc[NPROC]; p++){
697     if(p->state != UNUSED)
698       num++;
699   }
700   return num;
701 } 

/kernel/defs.h修改

要将上述定义的两个函数添加进defs.h中,在/kernel中,内核函数调用defs.h查询需要用的内核函数

11 struct sysinfo;67 uint64     kcollect_free(void);111 int       collect_proc_num(void);

添加/kernel/sysinfo.c文件

  1 // kernel/sysinfo.c2 #include "types.h"3 #include "riscv.h"4 #include "defs.h"5 #include "param.h"6 #include "memlayout.h"7 #include "spinlock.h"8 #include "proc.h"9 #include "sysinfo.h"1011 uint6412 sys_sysinfo(void)13 {14     struct proc *p = myproc();1516     struct sysinfo info;17     uint64 info_addr; // user pointer to struct stat18     argaddr(0, &info_addr);1920     info.freemem = kcollect_free();21     info.nproc = collect_proc_num();2223     // 将struct sysinfo拷贝至用户态24     if(copyout(p->pagetable, info_addr, (char*)&info, sizeof(info)) < 0){25         return -1;26     }27     return 0;28 }

/kernel/syscall.h修改

增加系统调用号

 23 #define SYS_sysinfo 22

/kernel/syscall.c修改

在相应位置增加转换定义

105 extern uint64 sys_sysinfo(void);
131 [SYS_sysinfo]  sys_sysinfo,

/user/user.h修改

增加函数声明

 26 int sysinfo(struct sysinfo *);

/user/usys.pl修改

增加系统调用入口,usys.pl编译后产生usys.S文件,该文件记录了内核函数的入口

 39 entry("sysinfo");

Makefile修改(编译)

在相应位置添加链接和编译内容

//链接
23   $K/sysinfo.o\
//编译
192  $U/_sysinfotest\

三、测试结果

使用测试工具测试

root@QQQ:~/xv6-labs-2023# make GRADEFLAGS=sysinfo grade

输出结果OK

rnel/syscall.o kernel/sysproc.o kernel/sysinfo.o kernel/bio.o kernel/fs.o kernel/log.o kernel/sleeplock.o kernel/file.o kernel/pipe.o kernel/exec.o kernel/sysfile.o kernel/kernelvec.o kernel/plic.o kernel/virtio_disk.o kernel/start.o kernel/console.o kernel/printf.o kernel/uart.o kernel/spinlock.o
riscv64-unknown-elf-objdump -S kernel/kernel > kernel/kernel.asm
riscv64-unknown-elf-objdump -t kernel/kernel | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > kernel/kernel.sym
make[1]: Leaving directory '/root/xv6-labs-2023'
== Test sysinfotest == sysinfotest: OK (5.5s)
root@QQQ:~/xv6-labs-2023#

相关文章:

MIT6.828 Lab2-3 Sysinfo

目录 一、实验内容二、实验过程2.1 已有的代码2.2 需补充内容/kernel/kalloc.c修改&#xff08;剩余内存计算的函数&#xff09;/kernel/proc.c修改&#xff08;统计进程数量的函数&#xff09;/kernel/defs.h修改添加/kernel/sysinfo.c文件/kernel/syscall.h修改/kernel/sysca…...

形态学操作:腐蚀、膨胀、开闭运算、顶帽底帽变换、形态学梯度区别与联系

一、总述相关概念 二、相关问题 1.形态学操作中的腐蚀和膨胀对图像有哪些影响&#xff1f; 形态学操作中的腐蚀和膨胀是两种常见的图像处理技术&#xff0c;它们通过对图像进行局部区域的像素值替换来实现对图像形状的修改。 腐蚀操作通常用于去除图像中的噪声和细小的细节&a…...

StringBufferInputStream类,你学会了吗?

在Java编程中,处理字符串数据流是一项常见的任务。 为了更灵活地处理字符串数据流,Java提供了StringBufferInputStream类,它允许将字符串转换为输入流,从而可以像处理其他输入流一样对字符串进行操作。 本文将深入探讨StringBufferInputStream类的背景、用法、优缺点以及…...

06_Tomcat

文章目录 Tomcat1.概念2.Tomcat安装3.Tomcat项目结构4.标准web项目结构5.Tomcat部署项目方式6.IDEA关联Tomcat6.1 构建tomcat和idea关联6.2 使用idea创建一个Javaweb工程6.3 使用idea将工程**构建**成一个app6.4 使用idea将构建好的app**部署**到tomcat中 Tomcat 1.概念 Tomc…...

系统安全扫描扫出了:可能存在 CSRF 攻击怎么办

公司的H5在软件安全测试中被检查出可能存在 CSRF 攻击&#xff0c;网上找了一堆解决方法&#xff0c;最后用这种方式解决了。 1、问题描述 CSRF 是 Cross Site Request Forgery的缩写(也缩写为也就是在用户会话下对某个 CGI 做一些 GET/POST 的事&#xff0c;RIVTSTCNNARGO一这…...

Android ART 虚拟机简析

源码基于&#xff1a;Android U 1. prop 名称选项名称heap 变量名称功能 dalvik.vm.heapstartsize MemoryInitialSize initial_heap_size_ 虚拟机在启动时&#xff0c;向系统申请的起始内存 dalvik.vm.heapgrowthlimit HeapGrowthLimit growth_limit_ 应用可使用的 max…...

Android低代码开发 - MenuPanel的源码剖析和基本使用

看了我上篇文章Android低代码开发 - 像启蒙和乐高玩具一样的MenuPanel 之后&#xff0c;本篇开始讲解代码。 源代码剖析 首先从MenuPanelItemRoot讲起。 package dora.widget.panelinterface MenuPanelItemRoot {/*** 菜单的标题。** return*/var title: String?fun hasTit…...

Leetcode刷题笔记3

18. 四数之和 18. 四数之和 - 力扣&#xff08;LeetCode&#xff09; 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&…...

初识C语言——第二十九天

数组 本章重点 1.一维数组的创建和初始化 数组的创建 注意事项&#xff1a; 1.一维由低数组在内存中是连续存放的&#xff01; 2.随着数组下标的增长&#xff0c;地址是由低到高变化的 2.二维数组的创建和初始化 注意事项&#xff1a; 1.二维数组在内存中也是连续存放的&am…...

LeetCode27.移除元素

题目链接&#xff1a; 27. 移除元素 - 力扣&#xff08;LeetCode&#xff09; 思路分析&#xff1a;同样属于经典的双指针移动问题&#xff0c;要掌握固定的思路即可。 算法分析&#xff1a;这个题目可以这样处理&#xff0c;我们把所有非val 的元素都向前移动&#xff0c;把…...

DiffMap:首个利用LDM来增强高精地图构建的网络

论文标题&#xff1a; DiffMap: Enhancing Map Segmentation with Map Prior Using Diffusion Model 论文作者&#xff1a; Peijin Jia, Tuopu Wen, Ziang Luo, Mengmeng Yang, Kun Jiang, Zhiquan Lei, Xuewei Tang, Ziyuan Liu, Le Cui, Kehua Sheng, Bo Zhang, Diange Ya…...

ComfyUI简单介绍

&#x1f353;什么是ComfyUI ComfyUI是一个为Stable Diffusion专门设计的基于节点的图形用户界面&#xff0c;可以通过各种不同的节点快速搭建自己的绘图工作流程。 软件打开之后是长这个样子&#xff1a; 同时软件本身是github上的一个开源项目&#xff0c;开源地址为&#…...

【内存泄漏Bug】animation未释放

问题描述 一个页面做了动画特效&#xff0c;这个页面有可能跳转到其他页面&#xff0c;并长时间不返回&#xff0c;该页面此时已经不活跃了&#xff0c;该页面的对象为无用对象&#xff0c;存在内存泄漏风险 问题分析 这个activity的特性是 1. 有可能跳转到其他页面 2. 有可…...

《异常检测——从经典算法到深度学习》28 UNRAVEL ANOMALIES:基于周期与趋势分解的时间序列异常检测端到端方法

《异常检测——从经典算法到深度学习》 0 概论1 基于隔离森林的异常检测算法 2 基于LOF的异常检测算法3 基于One-Class SVM的异常检测算法4 基于高斯概率密度异常检测算法5 Opprentice——异常检测经典算法最终篇6 基于重构概率的 VAE 异常检测7 基于条件VAE异常检测8 Donut: …...

Python正则模块re方法介绍

Python 的 re 模块提供了多种方法来处理正则表达式。以下是一些常用的方法及其功能介绍&#xff1a; 1. re.match() 在字符串的开始位置进行匹配。 import repattern r\d string "123abc456"match re.match(pattern, string) if match:print(f"匹配的字符…...

pdf使用pdfbox切割pdf文件MultipartFile

引入依赖&#xff1a; <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.25</version></dependency>测试代码&#xff1a; import io.choerodon.core.iam.ResourceLevel; impo…...

力扣HOT100 - 31. 下一个排列

解题思路&#xff1a; 数字是逐步增大的 步骤如下&#xff1a; class Solution {public void nextPermutation(int[] nums) {int i nums.length - 2;while (i > 0 && nums[i] > nums[i 1]) i--;if (i > 0) {int j nums.length - 1;while (j > 0 &&…...

设计模式 20 中介者模式 Mediator Pattern

设计模式 20 中介者模式 Mediator Pattern 1.定义 中介者模式&#xff08;Mediator Pattern&#xff09;是一种行为型设计模式&#xff0c;它通过封装对象之间的交互&#xff0c;促进对象之间的解耦合。中介者模式的核心思想是引入一个中介者对象&#xff0c;将系统中对象之间…...

在 C++ 中,p->name 和 p.name 的效果并不相同。它们用于不同的情况,取决于你是否通过指针访问结构体成员。

p->name&#xff1a;这是指针访问运算符&#xff08;箭头运算符&#xff09;。当 p 是一个指向结构体的指针时&#xff0c;用 p->name 来访问结构体的成员。 student* p &stu; // p 是一个指向 student 类型的指针 cout << p->name << endl; // 通过…...

C++基础:多态

多态相关 多态继承重写父类的虚函数多态的体现,父类的引用指向子类对象的空间虚函数可以实现,也可以不实现,不实现必须要有初始值存在未定义的虚函数的类为抽象类.抽象类不能实例化对象;(animal父类不能实例化对象)如果父类中的函数非虚函数,则会调用父类中的函数//多态的体现…...

LinkSwift:开源网盘直链解析引擎的技术解析与部署指南

LinkSwift&#xff1a;开源网盘直链解析引擎的技术解析与部署指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼…...

Nanbeige 4.1-3B 在AI Agent场景的应用:自主任务规划与执行

Nanbeige 4.1-3B 在AI Agent场景的应用&#xff1a;自主任务规划与执行 最近和几个做项目管理的朋友聊天&#xff0c;他们都在抱怨一件事&#xff1a;每周整理项目文档和写周报&#xff0c;简直是“体力活”。从各个文件夹里翻找文件&#xff0c;手动汇总信息&#xff0c;再绞…...

MTKClient深度应用指南:联发科设备底层调试与系统修复全解析

MTKClient深度应用指南&#xff1a;联发科设备底层调试与系统修复全解析 【免费下载链接】mtkclient MTK reverse engineering and flash tool 项目地址: https://gitcode.com/gh_mirrors/mt/mtkclient 问题诊断&#xff1a;联发科设备典型故障与解决方案 识别设备无法…...

春联生成模型-中文-base环境隔离部署:Anaconda虚拟环境配置指南

春联生成模型-中文-base环境隔离部署&#xff1a;Anaconda虚拟环境配置指南 每次想尝试一个新的AI模型&#xff0c;最头疼的可能不是模型本身&#xff0c;而是环境配置。装了这个包&#xff0c;发现和之前项目的包版本冲突&#xff1b;好不容易跑起来&#xff0c;结果报了一堆…...

Intv_AI_MK11大模型微调实战:使用自有数据定制专属AI

Intv_AI_MK11大模型微调实战&#xff1a;使用自有数据定制专属AI 1. 为什么需要微调大模型 想象一下&#xff0c;你买了一套高级西装&#xff0c;虽然剪裁精良&#xff0c;但总感觉少了点个人特色。大模型就像这套西装&#xff0c;通用性强但缺乏针对性。微调就是为它"量…...

Anaconda环境下的LiuJuan20260223Zimage开发:创建独立Python沙箱

Anaconda环境下的LiuJuan20260223Zimage开发&#xff1a;创建独立Python沙箱 你是不是也遇到过这种情况&#xff1f;电脑上同时跑着好几个Python项目&#xff0c;一个需要TensorFlow 2.0&#xff0c;另一个却只能用TensorFlow 1.x&#xff0c;装来装去最后环境一团糟&#xff…...

全自动洗衣机组态王与三菱PLC联机及仿真探索

全自动洗衣机组态王6.53,6.60和三菱PLC联机和仿真程序包最近在研究自动化控制领域相关内容&#xff0c;接触到了全自动洗衣机组态王 6.53、6.60 与三菱 PLC 的联机以及仿真程序包&#xff0c;感觉很有意思&#xff0c;今天就来和大家分享分享。 一、组态王与三菱 PLC 联机的意义…...

解决Xcode真机调试常见问题:App ID限制与证书信任错误处理

Xcode真机调试全攻略&#xff1a;突破App ID限制与证书信任难题 1. 引言&#xff1a;为什么开发者需要掌握无证书调试&#xff1f; 在iOS开发过程中&#xff0c;真机调试是不可或缺的环节。然而&#xff0c;传统的证书配置流程繁琐复杂&#xff0c;尤其是对于独立开发者或小型…...

Qwen-Image-Edit快速上手:模糊图片变清晰,效果惊艳实测

Qwen-Image-Edit快速上手&#xff1a;模糊图片变清晰&#xff0c;效果惊艳实测 1. 引言&#xff1a;从模糊到清晰的魔法 你是否遇到过这样的困扰&#xff1f;手机里珍藏的老照片变得模糊不清&#xff0c;或是抓拍的精彩瞬间因为手抖而糊成一片。传统修图软件对这些模糊图片往…...

盈鹏飞T527评估板AHD摄像头实战:从硬件连接到QT界面调试全流程

盈鹏飞T527评估板AHD摄像头全流程开发指南&#xff1a;从硬件对接到QT界面优化 在嵌入式视觉系统开发中&#xff0c;AHD摄像头因其长距离传输优势成为安防、工业检测等场景的首选。盈鹏飞T527评估板搭载全志T527处理器&#xff0c;通过TP2815转换板实现四路AHD摄像头接入&#…...