code:bread - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki

Source

  • 将指定设备指定块号的内容读入缓存池,并返回存放指定内容的缓存块管理结构的指针
  • 传入两个参数dev,blkno
    • dev:指定设备号
    • blkno:指定块号
  • 返回 读取的缓存块

4750

4751 /* Read in (if necessary) the block and

4752  * return a buffer pointer.

4753  */

4754 bread(dev, blkno)

4755 {

4756     register struct buf *rbp;

4757

4758     rbp = getblk(dev, blkno);

4759     if (rbp->b_flags&B_DONE)

4760          return(rbp);

  • 调用getblk获取一个指向缓存块管理结构的指针
  • 若标志位中包含B_DONE,表明所得缓存块中已经包含要读取的信息
4761     rbp->b_flags =| B_READ;

4762     rbp->b_wcount = -256;

4763     (*bdevsw[dev.d_major].d_strategy)(rbp);

4764     iowait(rbp);

4765     return(rbp);

  • 若标志位中不含B_DONE,表明所得缓存块还未读入待读取的信息
    • 此时将标志位置B_READ
    • 将传输字节数 设置为512字节,计数寄存器要求传入补码(-256 = 512的补码)
    • 将缓存块放入设备I/O队列,启动设备
    • 等待I/O操作结束后,返回指向该缓存块管理结构的指针
4766 }

4767     /* -------------------------*/

Ref

Caller

⚠️ **GitHub.com Fallback** ⚠️