关于Linux的启动和

时间:2011-09-04

    Linux是一类Unix计算机操作系统的统称。Linux操作系统的内核的名字也是“Linux”。Linux操作系统也是自由软件和开放源代码发展中的例子。严格来讲,Linux这个词本身只表示Linux内核,但在实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU 工程各种工具和数据库的操作系统。Linux得名于计算机业余爱好者Linus Torvalds。

  这里分为四部分内容:
  一、Linux源码结构介绍
  二、编译和配置的过程
  三、系统启动顺序的相关文件
  四、改造的一些经验
  一、
  当安装好一个Linux系统,通常源码存放在/usr/src/linux/目录。
  下面先看看这目录下的各个子目录及文件。
  [/]#cd /usr/src/linux
  [linux]#ls -aF
  ./ MAINTAINERS drivers/ kernel/ scripts/
  ../ Makefile fs/ lib/
  COPYING README include/ mm/
  CREDITS Rules.make init/ modules/
  Documentation/ arch/ ipc/ net/
  描述如下:
  COPYING
  GPL版权申明,看后你至少应该知道,你对具有GPL版权的源代码改动而形成的程序,或使用GPL工具产生的程序,具有使用GPL发表的义务。其中之一就是公开源代码。 bitsCN#com中国网管联盟
  CREDITS
  光荣榜,你应当感谢的一些人的信息,其中的每一个人都对Linux做出过很大贡献。
  Documentation/
  此目录是一些文档,起参考作用
  MAINTAINERS
  维护人员列表,对当前版本的内核各部分都有谁负责,如果你研究的够深入,可以与他们讨论
  Makefile
  如果你在UNIX编译过程序,可以看明白README,Linus 所写,及其编译配置方法简单介绍Rules.make: make时使用的一些共同规则
  arch/
  architecture(体系结构)arch 这个子目录包含了此源代码所支持的硬件体系结构相关的代码         drivers/
  系统中任何的设备驱动都位于此目录中。他又进一步划分成几类设备驱动,每一种也有对应的子目录,如声卡的驱动对应于drivers/sound
  fs/
  文件系统,实现了当前流行的几乎所有文件系统。Cool
  include/
  这个目录包括了的大多数include文档。另外对于每种支持的体系结构分别有一个子目录
  init/
  初始化文件,包含main.c和version.c两个文件。Initialize。此目录包含启动代码
  ipc/
  ipc的实现,与SYS V兼容。此目录包含了的进程间通讯代码
  kernel/
  代码,调度,中断,信号等的处理
  lib/
  一些工具。
  Mm/
  此目录包含了任何的内存管理代码。和具体硬件体系结构相关的内存管理代码位于arch/*/mm目录下,如对应于X86的就是arch/i386/mm/fault.c  Modules/
  模块文件目录,用于存放编译时产生的模块目标文件(参考编译过程)
  net/
  网络实现,包括TCP/IP在内的大量网络协议的实现。
  Scripts/
  描述文件,脚本,用于对的配置。
   
  二、
  构造内核
  常用命令包括:
  make config, dep, clean, mrproper, zImage, bzImage, modules, modules_install
  
  (1) make config
  内核配置文件,包含由用户选择的配置选项,用来存放内核配置后的结果。
  命令执行完后产生文件.config,其中保存着配置信息。下再做make config将产生新的.config文件,原.config被改名为.config.old
  (2)make dep
  寻找有关联的关系,互相依存,从而产生两个文件.depend和.hdepend。其中.hdepend表示每个.h文件都包含其它哪些嵌入文件。而.depend 文件有多个,在每个会产生目标文件(.o)文件的目录下均有,它表示每个目标文件都依赖哪些嵌入文件(.h)。    
  (3)make clean
  清出以前构核所产生的所有目标文件、模块文件、以及一些临时文件等,不产生任何文件。   
  (4)make rmproper
  除了做make clean外,删除所有因构核过程中产生的所有文件,还要删除.config,.depend等文件,把源码恢复到原始的状态。下次构核时就必须重新配置了。  
  (5)make, make zImage, make bzImage
  make:
  构核。通过各目录的Makefile文件进行。会在各个目录下产生一大堆目标文件,若代码没有错误,将产生文件vmlinux,这就是所构的。并产生映射文件System.map通过各目录的Makefile文件进行。.version 文件中的数加1,表示版本号(又产生一个新的版本了),让你明白,你已经对改动过多少次了。
  Make zImage:
  在make的基础上产生压缩的映象文件./arch/$(ARCH)/boot/zImage以及在./arch/$(ARCH)/boot/compresed/目录下产生一些临时文件。
  Make bzImage:
  在make 的基础上产生压缩比例更大的映象文件./arch/$(ARCH)/boot/bzImage以及在./arch/$(ARCH)/boot/compresed/目录下产生一些临时文件。在太大时进行。
  (6)make modules
  编译模块文件,你在make config时所配置的所有模块将在这时编译,形成模块目标文件,并把这些目标文件存放在modules目录中。使用如下命令看一看。
  Ls modules
  (7)make modules_install
  把上面编译好的模块目标文件目录/lib/modules/$KERNEL_VERSION/ 中。比如我的版本是2.0.36,做完这个操作后可使用下面的命令看看:

  ls /lib/modules/2.0.36/
     

  三、
  系统的启动顺序及相关文件
  仍在源码目录下,看以下几个文件
  ./arch/$ARCH/boot/bootsect.s
  ./arch/$ARCH/boot/setup.s
  ./init/main.c
   
  bootsect.S 及 setup.S
    bootsect.S,系统引导程序,一般不超过512字节。
    setup.S汇编函数被连接器放在内核映像文件中的0x200的偏移处。setup函数必须初始化计算机中的硬件设备并为内核程序的执行建立环境。
   在说明这个程序是linux kernel的个程序,也是linux自己的bootstrap程序之前,我们一般要先打开IBM PC的电源:
    在电源打开时,内存中地址FFFF:0000开始执行,而此处的内容则是一个jump指令,jump到另一个位於ROM BIOS中的位置,开始执行一系列的动作,其中包括了检查RAM,keyboard,显示器,软硬磁盘等等,这些动作是由系统测试代码(system test code)来执行的,随着制作BIOS厂商的不同而会有些许差异,但都没什么区别。
    然后在系统测试码之后,控制权会转移给ROM中的启动程序(ROM bootstrap routine),这个程序会将磁盘上的第零轨第零扇区读入内存中(这就是一般所谓的boot sector,如果你曾接触过电脑病毒,就大概听过它的大名),至於被读到内存的哪里呢? --位置07C0:0000(即07C00h处),这是IBM系列PC的特性。而位在linux开机磁盘的boot sector上的正是linux的bootsect程序,也就是说,bootsect是个被读入内存中并执行的程序。bootsect做了以下一些步骤。  
    步
   bootsect将它"自己"从被ROM BIOS载入的地址0x7C00处搬到0x90000处,然后利用一个jmpi(jump indirectly)的指令,跳到新位置的jmpi的下一行去执行,
  第二步
   将其他segment registers包括DS,ES,SS都指向0x9000这个位置,与CS看齐。另外将SP及DX指向一任意位移地址( offset ),这个地址等一下会用来存放磁盘参数表(disk para- meter table )
  第三步
   利用BIOS中断服务int 13h的第0号功能,重置磁盘控制器,使得刚才的设定发挥功能。
   
  第四步
   完成重置磁盘控制器之后,bootsect就从磁盘上读入紧邻着bootsect的setup程序,也就是setup.S,此读入动作是利用BIOS中断服务int 13h的第2号功能。Setup的image将会读入至程序所指定的内存中紧邻着bootsect 所在的位置。待setup的image读入内存后,利用BIOS中断服务int 13h的第8号功能读取目前磁盘的参数。
   第五步
   读入真正linux的kernel,可以在linux的根目录下看到的"vmlinuz" 。在读入前,将会先呼叫BIOS中断服务int 10h 的第3号功能,读取游标位置,之后再呼叫BIOS 中断服务int 10h的第13h号功能,在萤幕上输出字串"Loading",这个字串在boot linux时都会个出现。
  第六步
   检查root device,仿照一开始的方法,利用indirect jump 跳至刚刚已读入的setup部份比较
   把大家所熟知的MS DOS 与linux的开机部份做个粗浅的比较,MS DOS 由位於磁盘上boot sector的boot程序负责把IO.SYS载入内存中,而IO.SYS则负有把DOS的kernel --MSDOS.SYS载入内存的重责大任。而linux则是由位於boot sector 的
  bootsect程序负责把setup及linux的kernel载入内存中,再将控制权交给setup。
    四、
    改造的一些经验 
   Linux的的好处之一就是它的源码公开。同时,公开的源码也吸引着无数的电脑爱好者和程序员,解读和分析Linux的源码是他们的兴趣,把修改Linux源码和改造Linux系统作为自己对计算机技术追求的目标。


  
上一篇:详解CPU卡的接口特性、传输协议与读写程序设计
下一篇:了解PBO技术及实时嵌入式软件开发

免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

相关技术资料