avatar
文章
37
标签
15
分类
8

主页
归档
标签
分类
H4wk1ns's blog
搜索
主页
归档
标签
分类

H4wk1ns's blog

xv6-八
发表于2022-07-13|手写|内核•手写
前言这篇博客研究xv6的锁机制 lock原因lock的一个最重要的应用场景——解决条件竞争条件竞争,即多个CPU并行的访问同一块内存,并且至少有一个执行写操作。当条件竞争出现时,往往会发生写入丢失或读取未完全更新的数据事件,从而引发更严重的bug。 而lock可以很好的避免条件竞争。lock可以确保互斥性,即确保同一时间只有一个进程访问临界区(可能被并行执行的部分)资源,从而根本上避免了不完整更新引发的bug。 lock机制一般来说,内核会提供两类lock——spinlock(自旋锁)和sleeplock(信号量)spinlock一般用于短时的互斥(关闭中断响应);而sleeplock往往用于长时的互斥 自旋锁xv6的自旋锁依赖于C标准库的__sync_lock_test_and_set函数,其在riscv底层通过amoswap(Atomic Memory Operations swap)实现。其通过互斥的设置和访问共享变量,从而根据获取的旧值来判断当前自旋锁状态,如下所示123456789101112131415161718192021222324252627282930313233 ...
xv6-七
发表于2022-07-04|手写|内核•手写
前言这篇博客研究xv6的进程调度机制的实现 多进程现代操作系统基本都支持并行多进程(多CPU多进程),而要实现该功能,需要解决如下问题 如何切换进程?虽然实现思路不是很难,但是实现细节比较复杂。 如何对用户进程透明?即用户进程应该对于进程切换无感——进程切换前和进程切换后,进程的上下文不应有任何改变 如何找到当前CPU执行的进程的描述符?进程可能被切换到任何CPU上,则CPU应当可以高效的找到当前执行的进程的描述符信息,从而在S-mode时更改当前进程的状态信息 进程切换xv6的进程切换的基本流程如下图所示 可以看到,xv6实现进程切换的方式非常标准——首先从U-mode陷入到S-mode(系统调用或中断),再从对应的S-mode切换到CPU切换进程(每个CPU在操作系统初始化时的执行流)。 接着就是上述步骤的反向操作,即切换到调度出的待切换进程的S-mode,然后从S-mode返回到U-mode,最终完成进程切换 进程调度时,进程首先陷入到S-mode,根据前面xv6-二可知,U-mode的上下文会保存在S-mode的内核栈中;当进程切换结束时,会从S-mode返回到U-mode ...
xv6-六
发表于2022-06-14|手写|内核•手写
前言这篇博客研究xv6的Copy-on-Write机制的实现 Lab Copy-on-Write Fork for xv6本次lab用来实现xv6的Copy-on-Write机制 Copy-on-Write要求 Your task is to implement copy-on-write fork in the xv6 kernel. You are done if your modified kernel executes both the cowtest and usertests programs successfully. 分析Copy-on-Write和lazy allocation非常类似,都是为了节省直接分配导致的性能损失,从而推迟实际的physical page的分配和映射,仅仅完成virtual page的分配。 其中,Copy-on-Write是在进程fork时,仅仅复制父进程的pd(页表),而共享实际的physical page,从而节省了physical page的分配和内容的复制。而实际的页框(physical page)分配,延迟到父进程或子进程执行 ...
xv6-五
发表于2022-06-11|手写|内核•手写
前言这篇博客研究lazy page allocation机制 lazy page allocation一个操作系统中可以包含多个进程,进程的地址空间所占用的虚拟地址空间之和一般远远大于实际的物理内存之和。 因此,一般操作系统通过通过如下几种方法,将进程的超大的虚拟地址空间映射到有限的物理地址空间中 不同虚拟内存映射相同物理内存实际上,不同进程或相同进程的不同虚拟内存有很大一部分包含相同的数据(linux的glibc库, 内核的stack0数据)。因此,完全可以将这些虚拟内存指向相同的物理地址 延迟分配往往进程会申请超过实际需要的内存,并且申请后不会立即使用。因此,当进程申请内存时,仅仅分配虚拟内存并记录在描述符中,但是并不实际分配物理内存并映射。也就是此时并不消耗物理内存。当进程真正访问该虚拟内存时,会产生page fault,从而在异常处理时完成实际的映射即可 Lab lazy allocation本次lab帮助熟悉xv6的lazy allocation机制 Lazy allocation要求 Modify the code in trap.c to respond to a p ...
xv6-四
发表于2022-06-07|手写|内核•手写
前言这篇博客探索一下xv6从U-mode地址空间trap(陷入)到S-mode地址空间的机制(前面xv6-二已经介绍的非常详细了) Lab traps本次lab帮助熟悉xv6的trap(陷入)机制 Backtrace要求 Implement a backtrace() function in kernel/printf.c. Insert a call to this function in sys_sleep, and then run bttest, which calls sys_sleep. Your output should be as follows: 1234backtrace:0x0000000080002cda0x0000000080002bb60x0000000080002898 After bttest exit qemu. In your terminal: the addresses may be slightly different but if you run addr2line -e kernel/kernel (or riscv64-unknown- ...
xv6-三
发表于2022-05-26|手写|内核•手写
前言这篇博客探索一下xv6内核的虚拟内存机制 xv6的页表机制page table(页表)是典型的软、硬件结合的机制,即硬件提供相关的电路实现和接口,操作系统根据硬件的接口,实现相关的服务 页表硬件对于riscv指令来说(无论在S-mode还是U-mode),其操作的是virtual address(虚拟地址)。但是对于机器的RAM来说,其操作的是physical address(物理地址) 而page table的硬件部分,则是连接两个地址的组件——其将virtual address(虚拟地址)映射为physical address(物理地址) page table工作的基本逻辑如下图所示 直白的说,其将虚拟地址空间和物理地址空间以页(4096字节)为单位切分,并以页为单位进行映射(即通过page table记录页号之间的映射关系) 当然,riscv支持多种page table机制,但是这些机制的大体思路和上面的图所展示的是一致的 xv6采用了Sv39方案的page table,即support a 39-bit virtual address space。该方案中,64bit的vi ...
123…7
avatar
H4wk1ns
coder && ctfer
文章
37
标签
15
分类
8
Follow Me
最新文章
xv6-十一2022-10-22
xv6-十2022-10-08
分区-文件系统2022-09-11
xv6-九2022-09-02
LinuxFoundation mentorship2022-08-26
分类
  • ctf5
  • 信息安全2
  • 内核2
  • 手写23
  • 杂谈1
  • 算法1
  • 编程1
  • 设置2
标签
linux内核手写设置杂谈信息安全ctf系统启动nodejshexo操作系统算法编程c++编译原理
归档
  • 十月 20222
  • 九月 20222
  • 八月 20221
  • 七月 20222
  • 六月 20223
  • 五月 20224
  • 二月 20221
  • 一月 20222
网站资讯
文章数目 :
37
本站访客数 :
本站总访问量 :
©2021 - 2023 By H4wk1ns
come to hack me!!
本地搜索