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

📄 56.html

📁 linux 0.11中文版 有注释
💻 HTML
📖 第 1 页 / 共 4 页
字号:
<html>
<head>
<title>kernel/blk_drv/hd.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>/hd.c</h2>
<i><font color='green'>/* [&lt;][&gt;]<a href='#L107'>[^]</a><a href='#L463'>[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='#L107' title='Defined at 107.'>sys_setup</a>
<li><a href='#L226' title='Defined at 226.'>controller_ready</a>
<li><a href='#L237' title='Defined at 237.'>win_result</a>
<li><a href='#L254' title='Defined at 254.'>hd_out</a>
<li><a href='#L278' title='Defined at 278.'>drive_busy</a>
<li><a href='#L294' title='Defined at 294.'>reset_controller</a>
<li><a href='#L310' title='Defined at 310.'>reset_hd</a>
<li><a href='#L320' title='Defined at 320.'>unexpected_hd_interrupt</a>
<li><a href='#L326' title='Defined at 326.'>bad_rw_intr</a>
<li><a href='#L336' title='Defined at 336.'>read_intr</a>
<li><a href='#L360' title='Defined at 360.'>write_intr</a>
<li><a href='#L382' title='Defined at 382.'>recal_intr</a>
<li><a href='#L390' title='Defined at 390.'>do_hd_request</a>
<li><a href='#L463' title='Defined at 463.'>hd_init</a>
</ol>
<hr>
<pre>
<a name='L1'><i><font color='green'>/*</font></i>
<a name='L2'><i><font color='green'>* linux/kernel/hd.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 is the low-level hd interrupt support. It traverses the</font></i>
<a name='L9'><i><font color='green'>* request-list, using interrupts to jump between functions. As</font></i>
<a name='L10'><i><font color='green'>* all the functions are called within interrupts, we may not</font></i>
<a name='L11'><i><font color='green'>* sleep. Special care is recommended.</font></i>
<a name='L12'><i><font color='green'>*</font></i>
<a name='L13'><i><font color='green'>* modified by Drew Eckhardt to check nr of hd's from the CMOS.</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'>* 本程序是底层硬盘中断辅助程序。主要用于扫描请求列表,使用中断在函数之间跳转。</font></i>
<a name='L17'><i><font color='green'>* 由于所有的函数都是在中断里调用的,所以这些函数不可以睡眠。请特别注意。</font></i>
<a name='L18'><i><font color='green'>* 由Drew Eckhardt 修改,利用CMOS 信息检测硬盘数。</font></i>
<a name='L19'><i><font color='green'>*/</font></i>
<a name='L20'>
<a name='L21'><font color='darkred'>#include</font> &lt;<a href='30.html'>linux/config.h</a>&gt;       <i><font color='green'>// 内核配置头文件。定义键盘语言和硬盘类型(HD_TYPE)可选项。</font></i>
<a name='L22'><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='L23'><i><font color='green'>// 还有一些有关描述符参数设置和获取的嵌入式汇编函数宏语句。</font></i>
<a name='L24'><font color='darkred'>#include</font> &lt;<a href='31.html'>linux/fs.h</a>&gt;           <i><font color='green'>// 文件系统头文件。定义文件表结构(file,buffer_head,m_inode 等)。</font></i>
<a name='L25'><font color='darkred'>#include</font> &lt;<a href='34.html'>linux/kernel.h</a>&gt;       <i><font color='green'>// 内核头文件。含有一些内核常用函数的原形定义。</font></i>
<a name='L26'><font color='darkred'>#include</font> &lt;<a href='32.html'>linux/hdreg.h</a>&gt;        <i><font color='green'>// 硬盘参数头文件。定义访问硬盘寄存器端口,状态码,分区表等信息。</font></i>
<a name='L27'><font color='darkred'>#include</font> &lt;<a href='25.html'>asm/system.h</a>&gt;         <i><font color='green'>// 系统头文件。定义了设置或修改描述符/中断门等的嵌入式汇编宏。</font></i>
<a name='L28'><font color='darkred'>#include</font> &lt;<a href='22.html'>asm/io.h</a>&gt;             <i><font color='green'>// io 头文件。定义硬件端口输入/输出宏汇编语句。</font></i>
<a name='L29'><font color='darkred'>#include</font> &lt;<a href='24.html'>asm/segment.h</a>&gt;        <i><font color='green'>// 段操作头文件。定义了有关段寄存器操作的嵌入式汇编函数。</font></i>
<a name='L30'>
<a name='L31'><font color='darkred'>#define</font> <a href='../R/121.html' title='Multiple refered from 9 places.'>MAJOR_NR</a> 3              <i><font color='green'>// 硬盘主设备号是3。</font></i>
<a name='L32'><font color='darkred'>#include</font> "<a href='54.html'>blk.h</a>"                <i><font color='green'>// 块设备头文件。定义请求数据结构、块设备数据结构和宏函数等信息。</font></i>
<a name='L33'>
<a name='L34'><font color='darkred'>#define</font> <a href='../R/13.html' title='Multiple refered from 9 places.'>CMOS_READ</a>(addr) (<font color='red'>{</font> \    <i><font color='green'>// 读CMOS 参数宏函数。</font></i>
<a name='L35'><a href='../S/22.html#L17' title='Defined at 17 in include/asm/io.h.'>outb_p</a> (0x80 | addr, 0x70);
<a name='L36'><a href='../S/22.html#L25' title='Defined at 25 in include/asm/io.h.'>inb_p</a> (0x71);
<a name='L37'><font color='red'>}</font>
<a name='L38'>
<a name='L39'>)
<a name='L40'><i><font color='green'>/* Max read/write errors/sector */</font></i>
<a name='L41'><font color='darkred'>#define</font> <a href='../R/124.html' title='Multiple refered from 4 places.'>MAX_ERRORS</a> 7            <i><font color='green'>// 读/写一个扇区时允许的最多出错次数。</font></i>
<a name='L42'><font color='darkred'>#define</font> <a href='../S/56.html#L84' title='Refered from 84 in kernel/blk_drv/hd.c.'>MAX_HD</a> 2                <i><font color='green'>// 系统支持的最多硬盘数。</font></i>
<a name='L43'>     <b>static</b> <b>void</b> <a href='../S/56.html#L382' title='Defined at 382 in kernel/blk_drv/hd.c.'>recal_intr</a> (<b>void</b>);     <i><font color='green'>// 硬盘中断程序在复位操作时会调用的重新校正函数(287 行)。</font></i>
<a name='L44'>
<a name='L45'>     <b>static</b> <b>int</b> recalibrate = 1;        <i><font color='green'>// 重新校正标志。</font></i>
<a name='L46'>     <b>static</b> <b>int</b> reset = 1;      <i><font color='green'>// 复位标志。</font></i>
<a name='L47'>
<a name='L48'><i><font color='green'>/*</font></i>
<a name='L49'><i><font color='green'>* This struct defines the HD's and their types.</font></i>
<a name='L50'><i><font color='green'>*/</font></i>
<a name='L51'><i><font color='green'>/* 下面结构定义了硬盘参数及类型 */</font></i>
<a name='L52'><i><font color='green'>// 各字段分别是磁头数、每磁道扇区数、柱面数、写前预补偿柱面号、磁头着陆区柱面号、控制字节。</font></i>
<a name='L53'>     <b>struct</b> hd_i_struct
<a name='L54'>     <font color='red'>{</font>
<a name='L55'>       <b>int</b> head, sect, cyl, wpcom, lzone, ctl;
<a name='L56'>     <font color='red'>}</font>;
<a name='L57'>
<a name='L58'><font color='darkred'>#ifdef</font> HD_TYPE                  <i><font color='green'>// 如果已经在include/linux/config.h 中定义了HD_TYPE…</font></i>
<a name='L59'><b>struct</b> hd_i_struct hd_info[] =
<a name='L60'><font color='red'>{</font>
<a name='L61'>HD_TYPE<font color='red'>}</font>;                       <i><font color='green'>// 取定义好的参数作为hd_info[]的数据。</font></i>
<a name='L62'>
<a name='L63'><font color='darkred'>#define</font> <a href='../R/143.html' title='Multiple refered from 12 places.'>NR_HD</a> ((<b>sizeof</b> (hd_info))/(<b>sizeof</b> (<b>struct</b> hd_i_struct)))        <i><font color='green'>// 计算硬盘数。</font></i>
<a name='L64'><font color='darkred'>#else</font> <i><font color='green'>// 否则,都设为0 值。</font></i>
<a name='L65'><b>struct</b> hd_i_struct hd_info[] =
<a name='L66'><font color='red'>{</font>
<a name='L67'>  <font color='red'>{</font>
<a name='L68'>  0, 0, 0, 0, 0, 0<font color='red'>}</font>
<a name='L69'>  ,
<a name='L70'>  <font color='red'>{</font>
<a name='L71'>  0, 0, 0, 0, 0, 0<font color='red'>}</font>
<a name='L72'><font color='red'>}</font>;
<a name='L73'><b>static</b> <b>int</b> <a href='../S/56.html#L63' title='Defined at 63 in kernel/blk_drv/hd.c.'>NR_HD</a> = 0;
<a name='L74'><font color='darkred'>#endif</font>
<a name='L75'>
<a name='L76'><i><font color='green'>// 定义硬盘分区结构。给出每个分区的物理起始扇区号、分区扇区总数。</font></i>
<a name='L77'><i><font color='green'>// 其中5 的倍数处的项(例如hd[0]和hd[5]等)代表整个硬盘中的参数。</font></i>
<a name='L78'><b>static</b> <b>struct</b> hd_struct
<a name='L79'><font color='red'>{</font>
<a name='L80'>  <b>long</b> start_sect;
<a name='L81'>  <b>long</b> nr_sects;
<a name='L82'><font color='red'>}</font>
<a name='L83'>
<a name='L84'>hd[5 * <a href='../S/56.html#L42' title='Defined at 42 in kernel/blk_drv/hd.c.'>MAX_HD</a>] =
<a name='L85'><font color='red'>{</font>
<a name='L86'>  <font color='red'>{</font>
<a name='L87'>  0, 0<font color='red'>}</font>
<a name='L88'>,<font color='red'>}</font>;
<a name='L89'>
<a name='L90'><i><font color='green'>// 读端口port,共读nr 字,保存在buf 中。</font></i>
<a name='L91'><font color='darkred'>#define</font> <a href='../S/56.html#L344' title='Refered from 344 in kernel/blk_drv/hd.c.'>port_read</a>(port,buf,nr) \
<a name='L92'><b>__asm__</b>( "cld;rep;insw":: "d" (port), "D" (<a href='../D/716.html' title='Multiple defined in 16 places.'>buf</a>), "c" (nr): "cx", "di")
<a name='L93'>
<a name='L94'><i><font color='green'>// 写端口port,共写nr 字,从buf 中取数据。</font></i>
<a name='L95'><font color='darkred'>#define</font> <a href='../R/551.html' title='Multiple refered from 2 places.'>port_write</a>(port,buf,nr) \
<a name='L96'><b>__asm__</b>( "cld;rep;outsw":: "d" (port), "S" (<a href='../D/716.html' title='Multiple defined in 16 places.'>buf</a>), "c" (nr): "cx", "si")
<a name='L97'>
<a name='L98'><b>extern</b> <b>void</b> hd_interrupt (<b>void</b>);

⌨️ 快捷键说明

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