xv6的设计trick(不断更新)
1、每个进程通过时钟中断出发trap.c中的
if(proc && proc->state == RUNNING && tf->trapno == T_IRQ0+IRQ_TIMER)
yield();来强制把这个进程置为Runnable状态,yield的实现如下:
acquire(&ptable.lock); //DOC: yieldlock
proc->state = RUNNABLE;
sched();
release(&ptable.lock);
在sched中
swtch(&proc->context, cpu->scheduler); 实现从当前进程的kernel Stack 切换到 CPU中专门负责程序调度的 scheduler Stack,
(gdb) p /x *cpus[0]->scheduler
$7 = {edi = 0x0, esi = 0x80104ea4, ebx = 0x8, ebp = 0x8010c608,
eip = 0x80104ab2}
此时,我们在 sched设置断点
(gdb)b proc.c:314
(gdb)s 进入汇编代码
在swtch的汇编代码中,我们将当前进程的esp所指向的内存地址+8 作为新的上下文的esp,然后保存老寄存值,popl加载新的寄存器的值
swtch:
movl %esp, (%eax)
movl %edx, %esp
edx 的值就是指向 CPU scheduler的栈底指针的值
2、磁盘文件块读写
struct buf* bread(uint dev, uint blockno) {
struct buf* b;
b = bget(dev, blockno);
if (!(b.flags & B_VALID)) {
iderw(b);
}
return b;
}
static struct buf* bget(uint dev, uint blockno) {
struct buf* b;
acquire(&bcache.lk);
loop:
for(b = bcache.head.next; b != &bcache.head; b = b->next) {
//if the buf is already in the buffer
if (b->dev == dev && b->blockno == blockno) {
if (!(b.flags & B_BUSY)) {
b.flags &= B_BUSY;
release(&bcache.lk);
return b;
}
sleep(b, &bcache.lk);
goto loop;
}
}
for (b = bcache.head.prev; b != &bcache.head; b = b->next) {
if((b.flags & B_BUSY) == 0 && (b.flags & B_DIRTY) == 0) {
b->dev = dev;
b->blockno = blockno;
b->flags = B_BUSY;
release(&bcache.lk);
return b;
}
}
panic("there isn't any empty buf");
}
xv6的设计trick(不断更新)的更多相关文章
- PowerDesigner如何将设计的表更新到数据库中
前言: 软件开发的过程中,将设计的表更新到数据库中是一件繁琐的事情,使用好工具,能够事半功倍. 环境介绍:Oracle 11g x64 前期准备: 1.PowerDesigner工具(本人是32位的) ...
- ORM数据层框架的设计热点:更新指定的列的几种设计方案
ORM框架的定义:对象-关系映射(Object/Relation Mapping,简称ORM) 常见的是:数据库结构=>映射Object(实体属性)=>基于实体类的操作. 还有一种:数据库 ...
- 【 js 基础 】【 源码学习 】源码设计 (持续更新)
学习源码,除了学习对一些方法的更加聪明的代码实现,同时也要学习源码的设计,把握整体的架构.(推荐对源码有一定熟悉了之后,再看这篇文章) 目录结构:第一部分:zepto 设计分析第二部分:undersc ...
- PowerBI开发 第十一篇:报表设计技巧(更新)
PowerBI版本在持续的更新,这使得报表设计能够实现更多新的功能,您可以访问 PowerBI Blog查看PowerBI的最新更新信息,本文总结了PowerBI新版本的重要更新和设计技巧. 我的Po ...
- pandas常用小trick(持续更新)
记录一下pandas常用的小技巧,时间长了干别的去了会忘记,记录一下: 1. 在处理数据过程中涉及到label和null的处理方法 # 方法一 df['height'][df.height < ...
- 客户端热更新框架之UI热更框架设计(下)
上一篇笔者介绍了关于什么是热更新,为什么需要热更新的技术文章.本篇就专门针对UI框架的热更新功能实现部分展开讨论,讨论的重点是热更新如何与UI框架进行结合? 现在笔者把设计“UI热更新框架”的整体设计 ...
- 微信小程序导航:官方工具+精品教程+DEMO集合(1月7更新)
1:官方工具:https://mp.weixin.qq.com/debug/w ... tml?t=14764346784612:简易教程:https://mp.weixin.qq.com/debug ...
- FME规划数据GIS更新入库
规划数据经过转换处理入库GIS,城市规划的特殊性,使得GIS里面数据经过分析处理后直接导出为CAD数据的话,肯定难以满足原来规划的要求,这个是硬伤.又要用GIS来进行空间分析处理统计,数据管理就必须了 ...
- winform实现自动更新并动态调用form实现
winform实现自动更新并动态调用form实现 标签: winform作业dllbytenull服务器 2008-08-04 17:36 1102人阅读 评论(0) 收藏 举报 分类: c#200 ...
随机推荐
- POJ 3020 Antenna Placement(无向二分图的最小路径覆盖)
( ̄▽ ̄)" //无向二分图的最小路径覆盖数=顶点总数-最大匹配数/2(最大匹配数=最小点覆盖数) //这里最大匹配数需要除以2,因为每两个相邻的*连一条边,即<u,v>和< ...
- Infix to posfix 自己写stack,没有()
#include<iostream> #include<string> using namespace std; template<typename Type> s ...
- C语言 - 大小端问题
目前使用的机器都是使用字节BYTE来存储的. 对于跨越多字节的对象,必须搞清楚两个规则: 这个对象的地址是什么 在存储器中如何按照这些字节的存放的书序 对于一个整型对象 a=0x12345678,一共 ...
- ural 1049. Brave Balloonists(标准分解式,数论)
1049. Brave Balloonists Time limit: 2.0 secondMemory limit: 64 MB Ten mathematicians are flying on a ...
- caffe层解读系列-softmax_loss
转自:http://blog.csdn.net/shuzfan/article/details/51460895 Loss Function softmax_loss的计算包含2步: (1)计算sof ...
- 4. JavaScript 控制语句
1. If...Else 语句 1.1 条件语句if /* 格式: 1. if ... 2. if ... else ... 3. if ... else if .... else 4. switch ...
- Android jni编辑.so库
引自:http://www.cnblogs.com/sevenyuan/p/4202759.html 1. 在Eclipse中创建项目:TestJNI 2. 新创建一个class:TestJNI.ja ...
- mysql基本操作 [http://www.cnblogs.com/ggjucheng/archive/2012/11/03/2752082.html]
创建表 简单的方式 CREATE TABLE person ( number INT(11), name VARCHAR(255), birthday DATE ); 或者是 CREATE TABLE ...
- log4net 日志文件占用,不能及时释放
在appender 下面加 <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
- HDU 5798 Stabilization
方法太厉害了....看了官方题解的做法....然后...想了很久很久才知道他想表达什么.... #pragma comment(linker, "/STACK:1024000000,1024 ...