⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 57.html

📁 linux 0.11中文版 有注释
💻 HTML
📖 第 1 页 / 共 2 页
字号:
<html>
<head>
<title>kernel/blk_drv/ll_rw_blk.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/104.html'>kernel</a>/<a href='../files/105.html'>blk_drv</a>/ll_rw_blk.c</h2>
<i><font color='green'>/* [&lt;][&gt;]<a href='#L58'>[^]</a><a href='#L221'>[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='#L58' title='Defined at 58.'>lock_buffer</a>
<li><a href='#L69' title='Defined at 69.'>unlock_buffer</a>
<li><a href='#L88' title='Defined at 88.'>add_request</a>
<li><a href='#L118' title='Defined at 118.'>make_request</a>
<li><a href='#L204' title='Defined at 204.'>ll_rw_block</a>
<li><a href='#L221' title='Defined at 221.'>blk_dev_init</a>
</ol>
<hr>
<pre>
<a name='L1'><i><font color='green'>/*</font></i>
<a name='L2'><i><font color='green'>* linux/kernel/blk_dev/ll_rw.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'>* This handles all read/write requests to block devices</font></i>
<a name='L9'><i><font color='green'>*/</font></i>
<a name='L10'><i><font color='green'>/*</font></i>
<a name='L11'><i><font color='green'>* 该程序处理块设备的所有读/写操作。</font></i>
<a name='L12'><i><font color='green'>*/</font></i>
<a name='L13'><font color='darkred'>#include</font> &lt;<a href='28.html'>errno.h</a>&gt;              <i><font color='green'>// 错误号头文件。包含系统中各种出错号。(Linus 从minix 中引进的)</font></i>
<a name='L14'><font color='darkred'>#include</font> &lt;<a href='36.html'>linux/sched.h</a>&gt;        <i><font color='green'>// 调度程序头文件,定义了任务结构task_struct、初始任务0 的数据,</font></i>
<a name='L15'><i><font color='green'>// 还有一些有关描述符参数设置和获取的嵌入式汇编函数宏语句。</font></i>
<a name='L16'><font color='darkred'>#include</font> &lt;<a href='34.html'>linux/kernel.h</a>&gt;       <i><font color='green'>// 内核头文件。含有一些内核常用函数的原形定义。</font></i>
<a name='L17'><font color='darkred'>#include</font> &lt;<a href='25.html'>asm/system.h</a>&gt;         <i><font color='green'>// 系统头文件。定义了设置或修改描述符/中断门等的嵌入式汇编宏。</font></i>
<a name='L18'>
<a name='L19'><font color='darkred'>#include</font> "<a href='54.html'>blk.h</a>"                <i><font color='green'>// 块设备头文件。定义请求数据结构、块设备数据结构和宏函数等信息。</font></i>
<a name='L20'>
<a name='L21'><i><font color='green'>/*</font></i>
<a name='L22'><i><font color='green'>* The request-struct contains all necessary data</font></i>
<a name='L23'><i><font color='green'>* to load a nr of sectors into memory</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'>* 请求结构中含有加载nr 扇区数据到内存的所有必须的信息。</font></i>
<a name='L27'><i><font color='green'>*/</font></i>
<a name='L28'><b>struct</b> request request[<a href='../S/54.html#L23' title='Defined at 23 in kernel/blk_drv/blk.h.'>NR_REQUEST</a>];
<a name='L29'>
<a name='L30'><i><font color='green'>/*</font></i>
<a name='L31'><i><font color='green'>* used to wait on when there are no free requests</font></i>
<a name='L32'><i><font color='green'>*/</font></i>
<a name='L33'><i><font color='green'>/* 是用于请求数组没有空闲项时的临时等待处 */</font></i>
<a name='L34'><b>struct</b> task_struct *wait_for_request = <a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a>;
<a name='L35'>
<a name='L36'><i><font color='green'>/* blk_dev_struct is:</font></i>
<a name='L37'><i><font color='green'>* do_request-address</font></i>
<a name='L38'><i><font color='green'>* next-request</font></i>
<a name='L39'><i><font color='green'>*/</font></i>
<a name='L40'><i><font color='green'>/* blk_dev_struct 块设备结构是:(kernel/blk_drv/blk.h,23)</font></i>
<a name='L41'><i><font color='green'>* do_request-address //对应主设备号的请求处理程序指针。</font></i>
<a name='L42'><i><font color='green'>* current-request // 该设备的下一个请求。</font></i>
<a name='L43'><i><font color='green'>*/</font></i>
<a name='L44'><i><font color='green'>// 该数组使用主设备号作为索引(下标)。</font></i>
<a name='L45'><b>struct</b> blk_dev_struct blk_dev[<a href='../S/54.html#L4' title='Defined at 4 in kernel/blk_drv/blk.h.'>NR_BLK_DEV</a>] = <font color='red'>{</font>
<a name='L46'>  <font color='red'>{</font><a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a>, <a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a><font color='red'>}</font>,                 <i><font color='green'>/* no_dev */</font></i><i><font color='green'>// 0 - 无设备。</font></i>
<a name='L47'>  <font color='red'>{</font><a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a>, <a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a><font color='red'>}</font>,                 <i><font color='green'>/* dev mem */</font></i><i><font color='green'>// 1 - 内存。</font></i>
<a name='L48'>  <font color='red'>{</font><a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a>, <a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a><font color='red'>}</font>,                 <i><font color='green'>/* dev fd */</font></i><i><font color='green'>// 2 - 软驱设备。</font></i>
<a name='L49'>  <font color='red'>{</font><a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a>, <a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a><font color='red'>}</font>,                 <i><font color='green'>/* dev hd */</font></i><i><font color='green'>// 3 - 硬盘设备。</font></i>
<a name='L50'>  <font color='red'>{</font><a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a>, <a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a><font color='red'>}</font>,                 <i><font color='green'>/* dev ttyx */</font></i><i><font color='green'>// 4 - ttyx 设备。</font></i>
<a name='L51'>  <font color='red'>{</font><a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a>, <a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a><font color='red'>}</font>,                 <i><font color='green'>/* dev tty */</font></i><i><font color='green'>// 5 - tty 设备。</font></i>
<a name='L52'>  <font color='red'>{</font><a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a>, <a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a><font color='red'>}</font>                  <i><font color='green'>/* dev lp */</font></i><i><font color='green'>// 6 - lp 打印机设备。</font></i>
<a name='L53'><font color='red'>}</font>;
<a name='L54'>
<a name='L55'><i><font color='green'>// 锁定指定的缓冲区bh。如果指定的缓冲区已经被其它任务锁定,则使自己睡眠(不可中断地等待),</font></i>
<a name='L56'><i><font color='green'>// 直到被执行解锁缓冲区的任务明确地唤醒。</font></i>
<a name='L57'><b>static</b> <b>inline</b> <b>void</b>
<a name='L58'><a href='../S/57.html#L142' title='Refered from 142 in kernel/blk_drv/ll_rw_blk.c.'>lock_buffer</a> (<b>struct</b> buffer_head *bh)
<a name='L59'><font color='red'>{</font>
<a name='L60'>  <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='L61'>  <b>while</b> (bh-&gt;b_lock)            <i><font color='green'>// 如果缓冲区已被锁定,则睡眠,直到缓冲区解锁。</font></i>
<a name='L62'>    <a href='../S/74.html#L219' title='Defined at 219 in kernel/sched.c.'>sleep_on</a> (&amp;bh-&gt;b_wait);
<a name='L63'>  bh-&gt;b_lock = 1;               <i><font color='green'>// 立刻锁定该缓冲区。</font></i>
<a name='L64'>  <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='L65'><font color='red'>}</font>
<a name='L66'>
<a name='L67'><i><font color='green'>// 释放(解锁)锁定的缓冲区。</font></i>
<a name='L68'><b>static</b> <b>inline</b> <b>void</b>
<a name='L69'><a href='../R/719.html' title='Multiple refered from 3 places.'>unlock_buffer</a> (<b>struct</b> buffer_head *bh)
<a name='L70'><font color='red'>{</font>
<a name='L71'>  <b>if</b> (!bh-&gt;b_lock)              <i><font color='green'>// 如果该缓冲区并没有被锁定,则打印出错信息。</font></i>
<a name='L72'>    <a href='../S/73.html#L30' title='Defined at 30 in kernel/printk.c.'>printk</a> ("ll_rw_block.c: buffer not locked\n\r");
<a name='L73'>  bh-&gt;b_lock = 0;               <i><font color='green'>// 清锁定标志。</font></i>
<a name='L74'>  <a href='../S/74.html#L272' title='Defined at 272 in kernel/sched.c.'>wake_up</a> (&amp;bh-&gt;b_wait);        <i><font color='green'>// 唤醒等待该缓冲区的任务。</font></i>
<a name='L75'><font color='red'>}</font>
<a name='L76'>
<a name='L77'><i><font color='green'>/*</font></i>
<a name='L78'><i><font color='green'>* add-request adds a request to the linked list.</font></i>
<a name='L79'><i><font color='green'>* It disables interrupts so that it can muck with the</font></i>
<a name='L80'><i><font color='green'>* request-lists in peace.</font></i>
<a name='L81'><i><font color='green'>*/</font></i>
<a name='L82'><i><font color='green'>/*</font></i>
<a name='L83'><i><font color='green'>* add-request()向连表中加入一项请求。它关闭中断,</font></i>
<a name='L84'><i><font color='green'>* 这样就能安全地处理请求连表了 */</font></i>
<a name='L85'>*/
<a name='L86'><i><font color='green'>//// 向链表中加入请求项。参数dev 指定块设备,req 是请求的结构信息。</font></i>
<a name='L87'>  <b>static</b> <b>void</b>
<a name='L88'><a href='../S/57.html#L197' title='Refered from 197 in kernel/blk_drv/ll_rw_blk.c.'>add_request</a> (<b>struct</b> blk_dev_struct *dev, <b>struct</b> request *req)
<a name='L89'><font color='red'>{</font>
<a name='L90'>  <b>struct</b> request *tmp;
<a name='L91'>
<a name='L92'>  req-&gt;next = <a href='../D/261.html' title='Multiple defined in 12 places.'>NULL</a>;
<a name='L93'>  <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='L94'>  <b>if</b> (req-&gt;bh)
<a name='L95'>    req-&gt;bh-&gt;b_dirt = 0;        <i><font color='green'>// 清缓冲区“脏”标志。</font></i>
<a name='L96'><i><font color='green'>// 如果dev 的当前请求(current_request)子段为空,则表示目前该设备没有请求项,本次是第1 个</font></i>
<a name='L97'><i><font color='green'>// 请求项,因此可将块设备当前请求指针直接指向请求项,并立刻执行相应设备的请求函数。</font></i>
<a name='L98'>  <b>if</b> (!(tmp = <a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a>-&gt;current_request))
<a name='L99'>    <font color='red'>{</font>
<a name='L100'>      <a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a>-&gt;current_request = req;
<a name='L101'>      <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='L102'>      (<a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a>-&gt;request_fn) ();     <i><font color='green'>// 执行设备请求函数,对于硬盘(3)是do_hd_request()。</font></i>
<a name='L103'>      <b>return</b>;
<a name='L104'>    <font color='red'>}</font>
<a name='L105'><i><font color='green'>// 如果目前该设备已经有请求项在等待,则首先利用电梯算法搜索最佳位置,然后将当前请求插入</font></i>
<a name='L106'><i><font color='green'>// 请求链表中。</font></i>
<a name='L107'>  <b>for</b> (; tmp-&gt;next; tmp = tmp-&gt;next)
<a name='L108'>    <b>if</b> ((<a href='../S/54.html#L58' title='Defined at 58 in kernel/blk_drv/blk.h.'>IN_ORDER</a> (tmp, req) ||

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -