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

📄 96.html

📁 linux 0.11中文版 有注释
💻 HTML
📖 第 1 页 / 共 2 页
字号:
<a name='L116'><i><font color='green'>// 在标准错误终端上显示所选择的根设备主、次设备号。</font></i>
<a name='L117'>  fprintf (stderr, "Root device is (%d, %d)\n", major_root, minor_root);
<a name='L118'><i><font color='green'>// 如果主设备号不等于2(软盘)或3(硬盘),也不等于0(取系统默认根设备),则显示出错信息,退出。</font></i>
<a name='L119'>  <b>if</b> ((major_root != 2) &amp;&amp; (major_root != 3) &amp;&amp; (major_root != 0))
<a name='L120'>    <font color='red'>{</font>
<a name='L121'>      fprintf (stderr, "Illegal root device (major = %d)\n", major_root);
<a name='L122'>      <a href='../D/757.html' title='Multiple defined in 2 places.'>die</a> ("Bad root device --- major #");
<a name='L123'>    <font color='red'>}</font>
<a name='L124'><i><font color='green'>// 初始化buf 缓冲区,全置0。</font></i>
<a name='L125'>  <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> &lt; <b>sizeof</b> <a href='../D/716.html' title='Multiple defined in 16 places.'>buf</a>; <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>++)
<a name='L126'>    <a href='../D/716.html' title='Multiple defined in 16 places.'>buf</a>[<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>] = 0;
<a name='L127'><i><font color='green'>// 以只读方式打开参数1 指定的文件(bootsect),若出错则显示出错信息,退出。</font></i>
<a name='L128'>  <b>if</b> ((id = <a href='../S/87.html#L19' title='Defined at 19 in lib/open.c.'>open</a> (argv[1], <a href='../S/29.html#L10' title='Defined at 10 in include/fcntl.h.'>O_RDONLY</a>, 0)) &lt; 0)
<a name='L129'>    <a href='../D/757.html' title='Multiple defined in 2 places.'>die</a> ("Unable to open 'boot'");
<a name='L130'><i><font color='green'>// 读取文件中的minix 执行头部信息(参见列表后说明),若出错则显示出错信息,退出。</font></i>
<a name='L131'>  <b>if</b> (read (id, <a href='../D/716.html' title='Multiple defined in 16 places.'>buf</a>, <a href='../S/96.html#L45' title='Defined at 45 in tools/build.c.'>MINIX_HEADER</a>) != <a href='../S/96.html#L45' title='Defined at 45 in tools/build.c.'>MINIX_HEADER</a>)
<a name='L132'>    <a href='../D/757.html' title='Multiple defined in 2 places.'>die</a> ("Unable to read header of 'boot'");
<a name='L133'><i><font color='green'>// 0x0301 - minix 头部a_magic 魔数;0x10 - a_flag 可执行;0x04 - a_cpu, Intel 8086 机器码。</font></i>
<a name='L134'>  <b>if</b> (((<b>long</b> *) <a href='../D/716.html' title='Multiple defined in 16 places.'>buf</a>)[0] != 0x04100301)
<a name='L135'>    <a href='../D/757.html' title='Multiple defined in 2 places.'>die</a> ("Non-Minix header of 'boot'");
<a name='L136'><i><font color='green'>// 判断头部长度字段a_hdrlen(字节)是否正确。(后三字节正好没有用,是0)</font></i>
<a name='L137'>  <b>if</b> (((<b>long</b> *) <a href='../D/716.html' title='Multiple defined in 16 places.'>buf</a>)[1] != <a href='../S/96.html#L45' title='Defined at 45 in tools/build.c.'>MINIX_HEADER</a>)
<a name='L138'>    <a href='../D/757.html' title='Multiple defined in 2 places.'>die</a> ("Non-Minix header of 'boot'");
<a name='L139'><i><font color='green'>// 判断数据段长a_data 字段(long)内容是否为0。</font></i>
<a name='L140'>  <b>if</b> (((<b>long</b> *) <a href='../D/716.html' title='Multiple defined in 16 places.'>buf</a>)[3] != 0)
<a name='L141'>    <a href='../D/757.html' title='Multiple defined in 2 places.'>die</a> ("Illegal data segment in 'boot'");
<a name='L142'><i><font color='green'>// 判断堆a_bss 字段(long)内容是否为0。</font></i>
<a name='L143'>  <b>if</b> (((<b>long</b> *) <a href='../D/716.html' title='Multiple defined in 16 places.'>buf</a>)[4] != 0)
<a name='L144'>    <a href='../D/757.html' title='Multiple defined in 2 places.'>die</a> ("Illegal bss in 'boot'");
<a name='L145'><i><font color='green'>// 判断执行点a_entry 字段(long)内容是否为0。</font></i>
<a name='L146'>  <b>if</b> (((<b>long</b> *) <a href='../D/716.html' title='Multiple defined in 16 places.'>buf</a>)[5] != 0)
<a name='L147'>    <a href='../D/757.html' title='Multiple defined in 2 places.'>die</a> ("Non-Minix header of 'boot'");
<a name='L148'><i><font color='green'>// 判断符号表长字段a_sym 的内容是否为0。</font></i>
<a name='L149'>  <b>if</b> (((<b>long</b> *) <a href='../D/716.html' title='Multiple defined in 16 places.'>buf</a>)[7] != 0)
<a name='L150'>    <a href='../D/757.html' title='Multiple defined in 2 places.'>die</a> ("Illegal symbol table in 'boot'");
<a name='L151'><i><font color='green'>// 读取实际代码数据,应该返回读取字节数为512 字节。</font></i>
<a name='L152'>  <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> = read (id, <a href='../D/716.html' title='Multiple defined in 16 places.'>buf</a>, <b>sizeof</b> <a href='../D/716.html' title='Multiple defined in 16 places.'>buf</a>);
<a name='L153'>  fprintf (stderr, "Boot sector %d bytes.\n", <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>);
<a name='L154'>  <b>if</b> (<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> != 512)
<a name='L155'>    <a href='../D/757.html' title='Multiple defined in 2 places.'>die</a> ("Boot block must be exactly 512 bytes");
<a name='L156'><i><font color='green'>// 判断boot 块0x510 处是否有可引导标志0xAA55。</font></i>
<a name='L157'>  <b>if</b> ((*(<b>unsigned</b> <b>short</b> *) (<a href='../D/716.html' title='Multiple defined in 16 places.'>buf</a> + 510)) != 0xAA55)
<a name='L158'>    <a href='../D/757.html' title='Multiple defined in 2 places.'>die</a> ("Boot block hasn't got boot flag (0xAA55)");
<a name='L159'><i><font color='green'>// 引导块的508,509 偏移处存放的是根设备号。</font></i>
<a name='L160'>  <a href='../D/716.html' title='Multiple defined in 16 places.'>buf</a>[508] = (<b>char</b>) minor_root;
<a name='L161'>  <a href='../D/716.html' title='Multiple defined in 16 places.'>buf</a>[509] = (<b>char</b>) major_root;
<a name='L162'><i><font color='green'>// 将该boot 块512 字节的数据写到标准输出stdout,若写出字节数不对,则显示出错信息,退出。</font></i>
<a name='L163'>  <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> = write (1, <a href='../D/716.html' title='Multiple defined in 16 places.'>buf</a>, 512);
<a name='L164'>  <b>if</b> (<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> != 512)
<a name='L165'>    <a href='../D/757.html' title='Multiple defined in 2 places.'>die</a> ("Write call failed");
<a name='L166'><i><font color='green'>// 最后关闭bootsect 模块文件。</font></i>
<a name='L167'>  close (id);
<a name='L168'>
<a name='L169'>
<a name='L170'><i><font color='green'>// 现在开始处理setup 模块。首先以只读方式打开该模块,若出错则显示出错信息,退出。</font></i>
<a name='L171'>  <b>if</b> ((id = <a href='../S/87.html#L19' title='Defined at 19 in lib/open.c.'>open</a> (argv[2], <a href='../S/29.html#L10' title='Defined at 10 in include/fcntl.h.'>O_RDONLY</a>, 0)) &lt; 0)
<a name='L172'>    <a href='../D/757.html' title='Multiple defined in 2 places.'>die</a> ("Unable to open 'setup'");
<a name='L173'><i><font color='green'>// 读取该文件中的minix 执行头部信息(32 字节),若出错则显示出错信息,退出。</font></i>
<a name='L174'>  <b>if</b> (read (id, <a href='../D/716.html' title='Multiple defined in 16 places.'>buf</a>, <a href='../S/96.html#L45' title='Defined at 45 in tools/build.c.'>MINIX_HEADER</a>) != <a href='../S/96.html#L45' title='Defined at 45 in tools/build.c.'>MINIX_HEADER</a>)
<a name='L175'>    <a href='../D/757.html' title='Multiple defined in 2 places.'>die</a> ("Unable to read header of 'setup'");
<a name='L176'><i><font color='green'>// 0x0301 - minix 头部a_magic 魔数;0x10 - a_flag 可执行;0x04 - a_cpu, Intel 8086 机器码。</font></i>
<a name='L177'>  <b>if</b> (((<b>long</b> *) <a href='../D/716.html' title='Multiple defined in 16 places.'>buf</a>)[0] != 0x04100301)
<a name='L178'>    <a href='../D/757.html' title='Multiple defined in 2 places.'>die</a> ("Non-Minix header of 'setup'");
<a name='L179'><i><font color='green'>// 判断头部长度字段a_hdrlen(字节)是否正确。(后三字节正好没有用,是0)</font></i>
<a name='L180'>  <b>if</b> (((<b>long</b> *) <a href='../D/716.html' title='Multiple defined in 16 places.'>buf</a>)[1] != <a href='../S/96.html#L45' title='Defined at 45 in tools/build.c.'>MINIX_HEADER</a>)
<a name='L181'>    <a href='../D/757.html' title='Multiple defined in 2 places.'>die</a> ("Non-Minix header of 'setup'");
<a name='L182'><i><font color='green'>// 判断数据段长a_data 字段(long)内容是否为0。</font></i>
<a name='L183'>  <b>if</b> (((<b>long</b> *) <a href='../D/716.html' title='Multiple defined in 16 places.'>buf</a>)[3] != 0)
<a name='L184'>    <a href='../D/757.html' title='Multiple defined in 2 places.'>die</a> ("Illegal data segment in 'setup'");
<a name='L185'><i><font color='green'>// 判断堆a_bss 字段(long)内容是否为0。</font></i>
<a name='L186'>  <b>if</b> (((<b>long</b> *) <a href='../D/716.html' title='Multiple defined in 16 places.'>buf</a>)[4] != 0)
<a name='L187'>    <a href='../D/757.html' title='Multiple defined in 2 places.'>die</a> ("Illegal bss in 'setup'");
<a name='L188'><i><font color='green'>// 判断执行点a_entry 字段(long)内容是否为0。</font></i>
<a name='L189'>  <b>if</b> (((<b>long</b> *) <a href='../D/716.html' title='Multiple defined in 16 places.'>buf</a>)[5] != 0)
<a name='L190'>    <a href='../D/757.html' title='Multiple defined in 2 places.'>die</a> ("Non-Minix header of 'setup'");
<a name='L191'><i><font color='green'>// 判断符号表长字段a_sym 的内容是否为0。</font></i>
<a name='L192'>  <b>if</b> (((<b>long</b> *) <a href='../D/716.html' title='Multiple defined in 16 places.'>buf</a>)[7] != 0)
<a name='L193'>    <a href='../D/757.html' title='Multiple defined in 2 places.'>die</a> ("Illegal symbol table in 'setup'");
<a name='L194'><i><font color='green'>// 读取随后的执行代码数据,并写到标准输出stdout。</font></i>
<a name='L195'>  <b>for</b> (<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> = 0; (c = read (id, <a href='../D/716.html' title='Multiple defined in 16 places.'>buf</a>, <b>sizeof</b> <a href='../D/716.html' title='Multiple defined in 16 places.'>buf</a>)) &gt; 0; <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> += c)
<a name='L196'>    <b>if</b> (write (1, <a href='../D/716.html' title='Multiple defined in 16 places.'>buf</a>, c) != c)
<a name='L197'>      <a href='../D/757.html' title='Multiple defined in 2 places.'>die</a> ("Write call failed");
<a name='L198'><i><font color='green'>//关闭setup 模块文件。</font></i>
<a name='L199'>  close (id);
<a name='L200'><i><font color='green'>// 若setup 模块长度大于4 个扇区,则算出错,显示出错信息,退出。</font></i>
<a name='L201'>  <b>if</b> (<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> &gt; SETUP_SECTS * 512)
<a name='L202'>    <a href='../D/757.html' title='Multiple defined in 2 places.'>die</a> ("Setup exceeds " <a href='../S/96.html#L59' title='Defined at 59 in tools/build.c.'>STRINGIFY</a> (SETUP_SECTS)
<a name='L203'>         " sectors - rewrite build/boot/setup");
<a name='L204'><i><font color='green'>// 在标准错误stderr 显示setup 文件的长度值。</font></i>
<a name='L205'>  fprintf (stderr, "Setup is %d bytes.\n", <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>);
<a name='L206'><i><font color='green'>// 将缓冲区buf 清零。</font></i>
<a name='L207'>  <b>for</b> (c = 0; c &lt; <b>sizeof</b> (<a href='../D/716.html' title='Multiple defined in 16 places.'>buf</a>); c++)
<a name='L208'>    <a href='../D/716.html' title='Multiple defined in 16 places.'>buf</a>[c] = '\0';
<a name='L209'><i><font color='green'>// 若setup 长度小于4*512 字节,则用\0 将setup 填足为4*512 字节。</font></i>
<a name='L210'>  <b>while</b> (<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> &lt; SETUP_SECTS * 512)
<a name='L211'>    <font color='red'>{</font>
<a name='L212'>      c = SETUP_SECTS * 512 - <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>;
<a name='L213'>      <b>if</b> (c &gt; <b>sizeof</b> (<a href='../D/716.html' title='Multiple defined in 16 places.'>buf</a>))
<a name='L214'>        c = <b>sizeof</b> (<a href='../D/716.html' title='Multiple defined in 16 places.'>buf</a>);
<a name='L215'>      <b>if</b> (write (1, <a href='../D/716.html' title='Multiple defined in 16 places.'>buf</a>, c) != c)
<a name='L216'>        <a href='../D/757.html' title='Multiple defined in 2 places.'>die</a> ("Write call failed");
<a name='L217'>      <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> += c;
<a name='L218'>    <font color='red'>}</font>
<a name='L219'>
<a name='L220'><i><font color='green'>// 下面处理system 模块。首先以只读方式打开该文件。</font></i>
<a name='L221'>  <b>if</b> ((id = <a href='../S/87.html#L19' title='Defined at 19 in lib/open.c.'>open</a> (argv[3], <a href='../S/29.html#L10' title='Defined at 10 in include/fcntl.h.'>O_RDONLY</a>, 0)) &lt; 0)
<a name='L222'>    <a href='../D/757.html' title='Multiple defined in 2 places.'>die</a> ("Unable to open 'system'");
<a name='L223'>
<a name='L224'><i><font color='green'>// system 模块是GCC 格式的文件,先读取GCC 格式的头部结构信息(linux 的执行文件也采用该格式)。</font></i>
<a name='L225'>  <b>if</b> (read (id, <a href='../D/716.html' title='Multiple defined in 16 places.'>buf</a>, <a href='../S/96.html#L46' title='Defined at 46 in tools/build.c.'>GCC_HEADER</a>) != <a href='../S/96.html#L46' title='Defined at 46 in tools/build.c.'>GCC_HEADER</a>)
<a name='L226'>    <a href='../D/757.html' title='Multiple defined in 2 places.'>die</a> ("Unable to read header of 'system'");
<a name='L227'><i><font color='green'>// 该结构中的执行代码入口点字段a_entry 值应为0。</font></i>
<a name='L228'>  <b>if</b> (((<b>long</b> *) <a href='../D/716.html' title='Multiple defined in 16 places.'>buf</a>)[5] != 0)
<a name='L229'>    <a href='../D/757.html' title='Multiple defined in 2 places.'>die</a> ("Non-GCC header of 'system'");
<a name='L230'><i><font color='green'>// 读取随后的执行代码数据,并写到标准输出stdout。</font></i>
<a name='L231'>  <b>for</b> (<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> = 0; (c = read (id, <a href='../D/716.html' title='Multiple defined in 16 places.'>buf</a>, <b>sizeof</b> <a href='../D/716.html' title='Multiple defined in 16 places.'>buf</a>)) &gt; 0; <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> += c)
<a name='L232'>    <b>if</b> (write (1, <a href='../D/716.html' title='Multiple defined in 16 places.'>buf</a>, c) != c)
<a name='L233'>      <a href='../D/757.html' title='Multiple defined in 2 places.'>die</a> ("Write call failed");
<a name='L234'><i><font color='green'>// 关闭system 文件,并向stderr 上打印system 的字节数。</font></i>
<a name='L235'>  close (id);
<a name='L236'>  fprintf (stderr, "System is %d bytes.\n", <a href='../D/839.html' title='Multiple defined in 4 places.'>i</a>);
<a name='L237'><i><font color='green'>// 若system 代码数据长度超过SYS_SIZE 节(或128KB 字节),则显示出错信息,退出。</font></i>
<a name='L238'>  <b>if</b> (<a href='../D/839.html' title='Multiple defined in 4 places.'>i</a> &gt; <a href='../S/96.html#L48' title='Defined at 48 in tools/build.c.'>SYS_SIZE</a> * 16)
<a name='L239'>    <a href='../D/757.html' title='Multiple defined in 2 places.'>die</a> ("System is too big");
<a name='L240'>  <b>return</b> (0);
<a name='L241'><font color='red'>}</font>
</pre>
<hr>
<a name='BOTTOM'>
<i><font color='green'>/* [&lt;][&gt;]<a href='#L63'>[^]</a><a href='#L77'>[v]</a><a href='#TOP'>[top]</a>[bottom]<a href='../mains.html'>[index]</a><a href='../help.html'>[help]</a> */</font></i>
</body>
</html>

⌨️ 快捷键说明

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