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

📄 52.html

📁 linux 0.11中文版 有注释
💻 HTML
📖 第 1 页 / 共 3 页
字号:
<a name='L88'><i><font color='green'>         */</font></i>
<a name='L89'>        <i><font color='green'>/*</font></i>
<a name='L90'><i><font color='green'>         * 是啊,是啊,下面这段程序很差劲,但我不知道如何正确地实现,而且好象它还能运行。如果有</font></i>
<a name='L91'><i><font color='green'>         * 关于实时时钟更多的资料,那我很感兴趣。这些都是试探出来的,以及看了一些bios 程序,呵!</font></i>
<a name='L92'><i><font color='green'>         */</font></i>
<a name='L93'>
<a name='L94'><font color='darkred'>#define</font> <a href='../S/56.html#L34' title='Defined at 34 in kernel/blk_drv/hd.c.'>CMOS_READ</a>(addr) (<font color='red'>{</font> \    <i><font color='green'>// 这段宏读取CMOS 实时时钟信息。</font></i>
<a name='L95'><a href='../S/22.html#L17' title='Defined at 17 in include/asm/io.h.'>outb_p</a> (0x80 | addr, 0x70);
<a name='L96'>\                               <i><font color='green'>// 0x70 是写端口号,0x80|addr 是要读取的CMOS 内存地址。</font></i>
<a name='L97'>  <a href='../S/22.html#L25' title='Defined at 25 in include/asm/io.h.'>inb_p</a> (0x71);
<a name='L98'>\                               <i><font color='green'>// 0x71 是读端口号。</font></i>
<a name='L99'><font color='red'>}</font>
<a name='L100'>
<a name='L101'>)
<a name='L102'><font color='darkred'>#define</font> <a href='../R/7.html' title='Multiple refered from 6 places.'>BCD_TO_BIN</a>(val) ((val)=((val)&amp;15) + ((val)&gt;&gt;4)*10)      <i><font color='green'>// 将BCD 码转换成数字。</font></i>
<a name='L103'>     <b>static</b> <b>void</b> <a href='../S/52.html#L175' title='Refered from 175 in init/main.c.'>time_init</a> (<b>void</b>)       <i><font color='green'>// 该子程序取CMOS 时钟,并设置开机时间??startup_time(秒)。</font></i>
<a name='L104'>     <font color='red'>{</font>
<a name='L105'>       <b>struct</b> tm time;
<a name='L106'>
<a name='L107'>       <b>do</b>
<a name='L108'>         <font color='red'>{</font>
<a name='L109'>           time.tm_sec = <a href='../S/56.html#L34' title='Defined at 34 in kernel/blk_drv/hd.c.'>CMOS_READ</a> (0); <i><font color='green'>// 参见后面CMOS 内存列表。</font></i>
<a name='L110'>           time.tm_min = <a href='../S/56.html#L34' title='Defined at 34 in kernel/blk_drv/hd.c.'>CMOS_READ</a> (2);
<a name='L111'>           time.tm_hour = <a href='../S/56.html#L34' title='Defined at 34 in kernel/blk_drv/hd.c.'>CMOS_READ</a> (4);
<a name='L112'>           time.tm_mday = <a href='../S/56.html#L34' title='Defined at 34 in kernel/blk_drv/hd.c.'>CMOS_READ</a> (7);
<a name='L113'>           time.tm_mon = <a href='../S/56.html#L34' title='Defined at 34 in kernel/blk_drv/hd.c.'>CMOS_READ</a> (8);
<a name='L114'>           time.tm_year = <a href='../S/56.html#L34' title='Defined at 34 in kernel/blk_drv/hd.c.'>CMOS_READ</a> (9);
<a name='L115'>         <font color='red'>}</font>
<a name='L116'>       <b>while</b> (time.tm_sec != <a href='../S/56.html#L34' title='Defined at 34 in kernel/blk_drv/hd.c.'>CMOS_READ</a> (0));
<a name='L117'>       <a href='../S/52.html#L102' title='Defined at 102 in init/main.c.'>BCD_TO_BIN</a> (time.tm_sec);
<a name='L118'>       <a href='../S/52.html#L102' title='Defined at 102 in init/main.c.'>BCD_TO_BIN</a> (time.tm_min);
<a name='L119'>       <a href='../S/52.html#L102' title='Defined at 102 in init/main.c.'>BCD_TO_BIN</a> (time.tm_hour);
<a name='L120'>       <a href='../S/52.html#L102' title='Defined at 102 in init/main.c.'>BCD_TO_BIN</a> (time.tm_mday);
<a name='L121'>       <a href='../S/52.html#L102' title='Defined at 102 in init/main.c.'>BCD_TO_BIN</a> (time.tm_mon);
<a name='L122'>       <a href='../S/52.html#L102' title='Defined at 102 in init/main.c.'>BCD_TO_BIN</a> (time.tm_year);
<a name='L123'>       time.tm_mon--;
<a name='L124'>       startup_time = <a href='../S/71.html#L52' title='Defined at 52 in kernel/mktime.c.'>kernel_mktime</a> (&amp;time);
<a name='L125'>     <font color='red'>}</font>
<a name='L126'>
<a name='L127'><b>static</b> <b>long</b> memory_end = 0;     <i><font color='green'>// 机器具有的内存(字节数)。</font></i>
<a name='L128'><b>static</b> <b>long</b> buffer_memory_end = 0;      <i><font color='green'>// 高速缓冲区末端地址。</font></i>
<a name='L129'><b>static</b> <b>long</b> main_memory_start = 0;      <i><font color='green'>// 主内存(将用于分页)开始的位置。</font></i>
<a name='L130'>
<a name='L131'><b>struct</b> drive_info
<a name='L132'><font color='red'>{</font>
<a name='L133'>  <b>char</b> dummy[32];
<a name='L134'><font color='red'>}</font>
<a name='L135'>
<a name='L136'>drive_info;                     <i><font color='green'>// 用于存放硬盘参数表信息。</font></i>
<a name='L137'>
<a name='L138'><b>void</b> main (<b>void</b>)                <i><font color='green'>/* This really IS void, no error here. */</font></i>
<a name='L139'><font color='red'>{</font>                               <i><font color='green'>/* The startup routine assumes (well, ...) this */</font></i>
<a name='L140'>  <i><font color='green'>/* 这里确实是void,并没错。在startup 程序(head.s)中就是这样假设的。 */</font></i>
<a name='L141'>  <i><font color='green'>// 参见head.s 程序第136 行开始的几行代码。</font></i>
<a name='L142'>  <i><font color='green'>/*</font></i>
<a name='L143'><i><font color='green'>   * Interrupts are still disabled. Do necessary setups, then</font></i>
<a name='L144'><i><font color='green'>   * enable them</font></i>
<a name='L145'><i><font color='green'>   */</font></i>
<a name='L146'>  <i><font color='green'>/*</font></i>
<a name='L147'><i><font color='green'>   * 此时中断仍被禁止着,做完必要的设置后就将其开启。</font></i>
<a name='L148'><i><font color='green'>   */</font></i>
<a name='L149'>  <i><font color='green'>// 下面这段代码用于保存:</font></i>
<a name='L150'>  <i><font color='green'>// 根设备号 ??ROOT_DEV; 高速缓存末端地址??buffer_memory_end;</font></i>
<a name='L151'>  <i><font color='green'>// 机器内存数??memory_end;主内存开始地址 ??main_memory_start;</font></i>
<a name='L152'>  ROOT_DEV = ORIG_ROOT_DEV;
<a name='L153'>  drive_info = DRIVE_INFO;
<a name='L154'>  memory_end = (1 &lt;&lt; 20) + (EXT_MEM_K &lt;&lt; 10);   <i><font color='green'>// 内存大小=1Mb 字节+扩展内存(k)*1024 字节。</font></i>
<a name='L155'>  memory_end &amp;= 0xfffff000;     <i><font color='green'>// 忽略不到4Kb(1 页)的内存数。</font></i>
<a name='L156'>  <b>if</b> (memory_end &gt; 16 * 1024 * 1024)    <i><font color='green'>// 如果内存超过16Mb,则按16Mb 计。</font></i>
<a name='L157'>    memory_end = 16 * 1024 * 1024;
<a name='L158'>  <b>if</b> (memory_end &gt; 12 * 1024 * 1024)    <i><font color='green'>// 如果内存&gt;12Mb,则设置缓冲区末端=4Mb</font></i>
<a name='L159'>    buffer_memory_end = 4 * 1024 * 1024;
<a name='L160'>  <b>else</b> <b>if</b> (memory_end &gt; 6 * 1024 * 1024)        <i><font color='green'>// 否则如果内存&gt;6Mb,则设置缓冲区末端=2Mb</font></i>
<a name='L161'>    buffer_memory_end = 2 * 1024 * 1024;
<a name='L162'>  <b>else</b>
<a name='L163'>    buffer_memory_end = 1 * 1024 * 1024;        <i><font color='green'>// 否则则设置缓冲区末端=1Mb</font></i>
<a name='L164'>  main_memory_start = buffer_memory_end;        <i><font color='green'>// 主内存起始位置=缓冲区末端;</font></i>
<a name='L165'><font color='darkred'>#ifdef</font> RAMDISK                  <i><font color='green'>// 如果定义了虚拟盘,则主内存将减少。</font></i>
<a name='L166'>  main_memory_start += <a href='../S/59.html#L78' title='Defined at 78 in kernel/blk_drv/ramdisk.c.'>rd_init</a> (main_memory_start, RAMDISK * 1024);
<a name='L167'><font color='darkred'>#endif</font>
<a name='L168'>  <i><font color='green'>// 以下是内核进行所有方面的初始化工作。阅读时最好跟着调用的程序深入进去看,实在看</font></i>
<a name='L169'>  <i><font color='green'>// 不下去了,就先放一放,看下一个初始化调用 -- 这是经验之谈?。</font></i>
<a name='L170'>  <a href='../S/94.html#L632' title='Defined at 632 in mm/memory.c.'>mem_init</a> (main_memory_start, memory_end);
<a name='L171'>  <a href='../S/79.html#L181' title='Defined at 181 in kernel/traps.c.'>trap_init</a> ();                 <i><font color='green'>// 陷阱门(硬件中断向量)初始化。(kernel/traps.c,181 行)</font></i>
<a name='L172'>  <a href='../S/57.html#L221' title='Defined at 221 in kernel/blk_drv/ll_rw_blk.c.'>blk_dev_init</a> ();              <i><font color='green'>// 块设备初始化。 (kernel/blk_dev/ll_rw_blk.c,157 行)</font></i>
<a name='L173'>  <a href='../S/65.html#L534' title='Defined at 534 in kernel/chr_drv/tty_io.c.'>chr_dev_init</a> ();              <i><font color='green'>// 字符设备初始化。 (kernel/chr_dev/tty_io.c,347 行)</font></i>
<a name='L174'>  <a href='../S/65.html#L126' title='Defined at 126 in kernel/chr_drv/tty_io.c.'>tty_init</a> ();                  <i><font color='green'>// tty 初始化。 (kernel/chr_dev/tty_io.c,105 行)</font></i>
<a name='L175'>  <a href='../S/52.html#L103' title='Defined at 103 in init/main.c.'>time_init</a> ();                 <i><font color='green'>// 设置开机启动时间??startup_time(见76 行)。</font></i>
<a name='L176'>  <a href='../S/74.html#L547' title='Defined at 547 in kernel/sched.c.'>sched_init</a> ();                <i><font color='green'>// 调度程序初始化(加载了任务0 的tr, ldtr) (kernel/sched.c,385)</font></i>
<a name='L177'>  <a href='../S/6.html#L515' title='Defined at 515 in fs/buffer.c.'>buffer_init</a> (buffer_memory_end);      <i><font color='green'>// 缓冲管理初始化,建内存链表等。(fs/buffer.c,348)</font></i>
<a name='L178'>  <a href='../S/56.html#L463' title='Defined at 463 in kernel/blk_drv/hd.c.'>hd_init</a> ();                   <i><font color='green'>// 硬盘初始化。 (kernel/blk_dev/hd.c,343 行)</font></i>
<a name='L179'>  <a href='../S/55.html#L689' title='Defined at 689 in kernel/blk_drv/floppy.c.'>floppy_init</a> ();               <i><font color='green'>// 软驱初始化。 (kernel/blk_dev/floppy.c,457 行)</font></i>
<a name='L180'>  <a href='../S/25.html#L14' title='Defined at 14 in include/asm/system.h.'>sti</a> ();                       <i><font color='green'>// 所有初始化工作都做完了,开启中断。</font></i>
<a name='L181'>  <i><font color='green'>// 下面过程通过在堆栈中设置的参数,利用中断返回指令切换到任务0。</font></i>
<a name='L182'>  <a href='../S/25.html#L3' title='Defined at 3 in include/asm/system.h.'>move_to_user_mode</a> ();         <i><font color='green'>// 移到用户模式。 (include/asm/system.h,第1 行)</font></i>
<a name='L183'>  <b>if</b> (!fork ())
<a name='L184'>    <font color='red'>{</font>                           <i><font color='green'>/* we count on this going ok */</font></i>
<a name='L185'>      <a href='../D/844.html' title='Multiple defined in 2 places.'>init</a> ();
<a name='L186'>    <font color='red'>}</font>
<a name='L187'>  <i><font color='green'>/*</font></i>
<a name='L188'><i><font color='green'>   * NOTE!! For any other task 'pause()' would mean we have to get a</font></i>
<a name='L189'><i><font color='green'>   * signal to awaken, but task0 is the sole exception (see 'schedule()')</font></i>
<a name='L190'><i><font color='green'>   * as task 0 gets activated at every idle moment (when no other tasks</font></i>
<a name='L191'><i><font color='green'>   * can run). For task0 'pause()' just means we go check if some other</font></i>
<a name='L192'><i><font color='green'>   * task can run, and if not we return here.</font></i>
<a name='L193'><i><font color='green'>   */</font></i>
<a name='L194'>  <i><font color='green'>/* 注意!! 对于任何其它的任务,'pause()'将意味着我们必须等待收到一个信号才会返</font></i>
<a name='L195'><i><font color='green'>   * 回就绪运行态,但任务0(task0)是唯一的意外情况(参见'schedule()'),因为任务0 在</font></i>

⌨️ 快捷键说明

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