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

网站的优化seo成都百度搜索排名优化

网站的优化seo,成都百度搜索排名优化,旅游的网站怎么做,做ppt到哪个网站找图片文章目录 前言其他篇章参考链接0. 前置准备1. System call tracing (moderate)简单分析Hint 1Hint 2Hint 3Hint 4Hint 5测试 2. Sysinfo (moderate) 前言 好像没啥前言 其他篇章 环境搭建 Lab1:Utilities 参考链接 官网链接 xv6手册链接#xff0c;这个挺重要的#xff… 文章目录 前言其他篇章参考链接0. 前置准备1. System call tracing (moderate)简单分析Hint 1Hint 2Hint 3Hint 4Hint 5测试 2. Sysinfo (moderate) 前言 好像没啥前言 其他篇章 环境搭建 Lab1:Utilities 参考链接 官网链接 xv6手册链接这个挺重要的建议做lab之前最好读一读。 xv6手册中文版这是几位先辈们的辛勤奉献来的呀再习惯英文文档阅读我还是更喜欢中文一点开源无敌 官方文档 0. 前置准备 很惭愧以前github用得少这一步折腾了老半天我再说一遍我个人的开发流程——先在windows下git一个本地仓库然后用VS编辑写完后git push上去在WSL的对应地方git pull下来然后编译运行。 前面环境配置中我为了连接到我个人的远程仓库是直接把原本的远程仓库删了的然后lab1做完做到lab2发现这个lab整体不是循序渐进的而是彼此分离的每个实验需要选择相应的分支因此就要重新弄一下 git remote add base git://g.csail.mit.edu/xv6-labs-2022git fetch basegit checkout syscallgit push --set-upstream origin syscall当然别忘了加.gitignore 1. System call tracing (moderate) 简单分析 gdb教学我就不说了看看这个task。 先简单研究一下我们需求的这个trace是干什么的吧trace顾名思义tracing追踪、寻迹的意思比如ray tracing就是光线追踪这个命令接受一个传参mask内涵是一个掩码每一位对应一个系统调用的一个序号比如传入32代表 32 1SYS_read2147483647 代表追踪所有syscall具体的这些值定义在了kernel/syscall.h里我们待会也会写 初步了解之后就写实现吧这个task按照hint的步骤来很清晰 Hint 1 Add $U/_trace to UPROGS in Makefile 首先添加makefile司空见惯了。 Hint 2 Run make qemu and you will see that the compiler cannot compile user/trace.c, because the user-space stubs for the system call don’t exist yet: add a prototype for the system call to user/user.h, a stub to user/usys.pl, and a syscall number to kernel/syscall.h. The Makefile invokes the perl script user/usys.pl, which produces user/usys.S, the actual system call stubs, which use the RISC-V ecall instruction to transition to the kernel. Once you fix the compilation issues, run trace 32 grep hello README; it will fail because you haven’t implemented the system call in the kernel yet. 然后说这个时候make会找不到trace我们要在用户态user/user.h里加上trace的声明根据原文 It should take one argument, an integer “mask”, whose bits specify which system calls to trace. 可知这玩意应该接受一个int然后返回也是一个int返回值其实不影响来着 然后我们在user/usys.pl下添加这么一行这里的意思是声明了一个trace系统调用的入口实际上这一段会为我们在usys.S中生成一段汇编代码。 然后在内核syscall.h中给它注册一个number Hint 3 Add a sys_trace() function in kernel/sysproc.c that implements the new system call by remembering its argument in a new variable in the proc structure (see kernel/proc.h). The functions to retrieve system call arguments from user space are in kernel/syscall.c, and you can see examples of their use in kernel/sysproc.c. 然后模仿着添加原型 这里简单解释一下后面这个syscalls数组可能很多人没有看懂这首先这是个static的不用说然后这是个函数指针的数组我一向很反感那些什么数组指针指针数组混着说的直接说成装指针的数组不就一目了然了吗函数返回值为uint64参数为void显然是为上面extern的那些函数准备的东西这些都比较简单后面的是个小feature了它本身叫作指派初始化器Designated Initializers来自C99意思就是给方括号里的那一位初始化为右边的值 但是可以看到C99的指派初始化器的形式是[N] expr的中间需要一个等号连接这里没有它是来自GCC私货原文出现在介绍指定初始化器的时候An alternative syntax for this that has been obsolete since GCC 2.5 but GCC still accepts is to write ‘[index]’ before the element value, with no ‘’. 意味着大家在自己使用时加个等号是更符合standard的写法。 然后叫我们仿照着kernel/sysproc.c里的其他函数给trace写一个定义进去 uint64 sys_trace(void) {return 0; }使用argint从寄存器取出用户传入的参数 int mask;argint(0, mask); // 保存用户传入的参数然后我们要把接到的这个mask保存到进程的元数据中根据原文Add a sys_trace() function in kernel/sysproc.c that implements the new system call by remembering its argument in a new variable in the proc structure (see kernel/proc.h). T 我们在kernel/proc.h中可以找到一个结构体struct proc 很显然这个结构体记录着一些元数据我们在这个基础上再添加一条承载mask的 int traceMask; // 用于接收trace的mask显然每一个进程都有一个独属于自己的proc对象我们可以通过myproc()来获取这个对象的指针就此我们可以完成我们的sys_trace定义 uint64 sys_trace(void) {argint(0, myproc()-mask); // 尝试从用户空间读取参数return 0; }Hint 4 Modify fork() (see kernel/proc.c) to copy the trace mask from the parent to the child process. 我们知道fork出的子进程会复制父进程的内存空间根据hint我们可以找到它的实现 可以看到这里明显是要做一个p到np的拷贝p指向的是父进程的proc对象np则应该是new proc的缩写了 我们这个mask的修改不需要持有锁因此只需要在alloc之后的合适时机将父进程的值赋出即可 既然提到了alloc这里刚好就可以想到一个问题——资源的分配与释放呢我们知道C语言访问未初始化变量的行为是UB那么我们默认状态下的mask进行初始化了吗在上面那张图里我们可以清晰地看到或者说猜到内核依赖allocproc分配内存依赖freeproc释放内存因此我们可以直接F12进去看一看实现 如图我们可以很容易地为mask初始化以及释放时赋0值。 Hint 5 Modify the syscall() function in kernel/syscall.c to print the trace output. You will need to add an array of syscall names to index into. 然后我们为syscall这个总体的函数实现我们的功能也就是前文中的那些打印 我们分析一下需要做的事情当我们进行了trace调用时我们应当追踪mask标记的所有调用并打印出4: syscall close - 0这样的内容不难看出打印内容分为三部分PID、系统调用的名称与系统调用的返回值其中pid我们可以通过读取proc来获取返回值实际在框架中都告诉你了 // and store its return value in p-trapframe-a0p-trapframe-a0 syscalls[num]();可以看到系统调用的返回值被保存在了寄存器a0中至于系统调用的名称呢C语言中没有反射我们就只好提前建立一张syscall的名称表再根据mask去寻址 // 系统调用的名称 static const char *syscallnames[] { [SYS_fork] fork, [SYS_exit] exit, [SYS_wait] wait, [SYS_pipe] pipe, [SYS_read] read, [SYS_kill] kill, [SYS_exec] exec, [SYS_fstat] fstat, [SYS_chdir] chdir, [SYS_dup] dup, [SYS_getpid] getpid, [SYS_sbrk] sbrk, [SYS_sleep] sleep, [SYS_uptime] uptime, [SYS_open] open, [SYS_write] write, [SYS_mknod] mknod, [SYS_unlink] unlink, [SYS_link] link, [SYS_mkdir] mkdir, [SYS_close] close, [SYS_trace] trace, };搞清楚并完成了所有前置工作我们就可以开始写逻辑了最后的syscall函数代码很简单 void syscall(void) {int num;struct proc *p myproc();num p-trapframe-a7;if(num 0 num NELEM(syscalls) syscalls[num]) {// Use num to lookup the system call function for num, call it,// and store its return value in p-trapframe-a0p-trapframe-a0 syscalls[num]();if ((p-mask num) 1) { // 判断系统调用是否被跟踪printf(%d: syscall %s - %d\n,p-pid, syscallnames[num], p-trapframe-a0);}} else {printf(%d %s: unknown sys call %d\n,p-pid, p-name, num);p-trapframe-a0 -1;} } 测试 到这里就基本完成了还是老规矩我们make qemu编译然后试一试文档中的几个命令 trace 32 grep hello READMEtrace 2147483647 grep hello READMEgrep hello READMEtrace 2 usertests forkforkfork # 这一条输入之后貌似要等一会才会出一大坨… 最后跑一下总体批分./grade-lab-syscall trace 成功通过 2. Sysinfo (moderate) 然后让我们来完成一下task2这个是也是添加一个系统调用叫sysinfo 我们先搞清楚这个调用是干啥的从介绍可以看到这个sysinfo接收一个struct sysinfo的指针我们就是要写这个指针指向的对象怎么写呢就是将空闲的字节数存到对象里的freemem字段将state不为UNUSED的进程数量写到nproc字段。 有一个初步的印象后就可以去写实现了整体思路和上文trace的步骤差不多 首先是增加$U/_sysinfotest\到Makefile: 在user/user.h里加声明 syscall.h中 syscall.c中第三个是上面的那个名称表
http://www.zqtcl.cn/news/923967/

相关文章:

  • wordpress+vps建站大连网站建设运营
  • 第一次开票网站建设怎么开制作网站品牌公司哪家好
  • 医疗机械网站怎么做什么是o2o电商模式
  • 北京微网站建设设计服务营销导向的企业网站建设步骤
  • 网站 301网站设计评价标准
  • 网站页面设计规范大连装修公司哪家好
  • 祁东网站建设微信公众号做的网站
  • 火山开发软件可以开发网站吗盐城代运营
  • 网页制作与网站建设从入门到精通民宿客栈网站制作
  • 如何写手机适配网站自己做的网站能上传到凡科吗
  • 建设公司网站开发方案seo优化工具的种类
  • 没备案的网站怎么做淘客企业做网站服务费
  • 网址站点异常怎么解决机关单位建设网站 说明
  • 阿虎手机站青岛关键词排名系统
  • 西安网站建设聚星互联网站成功案例
  • 山东鲁为建设集团网站百度的合作网站有哪些
  • 电子商务网站建设与管理程序设计题6哪家微网站做的好
  • 网站建设图文片平面网页设计是什么
  • 域外网站宁波建设监理协会
  • 胶州网站建设公司哪家好wordpress怎么改标题
  • php网站开发综合案例免费注册推广网站
  • 邯郸做网站的地方广州网站制作
  • 企业网站制作公司24小时接单郑州手机网站推广外包
  • 接做施工图的网站手机移动网站模板
  • 做网站月薪资多少钱如何打开微信小程序
  • 免费建站网站一级大录像不卡在线看网页无锡网站排名提升
  • 无锡门户网站制作服务郑州艾特网站建设
  • 建设网站 万网网页设计表单代码模板
  • 网站速度查询app开发模板网站
  • 国外案例网站做电商网站有什么用