新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 操作系统研究。UEFI
    [返回] 中文XML论坛 - 专业的XML技术讨论区计算机理论与工程『 操作系统原理 』 → Linux操作系统下关于引导和初始化的问题 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 6241 个阅读者浏览上一篇主题  刷新本主题   平板显示贴子 浏览下一篇主题
     * 贴子主题: Linux操作系统下关于引导和初始化的问题 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 操作系统原理 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客楼主
    发贴心情 

    址,则内核会被先解压到一个临时缓冲区中,待完

      成后再将其加载到物理地址为0x00100000的地方.

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

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

      接管了启动过程.

      第二个startup_32( )函数完成的功能

      解压缩Linux内核的工作由另外一个startup_32( )函数来完成.该函数位于

      /usr/src/linux-2.4.2/arch/i386/kernel/head.S文件中.

      这时你可能会说两个不同的函数用同一个名字不会出错吗 答案是不会的.因为两个函数都是到自己

      初始地址去执行,并且都有自己的执行环境,所以不会出错.

      下面我们来看一下第二个startup_32( )函数的功能.当执行这个函数时,实际上是为第一个Linux

      进程(process 0)设置环境.这个函数将执行下面的操作:

      (1) 寄存器将以最后的值进行初始化;

      (2)为process 0设置内核模式栈;

      (3)调用并且执行setup_idt( )函数,该函数将把所有的IDT填充空值;

      (4)把从BIOS中获得的参数放在第一页的框架中;

      (5)识别处理器的模式;

      (6)使用GDT和IDT表加载gdtr和idtr寄存器;

      (7)最后跳到start_kernel( )函数.

      l start_kernel( )函数功能

      start_kernel( )函数完成Linux内核的初始化工作.这个函数执行后,所有的基本内核组件都将被初

      始化.这也是整个启动过程的最后一步.

      该函数将完成以下的功能:

      (1)输出Linux版本信息(printk(linux_banner))


      (2)设置与体系结构相关的环境(setup_arch()) ――>页表结构初始化(paging_init())

      (3)提取并分析核心启动参数(从环境变量中读取参数,设置相应标志位等待处理,(parse_options())

      (4)使用"arch/alpha/kernel/entry.S"中的入口点设置系统自陷入口(trap_init())

      (5)使用alpha_mv结构和entry.S入口初始化系统IRQ(init_IRQ())

      (6)核心进程调度器初始化(包括初始化几个缺省的Bottom-half,sched_init())

      (7)时间,定时器初始化(包括读取CMOS时钟,估测主频,初始化定时器中断等,time_init())

      (8)控制台初始化(为输出信息而先于PCI初始化,console_init())

      (9)初始化可安装模块机制,计算出内核符号表的大小init_modules()

      (10)剖析器数据结构初始化(prof_buffer和prof_len变量)

      (11)核心Cache初始化(描述Cache信息的Cache,kmem_cache_init())

      (12)延迟校准(获得时钟jiffies与CPU主频ticks的延迟,calibrate_delay())

      (13)内存初始化(设置内存上下界和页表项初始值,mem_init())

      (14)创建和设置内部及通用cache("slab_cache",kmem_cache_sizes_init())

      (15)创建页cache(内存页hash表初始化,pgtable_cache_init())

      (16)根据物理内存的大小计算出允许创建线程(包括进程)的数量fork_init(num_mappedpages);

      (17)proc_caches_init(); vfs_caches_init(num_physpages);buffer_init(num_physpages).

      都是为有关的管理机制建立起专用的slab缓冲区队列.

      (18)分配空间建立起缓冲页面杂凑表page_hash_table ( page_cache_init())

      (19)对Sys V 进程间通信机制的初始化ipc_init();

      (20)创建信号队列cache("signal_queue",signals_init())


      (21)检查体系结构漏洞(对于alpha,此函数为空,check_bugs())

      (22)SMP机器其余CPU(除当前引导CPU)初始化(对于没有配置SMP的内核,此函数为空,smp_init())

      启动init过程(创建第一个核心线程,调用init()函数,原执行序列调用cpu_idle() 等待调度,init())

      至此start_kernel()结束,基本的核心环境已经建立起来了

      init()函数作用

      init()函数作为核心线程,首先锁定内核(仅对SMP机器有效),然后调用 do_basic_setup()完成外

      设及其驱动程序的加载和初始化.过程如下:

      总线初始化(比如pci_init()) ;

      网络初始化(所有协议的初始化过程,sock_init());

      创建事件管理核心线程(start_context_thread()函数启动context_thread()过程,并重命名为

      keventd);

      启动任何使用__initcall标识的函数(方便核心开发者添加启动函数,do_initcalls())

      do_initcalls()-partion_setup()-device_init()是所有外设初始化的总入口;

      文件系统初始化(filesystem_setup(),主要是devfs);

      安装root文件系统(mount_root())

      至此do_basic_setup()函数返回init(),在释放启动内存段(free_initmem())并给内核解锁以后,

      init()打开/dev/consol

    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/9/7 8:19:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 操作系统原理 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/7/1 9:21:51

    本主题贴数5,分页: [1]

     *树形目录 (最近20个回帖) 顶端 
    主题:  Linux操作系统下关于引导和初始化的问题(3788字) - 卷积内核,2007年9月7日
        回复:  e设备,重定向stdin,stdout和stderr到控制台,最后,搜索文件系统中的init ..(3583字) - 卷积内核,2007年9月7日
        回复:  址,则内核会被先解压到一个临时缓冲区中,待完  成后再将其加载到物理地址为0x00100000..(3795字) - 卷积内核,2007年9月7日
        回复:  是就去启动其他介质.  一般来说,Linux是从硬盘启动的.这就需要不同的自举程序.在Inte..(4053字) - 卷积内核,2007年9月7日
        回复:  r-On Self-Test,POST),这时会显示版本及其它很多相关的硬件信  息. BIO..(3870字) - 卷积内核,2007年9月7日

    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    46.875ms