📄 54.html
字号:
<html>
<head>
<title>kernel/blk_drv/blk.h</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>/blk.h</h2>
<i><font color='green'>/* [<][>]<a href='#L126'>[^]</a><a href='#L136'>[v]</a>[top]<a href='#BOTTOM'>[bottom]</a><a href='../mains.html'>[index]</a><a href='../help.html'>[help]</a> */</font></i>
<hr>
<h2><a href='../J/54.html' title='Multiple included from 4 places.'>INCLUDED FROM</a></h2>
<hr>
<h2>DEFINITIONS</h2>
This source file includes following definitions.
<ol>
<li><a href='#L126' title='Defined at 126.'>unlock_buffer</a>
<li><a href='#L136' title='Defined at 136.'>end_request</a>
</ol>
<hr>
<pre>
<a name='L1'><font color='darkred'>#ifndef</font> <a href='../S/54.html#L2' title='Defined at 2 in kernel/blk_drv/blk.h.'>_BLK_H</a>
<a name='L2'><font color='darkred'>#define</font> <a href='../S/54.html#L1' title='Refered from 1 in kernel/blk_drv/blk.h.'>_BLK_H</a>
<a name='L3'>
<a name='L4'><font color='darkred'>#define</font> <a href='../R/139.html' title='Multiple refered from 3 places.'>NR_BLK_DEV</a> 7 <i><font color='green'>// 块设备的数量。</font></i>
<a name='L5'><i><font color='green'>/*</font></i>
<a name='L6'><i><font color='green'>* NR_REQUEST is the number of entries in the request-queue.</font></i>
<a name='L7'><i><font color='green'>* NOTE that writes may use only the low 2/3 of these: reads</font></i>
<a name='L8'><i><font color='green'>* take precedence.</font></i>
<a name='L9'><i><font color='green'>*</font></i>
<a name='L10'><i><font color='green'>* 32 seems to be a reasonable number: enough to get some benefit</font></i>
<a name='L11'><i><font color='green'>* from the elevator-mechanism, but not so much as to lock a lot of</font></i>
<a name='L12'><i><font color='green'>* buffers when they are in the queue. 64 seems to be too many (easily</font></i>
<a name='L13'><i><font color='green'>* long pauses in reading when heavy writing/syncing is going on)</font></i>
<a name='L14'><i><font color='green'>*/</font></i>
<a name='L15'><i><font color='green'>/*</font></i>
<a name='L16'><i><font color='green'>* 下面定义的NR_REQUEST 是请求队列中所包含的项数。</font></i>
<a name='L17'><i><font color='green'>* 注意,读操作仅使用这些项低端的2/3;读操作优先处理。</font></i>
<a name='L18'><i><font color='green'>*</font></i>
<a name='L19'><i><font color='green'>* 32 项好象是一个合理的数字:已经足够从电梯算法中获得好处,</font></i>
<a name='L20'><i><font color='green'>* 但当缓冲区在队列中而锁住时又不显得是很大的数。64 就看上</font></i>
<a name='L21'><i><font color='green'>* 去太大了(当大量的写/同步操作运行时很容易引起长时间的暂停)。</font></i>
<a name='L22'><i><font color='green'>*/</font></i>
<a name='L23'><font color='darkred'>#define</font> <a href='../R/146.html' title='Multiple refered from 5 places.'>NR_REQUEST</a> 32
<a name='L24'>
<a name='L25'><i><font color='green'>/*</font></i>
<a name='L26'><i><font color='green'>* Ok, this is an expanded form so that we can use the same</font></i>
<a name='L27'><i><font color='green'>* request for paging requests when that is implemented. In</font></i>
<a name='L28'><i><font color='green'>* paging, 'bh' is NULL, and 'waiting' is used to wait for</font></i>
<a name='L29'><i><font color='green'>* read/write completion.</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'>* OK,下面是request 结构的一个扩展形式,因而当实现以后,我们就可以在分页请求中</font></i>
<a name='L33'><i><font color='green'>* 使用同样的request 结构。在分页处理中,'bh'是NULL,而'waiting'则用于等待读/写的完成。</font></i>
<a name='L34'><i><font color='green'>*/</font></i>
<a name='L35'><i><font color='green'>// 下面是请求队列中项的结构。其中如果dev=-1,则表示该项没有被使用。</font></i>
<a name='L36'><b>struct</b> request
<a name='L37'><font color='red'>{</font>
<a name='L38'> <b>int</b> <a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a>; <i><font color='green'>/* -1 if no request */</font></i><i><font color='green'>// 使用的设备号。</font></i>
<a name='L39'> <b>int</b> cmd; <i><font color='green'>/* READ or WRITE */</font></i><i><font color='green'>// 命令(READ 或WRITE)。</font></i>
<a name='L40'> <b>int</b> errors; <i><font color='green'>//操作时产生的错误次数。</font></i>
<a name='L41'> <b>unsigned</b> <b>long</b> sector; <i><font color='green'>// 起始扇区。(1 块=2 扇区)</font></i>
<a name='L42'> <b>unsigned</b> <b>long</b> nr_sectors; <i><font color='green'>// 读/写扇区数。</font></i>
<a name='L43'> <b>char</b> *buffer; <i><font color='green'>// 数据缓冲区。</font></i>
<a name='L44'> <b>struct</b> task_struct *waiting; <i><font color='green'>// 任务等待操作执行完成的地方。</font></i>
<a name='L45'> <b>struct</b> buffer_head *bh; <i><font color='green'>// 缓冲区头指针(include/linux/fs.h,68)。</font></i>
<a name='L46'> <b>struct</b> request *next; <i><font color='green'>// 指向下一请求项。</font></i>
<a name='L47'><font color='red'>}</font>;
<a name='L48'>
<a name='L49'><i><font color='green'>/*</font></i>
<a name='L50'><i><font color='green'>* This is used in the elevator algorithm: Note that</font></i>
<a name='L51'><i><font color='green'>* reads always go before writes. This is natural: reads</font></i>
<a name='L52'><i><font color='green'>* are much more time-critical than writes.</font></i>
<a name='L53'><i><font color='green'>*/</font></i>
<a name='L54'><i><font color='green'>/*</font></i>
<a name='L55'><i><font color='green'>* 下面的定义用于电梯算法:注意读操作总是在写操作之前进行。</font></i>
<a name='L56'><i><font color='green'>* 这是很自然的:读操作对时间的要求要比写严格得多。</font></i>
<a name='L57'><i><font color='green'>*/</font></i>
<a name='L58'><font color='darkred'>#define</font> <a href='../R/99.html' title='Multiple refered from 2 places.'>IN_ORDER</a>(s1,s2) \
<a name='L59'>((s1)->cmd<(s2)->cmd || (s1)->cmd==(s2)->cmd && \
<a name='L60'>((s1)-><a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a> < (s2)-><a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a> || ((s1)-><a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a> == (s2)-><a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a> && \
<a name='L61'>(s1)->sector < (s2)->sector)))
<a name='L62'>
<a name='L63'><i><font color='green'>// 块设备结构。</font></i>
<a name='L64'><b>struct</b> blk_dev_struct
<a name='L65'><font color='red'>{</font>
<a name='L66'> <b>void</b> (*request_fn) (<b>void</b>); <i><font color='green'>// 请求操作的函数指针。</font></i>
<a name='L67'> <b>struct</b> request *current_request; <i><font color='green'>// 请求信息结构。</font></i>
<a name='L68'><font color='red'>}</font>;
<a name='L69'>
<a name='L70'><b>extern</b> <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>]; <i><font color='green'>// 块设备数组,每种块设备占用一项。</font></i>
<a name='L71'><b>extern</b> <b>struct</b> request request[<a href='../S/54.html#L23' title='Defined at 23 in kernel/blk_drv/blk.h.'>NR_REQUEST</a>]; <i><font color='green'>// 请求队列数组。</font></i>
<a name='L72'><b>extern</b> <b>struct</b> task_struct *wait_for_request; <i><font color='green'>// 等待请求的任务结构。</font></i>
<a name='L73'>
<a name='L74'><font color='darkred'>#ifdef</font> <a href='../D/225.html' title='Multiple defined in 3 places.'>MAJOR_NR</a> <i><font color='green'>// 主设备号。</font></i>
<a name='L75'>
<a name='L76'><i><font color='green'>/*</font></i>
<a name='L77'><i><font color='green'>* Add entries as needed. Currently the only block devices</font></i>
<a name='L78'><i><font color='green'>* supported are hard-disks and floppies.</font></i>
<a name='L79'><i><font color='green'>*/</font></i>
<a name='L80'><i><font color='green'>/*</font></i>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -