linux-0.11调试教程 文件系统中b_uptodate字段的含义
2013-03-24 20:18
741 查看
b_uptodate的含义就是sync既是否同步了缓冲区和块设备的内容。
void do_hd_request(void)
{
......
if (CURRENT->cmd == WRITE) {
hd_out(dev,nsect,sec,head,cyl,WIN_WRITE,&write_intr);
for(i=0 ; i<3000 && !(r=inb_p(HD_STATUS)&DRQ_STAT) ; i++)
/* nothing */ ;
if (!r) {
bad_rw_intr();
goto repeat;
}
port_write(HD_DATA,CURRENT->buffer,256);
} else if (CURRENT->cmd == READ) {
hd_out(dev,nsect,sec,head,cyl,WIN_READ,&read_intr);
} else
panic("unknown hd-command");
}
kernel\blk_drv\hd.c
static void read_intr(void)
{
if (win_result()) {
bad_rw_intr();
do_hd_request();
return;
}
port_read(HD_DATA,CURRENT->buffer,256);
CURRENT->errors = 0;
CURRENT->buffer += 512;
CURRENT->sector++;
if (--CURRENT->nr_sectors) {
do_hd = &read_intr;
return;
}
end_request(1);
do_hd_request();
}
kernel\blk_drv\blk.h
extern inline void end_request(int uptodate)
{
DEVICE_OFF(CURRENT->dev);
if (CURRENT->bh) {
CURRENT->bh->b_uptodate = uptodate;
unlock_buffer(CURRENT->bh);
}
if (!uptodate) {
printk(DEVICE_NAME " I/O error\n\r");
printk("dev %04x, block %d\n\r",CURRENT->dev,
CURRENT->bh->b_blocknr);
}
wake_up(&CURRENT->waiting);
wake_up(&wait_for_request);
CURRENT->dev = -1;
CURRENT = CURRENT->next;
}
当把内容从硬盘读入缓冲区后bh->b_uptodate被赋值为1。
struct request {
int dev; /* -1 if no request */
int cmd; /* READ or WRITE */
int errors;
unsigned long sector;
unsigned long nr_sectors;
char * buffer;
struct task_struct * waiting;
struct buffer_head * bh;
struct request * next;
};
struct blk_dev_struct {
void (*request_fn)(void);
struct request * current_request;
};
extern struct blk_dev_struct blk_dev[NR_BLK_DEV];
同理,当把内容从缓冲区写入硬盘后bh->b_uptodate被赋值为1。
static void write_intr(void)
{
if (win_result()) {
bad_rw_intr();
do_hd_request();
return;
}
if (--CURRENT->nr_sectors) {
CURRENT->sector++;
CURRENT->buffer += 512;
do_hd = &write_intr;
port_write(HD_DATA,CURRENT->buffer,256);
return;
}
end_request(1);
do_hd_request();
}
void do_hd_request(void)
{
......
if (CURRENT->cmd == WRITE) {
hd_out(dev,nsect,sec,head,cyl,WIN_WRITE,&write_intr);
for(i=0 ; i<3000 && !(r=inb_p(HD_STATUS)&DRQ_STAT) ; i++)
/* nothing */ ;
if (!r) {
bad_rw_intr();
goto repeat;
}
port_write(HD_DATA,CURRENT->buffer,256);
} else if (CURRENT->cmd == READ) {
hd_out(dev,nsect,sec,head,cyl,WIN_READ,&read_intr);
} else
panic("unknown hd-command");
}
kernel\blk_drv\hd.c
static void read_intr(void)
{
if (win_result()) {
bad_rw_intr();
do_hd_request();
return;
}
port_read(HD_DATA,CURRENT->buffer,256);
CURRENT->errors = 0;
CURRENT->buffer += 512;
CURRENT->sector++;
if (--CURRENT->nr_sectors) {
do_hd = &read_intr;
return;
}
end_request(1);
do_hd_request();
}
kernel\blk_drv\blk.h
extern inline void end_request(int uptodate)
{
DEVICE_OFF(CURRENT->dev);
if (CURRENT->bh) {
CURRENT->bh->b_uptodate = uptodate;
unlock_buffer(CURRENT->bh);
}
if (!uptodate) {
printk(DEVICE_NAME " I/O error\n\r");
printk("dev %04x, block %d\n\r",CURRENT->dev,
CURRENT->bh->b_blocknr);
}
wake_up(&CURRENT->waiting);
wake_up(&wait_for_request);
CURRENT->dev = -1;
CURRENT = CURRENT->next;
}
当把内容从硬盘读入缓冲区后bh->b_uptodate被赋值为1。
struct request {
int dev; /* -1 if no request */
int cmd; /* READ or WRITE */
int errors;
unsigned long sector;
unsigned long nr_sectors;
char * buffer;
struct task_struct * waiting;
struct buffer_head * bh;
struct request * next;
};
struct blk_dev_struct {
void (*request_fn)(void);
struct request * current_request;
};
extern struct blk_dev_struct blk_dev[NR_BLK_DEV];
同理,当把内容从缓冲区写入硬盘后bh->b_uptodate被赋值为1。
static void write_intr(void)
{
if (win_result()) {
bad_rw_intr();
do_hd_request();
return;
}
if (--CURRENT->nr_sectors) {
CURRENT->sector++;
CURRENT->buffer += 512;
do_hd = &write_intr;
port_write(HD_DATA,CURRENT->buffer,256);
return;
}
end_request(1);
do_hd_request();
}
相关文章推荐
- linux 0.11 调试教程,minix 1.0 文件系统,上篇(03),super_block,137f和301看见了么?
- linux-0.11调试教程,minix文件系统1.0,上篇(02)sys_setup
- linux-0.11调试教程,minix文件系统1.0上篇(01),硬盘基本参数hd_info
- linux-0.11调试教程 minix文件系统1.0 下篇(2)inode_table内存i节点表和目录 /etc/tty0
- linux-0.11调试教程 minix 文件系统1.0 下篇(3)文件表 file_table
- linux-0.11调试教程,bootsect.s文件调试,Loading system ...
- linux-0.11调试教程,安装minix-1.5.10到硬盘(3)安装shoelace后修改/etc/rc文件和更改root密码
- linux-0.11调试教程,task3(02)系统调用sys_alarm和sigaction结构
- linux-0.11调试教程,系统调用sys_write的调用过程
- linux-0.11调试教程,img文件的分区和格式化,写了个fdisk1可以新建一个分区
- linux0.11调试教程,写了个readinode,参数i节点号,返回磁盘i节点到文件inodexxxx
- linux-0.11调试教程,Bochs-2.1.1配置文件,精简版可拷贝,及img文件制作过程
- linux-0.11调试教程,task3(01),/etc/rc文件
- Ubuntu+Win7+Samba实现文件共享_Linux教程_Linux公社-Linux系统门户网站
- 关于linux0.11文件系统高速缓冲的见解【《linux内核完全注释》阅读笔记】
- Linux教程:文件系统基础知识
- linux-0.11调试教程,HIST_ENTRY结构中data域的用处
- Linux 中的 VFS 文件系统之基础知识:挂载的含义
- 基于topeer 4412开发板 无界面linux文件系统的制作
- ubuntu12.04编译调试inux0.11(引导+根文件系统集成盘)