当前位置:首页 » 编程博文
开发技术指南» 文章正文
    引言: 各位是否曾经对电脑整个开机的流程感到好奇呢 ? 这一次 , 我们
 

 

 ·vxworks romstar函数分析    »显示摘要«
    摘要:vxworks romstar函数分析 lmjx 2004-8-26 email:limiao@yeah.net 以下对romstart进行了必要的删减,主要去掉了一些预编译选项。 void romstart ( fast int starttype /* start type */ ) { volatile /* to force absolute adressin......
    摘要:hi,everybody!又见面,想我了没(吐……)!不扯闲的了,开始我们的c#之旅吧。 前面两章花了很多的时间都在讲述一些理论的东西,大家是不是觉得很无趣(是!说真的我的头也大了,我也是强挺着读下去的。)。那么这回大家终于开以松一口气,从这一章开始,我们将正式踏进c#的世界了。由于这章的内容比较多,也比较重要,所以分几节来学习。ready,go! 这一章主要讲解了c#......


剖析Linux系统启动过程(二)

各位是否曾经对电脑整个开机的流程感到好奇呢 ? 这一次 , 我们所要讨论的主题 , 就是 linux 从开机的一瞬间到 login 为止 , 到底发生了什么事情 ?

想必各位都知道 , 在刚开机时 , 由于 80x86 的特性 , cs ( code segment ) 【程序编程相关:WebWork 2.1.1发布

【推荐阅读:040902 Z China VS US

之中扫描 , 看看是否有合法的 rom 存在 ( 比如 scsi 卡上的 rom ) . 【扩展信息:TNS-12560的一次解决

这个寄存器中全部都放着 1 , 而 ip ( instruction pointer ) 这个寄存器中全部都放着 0 , 换句话说 , cs=ffff 而 ip=0000 , 此时 , cpu 就依据cs 及 ip 的值 , 到 ffff0h 去执行那个地方所放的指令 . 这时候 , 由于ffff0h 已经到了高位址的顶端 , 所以 , ffff0h 这个地方 , 总是会放一个jmp 指令 , 跳到比较低的位址 . 接著 , rom bios 就会作一些检查的动作像内存 , 键盘 等...... 并在我们俗称的 umb ( upper memory block )

假如有 , 就到里面去执行一些东西 , 执行完之后再继续刚才的行程 . 到了最后 , 读取硬盘上的第一个 sector . 在这里 , 我假设各位由硬盘启动

因此 , 就硬盘的构造而言 , 它的第一个 sector 称为 mbr ( master boot

record ) . 因为一个 sector 是 512 bytes , 而 mbr 这 512 bytes 可分为两个部份 , 第一个部份为 pre-boot 区 , 占了 446 bytes ; 第二部份是partition table , 占了 66 bytes . pre-boot 区的作用之一 , 就是去看看那个 partition 被标成 active , 然後去读那个 partition 的 boot 区 .

在 linux 的启动方面 , 一般人最常把 lilo 放在 mbr 或 superblock假如你把 lilo 放在 mbr , 那很明显的 , 当读取到 mbr 的时候 , lilo就被执行 , 此时 , 你的屏幕上会出现 boot: 接着 , 就进行 load kernel 的动作 . 在另一方面来说 , 假如你把 lilo 安装在 superblock , 通常你还会有一个管理开机的程序 , 也许是放在 mbr ( 像 osbs ) 或者是放在一个单独的 partition ( 像 os/2 的 boot manager ) . 再由这个管理开机的程式去读取 lilo , 进而做 load kernel 的动作 .

好了 , 到了目前为止 , 我们已经讲到 load kernel 的动作 . kernel 被load 到 memory 中之后 , 接着进行一连串 probe 周边的动作 , 像串口并口 , 软盘 , 声卡 , 硬盘 , 光驱 等 ...... 接着 mount rootpartition . 在这之后 , kernel 会起动 init 这个 process . init 这个 process 的 pid 为 1 , 它是所有 process 的祖先 .

接下来呢 ? 系统就开始执行 /rc.d/rc.s , 在这里 , 我们暂时打住 , 先对大概的 initialization script 执行的顺序作一个浏览 , 请看下面的流程 :

init[1]

rc.s begin <--- 目前我们已经讲到这里

rc.serial begin

rc.serial end

rc.s end

init[1] enter runlevel 5

rc.m begin

rc.inet1 begin

rc.inet1 end

rc.inet2 begin

rc.inet2 end

rc.font begin

rc.font end

rc.local begin

rc.local end

rc.m end

login

上面的流程清楚的指出 , 在 rc.s 这个 shell script 中 , 会去执行 rc.serial接着再执行 rc.m , rc.m 中又包含了 rc.inet1 , rc.inet2 , rc.font , rc.local最后执行 login . 在下面的内容中 , 将为各位介绍这几个 shell script从下面开始 , 凡是每一列之前有一个 # 的 , 为原来 shell script 中的注释有两个 # 的 , 为笔者加上的注释 , 当然啦 , 没有任何 # 的为 shell script的内容 , 而对命令或内容的解释 , 一律都写在命令或内容的前面 .

首先由 rc.s 开始 :

***************************** rc.s********************************

#!/bin/sh

#

# /etc/rc

#

# these commands are executed at boot time by init(8).

# user customization should go in /etc/rc.local.

echo ´======== rc.s is running ! system initializing now !!! ========´

path=/sbin:/usr/sbin:/bin:/usr/bin

## 打开所有 swap ! 下面 /sbin/swapon -a 的意思是 : 使得 /etc/fstab 中被记录

## 成 swap 的 device 全部启动 .

/sbin/swapon -a

?

喔 ! 下面这个指令 update 就很重要了 , 它负责每隔一段固定的时间 ,就将buffer 中的资料 , 利用 sync 写回磁盘上 , 并将 superblock做update 的动作 . 使用 ps 这个指令看看有那些 process , 就可看到update 还有一个bdflush , 这两个 process 都是必然要存在的 , 可不要随便砍掉 , 要不然 , 万一系统 crash 了 , 那磁盘里面的资料就不是最新的了 ......

/sbin/update &

?

利用 echo -n >> 制造一个文件 , 并用 rm -f 这个档案来测试 root partition


...   下一页
    摘要:[原创]代码范例:自定义组件和自定义事件 自定义事件:/** * @(#) odtbuttonevent.java * * copyright 2004 opensource develop team. all rights reserved. */ // packagepackage com.opensource.event; // import classesimport java.aw......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE