📄 common-start-flow.html
字号:
, 在
<br>## 这篇文章的结尾 , 我会提出一些书单 , 各位可以去找找这几本书 ......
<p>/bin/sh /etc/rc.d/rc.serial
<br>echo '================= rc.S is finish NOW !!! ========================='
<br>
<br>
<p>到了这里 , rc.S 的最後一步 , 是去执行 rc.serial . 大家可以看一看
<br>/rc.d/rc.serial . 好像很长的样子 , 但实际上呢 , 各位必然发现到了 ,
这个
<br>shell script 大部份指令的前面都有一个 '#' 号 , 这代表着 , 这些指令完全
<br>不会被执行 . 所以呢 , 真正有用的只不过寥寥十几行吧 ! 在另一方面来说
,
<br>假如你是用网卡连上网络 , 那 rc.serial 对你并没有什么大用处 .
<br>
<p>**************************** rc.serial ******************************
<p>#!/bin/sh
<br>#
<br># /etc/rc.serial
<br># Initializes the serial ports on your system
<br>#
<br># Version 2.01
<p>echo '======================= rc.serial is begin !!! ====================='
<br>cd /dev
<p>## 下面三行中的前两行是设定一些变量 , 由于在这个 shell script 中 , 需要
<br>## 用到 /bin/setserial -b 这个指令 , 或是需要用到所有以 cua 开头的
node
<br>## 的次数太多了 , 因此 , 把它们设定为一个变量 , 是一个不错的方法 .
尤其
<br>## PORTS=`echo cua? cua??` 这是一个聪明的写法 , 那为什么不写成 PORT=
<br>## `echo cua*` 呢 ? 各位可以在 /dev 下分别使用这两个指令 , 观察输出到底
<br>## 有什么不同 ......
<p>SETSERIAL="/bin/setserial -b"
<br>PORTS=`echo cua? cua??`
<br>echo -n "Configuring serial ports...."
<br>
<p>## 下面这行 , 没有学过 shell programming 的人很可能会看不懂 , 不过没有
<br>## 关系 , 这行中的 ${SETSERIAL} 会被换成 /bin/setserial -b , 而 ${PORTS}
<br>## 会被换成 cua0 cua1 cua2 ....... cua31 , 所以整句翻译就是 :
<br>## /bin/setserial -b -W cua0 cua1 cua2 cua3 cua4 cua5 cua6 ...... cua31
<br>## 那这行指令到底在做什么呢 ? 其实只是在做中断侦测的工作 .
<p>${SETSERIAL} -W ${PORTS}
<br>
<p>## 各位看到下面原来的注释了吧 . 当你有一些特殊的卡时 , 你可以把相对应部
<br>## 份前面的 '#' 去掉 , 以便能做自动设定的工作 . 其实呢 , 这种情况实在
<br>## 不多 , 大部份人的设备都差不了多少 , 说到关于串口 , 差异就更少了
.
<br>#
<br># AUTOMATIC CONFIGURATION
<br>#
<br># Uncomment the appropriate lines below to enable auto-configuration
<br># of a particular board. Or comment them out to disable them....
<br>#
<br>
<p>## 好了 , 这下我们又多了一个变量 : AUTO_IRQ , 这在下面会用到 .
<p>AUTO_IRQ=auto_irq
<br>
<p>## 下面几行非常整齐 , 它们可以分别被换成 :
<br>## /bin/setserial -b /dev/cua? auto_irq skip_test autoconfig
<br>## setserial 说穿了也没什么 , 这个指令可以让你对 serial port 做设定及回报
<br>## 的动作 , 像 IRQ , I/O port 啦等等的事情 . 一般的情况下 , 大家的电脑中
<br>## 通常只有 COM1-COM4 , 但假如你想增加新的 port , 那 setserial 就派上用
<br>## 场了 .
<p># These are the standard COM1 through COM4 devices
<br>#
<br># If you have an internal modeme with a Rockwell Chipset, add a "skip_test"
<br># to the /dev/cua3 line below. (It's not added by default because it
will
<br># screw up people with 8514 displays).
<br>#
<br>${SETSERIAL} /dev/cua0 ${AUTO_IRQ} skip_test autoconfig
<br>${SETSERIAL} /dev/cua1 ${AUTO_IRQ} skip_test autoconfig
<br>${SETSERIAL} /dev/cua2 ${AUTO_IRQ} skip_test autoconfig
<br>${SETSERIAL} /dev/cua3 ${AUTO_IRQ} autoconfig
<p># These are for the first AST Fourport board (base address 0x1A0)
<br>#
<br>${SETSERIAL} /dev/cua4 ${AUTO_IRQ} autoconfig
<br>${SETSERIAL} /dev/cua5 ${AUTO_IRQ} autoconfig
<br>${SETSERIAL} /dev/cua6 ${AUTO_IRQ} autoconfig
<br>${SETSERIAL} /dev/cua7 ${AUTO_IRQ} autoconfig
<p># These are for the second AST Fourport board (base address 0x2A0)
<br>#
<br>${SETSERIAL} /dev/cua8 ${AUTO_IRQ} autoconfig
<br>${SETSERIAL} /dev/cua9 ${AUTO_IRQ} autoconfig
<br>${SETSERIAL} /dev/cua10 ${AUTO_IRQ} autoconfig
<br>${SETSERIAL} /dev/cua11 ${AUTO_IRQ} autoconfig
<br>
<p>## 从这里以下 , 我省略了一大段 , 因为这一大段都是支持特殊的卡
<p># These are the 3rd and 4th ports on the Accent Async board.
<br>#
<br>#${SETSERIAL} /dev/cua12 ${AUTO_IRQ} autoconfig
<br>#${SETSERIAL} /dev/cua13 ${AUTO_IRQ} autoconfig
<br>#
<br>
<p>.
<br>.
<br>.
<br>.
<br>.
<br>.
<br>.
<br>
<p>## 好了 , 我们跳掉了一大段 , 直到这里 . 各位看到下面的注解了 .
<br>## 假如你想用手动的方法指定 IRQ , I/O port , 及指定 chip 的型号
<br>## 那你可以拿掉下面对应那行前面的 '#' 并作适当的修改 , 比如说
<br>## 你用的是比较新的 16550 或 16550A , 而不是 16450 , 那你就可以
<br>## 在下面用手动的方法指定 . 实际上 , 用 autoconfig 及 autoirq
<br>## 的选项就可以了 , 没有必要用手动的方式 . 除非侦测不到 .
<p>###############################################################
<br>#
<br># MANUAL CONFIGURATION
<br>#
<br># If you want to do manual configuration of one or more of your
<br># serial ports, uncomment and modify the relevant lines.
<br>#
<br>###############################################################
<p># These are the standard COM1 through COM4 devices
<br>#
<br>#${SETSERIAL} /dev/cua0 uart 16450 port 0x3F8 irq 4
<br>#${SETSERIAL} /dev/cua1 uart 16450 port 0x2F8 irq 3
<br>#${SETSERIAL} /dev/cua2 uart 16450 port 0x3E8 irq 4
<br>#${SETSERIAL} /dev/cua3 uart 16450 port 0x2E8 irq 3
<p>.
<br>.
<br>.
<br>.
<br>.
<br>.
<br>.
<br>.
<p>## Ok , 到此 , rc.S 及 rc.serial 已经结束 , 因为截稿时间的关系 , rc.M
<br>## rc.inet1 , rc.inet2 , rc.font , rc.local 将在以后为各位介绍 .
<p>echo "done."
<br>${SETSERIAL} -bg ${PORTS}
<p>echo ' ====================== rc.serial is complete !!! ==================='
<br>
<br>
<p>* 关于 Shell Programming 的书单 :
<p>Title: The Unix C Shell Field Guide
<br>Authors: Gail Anderson and Paul Anderson
<br>Publisher: Prentice Hall
<br>Edition: 1986
<br>ISBN: 0-13-937468-X
<p>这本是 C-Shell 的 Bible , 想学 C-Shell 的人 , 可以去看这本书 .
<br>
<p>Title: Unix Shell Programming
<br>Authors: Stephen Kochan and Patrick Wood
<br>Publisher: Hayden
<br>Edition: 1990
<br>ISBN: 0-672-48448-X
<p>喔 ! 这本书以 Bourne Shell 为主 , 内容深入浅出 , 读者很容易就可以了解
<br>这本书的内容 , 进而掌握 Bourne Shell 的精髓 . 此外 , 这本书也有提到
<br>Korn Shell , 大体上来说 , 是一本值得看的好书 .
<br>
<p>*如何联系作者 :
<p>E-Mail Address : jhhsu@csie.nctu.edu.tw
<br>u8217017@cc.nctu.edu.tw
<p>Dormitory : 交通大学十舍 317R
<p>..
<br>
<br>
<p>Linux 开机程序之研讨
<br>CCCA 资工86 许景华
<p>在上次的介绍中 , 我们已经看完了 rc.S 及 rc.serial 这两个 shell script
.
<br>现在 , 我们将把剩下的 shell script 再作一个介绍 .
<br>首先还是看看全部的流程 :
<br>
<p>init[1]
<br>rc.S begin
<br>rc.serial begin
<br>rc.serial end
<br>rc.S end <-- 上一次我们说明到这里
<br>init[1] enter runlevel 5
<br>rc.M begin
<br>rc.inet1 begin
<br>rc.inet1 end
<br>rc.inet2 begin
<br>rc.inet2 end
<br>rc.font begin
<br>rc.font end
<br>rc.local begin
<br>rc.local end
<br>rc.M end
<br>login
<br>
<p>这次主要的部份可分为两项 : 因为 init 将会去读取 inittab , 所以 inittab
<br>将被列为第一部份的重点 , 而第二部份就是 rc.M , rc.font , rc.local
<br>这几个 shell script 的说明 . ( rc.inet1 , rc.inet2 这两个关于网络的
<br>shell script 将在以后单独说明 )
<br>好了 , 我们先从 inittab 看起吧 ! 看看上面的流程 , 在第一行 : init[1]
<br>也就是 init 这个 process 被启动之后 , 它会去读取 /etc/inittab 这个文件
<br>以完成系统的启动 . 从这里 , 我们看到了 LINUX 的确融合了 SVR4 及 SunOS
<br>的一些特性 , inittab 这个文件 , 在 SunOS 系统中是不存在的 , 但是它却是
<br>SVR4 典型的文件 . init 这个 process 会依据 /etc/inittab 中所记载的内容
<br>进入不同的 run-level 并启动不同的 process . 所以 inittab 的重要性
<br>可见一斑 . 那什么叫 run-level 呢 ? 所谓 run-level 就是系统中定义了许多
<br>不同的 level , 而系统会随著 level 的不同而去启动不同的资源 .
<br>现在就让我们来看一下 /etc/inittab 中的内容 :
<br>在 /etc/inittab 这个文件中 , 每一列是一个进入点 , 假如我们仔细观察每一列
<br>的话 , 那我们就会很容易的发现 , /etc/inittab 的每一列可以被 " : " 这个
<br>字符分成好几个栏位 . 这几个栏位的格式如下 :
<p>id:runlevels:action:process
<p>而它们代表的意义分别如下 :
<p>id : 由两个独特的字符所组成的辨示符号 , 在比较新的 UNIX 系统中 , 已不
<br>受只能有两个字符的限制 .
<p>runlevels : 指出下面一个栏位中的 action 以及 下下个栏位中的 process
<br>会在那些 runlevel 中被执行 . 这一栏的合法值有 0,1,2...6
<br>s 以及 S . 而在正常的启动程序之后 , Superuser 可以使用
<br>telinit 这个指令来改变系统的 runlevel . 又因为在 LINUX 中
<br>, runlevel 的预设值是 5 ( 等一下就会看到 ) 所以 , 只有
<br>那些每一列中 runlevel 那栏有 5 这个值的 , 后面的 process
<br>才会被启动 . 所以 , 我们就可以想像的到 : " 由于系统的
<br>runlevel 不同 , 所起动的 process 也不尽相同 , 所以系统
<br>起动的资源在每个不同的 runlevel 就会有差异存在 .
<p>action : 这个栏位有一点复杂 , 在这个栏位中记录着 init 在启动相对应的
<br>process 时 , 对 process 所采取的动作 , 而合法的动作有下面几项:
<p>initdefault : 指出系统在启动时 , 预设进入的 run-level 值 ,
<br>比如说 , 我们可以在 /etc/inittab 中找到下面这
<br>一列 : id:3:initdefault:
<br>很明显的 , 系统将在启动时 , 进入 runlevel 为 3
<br>的模式 . 当然 , 你可以把 3 改成 4 试试看 , 如
<br>果你改成了 4 , 那将会执行 /etc/rc.d/rc.4 , 也
<br>就是 run xdm . xdm 在以后有机会的话 , 将为各
<br>位介绍 ......
<p>sysinit : 在系统起动时 , 这个 process 会被执行 . 而所有 process
<br>前的 action 中有 boot 及 bootwait 的 process , 必
<br>须等到这些 action 为 sysinit 的 process 执行完之后
<br>它们才能够执行 .
<p>wait : 在起动一个 process 之后 , 若要再起动另一个 process , 则
<br>必需等到这个 process 结束之后才能继续 .
<p>respawn : 代表这个 process 即使在结束之后 , 也会重新被启动 ,
<br>最典型的例子就是 getty ( 在 LINUX 中为 agetty ) .
<br>看看下面的循环 :
<p>-- getty --> login --> shell --> logout --
<br>^ |
|
<br> |<---------------------------------------|
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -