[Linux内核]从开机加电到main函数执行前的过程

第一步:启动BIOS

          CPU加电后首先工作在16位实模式下,

                1.启动BIOS是通过硬件的特殊设计完成的。加电瞬间强行置CS:0xFFFF,IP:0x0000,如此CS:IP就指向0xFFFF0。BIOS的入口地址即为0xFFFF0

                2.定位BIOS后便开始执行BIOS代码(比如自检)。最重要的任务就是在内存中建立中断向量表和中断服务程序。

                  如:0x00000—0x003FF的1KB构建中断向量表

                          0x00400—0x004FF用256字节构建BIOS数据区

                          0x0E2CE加载了8KB左右的中断服务程序

 

第二步:加载操作系统内核

                1.第一步加载引导程序到内存。BIOS程序发出int 0x19中断,CPU在中断向量表中找到中断服务程序入口地址后执行。此段代码BIOS设计好,与操作系统无关。此中断程序把软驱的0号磁头对应盘面的0磁道1扇区的内容拷贝至内存0x07C00,此扇区的内容即是linux 0.11的引导程序bootsect,他会把软盘中的操作系统陆续加载进内存

 

                两头约定,定位识别

              两头约定就是指约定操作系统必须把最开始执行的代码放在0盘面0磁道1扇区,约定BIOS在接到启动命令后要把启动扇区的代码加载到0X07C00。这样只要操作系统的设计者和BIOS的设计者遵照这个约定,BIOS就能顺利的引导操作系统的启动。

 

                 2.第二步,加载setup代码。

                    linux设计者很好的规划了实模式下1MB内存的使用:

SETUPLEN = 4    ! nr of setup-sectors
BOOTSEG  = 0x07c0   ! original address of boot-sector
INITSEG  = 0x9000   ! we move boot here - out of the way
SETUPSEG = 0x9020   ! setup starts here
SYSSEG   = 0x1000   ! system loaded at 0x10000 (65536).
ENDSEG   = SYSSEG + SYSSIZE  ! where to stop loading

                    首先要复制bootsect,就是把自己从BOOTSEG位置复制到INITSEG。从现在起操作系统已经不需要依赖BIOS,可以完全按照自己的意图分配内存使用。

                   将Setup程序加载到内存需要依靠BIOS提供的int 0x13中断向量所指的中断服务程序(磁盘服务程序)。使用0x13中断必须先给他“传参”,指定的扇区和加载内存的位置传给他。

                   linux会从第2个扇区到第4个扇区加载至内存0x90200处

 

                3.第三部,加载system模块。使用的依然是int 0x13中断。

posted @ 2012-09-05 22:14  petercao  阅读(2543)  评论(1编辑  收藏  举报