📄 96.html
字号:
<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) && (major_root != 3) && (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> < <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)) < 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)) < 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>)) > 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> > 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 < <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> < 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 > <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)) < 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>)) > 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> > <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'>/* [<][>]<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 + -