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(不断更新)的更多相关文章

  1. PowerDesigner如何将设计的表更新到数据库中

    前言: 软件开发的过程中,将设计的表更新到数据库中是一件繁琐的事情,使用好工具,能够事半功倍. 环境介绍:Oracle 11g x64 前期准备: 1.PowerDesigner工具(本人是32位的) ...

  2. ORM数据层框架的设计热点:更新指定的列的几种设计方案

    ORM框架的定义:对象-关系映射(Object/Relation Mapping,简称ORM) 常见的是:数据库结构=>映射Object(实体属性)=>基于实体类的操作. 还有一种:数据库 ...

  3. 【 js 基础 】【 源码学习 】源码设计 (持续更新)

    学习源码,除了学习对一些方法的更加聪明的代码实现,同时也要学习源码的设计,把握整体的架构.(推荐对源码有一定熟悉了之后,再看这篇文章) 目录结构:第一部分:zepto 设计分析第二部分:undersc ...

  4. PowerBI开发 第十一篇:报表设计技巧(更新)

    PowerBI版本在持续的更新,这使得报表设计能够实现更多新的功能,您可以访问 PowerBI Blog查看PowerBI的最新更新信息,本文总结了PowerBI新版本的重要更新和设计技巧. 我的Po ...

  5. pandas常用小trick(持续更新)

    记录一下pandas常用的小技巧,时间长了干别的去了会忘记,记录一下: 1. 在处理数据过程中涉及到label和null的处理方法 # 方法一 df['height'][df.height < ...

  6. 客户端热更新框架之UI热更框架设计(下)

    上一篇笔者介绍了关于什么是热更新,为什么需要热更新的技术文章.本篇就专门针对UI框架的热更新功能实现部分展开讨论,讨论的重点是热更新如何与UI框架进行结合? 现在笔者把设计“UI热更新框架”的整体设计 ...

  7. 微信小程序导航:官方工具+精品教程+DEMO集合(1月7更新)

    1:官方工具:https://mp.weixin.qq.com/debug/w ... tml?t=14764346784612:简易教程:https://mp.weixin.qq.com/debug ...

  8. FME规划数据GIS更新入库

    规划数据经过转换处理入库GIS,城市规划的特殊性,使得GIS里面数据经过分析处理后直接导出为CAD数据的话,肯定难以满足原来规划的要求,这个是硬伤.又要用GIS来进行空间分析处理统计,数据管理就必须了 ...

  9. winform实现自动更新并动态调用form实现

    winform实现自动更新并动态调用form实现 标签: winform作业dllbytenull服务器 2008-08-04 17:36 1102人阅读 评论(0) 收藏 举报  分类: c#200 ...

随机推荐

  1. PerformSelector 和 NSInvocation

  2. Ambari安装组件出错

    Caught an exception while executing custom service command: <class 'ambari_agent.AgentException.A ...

  3. ActiveMQ in Action(5) - Clustering

    关键字: activemq 2.5 Clustering    ActiveMQ从多种不同的方面提供了集群的支持.2.5.1 Queue consumer clusters    ActiveMQ支持 ...

  4. HDU 2216 Game III(BFS)

    Game III Problem Description Zjt and Sara will take part in a game, named Game III. Zjt and Sara wil ...

  5. HDU 1242 Rescue(BFS),ZOJ 1649

    题目链接 ZOJ链接 Problem Description Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The ...

  6. tomcat下获取当前路径的url中含有空格解决方法

    参考博文(http://www.360doc.com/content/11/1009/17/4602013_154657565.shtml) web项目发布到Tomcat之后,如果tomcat是安装在 ...

  7. [转载]The Island Castaway mac版解锁

    http://blog.sina.com.cn/s/blog_506b3ac90101ke0e.html 1.首先,去安装一个The Island - Castaway™ mac free版,然后打开 ...

  8. tableIView 区头的一点问题

    要记得设置区头的高度 否则会出现第一行没区头问题

  9. win安装Theano

    艰辛的安装Theano过程,把其中遇到的问题记录下来,三台机子都尝试了安装Theao,系统分别为:A机:win7 64-bit(笔记本).B机:win7 64-bit(台式机).C机:win8 64- ...

  10. chrome浏览器调试工具的使用

    废话不多说,给大家介绍一下最基本的浏览器调试工具