6.html
来自「linux 0.11中文版 有注释」· HTML 代码 · 共 596 行 · 第 1/4 页
HTML
596 行
<html>
<head>
<title>fs/buffer.c</title>
<meta name='robots' content='noindex,nofollow'>
<meta name='generator' content='GLOBAL-5.4.1'>
</head>
<body text='#191970' bgcolor='#f5f5dc' vlink='gray'>
<a name='TOP'><h2><a href='../mains.html'>root</a>/<a href='../files/98.html'>fs</a>/buffer.c</h2>
<i><font color='green'>/* [<][>]<a href='#L64'>[^]</a><a href='#L515'>[v]</a>[top]<a href='#BOTTOM'>[bottom]</a><a href='../mains.html'>[index]</a><a href='../help.html'>[help]</a> */</font></i>
<hr>
<h2>DEFINITIONS</h2>
This source file includes following definitions.
<ol>
<li><a href='#L64' title='Defined at 64.'>wait_on_buffer</a>
<li><a href='#L74' title='Defined at 74.'>sys_sync</a>
<li><a href='#L93' title='Defined at 93.'>sync_dev</a>
<li><a href='#L123' title='Defined at 123.'>invalidate_buffers</a>
<li><a href='#L165' title='Defined at 165.'>check_disk_change</a>
<li><a href='#L190' title='Defined at 190.'>remove_from_queues</a>
<li><a href='#L214' title='Defined at 214.'>insert_into_queues</a>
<li><a href='#L236' title='Defined at 236.'>find_buffer</a>
<li><a href='#L261' title='Defined at 261.'>get_hash_table</a>
<li><a href='#L301' title='Defined at 301.'>getblk</a>
<li><a href='#L377' title='Defined at 377.'>brelse</a>
<li><a href='#L397' title='Defined at 397.'>bread</a>
<li><a href='#L439' title='Defined at 439.'>bread_page</a>
<li><a href='#L478' title='Defined at 478.'>breada</a>
<li><a href='#L515' title='Defined at 515.'>buffer_init</a>
</ol>
<hr>
<pre>
<a name='L1'><i><font color='green'>/*</font></i>
<a name='L2'><i><font color='green'>* linux/fs/buffer.c</font></i>
<a name='L3'><i><font color='green'>*</font></i>
<a name='L4'><i><font color='green'>* (C) 1991 Linus Torvalds</font></i>
<a name='L5'><i><font color='green'>*/</font></i>
<a name='L6'>
<a name='L7'><i><font color='green'>/*</font></i>
<a name='L8'><i><font color='green'>* 'buffer.c' implements the buffer-cache functions. Race-conditions have</font></i>
<a name='L9'><i><font color='green'>* been avoided by NEVER letting a interrupt change a buffer (except for the</font></i>
<a name='L10'><i><font color='green'>* data, of course), but instead letting the caller do it. NOTE! As interrupts</font></i>
<a name='L11'><i><font color='green'>* can wake up a caller, some cli-sti sequences are needed to check for</font></i>
<a name='L12'><i><font color='green'>* sleep-on-calls. These should be extremely quick, though (I hope).</font></i>
<a name='L13'><i><font color='green'>*/</font></i>
<a name='L14'><i><font color='green'>/*</font></i>
<a name='L15'><i><font color='green'>* 'buffer.c'用于实现缓冲区高速缓存功能。通过不让中断过程改变缓冲区,而是让调用者</font></i>
<a name='L16'><i><font color='green'>* 来执行,避免了竞争条件(当然除改变数据以外)。注意!由于中断可以唤醒一个调用者,</font></i>
<a name='L17'><i><font color='green'>* 因此就需要开关中断指令(cli-sti)序列来检测等待调用返回。但需要非常地快(希望是这样)。</font></i>
<a name='L18'><i><font color='green'>*/</font></i>
<a name='L19'>
<a name='L20'><i><font color='green'>/*</font></i>
<a name='L21'><i><font color='green'>* NOTE! There is one discordant note here: checking floppies for</font></i>
<a name='L22'><i><font color='green'>* disk change. This is where it fits best, I think, as it should</font></i>
<a name='L23'><i><font color='green'>* invalidate changed floppy-disk-caches.</font></i>
<a name='L24'><i><font color='green'>*/</font></i>
<a name='L25'><i><font color='green'>/*</font></i>
<a name='L26'><i><font color='green'>否</font></i>
<a name='L27'><i><font color='green'>是</font></i>
<a name='L28'><i><font color='green'>bread</font></i>
<a name='L29'><i><font color='green'>获取缓冲块(getblk)</font></i>
<a name='L30'><i><font color='green'>块中数据有效?</font></i>
<a name='L31'><i><font color='green'>调用块设备低层块读写</font></i>
<a name='L32'><i><font color='green'>函数ll_rw_block()</font></i>
<a name='L33'><i><font color='green'>进入睡眠等待状态</font></i>
<a name='L34'><i><font color='green'>否</font></i>
<a name='L35'><i><font color='green'>是</font></i>
<a name='L36'><i><font color='green'>块中数据有效?</font></i>
<a name='L37'><i><font color='green'>释放该缓冲块</font></i>
<a name='L38'><i><font color='green'>返回NULL</font></i>
<a name='L39'><i><font color='green'>返回缓冲块头指针</font></i>
<a name='L40'><i><font color='green'>* 注意!这里有一个程序应不属于这里:检测软盘是否更换。但我想这里是</font></i>
<a name='L41'><i><font color='green'>* 放置该程序最好的地方了,因为它需要使已更换软盘缓冲失效。</font></i>
<a name='L42'><i><font color='green'>*/</font></i>
<a name='L43'>
<a name='L44'><font color='darkred'>#include</font> <<a href='40.html'>stdarg.h</a>> <i><font color='green'>// 标准参数头文件。以宏的形式定义变量参数列表。主要说明了-个</font></i>
<a name='L45'><i><font color='green'>// 类型(va_list)和三个宏(va_start, va_arg 和va_end),用于</font></i>
<a name='L46'><i><font color='green'>// vsprintf、vprintf、vfprintf 函数。</font></i>
<a name='L47'>
<a name='L48'><font color='darkred'>#include</font> <<a href='30.html'>linux/config.h</a>> <i><font color='green'>// 内核配置头文件。定义键盘语言和硬盘类型(HD_TYPE)可选项。</font></i>
<a name='L49'><font color='darkred'>#include</font> <<a href='36.html'>linux/sched.h</a>> <i><font color='green'>// 调度程序头文件,定义了任务结构task_struct、初始任务0 的数据,</font></i>
<a name='L50'><i><font color='green'>// 还有一些有关描述符参数设置和获取的嵌入式汇编函数宏语句。</font></i>
<a name='L51'><font color='darkred'>#include</font> <<a href='34.html'>linux/kernel.h</a>> <i><font color='green'>// 内核头文件。含有一些内核常用函数的原形定义。</font></i>
<a name='L52'><font color='darkred'>#include</font> <<a href='25.html'>asm/system.h</a>> <i><font color='green'>// 系统头文件。定义了设置或修改描述符/中断门等的嵌入式汇编宏。</font></i>
<a name='L53'><font color='darkred'>#include</font> <<a href='22.html'>asm/io.h</a>> <i><font color='green'>// io 头文件。定义硬件端口输入/输出宏汇编语句。</font></i>
<a name='L54'>
<a name='L55'><b>extern</b> <b>int</b> end; <i><font color='green'>// 由连接程序ld 生成的表明程序末端的变量。[??]</font></i>
<a name='L56'><b>struct</b> buffer_head *start_buffer = (<b>struct</b> buffer_head *) &end;
<a name='L57'><b>struct</b> buffer_head *hash_table[<a href='../S/31.html#L63' title='Defined at 63 in include/linux/fs.h.'>NR_HASH</a>]; <i><font color='green'>// NR_HASH = 307 项。</font></i>
<a name='L58'><b>static</b> <b>struct</b> buffer_head *free_list;
<a name='L59'><b>static</b> <b>struct</b> task_struct *buffer_wait = <a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a>;
<a name='L60'><b>int</b> <a href='../S/31.html#L64' title='Defined at 64 in include/linux/fs.h.'>NR_BUFFERS</a> = 0;
<a name='L61'>
<a name='L62'><i><font color='green'>//// 等待指定缓冲区解锁。</font></i>
<a name='L63'><b>static</b> <b>inline</b> <b>void</b>
<a name='L64'><a href='../R/729.html' title='Multiple refered from 11 places.'>wait_on_buffer</a> (<b>struct</b> buffer_head *bh)
<a name='L65'><font color='red'>{</font>
<a name='L66'> <a href='../S/25.html#L15' title='Defined at 15 in include/asm/system.h.'>cli</a> (); <i><font color='green'>// 关中断。</font></i>
<a name='L67'> <b>while</b> (bh->b_lock) <i><font color='green'>// 如果已被上锁,则进程进入睡眠,等待其解锁。</font></i>
<a name='L68'> <a href='../S/74.html#L219' title='Defined at 219 in kernel/sched.c.'>sleep_on</a> (&bh->b_wait);
<a name='L69'> <a href='../S/25.html#L14' title='Defined at 14 in include/asm/system.h.'>sti</a> (); <i><font color='green'>// 开中断。</font></i>
<a name='L70'><font color='red'>}</font>
<a name='L71'>
<a name='L72'><i><font color='green'>//// 系统调用。同步设备和内存高速缓冲中数据。</font></i>
<a name='L73'><b>int</b>
<a name='L74'><a href='../R/686.html' title='Multiple refered from 4 places.'>sys_sync</a> (<b>void</b>)
<a name='L75'><font color='red'>{</font>
<a name='L76'> <b>int</b> <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>;
<a name='L77'> <b>struct</b> buffer_head *bh;
<a name='L78'>
<a name='L79'> <a href='../S/12.html#L77' title='Defined at 77 in fs/inode.c.'>sync_inodes</a> (); <i><font color='green'>/* write out inodes into buffers */</font></i><i><font color='green'>/*将i 节点写入高速缓冲 */</font></i>
<a name='L80'><i><font color='green'>// 扫描所有高速缓冲区,对于已被修改的缓冲块产生写盘请求,将缓冲中数据与设备中同步。</font></i>
<a name='L81'> bh = start_buffer;
<a name='L82'> <b>for</b> (<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> = 0; <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> < <a href='../S/31.html#L64' title='Defined at 64 in include/linux/fs.h.'>NR_BUFFERS</a>; <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>++, bh++)
<a name='L83'> <font color='red'>{</font>
<a name='L84'> <a href='../S/6.html#L64' title='Defined at 64 in fs/buffer.c.'>wait_on_buffer</a> (bh); <i><font color='green'>// 等待缓冲区解锁(如果已上锁的话)。</font></i>
<a name='L85'> <b>if</b> (bh->b_dirt)
<a name='L86'> <a href='../S/57.html#L204' title='Defined at 204 in kernel/blk_drv/ll_rw_blk.c.'>ll_rw_block</a> (<a href='../S/31.html#L43' title='Defined at 43 in include/linux/fs.h.'>WRITE</a>, bh); <i><font color='green'>// 产生写设备块请求。</font></i>
<a name='L87'> <font color='red'>}</font>
<a name='L88'> <b>return</b> 0;
<a name='L89'><font color='red'>}</font>
<a name='L90'>
<a name='L91'><i><font color='green'>//// 对指定设备进行高速缓冲数据与设备上数据的同步操作。</font></i>
<a name='L92'><b>int</b>
<a name='L93'><a href='../R/626.html' title='Multiple refered from 5 places.'>sync_dev</a> (<b>int</b> dev)
<a name='L94'><font color='red'>{</font>
<a name='L95'> <b>int</b> <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>;
<a name='L96'> <b>struct</b> buffer_head *bh;
<a name='L97'>
<a name='L98'> bh = start_buffer;
<a name='L99'> <b>for</b> (<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> = 0; <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> < <a href='../S/31.html#L64' title='Defined at 64 in include/linux/fs.h.'>NR_BUFFERS</a>; <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>++, bh++)
<a name='L100'> <font color='red'>{</font>
<a name='L101'> <b>if</b> (bh->b_dev != <a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a>)
<a name='L102'> <b>continue</b>;
<a name='L103'> <a href='../S/6.html#L64' title='Defined at 64 in fs/buffer.c.'>wait_on_buffer</a> (bh);
<a name='L104'> <b>if</b> (bh->b_dev == <a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a> && bh->b_dirt)
<a name='L105'> <a href='../S/57.html#L204' title='Defined at 204 in kernel/blk_drv/ll_rw_blk.c.'>ll_rw_block</a> (<a href='../S/31.html#L43' title='Defined at 43 in include/linux/fs.h.'>WRITE</a>, bh);
<a name='L106'> <font color='red'>}</font>
<a name='L107'> <a href='../S/12.html#L77' title='Defined at 77 in fs/inode.c.'>sync_inodes</a> (); <i><font color='green'>// 将i 节点数据写入高速缓冲。</font></i>
<a name='L108'> bh = start_buffer;
<a name='L109'> <b>for</b> (<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> = 0; <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> < <a href='../S/31.html#L64' title='Defined at 64 in include/linux/fs.h.'>NR_BUFFERS</a>; <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>++, bh++)
<a name='L110'> <font color='red'>{</font>
<a name='L111'> <b>if</b> (bh->b_dev != <a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a>)
<a name='L112'> <b>continue</b>;
<a name='L113'> <a href='../S/6.html#L64' title='Defined at 64 in fs/buffer.c.'>wait_on_buffer</a> (bh);
<a name='L114'> <b>if</b> (bh->b_dev == <a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a> && bh->b_dirt)
<a name='L115'> <a href='../S/57.html#L204' title='Defined at 204 in kernel/blk_drv/ll_rw_blk.c.'>ll_rw_block</a> (<a href='../S/31.html#L43' title='Defined at 43 in include/linux/fs.h.'>WRITE</a>, bh);
<a name='L116'> <font color='red'>}</font>
<a name='L117'> <b>return</b> 0;
<a name='L118'><font color='red'>}</font>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?