首页>计算机>Linux认证>学习教程>正文
Linux启动过程全接触

www.zige365.com 2008-8-19 17:16:47 点击:发送给好友 和学友门交流一下 收藏到我的会员中心
Setup()函数的功用

  现在我们就可以深入研究一下自举过程中不可缺少的汇编语言函数了。

  Setup()函数可以在/usr/src/linux-2.4.2/arch/i386/boot/setup.S文件中找到。

  Setup()函数代码是在完整的内核自举程序加载以后,才会跳到相应的函数代码处。在内核文件中,其偏移地址是0x200。这使得自举程序很容易找到这段代码,并将其拷贝到起始物理地址为0x00090200的内存中。

  这个Setup()文函数到底是做什么用的?在计算机时里,内核要正确地操作所有硬件就必需首先要检测到它们,并且以一种有序的方式进行初始化。Setup()函数初始化所有的硬件设备,从而为内核操作它创造了一个环境。

  但是,前面我们不是已经提到过BIOS会检测所有的硬件吗?虽然BIOS初始化了所有的硬件,但是Linux内核并不放心,它还要以自己的方式对所有的硬件进行初始化。Linux内核之所以要设计成这样,是为了增强可移植性和稳定性。这也是Linux内核要优于很多目前可用的Unix和类Unix内核的原因之一,并且也使得它在很多方面表现的非常出众。

  Setup()函数主要完成以下任务:

  (1)首先是检测系统可用内存的总量,它是通过BIOS程序来完成检测的;

  (2)设置键盘重复延迟时间和重复速度;

  (3)检测视频卡;

  (4)重新初始化硬盘控制器和硬盘参数;

  (5)检测一个MCA;

  (6)检测一个PS/2定点设备(鼠标总线);

  (7)检测高级电源管理器(APM)BIOS支持;

  (8)检测内核在内存中的位置,如果在低地址0x00010000,就将其移到高地址0x00001000,如在高地址则不做任何移动;

  (9)设置设备中断描述表(IDT)和全局描述表(GDT);

  (10)如已经有了浮点单位(FPU),则重置之;

  (11)重新调用程序中断控制器;

  (12)通过设置cr0状态寄存器的PE位,把CPU从“实模式”切换到“保护模式”;

  (13)跳转到stratup_32( )汇编语言函数。

  第一个stratup_32( )函数做什么

  在启动过程中要用到两个stratup_32( )函数,虽然它们都是汇编语言函数,但是却是两个完全不同的函数。我们这里所说的函数包含在/usr/src/linux-2.4.2/arch/i386/boot/compressed/head.S文件里。

  Setup()文件执行后,这个函数就被加载到物理地址为0x00100000或者物理地址为0x00001000的内存中(取决于内核是载入高或者低内存)。

  当执行这个函数时,会执行以下的操作:

  (1)初始化段寄存器和一个临时栈。

  (2)内核中没有初始化氖荻加?填充。它是通过symbols _edata和 _end来识别的。

  (3)执行decompress_kernel( )函数。这个函数用于对Linux内核解压缩。这个时候,屏幕上将显示“Uncompressing Linux……”信息。解压缩完成后,就会显示“OK, booting the kernel”信息。现在有一个问题,就是解完压缩的内核被放置在什么位置?答案是如果Linux内核被加载低地址,那么解压缩的内核将被置于物理地址为0x00100000的地方。如果在高地址,则内核会被先解压到一个临时缓冲区中,待完成后再将其加载到物理地址为0x00100000的地方。

  (4)最后,跳转到物理地址为0x00100000的地方执行。

  到此为止,代码执行操作就由另外一个startup_32( )函数来接管。也就是说,第二个startup_32( )函数接管了启动过程。

本新闻共4页,当前在第3页  1  2  3  4  

我要投稿 新闻来源: 编辑: 作者:
相关新闻
红旗linux认证工程师考题系统部份(3)
Wine让Windows上的软件集体移民
LinuxDNS的负载均衡及子域委派
用chkconfig轻松管理启动程序
如何设置Ubuntu做网关