龙格-库塔法求解常微分方程
发表于|更新于|实验记录
|总字数:0|阅读时长:1分钟|浏览量:
文章作者: tzyt
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 tzyt的博客!
相关推荐

2022-08-08
[MIT 6.s081] Xv6 Lab8 Networking 实验记录
upd@2022/9/14:最近把实验的代码放到 github 上了,如果需要参考可以查看这里: https://github.com/ttzytt/xv6-riscv 里面不同的分支就是不同的实验。 Lab8: Networking 这个 lab 的描述属实是长,不过很多的篇幅都在介绍 E1000 网卡。最终的任务其实很简单,就是实现 E1000 网卡驱动中的 transmit() 和 recv() 函数。 这个 lab 的代码不复杂,但写出来需要对 lab 中的提示有很好的理解。同时,也需要查阅 E1000 的文档。 下面先介绍处理器和 E1000 交互的方法,随后再介绍两个函数的具体实现方法。 E1000 的交互方法 E1000 使用了 DMA(direct memory access)技术,可以直接把接收到的数据包写入计算机的内存,这在数据量大的时候非常有用,可以当作缓存。 在发送时也可以把描述符(见下文)写入内存的特定位置,这样 E1000 就会自己去找到待发送的数据,然后发送。 不管是接收还是发送,数据包都是以描述符数组描述的。在下面的接收和发送部分,会分别介绍接收...

2022-08-12
[MIT 6.s081] Xv6 Lab9 Lockss 实验记录
upd@2022/8/18: 本文的第二个实验不完全正确,并且还有很多其他的做法,具体可以见这篇博客中我和博主的讨论。以及博主根据讨论新写的代码。 如果接下来有时间,会把第二部分的代码改掉并添加注释。 upd@2022/9/14:最近把实验的代码放到 github 上了,如果需要参考可以查看这里: https://github.com/ttzytt/xv6-riscv 里面不同的分支就是不同的实验。 Lab9: locks Memory allocator 实验描述 这 lab 的描述也是非常长,所以就不截图了。下面描述一下大概的题意: 在原本的 kalloc() 中,只有一个大锁,我们会维护一个 freelist 链表,如果有任何程序申请内存,都需要竞争 freelist 的锁,以修改 freelist 的内容。具体可见 freelist 和 kalloc() 的实现: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253struct ...
2022-07-09
[MIT 6.s081] Xv6 Lab1 Util 实验记录
upd@2022/9/14:最近把实验的代码放到 github 上了,如果需要参考可以查看这里: https://github.com/ttzytt/xv6-riscv 里面不同的分支就是不同的实验。 开始之前先吐槽一句,为什么 xv6 源码的码风这么怪啊???函数的返回类型居然跟函数名不在同一行?? 123intmain(int argc, char* argv[]){} 像这样…… 然后就是建议阅读时关闭暗黑模式(右下角齿轮标),因为有些图片上的字是黑的,开了暗黑模式就看不清了。 Lab 1: utils 实验说明地址:https://pdos.csail.mit.edu/6.828/2020/labs/util.html sleep 实现一个 sleep 命令,唯一的参数是休眠的时间。 因为有系统调用,所以实现起来还是比较简单的,可以直接调用提供的 sleep 系统调用。 唯一需要注意的是要在 #include user/user.h 之前先 #include kernel/types.h。这个文件里面包含了一些类型的定义,而 user.h 需要...

2022-08-21
[MIT 6.s081] Xv6 Lab11 Mmap 实验记录
upd@2022/9/14:最近把实验的代码放到 github 上了,如果需要参考可以查看这里: https://github.com/ttzytt/xv6-riscv 里面不同的分支就是不同的实验。 最后一个 lab 了,终于搞完了!! Lab11: mmap 描述 实现一个 UNIX 操作系统中常见系统调用 mmap() 和 munmap() 的子集。此系统调用会把文件映射到用户空间的内存,这样用户可以直接通过内存来修改和访问文件,会方便很多。 mmap() 的定义如下: 12void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); 意思是映射描述符为 fd 的文件,的前 length 个字节到 addr 开始的位置。并且加上 offset 的偏移量(即不从文件的开头映射)。 如果 addr 参数为 0,系统会自动分配一个空闲的内存区域来映射,并返回这个地址。 在实验中我们只需要支持 addr 和 offset 都为 0 的情况,也就是完全不用考虑用...

2022-07-25
[MIT 6.s081] Xv6 Lab4 Traps 实验记录
前言:今天是 2022/7/25 先庆祝一下博客运行 100 天了。 upd@2022/9/14:最近把实验的代码放到 github 上了,如果需要参考可以查看这里: https://github.com/ttzytt/xv6-riscv 里面不同的分支就是不同的实验。 Lab4: traps RISC-V assembly 先鸽了 Backtrace 实现一个 backtrace() 的函数,如果某个程序调用了这个函数,该函数应该输出这个程序的 “函数调用顺序”,也就是把当前栈中的函数地址按照先后顺序全部打印出来。 做这个实验最主要的还是需要了解函数调用的过程,具体可以参考我之前写的这篇文章。 这里我把那篇文章中最重要的图和视频放在下面(绝对不是水字数),如果你之前比较熟悉函数调用的过程,但是现在忘了,看了之后应该比较容易回忆起来。 实验中,我们需要把函数调用的一个 “链条” 打印出来。 比如有下面这个程序: 123456789101112131415int third(int x){ backtrace(); return x;...

2022-07-29
[MIT 6.s081] Xv6 Lab6 COW 实验记录
upd@2022/9/14:最近把实验的代码放到 github 上了,如果需要参考可以查看这里: https://github.com/ttzytt/xv6-riscv 里面不同的分支就是不同的实验。 Lab6: Copy-on-Write Fork for xv6 这个 lab 的描述属实是简洁,其实他主要的描述在前面: The problem The fork() system call in xv6 copies all of the parent process’s user-space memory into the child. If the parent is large, copying can take a long time. Worse, the work is often largely wasted; for example, a fork() followed by exec() in the child will cause the child to discard the copied memory, probably without e...
评论



![[Stanford CS144] Lab4 实验记录](/img/CS144/tcp%E7%8A%B6%E6%80%81%E6%B5%81%E8%BD%AC%E5%9B%BE.jpg)