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

📄 4.html

📁 linux 0.11中文版 有注释
💻 HTML
📖 第 1 页 / 共 2 页
字号:
<html>
<head>
<title>fs/bitmap.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>/bitmap.c</h2>
<i><font color='green'>/* [&lt;][&gt;]<a href='#L59'>[^]</a><a href='#L185'>[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='#L59' title='Defined at 59.'>free_block</a>
<li><a href='#L99' title='Defined at 99.'>new_block</a>
<li><a href='#L143' title='Defined at 143.'>free_inode</a>
<li><a href='#L185' title='Defined at 185.'>new_inode</a>
</ol>
<hr>
<pre>
<a name='L1'><i><font color='green'>/*</font></i>
<a name='L2'><i><font color='green'>* linux/fs/bitmap.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'>/* bitmap.c contains the code that handles the inode and block bitmaps */</font></i>
<a name='L8'><i><font color='green'>/* bitmap.c 程序含有处理i 节点和磁盘块位图的代码 */</font></i>
<a name='L9'><font color='darkred'>#include</font> &lt;<a href='42.html'>string.h</a>&gt;             <i><font color='green'>// 字符串头文件。主要定义了一些有关字符串操作的嵌入函数。</font></i>
<a name='L10'><i><font color='green'>// 主要使用了其中的memset()函数。</font></i>
<a name='L11'><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='L12'><i><font color='green'>// 还有一些有关描述符参数设置和获取的嵌入式汇编函数宏语句。</font></i>
<a name='L13'><font color='darkred'>#include</font> &lt;<a href='34.html'>linux/kernel.h</a>&gt;       <i><font color='green'>// 内核头文件。含有一些内核常用函数的原形定义。</font></i>
<a name='L14'>
<a name='L15'><i><font color='green'>//// 将指定地址(addr)处的一块内存清零。嵌入汇编程序宏。</font></i>
<a name='L16'><i><font color='green'>// 输入:eax = 0,ecx = 数据块大小BLOCK_SIZE/4,edi = addr。</font></i>
<a name='L17'><font color='darkred'>#define</font> <a href='../S/4.html#L134' title='Refered from 134 in fs/bitmap.c.'>clear_block</a>(addr) \
<a name='L18'><b>__asm__</b>( "cld\n\t" \            <i><font color='green'>// 清方向位。</font></i>
<a name='L19'>"rep\n\t" \                     <i><font color='green'>// 重复执行存储数据(0)。</font></i>
<a name='L20'>"stosl"::"a" (0), "c" (<a href='../D/23.html' title='Multiple defined in 2 places.'>BLOCK_SIZE</a> / 4), "D" ((<b>long</b>) (addr)):"cx", "di")
<a name='L21'><i><font color='green'>//// 置位指定地址开始的第nr 个位偏移处的比特位(nr 可以大于32!)。返回原比特位(0 或1)。</font></i>
<a name='L22'><i><font color='green'>// 输入:%0 - eax(返回值),%1 - eax(0);%2 - nr,位偏移值;%3 - (addr),addr 的内容。</font></i>
<a name='L23'><font color='darkred'>#define</font> <a href='../R/593.html' title='Multiple refered from 4 places.'>set_bit</a>(nr,addr) (<font color='red'>{</font>\
<a name='L24'><b>register</b> <b>int</b> res <b>__asm__</b>( "ax"); \
<a name='L25'><b>__asm__</b> <b>__volatile__</b>( "btsl %2,%3\n\tsetb %%al": \
<a name='L26'>"=a" (res): "" (0), "r" (nr), "m" (*(addr))); \
<a name='L27'>res;<font color='red'>}</font>)
<a name='L28'><i><font color='green'>//// 复位指定地址开始的第nr 位偏移处的比特位。返回原比特位的反码(1 或0)。</font></i>
<a name='L29'><i><font color='green'>// 输入:%0 - eax(返回值),%1 - eax(0);%2 - nr,位偏移值;%3 - (addr),addr 的内容。</font></i>
<a name='L30'><font color='darkred'>#define</font> <a href='../R/400.html' title='Multiple refered from 2 places.'>clear_bit</a>(nr,addr) (<font color='red'>{</font>\
<a name='L31'><b>register</b> <b>int</b> res <b>__asm__</b>( "ax"); \
<a name='L32'><b>__asm__</b> <b>__volatile__</b>( "btrl %2,%3\n\tsetnb %%al": \
<a name='L33'>"=a" (res): "" (0), "r" (nr), "m" (*(addr))); \
<a name='L34'>res;<font color='red'>}</font>)
<a name='L35'><i><font color='green'>//// 从addr 开始寻找第1 个0 值比特位。</font></i>
<a name='L36'><i><font color='green'>// 输入:%0 - ecx(返回值);%1 - ecx(0);%2 - esi(addr)。</font></i>
<a name='L37'><i><font color='green'>// 在addr 指定地址开始的位图中寻找第1 个是0 的比特位,并将其距离addr 的比特位偏移值返回。</font></i>
<a name='L38'><font color='darkred'>#define</font> <a href='../R/455.html' title='Multiple refered from 2 places.'>find_first_zero</a>(addr) (<font color='red'>{</font> \
<a name='L39'><b>int</b> __res; \
<a name='L40'><b>__asm__</b>( "cld\n" \              <i><font color='green'>// 清方向位。</font></i>
<a name='L41'>  "1:\tlodsl\n\t" \             <i><font color='green'>// 取[esi]??eax。</font></i>
<a name='L42'>  "notl %%eax\n\t" \            <i><font color='green'>// eax 中每位取反。</font></i>
<a name='L43'>  "bsfl %%eax,%%edx\n\t" \      <i><font color='green'>// 从位0 扫描eax 中是1 的第1 个位,其偏移值??edx。</font></i>
<a name='L44'>  "je 2f\n\t" \                 <i><font color='green'>// 如果eax 中全是0,则向前跳转到标号2 处(40 行)。</font></i>
<a name='L45'>  "addl %%edx,%%ecx\n\t" \      <i><font color='green'>// 偏移值加入ecx(ecx 中是位图中首个是0 的比特位的偏移值)</font></i>
<a name='L46'>  "jmp 3f\n" \                  <i><font color='green'>// 向前跳转到标号3 处(结束)。</font></i>
<a name='L47'>  "2:\taddl $32,%%ecx\n\t" \    <i><font color='green'>// 没有找到0 比特位,则将ecx 加上1 个长字的位偏移量32。</font></i>
<a name='L48'>  "cmpl $8192,%%ecx\n\t" \      <i><font color='green'>// 已经扫描了8192 位(1024 字节)了吗?</font></i>
<a name='L49'>  "jl 1b\n" \                   <i><font color='green'>// 若还没有扫描完1 块数据,则向前跳转到标号1 处,继续。</font></i>
<a name='L50'>  "3:" \                        <i><font color='green'>// 结束。此时ecx 中是位偏移量。</font></i>
<a name='L51'>: "=c" (__res): "c" (0), "S" (addr):"ax", "dx", "si");
<a name='L52'>__res;
<a name='L53'><font color='red'>}</font>
<a name='L54'>
<a name='L55'>)
<a name='L56'><i><font color='green'>//// 释放设备dev 上数据区中的逻辑块block。</font></i>
<a name='L57'><i><font color='green'>// 复位指定逻辑块block 的逻辑块位图比特位。</font></i>
<a name='L58'><i><font color='green'>// 参数:dev 是设备号,block 是逻辑块号(盘块号)。</font></i>
<a name='L59'>     <b>void</b> <a href='../R/464.html' title='Multiple refered from 7 places.'>free_block</a> (<b>int</b> dev, <b>int</b> block)
<a name='L60'>     <font color='red'>{</font>
<a name='L61'>       <b>struct</b> super_block *sb;
<a name='L62'>       <b>struct</b> buffer_head *bh;
<a name='L63'>
<a name='L64'><i><font color='green'>// 取指定设备dev 的超级块,如果指定设备不存在,则出错死机。</font></i>
<a name='L65'>       <b>if</b> (!(sb = <a href='../S/19.html#L76' title='Defined at 76 in fs/super.c.'>get_super</a> (<a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a>)))
<a name='L66'>         <a href='../S/72.html#L24' title='Defined at 24 in kernel/panic.c.'>panic</a> ("trying to free block on nonexistent device");
<a name='L67'><i><font color='green'>// 若逻辑块号小于首个逻辑块号或者大于设备上总逻辑块数,则出错,死机。</font></i>
<a name='L68'>       <b>if</b> (block &lt; sb-&gt;s_firstdatazone || block &gt;= sb-&gt;s_nzones)
<a name='L69'>         <a href='../S/72.html#L24' title='Defined at 24 in kernel/panic.c.'>panic</a> ("trying to free block not in datazone");
<a name='L70'><i><font color='green'>// 从hash 表中寻找该块数据。若找到了则判断其有效性,并清已修改和更新标志,释放该数据块。</font></i>
<a name='L71'><i><font color='green'>// 该段代码的主要用途是如果该逻辑块当前存在于高速缓冲中,就释放对应的缓冲块。</font></i>
<a name='L72'>       bh = <a href='../S/6.html#L261' title='Defined at 261 in fs/buffer.c.'>get_hash_table</a> (<a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a>, block);
<a name='L73'>       <b>if</b> (bh)
<a name='L74'>         <font color='red'>{</font>
<a name='L75'>           <b>if</b> (bh-&gt;b_count != 1)
<a name='L76'>             <font color='red'>{</font>
<a name='L77'>               <a href='../S/73.html#L30' title='Defined at 30 in kernel/printk.c.'>printk</a> ("trying to free block (%04x:%d), count=%d\n",
<a name='L78'>                       <a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a>, block, bh-&gt;b_count);
<a name='L79'>               <b>return</b>;
<a name='L80'>             <font color='red'>}</font>
<a name='L81'>           bh-&gt;b_dirt = 0;      <i><font color='green'>// 复位脏(已修改)标志位。</font></i>
<a name='L82'>           bh-&gt;b_uptodate = 0;  <i><font color='green'>// 复位更新标志。</font></i>
<a name='L83'>           <a href='../S/6.html#L377' title='Defined at 377 in fs/buffer.c.'>brelse</a> (bh);
<a name='L84'>         <font color='red'>}</font>
<a name='L85'><i><font color='green'>// 计算block 在数据区开始算起的数据逻辑块号(从1 开始计数)。然后对逻辑块(区块)位图进行操作,</font></i>
<a name='L86'><i><font color='green'>// 复位对应的比特位。若对应比特位原来即是0,则出错,死机。</font></i>
<a name='L87'>       block -= sb-&gt;s_firstdatazone - 1;        <i><font color='green'>// block = block - ( -1) ;</font></i>
<a name='L88'>       <b>if</b> (<a href='../S/4.html#L30' title='Defined at 30 in fs/bitmap.c.'>clear_bit</a> (block &amp; 8191, sb-&gt;s_zmap[block / 8192]-&gt;b_data))
<a name='L89'>         <font color='red'>{</font>
<a name='L90'>           <a href='../S/73.html#L30' title='Defined at 30 in kernel/printk.c.'>printk</a> ("block (%04x:%d) ", <a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a>, block + sb-&gt;s_firstdatazone - 1);
<a name='L91'>           <a href='../S/72.html#L24' title='Defined at 24 in kernel/panic.c.'>panic</a> ("free_block: bit already cleared");
<a name='L92'>         <font color='red'>}</font>
<a name='L93'><i><font color='green'>// 置相应逻辑块位图所在缓冲区已修改标志。</font></i>
<a name='L94'>       sb-&gt;s_zmap[block / 8192]-&gt;b_dirt = 1;
<a name='L95'>     <font color='red'>}</font>
<a name='L96'>
<a name='L97'><i><font color='green'>////向设备dev 申请一个逻辑块(盘块,区块)。返回逻辑块号(盘块号)。</font></i>
<a name='L98'><i><font color='green'>// 置位指定逻辑块block 的逻辑块位图比特位。</font></i>
<a name='L99'><b>int</b> <a href='../R/535.html' title='Multiple refered from 8 places.'>new_block</a> (<b>int</b> dev)
<a name='L100'><font color='red'>{</font>
<a name='L101'>  <b>struct</b> buffer_head *bh;
<a name='L102'>  <b>struct</b> super_block *sb;
<a name='L103'>  <b>int</b> <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>, j;
<a name='L104'>
<a name='L105'><i><font color='green'>// 从设备dev 取超级块,如果指定设备不存在,则出错死机。</font></i>
<a name='L106'>  <b>if</b> (!(sb = <a href='../S/19.html#L76' title='Defined at 76 in fs/super.c.'>get_super</a> (<a href='../S/7.html#L136' title='Defined at 136 in fs/char_dev.c.'>dev</a>)))

⌨️ 快捷键说明

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