![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
6.S081
文章平均质量分 79
passenger12234
这个作者很懒,什么都没留下…
展开
-
6.S081 net lab
0. 序算是填了一个坑吧。1 qemu参数的解释ifeq ($(LAB),net)QEMUOPTS += -netdev user,id=net0,hostfwd=udp::$(FWDPORT)-:2000 -object filter-dump,id=net0,netdev=net0,file=packets.pcapQEMUOPTS += -device e1000,netdev=net0,bus=pcie.0endif查看qemu的手册,在设备模拟上,有一个Device Front E原创 2021-12-18 12:34:43 · 917 阅读 · 0 评论 -
最近debug的一些记录
0. 前言不算一篇正经的文章,只是记录一下最近几天在k210板子上跑xv6的经历,也许可以供以后参考。1. 遇到的困难1.1 S态对U态的访问(qemu)在之前的xv6-k210项目中是proc用两个页表进行处理,尝试将两个页表合为1个,此时要求S态能够自由地访问U态的页表,自然地认为这是显然的事情,结果触发异常,debug找了很久的原因,发现S态是不能访问设置了PTE_U位的页。查了一下riscv手册,发现需要设置sstatus的SUM位为1才能正常访问。1.2 C与C++的混合编译解决了问题原创 2021-07-17 22:19:26 · 271 阅读 · 1 评论 -
riscv-xv6单步调试x 文件系统2
1. Inode层首先这里有两个分配硬盘的空闲block的函数。static uintballoc(uint dev){ int b, bi, m; struct buf *bp; bp = 0; for(b = 0; b < sb.size; b += BPB){ bp = bread(dev, BBLOCK(b, sb)); for(bi = 0; bi < BPB && b + bi < sb.size; bi++){原创 2021-06-18 19:45:58 · 342 阅读 · 0 评论 -
riscv-xv6单步调试x 文件系统1
1. Cache层//Cache层主要作用是来缓存磁盘块struct buf { int valid; // has data been read from disk? int disk; // does disk "own" buf? uint dev; uint blockno; struct sleeplock lock; uint refcnt; struct buf *prev; // LRU cache list struct buf *next;原创 2021-06-17 11:20:37 · 3307 阅读 · 0 评论 -
6.S081 lab6 cow
1. riscv.h中的修改#define PTE_RSW (1L << 8) // 用于cow的页表项标志位#define GO(addr) (((addr) - KERNBASE) / PGSIZE) // 把一个物理页映射为一个数组标号,下面的ref_count[GO(addr)]//表示地址为addr的物理页的引用计数2. kalloc.c 中的修改unsigned char ref_count[32*1024]; // 页面的引用计数struct spinloc原创 2021-06-14 20:47:39 · 701 阅读 · 0 评论 -
6.S081 lab5: lazy
主要记录下我在写这个lab的时候遇到的问题,具体的代码网上已经有很多了 。BUG1理论上来讲,vm.c文件中freewalk的panic是不需要注释掉的,当时写的时候老是报错panic freewalk: leaf后来发现问题出在trap函数中:else if((r_scause() == 13 || r_scause() == 15) && r_stval() >= p->heap_start){ uint64 vmaddr = r_stval(); i原创 2021-06-13 10:43:19 · 520 阅读 · 0 评论 -
riscv-xv6单步调试5 锁与多核调度
start->把每个cpu的标号记录在寄存器tp里面usertrapret->返回时读取tp寄存器,然后把值保存在用户trapframe中(该位置用户不可修改)uservec->在用户发生异常时跳转到此位置,会将trapframe中的tp值读取到tp寄存器中myproc函数与mycpu函数利用了tp寄存器的值确定是目前是位于哪一个cpu,从而拿到需要的进程信息。在上下文切换时,只保存了进程的调用者保存寄存器和ra,sp,因此切换前后tp寄存器的值不发生改变(或者从cpu的角度来看,原创 2021-04-10 22:54:13 · 1905 阅读 · 8 评论 -
6.S081 lab7 Multithreading
1. 任务 任务主要有3个:将所给代码补充完整,简单实现用户级的多线程;使用多线程+锁体验程序速度提升;实现barrier函数(多线程同步机制)。1.5 补充 在barrier函数的实现中,用到了之前没用过的pthread函数,在此记录一下函数语义。int pthread_cond_init(pthread_cond_t* cond, pthread_condattr_t *cond_attr);int pthread_cond_destroy(pthread_cond_t* cond);原创 2021-04-07 18:22:52 · 359 阅读 · 0 评论 -
6.S081 lab4: traps
不加参数的cat,还有addr2line等指令,用ctrl+D退出。原创 2021-04-01 22:47:03 · 586 阅读 · 0 评论 -
riscv-xv6单步调试4 异常处理初始化和进程调用
0. 序 主要记录xv6异常处理的初始化和第一个进程的建立。main函数中主要有trapinit()函数和trapinithart()函数与异常初始化部分相关。1. trapinit()函数void //初始化了一把锁??有关锁的部分以后会写把....trapinit(void){ initlock(&tickslock, "time");}2. trapinithart()函数// set up to take exceptions and traps while原创 2021-03-31 15:46:15 · 961 阅读 · 0 评论 -
riscv-xv6单步调试3 虚拟内存的初始化
0. 序这一部分主要记录main函数如何初始化xv6的虚拟内存,main函数依次调用了kinit(), kvminit(), kvminithart()。1. kinit()函数struct run { struct run *next;};struct { //kmem是用于管理物理页面的数据结构,就是一个链表。 struct spinlock lock; struct run *freelist;} kmem; //最终达成的效果是:kmem本身是存放在内核的全局数据原创 2021-03-30 18:15:31 · 1413 阅读 · 4 评论 -
riscv-xv6单步调试1.5
0. 序 在2之前,先记录一下riscv异常处理的机制。1. 异常定义2. 异常相关的CSR 主要有这几个mstatus, mepc, mtvec, mcause, mie, mip, mscratch, mtval。这是以m模式为例,因此寄存器带有m前缀(否则为s前缀)。其中mie指定哪些中断需要屏蔽,mip保存哪些中断等待被接收。mtvec指令指定异常处理程序的位置。如果mtvec的第一位为1,则异步中断跳转到mtvec+4*mcause的位置(我怎么觉得64位应该是8*mcause?)。原创 2021-03-28 14:45:36 · 424 阅读 · 0 评论 -
riscv-xv6单步调试1
gdb-multiarch调试xv6.gdbinit原创 2021-03-27 19:30:12 · 1042 阅读 · 2 评论 -
6.S081 lab2 记录
主要对内核做了这些更改:trace系统调用选择把一个新的变量watch_int添加到proc的结构体中(proc.h)在allocproc增加一行:初始化proc的watch_int 为0 (proc.c)在freeproc中增加一行:将proc的watch_int 重新设置为0(proc.c)在fork中增加一行,让子进程继承父进程的watch_int(proc.c)增加函数sys_trace,只需要将watch_int修改为传入参数即可(syscall.c)t原创 2021-01-26 18:16:32 · 191 阅读 · 1 评论 -
6.S081 lab1 debug记录
1丶sleep函数利用while循环检查传入参数是否为纯数字时忘了累加变量i,造成死循环2丶find函数进入新目录后,调用ls,cat等指令需要传入正确的路径名,而不能直接输入ls。及时关闭不再使用的文件描述符,之前因为忘记这一点,后面的open调用失败(xv6中一个进程能使用的文件描述符大概就10多个?)xv6的键盘中断是ctrl+d3丶xargs函数二维数组开大了报错:usertrap(): unexpected scause把main函数的参数char* argv[] 的结束标志原创 2021-01-22 11:59:13 · 268 阅读 · 0 评论