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

pc做任务赚钱的网站/新网站推广最直接的方法

pc做任务赚钱的网站,新网站推广最直接的方法,个人网站设计摘要,网站建设的公司在哪找本文来源: https://mp.weixin.qq.com/s/kPwvXMZ2cv8uQNZIsKcAjA 在上一个实验中,你使用系统调用编写了一些实用程序。在本实验中,你将向xv6添加一些新的系统调用,这将帮助你了解它们是如何工作的,同时,让…

本文来源:

https://mp.weixin.qq.com/s/kPwvXMZ2cv8uQNZIsKcAjA

在上一个实验中,你使用系统调用编写了一些实用程序。在本实验中,你将向xv6添加一些新的系统调用,这将帮助你了解它们是如何工作的,同时,让你了解xv6内核的一些内部结构。在以后的实验中你可能会添加更多的系统调用。 

在开始编码之前,请阅读xv6手册的第2章、第4章的4.3节、4.4节以及下面所列相关源文件:

系统调用的用户空间代码:在user/user.h和user/usys.pl中。

内核空间代码:在kernel/syscall.h和kernel/syscall.c中。

与进程相关的代码:在kernel/proc.h和kernel/proc.c中。 

开始本实验前,请切换到syscall分支:

  $ git fetch

  $ git checkout syscall

  $ make clean

1. 系统调用跟踪 (难度:中等) 

任务:在xv6中添加一个系统调用跟踪功能,该功能可帮助你在以后的实验中调试程序。您将创建一个新的trace系统调用来控制跟踪。它应该有一个参数,一个整数“mask”,其位指定要跟踪的系统调用。例如,为了跟踪fork系统调用,程序调用trace(1<<SYS_fork),其中SYS_fork是kernel/syscall.h中的syscall编号。如果在掩码中设置了系统调用的编号,则必须修改xv6内核,以便在每个系统调用即将返回时输出一行。该行应包含进程id、系统调用的名称和返回值;不需要输出系统调用参数。trace系统调用应启用对调用它的进程及其随后派生的任何子进程的跟踪,但不应影响其他进程。

我们提供了一个跟踪用户级程序,该程序运行另一个启用了跟踪的程序(请参见user/trace.c)。完成后,您应该看到如下输出:

例1: trace调用grep仅仅跟踪read系统调用。32是1<<SYS_read。注:输出的第一段是进程标识符PID,第二段是系统调用名称,第三段是系统调用返回码。

例2: trace跟踪所有运行grep时调用的系统调用,其中2147583647的低31位都为1。

例3: 程序没有被跟踪,因此没有打印跟踪输出。

例4:usertests中的forkforkfork测试的所有后代的fork系统调用都被跟踪。

如果程序的行为如上所示,则你的实验方案是正确的(尽管进程ID可能不同)。

提示:

● 将$U/_trace添加到Makefile的UPROGS中

● 运行make qemu,您将看到编译器无法编译user/trace.c,这是因为系统调用的用户空间的存根(stubs)还不存在:将系统调用的原型添加到user/user.h,将存根添加到user/usys.pl中,并将syscall编号添加到kernel/syscall.h。Makefile调用perl脚本user/usys.pl,它生成user/usys.S,即实际的系统调用存根,它使用RISC-V ecall指令转换到内核。一旦你修复了编译问题,运行trace 32 grep hello README;它将失败,因为您尚未在内核中实现系统调用。

● 在kernel/sysproc.c中添加一个sys_strace( )函数,通过在proc结构的新变量中记住其参数来实现新的系统调用(请参见kernel/proc.h)。从用户空间检索系统调用参数的函数在kernel/syscall.c中,您可以在kernel/sysproc.c中看到它们的使用示例。

● 修改fork( )(参见kernel/proc.c)将跟踪掩码从父进程复制到子进程。

● 修改kernel/syscall.c中的syscall( )函数以输出跟踪输出。您需要添加一个syscall名称数组来索引到其中。

实验参考步骤

步骤1:用户接口代码的修改

(1) 在user/user.h中添加系统调用函数的定义。

图片

(2) 在user/usys.pl中添加入口entry("trace")。

图片

在make时会调用usys.pl生成user/usys.S汇编程序。在该汇编程序中,每个函数有五行,其中有三条指令,其功能是将系统调用号通过li(load imm)存入a7寄存器,之后使用ecall指令进入内核态,最后返回。

make后user/usys.S中将出现下图中.global trace开始的5行代码。

图片

步骤2:内核代码的修改

(1)在kernel/syscall.h中定义系统调用号。

图片

(2)在kernel/syscall.c的syscalls函数指针数组中添加对应的函数。

图片

在syscall函数中,可读取trapframe->a7获取系统调用号,之后根据该系统调用号查找syscalls数组中的对应的处理函数并调用。

图片

(3)在proc结构体中添加一个trace_mask字段,之后在创建子进程的fork函数中复制该字段到新进程。

kernel/proc.h

图片

kernel/proc.c

图片

(4)系统调用sys_trace的实现。在sysproc.c中添加函数uint64 sys_trace(void),该函数通过argint函数读取参数赋值给mask变量,然后与trace_mask字段位或即可。

图片

(5) 修改syscall函数,当系统调用号和trace_mask匹配时输出相关信息。

图片

注意上图中的黄线处的syscall_name[num],这个需要定义。如下图所示。

图片

步骤3:编写应用工具(注:源代码中已提供)

user/trace.c

图片

步骤4:修改Makefile,将$U/_trace添加到Makefile的UPROGS中。

步骤5:make qemu,然后测试。

图片

2. Sysinfo (难度:中等) 

任务:增加一个sysinfo系统调用,它收集有关运行系统的信息。该系统调用有一个参数,即指向结构sysinfo的指针(参见kernel/sysinfo.h)。内核为该结构的各个字段赋值:设置freemem字段为可用内存的字节数,设置nproc字段为状态是非UNUSED的进程数。实验提供了一个测试程序sysinfotest,如果输出“sysinfotest:OK”,则该任务通过。

提示:

● 将$U/_sysinfotest添加到Makefile的UPROGS中。

● 运行make qemu,user/sysinfotest.c将无法编译。添加系统调用sysinfo,步骤与前面的trace系统调用相同。要在user/user.h中声明sysinfo( )的原型,预先声明struct sysinfo的存在:

struct sysinfo;

int sysinfo(struct sysinfo *);

● 修改上述编译问题后,运行sysinfotest将会失败,因为你尚未在内核中实现系统调用。

● sysinfo需要将struct sysinfo复制到用户空间,请参阅sys_fstat( )(kernel/sysfile.c)和filestat( )(kernel/file.c)以获取如何使用copyout()执行此操作的示例。

● 请在kernel/kalloc.c中添加一个函数,收集可用内存量。

● 请在kernel/proc.c中添加一个函数,收集进程数。

实验参考步骤

步骤1:用户接口代码的修改

(1) 在user/user.h中声明struct sysinfo的存在。(注:struct sysinfo在kernel/sysinfo.h中定义。

(2) 在user/user.h中添加系统调用函数的定义。

(3) 在user/usys.pl中添加入口 entry("sysinfo")。

在make时会调用usys.pl生成user/usys.S汇编程序。在该汇编程序中,每个函数有五行,其中有三条指令,其功能是将系统调用号通过li(load imm)存入a7寄存器,之后使用ecall指令进入内核态,最后返回。

make后user/usys.S中将出现下图中.global sysinfo开始的5行代码。

步骤2:内核代码的修改

(1)在kernel/syscall.h中定义系统调用号。

(2)在kernel/syscall.c的syscalls函数指针数组中添加对应的函数及函数名。

(3)freemem()函数的实现。

阅读kalloc和kfree两个函数可知,kmem.freelist是一个保存了当前空闲内存块的链表,因此只需要统计这个链表的长度再乘以PGSIZE就可以得到空闲内存。(注:kalloc和kfree两个函数在kernel/kalloc.c文件中。)

在kernel/defs.h中声明freemem函数。

在kernel/kalloc.c中添加freemem函数。

// get free memory
uint64
freemem(void)
{uint64 counter = 0;struct run *r;acquire(&kmem.lock);  // 上锁r = kmem.freelist;    // 空闲块链表while(r){    // 遍历空闲块链表,统计空闲块块数r = r->next;++counter;}release(&kmem.lock); // 释放自旋锁return counter * PGSIZE; // 返回空闲存储空间大小,单位字节(B)
}

(4)nproc()函数的实现。

阅读procdump和相关代码可知,xv6的进程结构体保存在proc[NPROC]数组中。而proc->state字段保存了进程的当前状态,有UNUSED、SLEEPING、RUNNABLE、RUNNING、ZOMBIE五种状态。因此只需要遍历这个数组,统计state不是UNUSED状态的就行了。

在kernel/defs.h中声明nproc函数。

在kernel/proc.c中添加nproc函数。


// get number of proc
uint64
nproc(void)
{uint64 counter = 0;struct proc *p;// 遍历进程控制块,即OS课程中的PCBfor(p = proc; p < &proc[NPROC]; p++) { acquire(&p->lock);if(p->state != UNUSED) {++counter;}release(&p->lock);}return counter;
}

(5)系统调用sys_sysinfo的实现。在sysproc.c中添加函数uint64 sys_sysinfo(void)。该函数主要通过freemem和nproc两个函数来统计空闲内存量和进程数。首先在kernel/proc.c中添加头文件#include "sysinfo.h"

添加sys_sysinfo(void)系统调用代码。

 


// get sysinfo
uint64
sys_sysinfo(void)
{uint64 info; // user pointerstruct sysinfo kinfo;struct proc *p = myproc();if(argaddr(0, &info) < 0){return -1;}kinfo.freemem = freemem();kinfo.nproc = nproc();if(copyout(p->pagetable, info, (char*)&kinfo, sizeof(kinfo)) < 0){return -1;}return 0;
}

步骤3:编写应用工具(注:源代码中已提供了测试程序sysinfotest)

步骤4:修改Makefile,将$U/_sysinfotest添加到Makefile的UPROGS中。

步骤5:make qemu,然后测试。

         make grade

参考资料

[1] https://pdos.csail.mit.edu/6.828/2021/labs/syscall.html

[2] https://www.cnblogs.com/YuanZiming/p/14218997.html

http://www.jmfq.cn/news/4876453.html

相关文章:

  • 建设网站能解决什么问题/外包接单平台
  • 网站如何做抖音推广/公司推广文案
  • web需要学什么内容/百度seo排名优化
  • 买公司的网站/北京seo排名外包
  • wordpress做的好的网站/广东培训seo
  • 网站开发项目实战视频/青岛建站seo公司
  • 商务酒店网站建设/最新百度关键词排名
  • 给别人做网站/百度灰色关键词排名代做
  • 网站开发外包 价格/郑州网站策划
  • 做网站在线支付系统多少钱/制作网站费用
  • 重庆网站建设推广/网易疫情实时最新数据
  • 在线音乐网站开发php/亚马逊关键词工具哪个最准
  • 安徽省建设安全质量协会网站/湖北短视频seo营销
  • 做一手房做那个网站好/淘宝搜索关键词技巧
  • 吉安做网站公司/seo站内优化技巧
  • 网站建设制/外贸订单一般在哪个平台接?
  • 关于色彩搭配的网站/湘潭网络推广
  • 石家庄学做网站建设培训/营业推广的方式
  • 环境设计专业资料网站/班级优化大师怎么下载
  • 江门市住房和城乡建设部网站/排名优化价格
  • 大连网站建设选网龙/上海推广服务
  • 新闻cms静态网站模板/可以看任何网站的浏览器
  • 查询icp备案跟接入的网站/单页网站设计
  • 简单静态网站模板/dw软件怎么制作网页
  • 做彩票网站需要代购/免费注册个人网站不花钱
  • 网站后台更新 前台看不到/网站开发软件
  • 哪里做网站做的好/优化推广关键词
  • 定制高端网站的公司/郑州网站优化渠道
  • 介绍小说的网站模板下载/自己怎么做游戏推广赚钱
  • 1688阿里巴巴批发网官网/海外seo