Dev_lzf - LiZhiFeng1111111/proj241-PA_for_LA GitHub Wiki

4.22

sdb简易调试器:

扫描内存实现

求出表达式EXPR的值, 将结果作为起始内存地址, 以十六进制形式输出连续的N个4字节。

pro问题:

  1. 如何访问客户计算机的内存数据 。
  2. 如何将获取的字符串分割并提取出我所需要的字符。
  3. 如何将获取的字符转化16进制和10进制。

思考过程:

  1. 通过RTFSC时,可以看到memory目录下有两个paddr.c和vaddr.c,其中是否有访问计算机的内存数据的函数!
  2. 参考cmd_si单步执行中strtok函数。
  3. C的标准库中应该进制转换的函数,可以去找找看。

debug过程:

解决方法:
  1. 通过查看memory目录下的paddr.c文件,找到了paddr_read()函数,这是一个可以访问计算机内存数据。
  2. 通过查看C标准库的方式,寻找到strtok()的使用方法和sscanf()将读入字符串转为需要的进制数

4.23

Git 多人远程协作流程:

解决问题:

解决思路:
  1. 主导成员需要创建一个git 仓库,在git仓库中放置工程代码,成员需要从git仓库中git clone下工程项目。

  2. 当成员将工程项目git clone到自己本地时,本地下有一个主支(比如说main),而我们是不能在main上进行一个工作的。需要开辟一个自己的分支,在分支上干活。

  3. 每次在我们干活之前,需要在主支(main)上进行同步其他成员的进度,也就是使用命令:git pull orgin main (同步远程仓库的信息),查看其他成员实现的哪些功能。然后进入到自己创建的分支上,如果没有问题就进行主分支同步,使用命令git merge main(主支)。

  4. 在进行主分支合并之后就可以继续做自己分支的活,完成功能后,就可以通过(git add 修改过的文件名 ) 添加修改过的文件,(git commit -m "提交信息"),(git push orgin 自己分支名) 将本地更新的分支推送到远端的分支。

  5. 最后由主导人,在远端查看你推送的分支更新,再是否决定合并你的分支,更新整个主支的状态。

提出问题:

虽然师兄说git pull orgin main 是用于更新当前所处分支的状态,但我的想表达的意思就是图上文字所描述的。所义这部分文字的正确性有待商榷。

git命令

pro问题:

由于对git poll 指令的不熟悉以及对于整套开发流程的模糊性,无法拉取最新的主线状态,所以几乎浪费了一整天的时间在研究git命令上。

解决方法:

在与yz的研究讨论下,逐渐理解整套开发流程。由于之前拉取命令导致了各种错误不得不将整个文件删除,重新到gitlab上git clone最新的主线状态下来,然后在yz的帮助下合并主分支,然后推送到远端,在这感谢yz和师兄的指导,才将问题顺利解决

4.24

简易调试器sdb: 监视点实现

pro问题:

  1. 如何知道监视点结构体还需要哪些成员变量。

  2. 如何正确实现监视点管理的两个函数WP* new_wp()和void free_wp(WP *wp)。

  3. 如何使程序遇到设置的监视点就实现停下来的功能。

思考过程:

  1. 通过了解监视点工作原理,添加记录监视点信息的成员变量expr,监视点原来的值old_value 以及可能因为某些程序错问题,而导致监视点变化成新的值new_value。

  2. 通过复习链表的增删查改,从中获得这两函数编写的思路。

  3. 通过RTFSC和读文档,知道了每当cpu_exec()的循环执行完一条指令, 都会调用一次trace_and_difftest()函数,那么只需要通过在trace_and_difftest()实现一个扫描监视点设置位置的值是否改变的功能就好了。

解决问题:

  1. 通过了解监视点工作原理,简单的设计实现了。

  2. 通过复习链表增删查改后,实现了这个两个函数,以及创建监视点和删除监视点函数。

提出问题:

  1. 问题3未解决,由于需要在cpu/cpu-exec.c 中的trace_and_difftest()函数添加扫描监视点功能,所以我需要将sdb下添加的watchpoint.h 这个头文件引入到cpu/cpu-exec.c,但 是尝试多次都以无法链接到wp_pool这个结构体数组失败告终。

  2. 虽然实现了监视点的增删改查,但是功能有点bug, 只能从1号监视点往后开始删除,一旦删除0号监视点就会直接触发assert(0)。

感想:

监视点的实现对于提高链表的熟悉度有较大的提升,虽然出现挺多bug的。但是明天会尽力调试好,然后git push。

4.25

简易调试器sdb:监视点代码调试

解决问题:

  1. 昨天想要在cpu/cpu-exec.c下使用wp_pool这个监视点池。但是后来发现实现监视点的思路出了点问题,我需要扫描的不是监视点池,而是组织监视点的链表。通过扫描链表中每个 监视点的expr经过表达式求值是否等于value(原来的值),来判断每次执行程序前监视点值有没有变化,如果发生变化,就停止运行。所以后面在程序watchpoint.c中实现了check_watchpoint()这个函数来扫描监视点。

  2. 还有一个bug就是删除监视点只能从1号监视点往后删除这个问题也解决了,是由于删除功能没有使用一个工作指针来进行操作,每次删除都直接使用头结点进行操作,代码看似能运行但是全是bug。设置了工作指针来操作链表,问题就解决了。

4.26

反汇编器的部分指令实现

解决问题:

通过阅读龙芯指令集的手册,查看了龙芯架构32位指令编码格式。实现的几条基本指令的反汇编。

提出问题:

为了能证明后面添加的反汇编指令是正确的,想进入dummy中测试看看添加的指令是否是正确的,但是后来发现编译不了,原因是缺少编译和安装支持 LoongArch 的 GCC 和 Binutils。

自省:

有点浮躁和抱有侥幸心理了,watchpoint的测试本来就有点问题,但还是push了上去。这是态度问题,应该踏实做好再提交的,哪怕会花多点时间。还是时刻警醒自己不要抱有侥幸心理。

4.27

简易调试器:监视器调试

解决问题:

通过设置标志位flag来处理由于设置监视点前后值发生变化,nemu变成暂停状态的情况。这样在执行后面的指令的时候才不会因为每次执行前扫描监视点设置的值前后不一致而进入暂停状态。

感想:

这个星期最大的笑话就是花了差不多一个星期写监视点,到最后展现出来的确是不知道自己监视的是什么,真是可笑。拜托长点心吧。

4.28

la反汇编器完善

解决问题:

  1. 通过查看loongarch32r的精简指令集整型指令集的这一章节,编写了代码使得la反汇编器识别大部分的整型指令(自己以为的实现,还没有经过测试)。

  2. 重新查看监视点的实现代码,发现昨天的设计思路出现了问题,重新修改了代码。

提出问题:

  1. 今天在完善反汇编器的整形指令时候需要实现了识别NOP指令,但是我在指令码表没有找到这个NOP的指令,反回去看手册,发现它是ANDI的别名,不知道这里的别名是否和RISCV32中的伪指令意思一样。

  2. 在完善反汇编器时,有几条指令有关符号位和移位操作的,不太会实现这几条指令,所以明天打算和yz商量商量。 奇怪的指令集 2024-04-28 194004

感想:

感觉自己的效率还是有点低,本来今天应该完成的任务由于专注度不太够而拖到第二天,希望接下来能更专注一点,效率再高一点,毕竟PA3才是大头(完全没做过,连文档还没看过)。

4.29

loongarch32r工具安装

提出问题

  1. 在安装loongarch32r工具链,使用submodule update出现的报错 loongarch32r工具链安装失败

解决问题

  1. 进入子模块目录 cd src/1a32r-Linux。

  2. 运行以下命令以重置子模块到远程仓库的master分支: git reset--hard origin

  3. 返回到主项目目录。运行以下命令以添加子模块更改并提交: git add src/la32r-Linux git commitm"Update submodule:src/la32r-Linux"

  4. 运行以下命令以更新子模块: git submodule update --init-recursive

4.30

loongarch32r反汇编工具完善和测试

解决问题:

  1. 通过查看loongarch32r的精简指令集特权指令集的这一章节,使得反汇编器在原来能识别整型指令集的基础上更进一步,能识别特权指令。

  2. 通过编写测试的16进制机器码,测试出大多数整型指令能够识别成功,当然也查出漏掉的指令。

感想:

通过编写反汇编器的这个过程,体会到一个工具从编写到上线使用这个过程需要经过几经波折,也意识到工具正确性对于项目的重要性。

5.1

loongarch32r反汇编工具测试完成(太奇怪的指令没试过)

解决问题:

今天通过不断把16进制机器摁怼进去测试,测试反汇编工具。虽然师兄讲了一个用makefile的方法,可以写一堆汇编指令,然后使用汇编器它们都编译成机器码怼到nemu中测试,但是那个方法我还是不太会,琢磨了半个小时最终决定使用自己之前的笨蛋方法,测试过程遇到不少指令无法识别的问题,通过回去修改写好的源码,最终解决了。

提出问题:

  1. git commit 可能会很奇怪,因为我不是交加识别汇编器的指令后加的commit,每一次的commit都是代表我写的指令通过测试,这里需要说明一下,可能师兄需要的不是这样的效果,但我后面真的测试不动,有点头晕目眩感觉快寄了,尽力了。

  2. 通过copy之前写好的两个工具iringbuf和matrce发现之前写的代码存在问题和错误。

  3. 虽然我测试完成反汇编器,可以识别基本的代码,但是我还是对自己写的东西抱有怀疑的。

感想:

今天算是比较充实,虽然好像没干什么事情,但也没浪费时间在别的东西上,专注于把比赛搞好,希望明天能把指令加完吧,后面的任务还是比较重的,我可能真的需要帮忙,加指令凭借我一个人的能力是一定完成不了的。加油,努力把所剩的比赛做好。

5.2

loongarch32r指令集

解决问题:

通过完成反汇编器和loongarch32r的工具链,在本地能把dummy跑起来了。但是在虚拟机上确实安装不了,头疼,看师兄和yz一直在连轴转8个小时还没解决,人都麻了。而我这边出现的问题也不少,就算dummy跑了起来以及指令实现并能识别出,跑dummy最后的结果确实HIT bad trap, 这表明指令实现得有问题,初步推出是BL和Jirl指令的实现有问题,但是已经反复检查几次了,还是没有查出问题所在。

感想:

人已经被这个工具链整麻了,指令实现也不知道是哪里出错了,今天是混沌的一天。希望明天问题能查出并解决。

5.3

loongarch32r指令集添加指令

解决问题:

通过查看loongarch32r的指令集,再加上使用反汇编器作用下,不断地添加指令。

提出问题:

  1. 在今晚和师兄以及yz的讨论下发现很多指令实现得有不少的问题,对于立即数的处理和扩展指令码的SEXT函数理解不过深刻,导致实现错了非常多的指令。
  2. 在这个学习加指令的过程,暴露我自身的弱点:调试能力,由于过于弱的调试经验,使得我无法锁定问题所在,即使锁定了问题,也不知道怎么解决。

感想:

参加这种高质量的比赛能锻炼各个方面的能力,目前暴露出的正是我的缺点:编写代码能力弱,逻辑混乱,调试能力差。希望在接下来的比赛里能逐步改善这些问题。

5.4

loongarch32r指令集添加指令以及visual code 连接虚拟机

解决问题:

由于在虚拟机上开发的过程比较卡,所以在本地的visual code中安装了一个ssh的插件,使得本地的visual code可以连接虚拟机进行开发工作。之前是由于虚拟机中没有安装ssh,所以导致连接不上,通过查看文档配置ssh就能够连接上了。

提出问题:

对于添加loongarch32r指令集,虽然说忙活了半个下午,但是确只跑通了5,6个tests,目前看错误好像是来自访存指令,希望明天test能全部跑通吧。

总结:

对于指令的理解还是不够透彻,效率蛮低的。

5.5

loongarch32r指令集添加指令以及qemu-difftest的安装

解决问题

  1. 通过修改跳转指令imm16()立即数获取错误的问题,解决了部分由于跳转指令不能够执行的test。
  2. 通过安装qemu模拟器开difftest(差分检测器),检测出了原本能跑通的指令存在本质的错误,有几条跳转指令还是没有实现。

总结:

还是得开difftest,它很从根源帮我们检测出很多隐藏的错误,但是qemu-difftest的整个安装流程并没有梳理,明天有时间就需要通过文档把这个过程记录下来,最近还是有点太依 赖师兄他们了,这些工具的配置我应该自己摸索清楚搞好的,后面尽量做好自己的工作,不给别人添麻烦。

5.6

loongarch32r指令集添加指令完毕

解决问题:

  1. 通过和zy讨论下解决了跳转指令,访存指令的问题。其实有几条指令解决得挺迷的,通过不断地试错并且结合手册解决(感觉手册也有点怪怪的)。
  2. merge的时候出现了不少问题,导致跳转指令的实现被全部覆盖了,下次merge前还是先看清楚吧

提出问题:

本来还有几条指令实现得有点问题,但是晚上合并了师兄最新的分支,报错就不见了。。。。虽然师兄说他把我的狮山代码改了改了,但是我合并分支后感觉和我今天写的指令格式大相径庭。感觉好奇怪啊。

感想:

测了今天一天下来,原本以为得晚点睡解决这个报错的问题,但是好像解决得莫名奇妙。

5.7

loongarch32r指令集添加

解决问题:

  1. 通过反复查看loongarch32r指令集以及不断gpt的方式, 解决了ld这一类访存指令带来的测试不通过的问题。解决问题核心是ld这类指令的扩展符号需要多少位必须清楚。

提出问题:

  1. loongarch32r仍然有一个bug没解决,晚上在和师兄的讨论中意识到好像是mul.w这条指令导致,牵扯到了long long这个问题,我有点没意识到问题的所在,还得多思考。

感想:

还有最后一个bug,整体把指令集的test测下来,发现其实自己是一个很粗心的人,很多细节没注意导致报错,后面做项目还是得细心一点。

5.8

输入输出设备

提出问题:

  1. CPU和设备之间的接口, 究竟是什么?

    1. 既然设备也有寄存器, 一种最简单的方法就是把设备的寄存器作为接口,让CPU来访问这些寄存器比如CPU可以从/往设备的数据寄存器中读出/写入数据, 进行数据的输入输出。
    2. 可以从设备的状态寄存器中读出设备的状态, 询问设备是否忙碌; 或者往设备的命令寄存器中写入命令字, 来修改设备的状态。
  2. 设备如何访问自己的寄存器?

    1. 给这些寄存器编个号, 比如eax是0, ecx是1。
    2. 在指令中引用这些编号, 电路上会有相应的选择器, 来选择相应的寄存器并进行读写。

解决问题:

1.通过查看文档大致构建出外设如何运行的基本框架以及对键盘的实现有了一些理解和看法。

外设的实现

感想:

既然自己对外设的基本运行的流程有了一定理解那就试着实现,需要提高效率,毕竟时间不等人。

5.9

输入输出设备

解决问题:

  1. 简单实现了时钟,键盘两个设备。

提出问题:

  1. 时钟,键盘与cpu交互函数虽然写好了,但是还有bug,今晚和yz定位到问题在串口传输。
  2. 真是奇怪了,通过看文档能得知基于Loongarch32r架构下是支持MMIO的,串口的实现是通过MMIO(内存映射I/O)或端口映射I/O(也就是通过寄存器映射I/O)。换言之,我们是不需 要实现串口,nemu已经帮我们实现了,但是今天晚上和yz的讨论下却定位到串口,看来是我理解得有点问题。

感想:

三个臭皮匠赛过诸葛亮,我或许找到了提高效率的方法,那就是多和人讨论,这样才能更快的把思路打开,定位到问题。

5.10

输入输出设备

解决问题:

1.实现VGA,键盘,时钟,串口这四个外设。

感想:

1.今天最搞笑的事情就是在找bug,我一直认为loongarch32r对于MMIO有进行一个挖坑的操作,我需要自己填坑才能真正实现外设。后来在与师兄他们的讨论中发现,其实程序写的是没有问题的,但是测试程序正确性的方式错了,有点嘎嘣住了,最近几天的功夫没有白费,准备进入下一个阶段,PA3冲。

5.11

对于操作系统初理解的文档编写

完成任务:

1.通过查看pa3文档以及集合之前学习rcore的知识编写对操作系统初步理解的文档 以下是文档链接:https://ebsidb6m9g.feishu.cn/wiki/Gc3HwErquiK5yCkO7PXcdN5jnWe?from=from_copylink

提出问题:

1.yz的外设能运行,但是VGA没显示出来,奇怪的现象。没关系,刚好可以研究一下那个VGA屏幕是怎么产生的。

感想:

1.之前学习rcore得出的一点对操作系统的理解应该会帮助到做pa3,操作系统的谜团已经逐渐被拨开。

5.12

对于nemu框架代码的分析

完成任务:

1.通过查看pa文档以及查阅网上资料完成了nemu框架代码文档的编写

提出问题:

1.对于整个nemu的启动和构建的理解还有待提高,文档需要继续完善

感想:

1.虽然师兄说我们后面可以慢慢做,但是针对于我个人,我认为还是得需要抓紧点进度。

5.13

对于nemu键入ctrl+c退出背后的程序

完成任务:

通过观看一生一芯分享会有关于nemu部分的vidio,了解了有关nemu键入ctrl+c退出程序背后的操作,编写了相关内容的文档。以下是文档链接: https://ebsidb6m9g.feishu.cn/wiki/D1nFwn0AFi5QrNk80Fscq9j6nph?from=from_copylink

提出问题:

由于yz运行nemu的外设时一直无法出现运行VGA的框,师兄说的缺少某个依赖包才会导致这种现象,我搜索了需要支持sdl库的依赖,但是yz安装我提供的所需的依赖之后,nemu却无法运行正常运行程序。这令我感到匪夷所思,或许la32r工具链和qemu的问题,但是晚上重新安装qemu后还是无法运行,晕。

感想:

感觉今天研究pa的方向大体上有点偏离的主线,但是学到一点有关操作系统的知识总归是好的,最近两天感觉没有师兄push有点松懈了,这两天需要调整心态把pa3之前的基础打牢固了(之前准备比赛一堆作业没写,在狂补作业),计划星期三进入pa3。

5.14

对于基于AM裸机的运行过程分析

完成任务:

通过疯狂gpt理解AM中makefile,深刻理解了AM是如何通过交叉编译构建出来,但是我还是低估了AM的makefile的复杂程度,应该说是它的奥妙, 以下是编写的文档链接:https://ebsidb6m9g.feishu.cn/wiki/CmANwfLV4ipZnWkNtCzcYFffn9f?from=from_copylink

提出问题:

  1. 对于交叉编译后的用户程序可执行目标文件存放在何处,以及传入二进制文件的细节还没搞太懂。
  2. 在trm.c中调用主函数时传入的mainargs的作用非常的疑惑。

感想:

今天分析AM的makefile确实深刻理解nemu运行背后的细节,理解PA文档将运行时环境封装成库这句话,但是文档编写的重点不够突出,有些细枝末节不需要扯太多,这也是我写文档花费时间多的问题,而且在意这些细节很有可能会导致研究的重点偏离中心,感觉今天写的这片文档体现出的效果不太好。

5.15

初次探寻nemu的异常处理机制的奥秘

完成任务:

通过学习一生一芯项目中有关于nemu异常处理的这块内容,编写异常处理笔记,以下是飞书文档链接: https://ebsidb6m9g.feishu.cn/wiki/USztw8toDiJG5bkJKawcOPw3nKc?from=from_copylink

感想:

今天中午师兄给我们开会时就已经给我们打好了预防针,说是loongar32r的PA3.1部分较为困难。所以除了编写核心的四个文档之外,我还去额外学习PA3.1中有关异常处理机制的那 部分内容。主要是想做足准备才进入PA3以免被劝退,课是没有听完的,但是觉得没有我想象中的那么困难(之前做rcore的时候也是这种感觉,一旦到写代码就原型毕露了),总的来说 还是觉得有趣的,核心实现思想还是抽象。

5.16

完善编写nemu的异常处理机制文档

完成任务:

通过学习完昨天有关于nemu部分异常处理的这块内容剩下的部分,对于异常处理有了一个比较清晰的内容,同时也完善了整个文档 以下是完善后的文档链接:https://ebsidb6m9g.feishu.cn/wiki/USztw8toDiJG5bkJKawcOPw3nKc?from=from_copylink

感想:

今天完成的任务虽然只有整理和完善之前写的文档,但是感觉还是收益匪浅。但是不可否认的是今天的效率不是特别高,精神不够集中,头有点晕乎乎的。还是得休息好再说吧,明天 计划把外设那部分内容给写完,将nemu在AM上的运行过程全部打通,这样做pa3时应该会比较清晰,师兄给我们安排这四篇文档的初衷也应该是这样,pa3爷来了。

5.17

IOE外设文档的编写

完成任务:

通过查看PA文档和一生一芯有关外设实现的那部分内容编写了外设实现的文档,但这次编写的文档牵扯到了一些别的东西,所以文档的重心(外设构建的makefile以及实现的难点)还没 有编写完成,以下是文档链接:https://ebsidb6m9g.feishu.cn/wiki/WdsDwlEcqiMEMzkrKOjcfjdDnKd?from=from_copylink

感想:

最近效率有点低,本来今天要完成任务估计要拖到明天了,有点难受,但是写这个文档还是学到东西的。

5.18

初次探索PA3.1

提出问题:

今天在尝试写pa3的开始就遇到问题,还没正式写代码就开始debug,啊这。我在Nanos-lite下跑loongarch32r-nemu,原本正确的现象应该是输出Nanos-lite的logo.txt然后输出Hello World!' from Nanos-lite和buil time等信息,虽然logo是输出出来了,但是却出现了访问了内存错误的问题,通过gpt显示这段内存不在我可以访问的区间,通过debug发现出现错误的地方是在jirl指令处,仔细看这条指令的实现应该没有什么问题,而且通过查看手册发现这还是一条特别的指令,是用于返回函数调用处,毕竟通过difftest的测试。但是显示我内存访问出错这是真实存在的问题,这到底是实验的一部分还是我指令出问题了呢,在思考中。 image image

感想:

刚开始pa3就进入debug,真崩不住了,不过可能应该是之前的指令写的有点遐思diffitest没有检测出来,但是细想一下应该不可能啊,简直匪夷所思,这难道是实验的一部分?

5.19

持续探索PA3.1

完成任务:

昨天找了半天的bug都没有解决,今天在师兄的提示下,尝试了从另一种解决思路入手顺利解决了昨天的bug,并不是指令集jirl的问题,出问题的是printf这个函数。是由于打印的图标超过了数组的大小导致的越界,并不是jirl指令跳转到未使用的内存地址这个错误。还有一个bug是出错在我的printf没有实现打印%p数据导致的错误,通过实现这个功能也顺利解决掉了这个bug可以正确运行程序了。也编写了有关异常处理的相关代码,但是目前还没实现。

提出问题:

解决之前无法在Nanos-lite上跑loongarch32r-nemu的问题后。编写异常相关代码后又开始debug,问题定位到isa_raise_intr()这个函数上,虽然之前编写了有关异常处理的文档以为自己应该能快速解决这一章的内容,事实上还是在写bug。

感想:

我算是明白了,写PA3就是不断debug,虽然已经做好了心理准备,但是真正在写的时候还是很难崩。继续加油吧,明天又是开始debug。

5.20

巩固PA3.1,浅尝PA3.2

完成任务:

  1. 今天通过结合文档以及源码初步实现PA3.1,昨天出现bug的原因是处理异常后没有跳转到自陷指令的下一条指令处,导致程序一直处于处理异常中无法跳出。通过查看文档修改 trap.s 的代码,将自陷指令的pc+4保存进入栈中,在处理完异常后,恢复上下文返回到自陷指令的下一条指令处,程序得以跳出。但似乎这个异常处理在师兄看来还是存在问题,继续 尝试修改吧。
  2. 然后今天也浅尝PA3.2的加载,并写下了笔记,以下是文档链接: https://ebsidb6m9g.feishu.cn/wiki/MVWVwojzgirFoAk9pYLcfCzhnec?from=from_copylink

感想:

总体来说,今天的收获还行,PA3是有趣且富有难度的。但是时间比较紧迫,我只能快马加鞭,但也需要体会代码之间的奥妙和趣味,解开迷雾的过程真的很有意思。继续加油,希望明天能够把加载这个过程完成,以及查看说异常处理的问题所在。

5.21

初探PA3.2

完成任务:

  1. 通过在进入异常前加入上下文调试信息,发现了上下文保存错位的问题(estat和 era两个寄存器在context里的先后顺序搞错了),顺利解决异常的bug。
  2. 通过读手册和查看源码初次理解加载的含义,但是由于是初次了解加载,对于load的实现还是一脸懵逼,尝试把实现思路写在了加载的文档中,但是感觉上思路不太对,还在持续思 考。

感想:

初次理解加载的含义,对于编写loader的实现代码无从下手,捣鼓了半天感觉思路好像还是错的,有点难崩。本来计划今天把这个加载器搞完的,但是奈何难度有点大,需要延时到明天了,计划23号把系统调用搞完写文档,最近得加班了,开冲。

5.22

持续探索PA3.2

完成任务:

  1. 今天通过查看yz的文档以及和zl的讨论中,初步实现loader,程序似乎是加载进入loongarch32r-nemu中了,但是触发了一个报错,是一个 数组越界的问题,只能继续debug了,问题可能是出在加载进的指令有问题。
  2. 通过git pull师兄的程序来查看师兄是如何实现异常的,整体思路和师兄的差不多,有关pc+4的操作和师兄的不同,我是修改trap.s中的汇编 代码保存上下文的era的时候让era寄存器+4来实现恢复上下文后跳转到异常的下一条指令,而师兄是在cte.c中编写处理完异常后让c->era +=4; 使得程序跳转到异常的下一条指令。

感想:

起初靠自己来理解整个加载的过程还是比较痛苦的,通过zy的文档和zl的讨论把过程捋清楚了不少,也初步实现了。剩下的就是看哪里加载的有问 题了,关于提pr由于loader没写完,就没提,但是pull下来后处理完冲突了,有关PA3.1的代码按师兄覆盖他的,今天就是这样,距离比赛完结也 快了,有点压力。

5.23

持续探索PA3.2

完成任务:

  1. 通过昨天与zl的讨论,今天对loader进行改进,成功将ramdisk.img加载,实现了loader。
  2. 通过查看文档和源码,初步实现了系统调用,从程序的逻辑上看好像实现的没什么问题,再深入了解一下看实现的有没有错。

感想:

明天开始认真投入文档的编写了,项目代码的推进先停一会。

5.24

编写IOE实现文档

完成任务:

  1. 通过阅读文档和源码编写IOE的实现文档,完成了大体编写,还剩VGA的实现部分没有编写完成。 以下是文档的链接:https://ebsidb6m9g.feishu.cn/wiki/WdsDwlEcqiMEMzkrKOjcfjdDnKd?from=from_copylink

感想:

今天不知道为什么莫名其妙的中暑了,休息了很久才开始编写文档,由于距离实现外设的代码过去了一段时间,印象有点模糊,理解和编写文档的过程花费蛮长的一段时间。今天还是早点休息,明天把剩下该写的文档完成,无奈....果然身体是革命的本钱。

5.25

编写完成IOE文档

完成任务:

1.完成编写IOE外设实现文档

感谢:

好好休息,准备开肝,距离比赛结束还有5天。

5.26

编写文档

完成任务:

  1. 通过阅读源码和文档编写完成了loader实现的过程,以下是文档链接: https://ebsidb6m9g.feishu.cn/wiki/BPz6w1Ay1iZ3B3ko6IwcseU9nRb?from=from_copylink
  2. 通过阅读文档和makefile编写了游戏分析的过程,但是这个过程还不是很清晰,需要再捋一捋。以下是文档链接: https://ebsidb6m9g.feishu.cn/wiki/W7Jjwoydiiau7Kkj2W4ccqBRnVe?from=from_copylink

感想:

今天心情很郁闷,但完成了两篇文档的编写,使得心情好一点了,距离比赛结束还有4天,专注自己吧。

5.27

编写文档

完成任务:

  1. 编写完成分析游戏运行到nemu上的过程,以下是文档链接: https://ebsidb6m9g.feishu.cn/wiki/W7Jjwoydiiau7Kkj2W4ccqBRnVe?from=from_copylink
  2. 编写完成Nanos-lite启动过程分析,以下是文档链接: https://ebsidb6m9g.feishu.cn/wiki/Wt88wvqe2iuAoCkyW1uca6TXnod?from=from_copylink

感想:

距离比赛结束还有3天。

5.28

编写文档

完成任务:

  1. 初步简略编写git协同开发流程文档,以下是文档链接: https://ebsidb6m9g.feishu.cn/wiki/PkEswzWG4iTOYOkiWq0cFuEgnUd?from=from_copylink
  2. 编写第二版初赛阶段性总结报告,以下是文档链接: https://ebsidb6m9g.feishu.cn/wiki/WA96wW2LKiFTTCkyzwucVBwWnxb?from=from_copylink

感想:

距离比赛结束还有2天,开冲。

5.29

编写文档

完成任务:

  1. 编写展示文档的致谢部分。
  2. 编写文档回顾和展望部分

感谢:

距离比赛结束还有1天,开冲。

5.30

进行推进项目代码

完成任务:

  1. 通过strace strace ls研究如何实现strace。

感想:

比赛时间延长到6月2日,尽力推进工程代码,身体状况有点不太对,今天先苟一苟早点睡。

5.31

推进项目代码

完成任务:

  1. 初步实现系统调用sys_write和strace。
  2. 了解issure绑定pr。

感想:

尽可能多做些吧,初赛时间临近结束。

6.1

推进项目代码

完成任务

  1. 了解PA文档的堆栈管理部分,了解到昨天开strace后导致用户程序逐个字符输出的原因是申请缓存区失败导致的。
  2. 通过查阅资料和使用man 命令查看brk,sbrk的行为以及_end如何使用,粗略编写了_sbrk()的实现代码和SYS_brk系统调用。

感想:

时光荏苒,转眼明天就是初赛结束,心情比较复杂。

6.2

推进项目代码

完成任务

  1. 阅读文件系统有关的文档,粗略了解文件系统。

感想:

初赛结束,心情复杂,似乎直到整个项目完成之前也无法放松。后面的策略是稳扎稳打,争取每天都进步。还有需要提高文档编写的能力。

6.3

阅读文档

完成任务

  1. 阅读继续文件系统的文档和参考yz的文档,构思如何写好IOE外设实现的文档。

感想:

迷茫,煎熬,紧绷。还得补一大堆作业,准备期末周了,加油顶住啊!

6.6

简易文件系统

完成任务

  1. 阅读完PA的简易文件系统文档以及结合源码分析,初步编写实现文件系统的代码。
  2. 构思如何编写IOE的文档。

感想:

休了两天,最近要开始干活了。难受的是,由于不能够像之前写文档那么随意。今天在编写IOE实现难点文档时,坐了一个多小时硬是写不出一行字。

6.7

简易文件系统

完成任务

  1. 进一步完善实现简易文件系统的代码。

感想:

今天赶车回家 + 与老友叙旧消磨大量时间,今天就当摸鱼了一手,明天好好干活。

6.8

简易文件系统

所做任务

  1. 编写实现简易文件系统代码。
  2. 开始编写IOE实现的初版。

感想:

好吧,今天的进度看上去还是有点摸鱼,因为没有参考除文档外的其他资料以及对于整个实现流程的还是有点模糊不清导致速度非常慢,明天把实现流程再捋一下,应该能顺利解决。

6.9

简易文件系统

所做任务

  1. 实现fs_open等文件操作函数以及对应的系统调用。还未正确修改loader,导致其不能实现加载测试文件操作的程序。

6.12

简易文件系统

完成任务

  1. 初步实现简易文件系统,并通过文件操作测试程序,输出PASS!的信息。但代码写得比较糙,还需要继续打磨。

明日计划

  1. 编写完成IOE外设的文档。
  2. 思考和完成PA必答题并进行初步整理。

摸鱼借口:

  1. 由于这周六要考六级,以及下周要考试。这周的进度会比较慢,后面几天重心会在文档和总结。

6.13

文档编写

所做任务

  1. 编写IOE外设文档的大体内容,完成部分的PA必答题。

6.16

文档编写

所做任务

  1. 完成PA1部分必答题。

感想:

明后天都有考试,所以今天还是摸鱼。

6.17

生活中的意外:

1.今天考完试后,准备好好干会活,结果电脑寄了。。。。。还得等考完试出去修。

7.6

操作系统上的IOE

所做任务

今天的时间都花费在去拿电脑的路上,基本没干什么活,晚上回来后回顾了一下代码。

7.7

操作系统上的IOE

所做任务

  1. 通过查看编译信息和修改Navy中的Makefile解决无法调用NDL库中的函数这个问题。
  2. 编写操作系统上的IOE(键盘),完成的大致代码编写,但是代码仍然存在问题(能识别出没有按下的情况,但是按下情况无法识别),问题可能是出在借助IOE的API来获得设备的 输入这里的代码(目前的推测),明天继续调试应该能顺利解决。

感想和目标

今天的精力有点不足,效率并不是很高。今晚早点睡,希望明后两天能把VGA和键盘完成(完成VGA估计有点难)。

7.8

操作系统上的IOE

所做任务

  1. 未调试好键盘,排查了昨天认为可能出现问题的地方,尝试了各种的方式调试还是无果。
  2. 思考VGA的实现,并编写了部分代码。

感想

今天有点抽象啊,调试了一下午的键盘还是没解决键盘按下无法响应的问题。起初能猜测问题可能所在,但后面一一进行排除各种可能出现问题的地方,有点迷茫了。当然,这部分应该不是什么难题,连这个都无法自己解决,更别说调通VGA了。这也是我调试技能锻炼的过程,需要自己独立完成。加油吧,时间有点紧,11号之前需要IOE这部分内容了。

7.9

操作系统上的IOE

所做任务

  1. 调试完成键盘IOE,解决按下无法响应的问题。
  2. 编写和调试VGA的代码。

7.10

操作系统上的IOE

所做任务

1.调试编写好的VGA代码,但仍然无法绘制正确的logo。

感想

由于之前PA2编写VGA时没有很好理解其原理,导致效率比较低。不过感觉胜利近在咫尺,希望明天能调试成功。

7.11

操作系统上的IOE

所做任务

  1. 调试VGA,能正确显示南大logo。但仍然存在瑕疵,需要继续完善。
  2. 思考SDL库实现。

7.12

更丰富的运行时环境

所做任务

  1. 思考定点运算,并编写实现代码。
  2. 继续完善VGA。

7.13

更丰富的运行时环境

所做任务

  1. 实现定点运算。
  2. 根据应用程序要求初步编写SDL库。

7.14

更丰富的运行时环境

所做任务

  1. 完善SDL库。

感想:

由于一些意外,突然今天决定回家,所以没什么进度。

7.15

更丰富的运行时环境

所做任务

  1. 编写APP运行所需要的SDL库,目前能正常显示MEMU和NSlider的图片。

感想

今天调试了一天SDL库但目前还是无法跑通仙剑,就连最简单的NSlider翻页也没调好,按键触发和VGA还有不少问题,感觉是NDL库没实现好,在调用NDL实现SDL导致不同的问题产生。 明天继续调。

7.16

更丰富的运行时环境

所做任务

调试SDL库代码,使其能跑通Nslider和MEMU,其余应用程序还在持续调试中。

7.17

更丰富的运行时环境

所做任务

能跑通NTerm,在Navy下能跑通Flappy Bird。

时间花费

5小时(临时有事)。

7.18

更丰富的运行时环境

所做任务

能在Navy下跑通Flappy Bird和pal,但无法在Nanos-lite下跑通以上两个程序。

感想

总感觉少了点什么,程序加载进来后就一直是黑屏,排查了半天库,但在Navy下能正常运行感觉似乎不是库的原因。更糟糕的是没有出现任何报错,难崩,坐了一天牢,明天只能尝试 往系统调用和在调试信息中来想解决办法了。

花费时间

9个小时(8:30 - 12:30 14:00 - 18:00 20:00 - 21:00)

7.19

更丰富的运行时环境

感想

修改了部分SDL库的代码仍然无法解决问题,属于是病急乱投医,这两天这里改一点那里改一点。属于是无效操作,浪费时间。我应该逆向分析产生错误的原因,而不是乱调乱改。

花费时间

7个小时(9:00 - 12:00 14:00 - 18:00 )

7.20

更丰富的运行时环境

感想

通过显示的异常察觉导可能是NDL初始化出了些问题,修改了初始化函数。屏幕看上去正常了许多,但还是不行,更坏消息是之前看错信息误以为仙剑和bird能跑在Navy native下, 其实却只能跑在linux native中。Navy库写的有很大问题,难崩。感觉5天时间似乎啥也没干成,明天就是deadline,已经寄了,但也没办法只能硬着头皮干。

花费时间

9个小时(9:00 - 12:00 13:00-14:00 16:00 - 18:00 22:00 - 1:00)

7.21

更丰富的运行时环境

感想

通过痛苦的修改minSDL库中的函数,终于是能显示画面,但是运行起来还是非常的卡,还是很多问题,明天边思考PA4边调

屏幕截图 2024-07-22 005501

花费时间: 9个小时 (10:00 - 12:00 14:00 - 15:00 16:00 - 18:00 21:00 - 1:00 )

7.22

更丰富的运行时环境&&多道程序

所做任务

  1. 看PA4.1的文档,思考多道程序。
  2. 整理PA3.3的代码和笔记。

感想

因为朋友们好久没见,决定今明两天聚一聚,所以代码还没怎么整理,可读性比较差(尽快搞好),所以可能晚点再提pr。

花费时间

5小时(摸鱼两天,狗头保命)。

7.23

更丰富的运行时环境&&多道程序

所做任务

  1. 看PA4文档,思考与尝试编写代码。
  2. 整理PA3.3代码。

感想

摸鱼结束,明天认真干活。

花费时间

3个小时(狗头保命)。