请选择语言:中文 ENGLISH
【最新通知】:
嵌入式OS

Linux的启动和核心介绍

2011-12-16 09:08:23   来源:来 源 : www.hzlitai.com.cn   浏览: 839 次

关键字:

  三、
  系统的启动顺序及相关文件
  仍在核心源码目录下,看以下几个文件
  ./arch/$ARCH/boot/bootsect.s
  ./arch/$ARCH/boot/setup.s
  ./init/main.c
   
  bootsect.S 及 setup.S
   这个程序是linux kernel的第一个程序,包括了linux自己的bootstrap程序,但是在说明这个程序前,必须先说明一般IBM PC开机时的动作(此处的开机是指"打开PC的电源"):
    一般PC在电源一开时,是由内存中地址FFFF:0000开始执行(这个地址一定在ROM BIOS中,ROM BIOS一般是在FEOOOh到FFFFFh中),而此处的内容则是一个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将会读入至程序所指定的内存绝对地址0x90200处,也就是在内存中紧邻着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。
  ##这几步内容主要参照一个台湾同胞写的文档,setup.s的内容希望有人补充。
   
  Start_kernel()
  当核心被载入后,首先进入的函数就是start_kernel。
  ./init/main.c 中函数start_kernel包含核心的启动过程及顺序。
  通过它来看核心整个初始化过程。
  首先进行一系列初始化,包括: [bitsCN.Com]
  trap_init(); ##./arch/i386/kernel/traps.c 陷入
  init_IRQ(); ##./arch/i386/kernel/irq.c setup IRQ
  sched_init(); ##./kernel/sched.c 调度初始化,并初始化bottom_half
  time_init(); ##./arch/i386/kernel/time.c
  init_modules(); ##

 

[1] [2] [3] [4]

分享到:

相关阅读:
· 第79届( 深圳)中国电子展 2012年4月
· Android“冰淇淋三明治”最新版本开始支持MIPS 架构
· MCU:32位比拼应用 64位核再添新军
· 恩智浦出货世界速度最快的ARM Cortex-M4及Cortex-M3微控制器
· MicriumμC/ OS – III开源-Jean labrosse 发表视频讲话
· 赛灵思进驻北京新址并宣布成立中国研发中心
· ADI推出业界首款信号隔离CAN收发器
· 风河:芯片商转型做软件,传统嵌入式软件商做什么?
· CEVA展示用于数字家庭和移动产品的最新IP技术
 
?