随笔分类 - 6.1810
摘要:https://www.jianshu.com/p/14ae99223683 1.uart初始化 #define LCR_BAUD_LATCH (1<<7) // 1000 0000 #define LCR_EIGHT_BITS (3<<0) // 11 #define FCR_FIFO_ENABL
阅读全文
摘要:学习流程 QEMU模仿的是82540EM 一、LAB说明 1. 背景 将使用一个名为 E1000 的网卡来处理网络通信。xv6是qemu模拟的硬件,连接到一个同样由 QEMU 模拟的 LAN。在这个仿真LAN上,xv6的IP地址是10.0.2.15。同时,Qemu将运行qemu的宿主的ip地址设置为
阅读全文
摘要:LAB-5 COW 主要是修改fork和缺页中断处理程序 以前fork时,会直接复制原进程的页表内容到新页表,具体过程是 对于原页表中的每一页,malloc一个新页,然后复制数据到新页,最后把这一页映射到新页表 现在进行修改: 1. fork复制页表 对于新进程,为其创建新页表 直接复用旧页表项
阅读全文
摘要:第五章 中断和设备驱动 驱动程序: 作用:配置硬件设备,告诉设备要执行的操作,处理设备产生的中断,与等待设备I/O的进程进行交互。 难点:驱动程序需与设备并行运行,驱动程序必须理解设备的硬件接口,可能没有文档。 设备中断是trap的一种,内核通过处理代码识别设备,然后调用相应的驱动程序进行处理,这种
阅读全文
摘要:一、trap简介 三类 trap 系统调用:用户程序执行ecall指令要求内核为其提供服务 异常:(用户或内核)指令做了一些非法的事情,例如除以零或使用无效的虚拟地址; 设备中断,一个设备,例如当磁盘硬件完成读或写请求时,向系统表明需要处理。 trap执行流程 1. 强制将控制权转移到内核 2. 内
阅读全文
摘要:Backtrace 注意栈帧的结构就很简单 Alarm (hard) sys_sigalarm 解决思路 保存时钟周期和handler地址 每次发生时钟中断时,计数一次,经过n个时钟周期,就调用handler函数 但是handler函数位于用户态 需要跳转到用户态执行handler 然后跳转回来继续
阅读全文
摘要:CH-3 页表 0、页表简介 每个进程都有一个页表 用于隔离不同进程的地址空间 为每个进程提供私有的地址空间 决定了进程能访问哪些地址 复用物理内存,把同一物理页映射到几个页表中 1. 分页硬件 内存的实际地址是物理地址 用户指令访问的是虚拟地址 需要通过页表,将虚拟地址翻译为物理地址,才能访问 在
阅读全文
摘要:文档名:riscv-privileged XV6使用Riscv SV39 Riscv satp地址翻译在4.3.1 Addressing and Memory Protection章节 SV39指令格式详细说明在4.4 Sv39: Page-Based 39-bit Virtual-Memory S
阅读全文
摘要:一、初始化 kernel\main.c\main() void main(){ ... kinit(); // physical page allocator kvminit(); // create kernel page table kvminithart(); // turn on pagin
阅读全文
摘要:第二章 操作系统的组织结构 1. 资源抽象 由操作系统管理硬件资源,用户程序通过操作系统提供的接口间接访问硬件资源 所有软件共享CPU,由操作系统进行进程切换的工作 进程通信通过文件描述符完成,省略了很多细节,比如管道文件的具体存放位置,而且如果管道中程序执行失败,内核会给管道另一端的程序发送EOF
阅读全文
摘要:Lab: page tables 1.Speed up system calls (easy) 加速getpid()系统调用速度 映射一页在USYSCALL位置,向其中写入一个结构体 struct usyscall { int pid; // Process ID }; 赋予用户态只读权限 代码:g
阅读全文
摘要:Lab: system calls 1.Using gdb (easy) 打开两个shell,都进入xv6文件夹 第一个shell输入 make qemu-gdb 第二个shell输入 riscv64-unknown-elf-gdb Looking at the backtrace output,
阅读全文
摘要:Lab: utilities 1.Sleep 代码:github 2.pingpong 代码:github 3.primes 代码:github 需要注意父子进程的管道阻塞问题,之前写过一个相关博客 https://www.cnblogs.com/INnoVationv2/p/16700899.ht
阅读全文
摘要:管道分写和读端,当写端全部close(),读端read时,会返回0,这样读端就可以此退出循环 while(read(fds[0], &val, sizeof(int)) != 0){} 但是管道如果没有正确的关闭,就会陷入阻塞 例 int p[2]; int main() { pipe(p); in
阅读全文

浙公网安备 33010602011771号