走进Linux 操作系统
| 它们的,而前一阶段都是由“硬件进程”手工去做的。该阶段,这个由ini_task创建的新进程需要初始化总线、网络并启动系统中的各种系统内核后台线程,然后再初始化外设、设置文件格式,在这之后,它要为进入系统做最后的准备——初始化文件系统,安装根文件,打开/dev/console设备,重定向stdin、stdout和stderr到控制台,然后搜索文件系统中的init程序,并使用 execve()系统调用加载执行init程序。系统自此进入了用户态。 init程序接着将依照initab配置文件中的选项依次执行: 1 确定运行级别(1-6) 2 运行rc.sysinit脚本中的的系统服务,如激活交换分区,检查磁盘,加载硬件模块等 3 运行规定级别下的服务:/etc/rc.d/rc*.d/下的s打头的服务,如网络服务s*network。 4 在指定串口上运行getty程序,getty打开终端线,并设置模式,然后运行login程序。如果用户帐号和密码正确(需要通过/etc/passwd验证),则进入用户的工作目录,并按照其工作目录中的设置执行相应的shell。 到这里用户才可以真正实用操作系统了。 idle进程是个奇怪的进程,它是在没有别的任务使用cpu时是才使用cpu的,它的存在价值据说可以延长cpu寿命。 内核后台线程是种执行在内核态的进程,它们和用户进程一样受调度程序调度,系统利用它们周期性(不一定固定周期)地执行一些自身管理方面的“家务事”。主要的几种内核线程为:bdflush——清理被写过的内存缓冲区;kup-date——按时将内存缓冲区中的信息更新到磁盘中; kswapd——将内存页交换到磁盘;keventd——关系系统事件;ksoftirq——执行软件中断。 搭建实验系统 很抱歉搭建一个linux操作系统到目前为止还没有一个很标准的流程或规范,不过大体流程都大通小异,无非是首先编译内核——将内核源代码编译成一个可执行的镜像文件,当然编译内核时可能会带有一些模块也需要同期进行编译和安装(是否有模块取决于你的具体选择)。 有了编译后的内核,接着就需要创建一个根文件系统,在其中又需要创建必要的目录。至于其中使用的软件和库函数你可以选择下载源代码包,然后交叉编译,再进行安装。或者我们偷个懒,从一个发布的完整系统里直接拷贝需要的软件和库,同时将必要的设备文件、配置文件和服务脚本也拷贝过来,你这时所要做得仅仅是去修改一些相关的配置文件就可以拥有一个自己的文件系统了。 内核与文件系统都有了,就可以说一切具备只欠东风,你所需要做得只剩下将内核和文件系统绑定到一起,让系统被引导载入内核,内核载入后可以找到根文件系统,并执行其中的初始化程序。你可别以为这个收尾动作能轻松搞定,往往初学者都在这里要栽跟头。 怎么能在最小的代价学习搭建系统呢?想想看可不是每个网友都能找个空硬盘或者磁盘(看看你的机器,也许连软驱都没)来做新系统的,为了保护原有系统,即便开一个新分区都不能鼓励。所以最好的方法就是用内存模拟一个磁盘,将创建的根文件系统放在其中,系统引导后,就登陆到内存模拟的磁盘上运行。这时你彻底跳出了你的物理硬盘。这种方法有时在嵌入系统中会被使用,或希望断电后数据被抹掉的安全系统中使用。 下面我们就一同做个这样的试验系统,你付出的唯一代价是消耗些时间和无数次击健。编译内核 第一步要做的工作就是挑选一个合适版本的内核源代码包,然后编译它。不要以为编译内核很神秘,其实它和编译普通程序差不多,内核源代码其实就是“一大堆”程序,编译它就等于分别编译个个程序然后在将它们链接成一个单一的可执行镜像文件。这个镜像就是你在/boot目录下看到的vmlinuz-*(如果你细心的话,一定能发现在该目录下还有一个叫vmlinux的文件。其实这两个文件是一回事,但前面那个是经过压缩的) 正如第一部分所说,linux内核具有很强的伸缩性,在内核里面许多功能是可选择的,如果需要就可以被编译到内核,不过内核会因此变的肥胖。一种可替代的方式是将某些功能编译成模块放在文件系统内,等你真正需要它时,再由被载入到内核,这样就内核就可以轻装上阵了,启动起来也快许多。 虽然是个试验系统,但还是尽力让它功能做强点吧。所以在编译前,配置内核选项时,除了支持最基本的ext2文件系统,pci接口,自动装在模块等功能外,再将ext3,jfs,即插即用,网络,scsi,usb等比较常用的功能加入。再一个就是为了能实现我们的虚拟内存中建立根文件系统,内核还需要支持ramdisk 和initrd。内核网络设备选项里包含大量网卡驱动程序,你必须知道自己网卡内型才能正确选择,一般情况都将网卡驱动编译未模块,在系统启动后载入。我们试验系统运行在vmware下,而vmware虚拟网卡驱动为pcnet32,因此这个模块被包含进来了。编译步骤 先去下载一个内核源代买不用我在多说了吧。如果你实在是个衣来伸手的家伙,好吧告诉你,到www.kernel.org网站上荡一个想要版本的内核源代码。如果是gz结尾的压缩源文件,就使用tar xvzf linux-2.4.18.tar.gz解开,如果是gz2结尾的,就使用tar xvjf linux-2.4.18.tar.bz2解开。 内核版本编号可是有点讲究的,简单的说,偶数为稳定版本,奇数为开发版本,所以我们用2.4.18版,一是因为它属于稳定版,再一个就使我机器里以前下载过它,不想再换了:)。 然后进入存放解开后的内核原代码的目录(标准系统默认情况下在目录/usr/src/linux下存放该系统的内核源代码),执行命令make menuconfig进行内核功能配置,选择需要的功能以模块形式编译或直接编译到内核。配置信息默认情况下记录在隐含文件.config中,你也可以选择将其记录到自定义文件中,比如可以把信息记录在minisys.config中。在以后配置内核时可以方便地导入指定的配置文件。<make 详细解释***> make menucofig提供给你一个文本图形界面的配置菜单,其中列出了内核所能提供的全部功能,如果你在选项前选则*号,那么该选项被编译到内核中,如果选m则被编译为模块,对于你不清楚的选项可以使用?查看其解释。除了用make meunconfig外你有复古情节的话,可以试试使用make config,它完成同样的功能,不过你得有足够得耐心去忍受刷平一样得命令行选择<y><n> 。如果你在x环境下(桌面环境)不妨可以使用make xconfig配置,它相比前两种方法得好处就试比较容易看清楚,对眼神不好得网友建议使用它。保存内核配置后,就执行 make dep /*确保所有的相依关系,例如 include files 都没问题.除非你的电脑真的很慢,否则它不会花太久时间的*/ make clean ?/*清除核心编译的所有目的档以及其它东西.在重建一个核心之前不要忘记这个步骤*/make bzimage 或zimage/*编译内核——bz和z格式内核之间最大的差别是对于内核体积大小的限制。zimage内核需要放在实模式1mb的内存之内,其体积受到了限制。而bzimage的内核没有1mb内存限制*/ 记住内核编译完了,还必须再编译模块, 即使您在配置内核时没有使用任何模块,也不要跳过此步骤,在编译完 bzimage 后立刻编译并安装模块是个好习惯。而且,如果您真的没有模块需要编译,这个步骤也非常快就结束了。 make modules; /*编译内核模块,凡是配置内核时标记为m功能都将被编译未模块*/make modules_install。/*这将导致模块被编译而且被安装到 /usr/lib/<内核版本号> 目录下。不过如果你想改变内核镜像或模块的所在目录,都可以通过修改内核源码中的makefile文件来达到,比如修改install_mod_path来改变模块安装目录*/ 等黄蜂一样的字符风暴再屏幕上停止后,你现在拥有了新内核了。它藏在内核源码目录下arch/i386/boot下叫bzimage或zimage。新内核随带的模块被安装到了lib下的modules目录中。组建文件系统 组建根文件系统说白了更简单,一来格式化文件系统的宿主设备,二来就是拷贝需要的文件。简单明了吧!我们先来一同拷贝文件吧,等考完了再谈宿主设备的问题,别忘了我们可都是完空手套百狼呀!(除了拷贝文件外,更标准的方法是下栽各种工具包,在本地交叉编译,在进行安装,不过为了省事,我们采用拷贝标准系统文件的方法来构造文件系统,不但方便而且异曲同工。但前提是新系统体系结构——处理器——和我们原料系统一致,如果你想在0x86系统上编译运行在arm机上的文件系统,那么最好是去下载源代码包重新交叉编译吧)   |
<< Linux 串口截止阀的分类以及特点 >>
