精华内容
下载资源
问答
  • 多系统启动引导程序,非常方便。亲自测试过。
  • 在刚刚的启动过程中,我们已经知道启动引导程序(Boot Loader,也就是 GRUB)会在启动过程中加载内核,之后内核才能取代 BIOS 接管启动过程。如果没有启动引导程,那么内核是不能被加载的。 本节,我们就来看看启动...

    在刚刚的启动过程中,我们已经知道启动引导程序(Boot Loader,也就是 GRUB)会在启动过程中加载内核,之后内核才能取代 BIOS 接管启动过程。如果没有启动引导程,那么内核是不能被加载的。

    本节,我们就来看看启动引导程序加载内核的过程,当然 initramfs 这个虚拟文件系统也是要靠启动引导程序调用的。在 CentOS 6.x 中,启动引导程序默认是 GRUB,GRUB 是现在最为流行的启动引导程序,我们也用 GRUB 来说明启动引导程序的作用。

    早期的 LILO 引导程序已经不是很常见了,GRUB 相比来讲有很多优势,主要有:

    • 支持更多的文件系统。
    • GRUB 的主程序可以直接在文件系统中查找内核文件。
    • 在系统启动时,可以利用 GRUB 的交互界面编辑和修改启动选项。
    • 可以动态修改 GRUB 的配置文件,这样在修改配置文件之后不需要重新安装 GRUB,而只需重新启动就可以生效。

    GRUB加载内核的过程

    GRUB 的作用有以下几个:

    • 加载操作系统的内核;
    • 拥有一个可以让用户选择的的菜单,来选择到底启动哪个系统;
    • 可以调用其他的启动引导程序,来实现多系统引导。


    按照启动流程,BIOS 在自检完成后,会到第一个启动设备的 MBR 中读取 GRUB。在 MBR 中用来放置启动引导程序的空间只有 446 Byte,那么 GRUB 可以放到这里吗?答案是空间不够,GRUB 的功能非常强大,MBRM 空间是不够使用的。那么 Linux 的解决办法是把 GRUB 的程序分成了三个阶段来执行。

    Stage 1:执行GRUB主程序

    第一阶段是用来执行 GRUB 主程序的,这个主程序必须放在启动区中(也就是 MBR 或者引导扇区中)。但是 MBR 太小了,所以只能安装 GRUB 的最小的主程序,而不能安装 GRUB 的相关配置文件。这个主程序主要是用来启动 Stage 1.5 和 Stage 2 的。

    Stage 1.5:识别不同的文件系统

    Stage 2 比较大,只能放在文件系统中(分区),但是 Stage 1 不能识别不同的文件系统,所以不能直接加载 Stage 2。这时需要先加载 Stage 1.5,由 Stage 1.5 来加载不同文件系统中的 Stage 2。

    还有一个问题,难道 Stage 1.5 不是放在文件系统中的吗?如果是,那么 Stage 1 同样不能找到 Stage 1.5。其实,Stage 1.5 还真没有放在文件系统中,而是在安装 GRUB 时,直接安装到紧跟 MBR 之后的 32KB 的空间中,这段硬盘空间是空白无用的,而且是没有文件系统的,所以 Stage 1 可以直接读取 Stage 1.5。读取了 Stage 1.5 就能识别不同的文件系统,才能加载 Stage 2。

    Stage 2:加载GRUB的配置文件

    Stage 2 阶段主要就是加载 GRUB 的配置文件 /boot/grub/grub.conf,然后根据配置文件中的定义,加载内核和虚拟文件系统。接下来内核就可以接管启动过程,继续自检与加载硬件模块了

    展开全文
  • 关于嵌入式开发ARM系统的启动引导程序代码
  • 本文详细解析了Linux系统启动引导程序配置文件。
  • Windows和linux启动引导程序

    千次阅读 2018-04-04 17:30:03
    如何卸载Ubuntu,恢复Windows启动引导程序 https://blog.csdn.net/wae42675/article/details/78821910 如何在Ubuntu系统中添加Windows启动引导 https://blog.csdn.net/booboyo/article/details/52955383 如何在...
    1. 如何卸载Ubuntu,恢复Windows启动引导程序
      https://blog.csdn.net/wae42675/article/details/78821910
    2. 如何在Ubuntu系统中添加Windows启动引导
      https://blog.csdn.net/booboyo/article/details/52955383
    3. 如何在centos系统中添加Windows启动引导
      https://blog.csdn.net/qq_33682653/article/details/60872822
    展开全文
  • 免安装启动引导程序Grub,Linux硬盘安装的工具,无需安装,直接解压到windows系统所在的根目录,然后在boot.ini文件中加入一行“c:\grldr="Grub"”,便可引导系统。
  • HJMac.iso 在Vmware上安装Mac OS的启动引导程序 HJMac.iso_更新_2011.8.6
  • BI3硬盘启动引导程序...一步一步来一定能行
  • Bootloader(启动引导程序)--->u-boot

    千次阅读 2020-07-25 11:56:58
    BootloaderBootloader中文解释为:启动引导程序Bootloader的种类归纳:一些常用Bootloader做简单对比:arm系统的启动流程 Bootloader中文解释为:启动引导程序 Bootloader的种类归纳: 分类标准 说明 针对不同...

    Bootloader中文解释为:启动引导程序

    1、Bootloader的种类归纳:

    分类标准说明
    针对不同 CPU架构1、针对X86架构的有LILO、GRUB、ntldr等 2、针对ARM架构的有vivi、armboot等 3、针对PPC架构的有ppcboot等 4、可以支持多种架构的u-boot等
    针对不同 操作系统1、专门用来启动Linux系统的vivi 2、专门用来启动WinCE系统的eboot 3、基于eCos系统的引导程序redboot 4、可以启动多种操作系统的u-boot等

    一些常用Bootloader做简单对比:

    BootloaderMonitor描述X86ARM
    LILOLinux磁盘引导程序
    GRUBGNU的LILO替代程序
    ntldrx86上引导windowsNT系列
    armboot专门为arm架构设计的boot
    ppcboot引导ppc架构操作系统
    vivi韩国Mizi公司针对三星ARM架构CPU设计引导程序
    redboot基于eCos的引导程序
    u-boot通用引导程序,支持多种CPU架构、多种 操作系统

    2、arm系统的启动流程

    以s5p6818开发板为例

    1. 芯片选择启动iROM设备
    2. iROM选择启动下一阶段引导程序所在设备(p95)
    3. iROM启动UBOOT第一阶段BL1
    4. UBOOT第一阶段启动UBOOT第二阶段BL2
    5. UBOOT第二阶段启动内核

    s5p6818支持多种启动方式,但常见的BL0一般 都来至固化在片内的Internal ROM,以SD卡为例:
    在这里插入图片描述

    • 从上图可以看出,我们的user bootcode是从SD卡等外部设备 上加载的,这样iROM就会先找到能够启动的外部设备 SD卡,并从核心板上的EMMC上搬运user bootcode,而 搬运的这段代码就是我们常说的Bootloader。
    • ubootpak.bin主要就是一个包含了2ndboot和 uboot.bin的完整Bootloader。
    • 嵌入式Bootloader的启动过程可以分为以下两种: 单阶段(Single-Stage)、多阶段(Multi-Stage)
    • 通常多阶段的Bootloader能够提供更复杂的功能,及 更好的可读性和移植性。从外部存储设备上启动的 Bootloader大多是两阶段的启动过程,其功能如下:
    阶段功能特点
    第一阶段通常用汇编实现,完成一些依赖于CPU体系结构的初 始化,并调用
    第二阶段代码 第二阶段 通常用C语言实现,完成体系结构之外的功能
    • 以下是s5p6818启动流程:
      和上图一样此图更详细
      在这里插入图片描述

    内核传参过程:

    引导程序(Bootloader)将要传递给系统的信息给内核后就可以释放了,系统启动后就不需要Bootloader了。

    • 传递给内核的参数由多个结构体组成
    • 各结构体放在一段连续的内存空间,起始地址为0x4000_0100(uboot中bi_boot_params成员记录)
    • 每一个结构体代表一条信息,并首尾相连
    • 内核引导起来以后,将从指定内存按照同样的数据结构将数据取出

    参数数据结构及存储结构如下:

    参数数据结构:

    struct tag {
    struct tag_header hdr;
    	union {
    		struct tag_core core;
    		struct tag_mem32 mem;
    		struct tag_videotext videotext;
    		struct tag_ramdisk ramdisk;
    		struct tag_initrd initrd;
    		struct tag_serialnr serialnr;
    		struct tag_revision revision;
    		struct tag_videolfb videolfb;
    		struct tag_cmdline cmdline;
    		struct tag_acorn acorn;
    		struct tag_memclk memclk;
    	} u;
    };
    struct tag_header {
    	u32 size;
    	u32 tag;
    };
    struct tag_mem32 {
    	u32 size;
    	u32 start;
    	/*physical start address*/
    };
    

    参数存储结构:

    在这里插入图片描述

    3、u-boot的介绍

    • u-boot最初是由PPCBoot发展而来的,
    • 目前已成为Armboot和PPCboot的替代品

    特点

    • 主要支持操作系统:Linux、NetBSD、 VxWorks、QNX、RTEMS、ARTOS、LynxOS等
    • 主要支持处理器架构:PowerPC、MIPS、x86、ARM、NIOS、XScale等

    u-boot目前最新版本是:https://gitlab.denx.de/u-boot/u-boot
    u-boot 是不能下载下来直接编译使用的,要经过厂家适配,或者你就是做这种工作的
    我有一个关于u-boot移植的文档 已经上传到csdn 需要的可以下载下来看一下。

    u-boot文件介绍:

    在这里插入图片描述

    • arch: 体系结构相关,按架构进行分类,如当前架构arch\arm\cpu\slsiap,第一阶段启动代码start.S就在这里,官方源码会包含多种架构和cpu,我们裁剪掉了(整个uboot的C语言起始函数board_init_r也在arch\arm\lib\board.c中)
    • board: 开发板相关,根据厂商进行分类,本平台裁剪成board\s5p6818\x6818,有的版本会包含初级初始化内容:lowlevel_init.S
    • common: 各种命令的实现,通常一个命令就是一个C文件
    • include: 各种头文件和开发板配置文件,如include\configs\x6818.h
    • api:用于演示测试用的代码,通常不参与工程编译
    • disk:硬盘接口程序,disk驱动分区处理代码,嵌入式不常用
    • doc:开发使用文档,主要介绍不同平台的配置编译方法
    • drivers: 设备驱动,如:网卡、SD卡、USB等
    • examples:一些独立运行的实例,通常不参与工程编译
    • fs: 所能支持的文件系统,如fat、ubifs等,用于访问带文件系统的存储设备
    • lib: 用于存放库和其他主要支持文件程序,中断处理、启动相关等
    • net: 独立于网卡驱动的网络协议,如于下载传输的TFTP协议,网络文件系统中的NFS协议等
    • post: 上电自检程序,与旧的PPC相关,当前平台下未被编译到工程
    • prototype:参与6818开发的三星协作厂商的一些code在这里
    • scripts用于生成指定的config.mk配置文件,以及一些检查工具
    • tools: 工具软件,如mkimage用于制作内核镜像,scripts用于生成指定的config.mk配置文件,mk6818用于生成6818专用uboot镜像,还有支持GDB的调试工具等

    4、u-boot的编译

    1. 清除编译结果
    make distclean
    
    1. 配置对应平台 如X6818
    make x6818_config
    

    Makefile 会构建编译结构,如:架构、cpu、开发板、厂商、芯片、目录等,为下一步真正编译链接做准备。

    1. 编译
    make
    
    1. 生成ubootpak.bin 在uboot根目录 就可以食用了
    2. 使用方法开袋即食、蒸泡煮炸也可以 :fastboot刷入,通过网络(TFTP+DHCP_Server/tftpd32.exe)也行等等

    编译内核时需要一下操作:

    编译完成uboot在tools下面会生成一个mkimage的工具,请将该工具拷贝到/bin目录下,这样才能使用编译Linux内核时可以生成uboot可以识别的内核镜像
    

    5、u-boot的启动过程

    u-boot阶段入口代码位置为:

    arch/arm/cpu/slsiap/start.S
    arch/arm/lib/board.c
    

    boot为标准的两阶段启动bootloader

    第一阶段为汇编代码(2ndboot),主要为初始化cpu硬件体系结构

    1、禁用看门狗、初始化系统时钟
    2、设置异常向量表(用到中断的情况下设置)
    3、动态内存控制器初始化配置
    4、初始化调试指示灯(可选)
    5、初始化UART,用于开发调试(可选)
    6、从NAND、NOR或SD卡中复制代码到DRAM
    7、跳转并进入Bootloader第二阶段

    第二阶段为c程序代码(u-boot.bin),主要提供多种复杂命令并引导操作系统

    1、汇编阶段核心初始化
    2、初始化GPIO
    3、初始化MMC等存储设备
    4、MMU初始化
    5、各类通信设备相关驱动初始化
    6、环境变量和参数的加载及初始化
    7、倒计时监听串口(进入命令模式或启动内核)
    8、启动内核(拷贝内核镜像并跳转到内核入口)

    在这里插入图片描述

    展开全文
  • AngularJS的启动引导过程

    千次阅读 2016-02-24 09:45:25
    1.引导之前:库阶段 在示例中,我们定义了一个指令ez-duang, 它应该会展开成一个动画 显示出来。AngularJS代码: angular.module("ezstuff",[]) .directive("ezDuang",function(){ return { restrict : "E...

    1.引导之前:库阶段

    在示例中,我们定义了一个指令ez-duang, 它应该会展开成一个动画 显示出来。AngularJS代码:

       angular.module("ezstuff",[])
       .directive("ezDuang",function(){
               return {
                   restrict : "E",
                   template : "<img src='http://ww4.sinaimg.cn/bmiddle/757eb2ffjw1eptcr4qobjg209205dthh.gif'>"
               };
       });

    html代码:

    • 应该在下面看到一幅动画才对!

    但是,看起来没有什么动画显示出来。AngularJS似乎没有工作,为什么?

    有点像操作系统,AngularJs也有一个启动引导的概念。

    当你在HTML文件中引入angular.min.js时,AngularJS只是建立了一个全局的 angular对象,这个对象有一些方法可供开发者调用,但应用的框架还没有建立。

    在这个阶段,AngularJS还只是一个库,和jQuery类似,你可以使用angular.element() 操作DOM,也可以使用angular.injector()创建注入器... 但是,你定义的指令,你 创建的控制器,你封装的服务,你开发的模板...所有这些组件,还静静地躺在那里, 没有被整合在一起。

    我们说,框架还没有运转起来,现在还是库阶段。

    只有通过启动引导,AngularJS框架才开始将那些组件拼接在一起,应用才真正 开始运转。

    像下面这样,试着给html元素增加一个ng-app指令,再重新运行!

     <html ng-app="ezstuff">
        ....
        </html>

    2.自动引导启动框架

    就像你看到的那样,如果HTML模板中有某个标签有ng-app属性,那么当DOM树建立成功后, AngularJS就会自动进入引导过程,启动整个框架:

    111.png

    试着把ng-app指令挪到body元素上,看看有什么不同?

    3.手工引导启动框架

    在大多数情况下,我们都使用ng-app指令来进行自动引导启动,但是如果一个HTML文件中 有多个ng-app,AngularJS只会自动引导启动它找到的第一个ng-app应用,这是需要手工引导 的一个应用场景。

    我们可以利用 angular.bootstrap() 方法进行手动引导:

    angular.bootstrap(element, [modules], [config]);

    bootstrap方法有三个参数:

    element : 一个DOM元素,以这个元素为Angular应用的根,等同自动引导时ng-app所在 的元素。这个参数是必须的。比如:document、document.body等。modules : 引导时需要载入的模块数组。比如:[]、["ezstuff"]等。由于我们的HTML中引用 了ezstuff模块中定义的ez-duang指令,所以,我们需要指定载入ezstuff模块。config :引导配置项,可选。我们先忽略。最终,我们使用如下的形式进行手动引导:

    angular.bootstrap(document,["ezstuff"]);改进的代码已经预置于在线课程。请点击【手动引导】按钮启动引导过程!

    4.引导第1步:创建注入器

    引导过程使AngularJS从库转变成了一个框架。

    回忆我们之前提到,AngularJS深入骨髓地使用着依赖注入,那么,在引导过程 之初,首先需要创建一个注入器就毫不奇怪了。

    注入器是通向AngularJS所有功能的入口,而AngularJS的功能实现,是通过模块的方式组织的。所以, 在创建注入器的时候,需要告诉AngularJS载入哪些模块(ng模块是内置载入的,不需要显式指定)。

    0022.png

    在自动启动引导的场景下,可以给ng-app赋值以指定一个需要载入的模块,比如: ng-app = "ezstuff"

    在手动启动引导的场景下,通过bootstrap方法的第二个参数指定需要载入的模块,比如: angular.bootstrap(document,["ezstuff"]);

    INSIDE:无论自动启动还是手工启动,最终都是调用angular对象上的injector()方法创建了一个 注入器,然后把这个注入器存入了根对象的data里: var injector = angular.injector(["ng","ezstuff"]); angular.element(document).data("$injector",injector);

    我们在在线课程的代码中,开始模拟引导启动过程的第一步:创建注入器。

    5.引导第2步:创建根作用域

    scope对象是AngularJS实现数据绑定的重要服务,所以,在引导启动建立了注入器之后, AngularJS马上在应用的根节点上创建一个根作用域:$rootScope对象。

    0033.png

    如果是自动引导启动,那么ng-app所在的DOM节点对应着根作用域。如果是手工引导启动, 那么在bootstrap方法中指定的第一个参数就对应着根作用域。

    无论哪一种情况,一旦$rootScope对象创建成功,AngularJS就将这个对象存储到根节点 的data中,我们可以使用如下的方法查看这个对象: angular.element(approot).data("$rootScope");

    你可以摆弄一下代码,看看$rootScope到底是什么东西。

    6.引导第3步:编译DOM子树

    引导过程的最后一步,是以ng-app所在DOM节点为根节点,对这棵DOM子树进行编译。

    0044.png

    编译过程通常借助于指令,完成这几种操作:

    1. 对DOM对象进行变换。
    2. 在DOM对象上挂接事件监听。
    3. 在DOM对象对应的scope对象上挂接数据监听。编译过程是AngularJS相当有特点的一个存在,我们将在下一节继续深入。

    现在你应该看到结果了吧?

    7.编译器/$compile

    编译器$compile是一个AngularJS的内置服务,它负责遍历DOM树来查找匹配指令, 并调用指令的实现代码进行处理。

    HTML编译包括3个步骤:

    匹配指令$compile遍历DOM树,如果发现有元素匹配了某个指令,那么这个指令将被加入 该DOM元素的指令列表中。一个DOM元素可能匹配多个指令。

    执行指令的编译函数当一个DOM元素的所有指令都找齐后,编译器根据指令的优先级/priority指令进行排序。 每个指令的compile函数被依次执行。每个compile执行的结果产生一个link函数,这些 link函数合并成一个复合link函数。

    执行生成的链接函数$compile通过执行指令的link函数,将模板和scope链接起来。结果就是一个DOM视图和scope对象模型 之间的动态数据绑定。

    为何将编译和连接两个步骤分开?

    简单说,当数据模型的变化会导致DOM结构变化时,指令就需要分别定义compile()函数和link函数。 例如,ng-repeat指令需要为数据集合中的每个成员复制DOM元素。将编译和链接过程分开可以有效 地提高性能,因为DOM的复制放在compile()里,仅需要执行一次,但链接则发生在每个生成的DOM元素 上,所以指令的link()函数会执行多次。

    指令很少需要compile函数,因为大多数指令考虑的是作用于特定的DOM元素实例,而不是改变DOM 的结构。所以link函数更常用。

    8.指令/directive

    笼统地说,指令是DOM元素(例如属性、元素、CSS类等)上的标记符,用来告诉AngularJS的HTML编译器 ($compile服务)将特定的行为绑定到DOM元素,或者改变DOM元素。

    指令可以放置在元素名、属性、CSS类名称及备注中。下面是一些等效的触发"ng-bind"指令的写法:

     <span ng-bind="exp"></span>
     <span class="ng-bind: exp;"></span>
     <ng-bind></ng-bind>
     <!-- directive: ng-bind exp -->

    指令的实现本质上就是一个类工厂,它返回一个指令定义对象,编译器根据这个指令定义对象进行操作。

    0055.png

    问题是,HTML中的ez-duang,怎么就匹配到了JavaScript中的ezDuang?

    9.指令的规范化

    AngularJS在进行匹配检测之前,首先对HTML元素的标签和属性名转化成规范的驼峰式字符串:

    1. 去除名称前缀的x-和data-
    2. 以: , - 或 _ 为分割符,将字符串切分成单词,除第一个单词外,其余单词首字母大写
    3. 重新拼接各单词例如,下面的写法都等效地匹配ngBind指令:

       <span ng-bind="name"></span> <br>
       <span ng:bind="name"></span> <br>
       <span ng_bind="name"></span> <br>
       <span data-ng-bind="name"></span> <br>
       <span x-ng-bind="name"></span> <br>

    所以,在前面的课程中,我们在HTML中使用的ez-duang指令,将被规范为ezDuang, 编译器使用这个规范化的名称与注册的指令进行匹配。参考资料:http://www.hubwiz.com/course/54f3ba65e564e50cfccbad4b/

    展开全文
  • 启动引导程序:/etc/lilo.conf或/etc/grub.conf LILO 和 GRUB 是两种比较流行的引导加载程序。 LILO(LInux LOader) GNU GRUB(GRand Unified Boot loader) LILO 和 GRUB 区别:
  • 误删Win7启动引导程序造成的错误

    千次阅读 2012-11-15 13:27:47
    今天很傻的把在linux下将Win7的启动引导程序删除了,导致无法正常引导win7和Ubuntu。 解决方法如下: 1)用光盘或者自己做一个U盘启动盘,对win7进行修复。 2)在1)的步骤之后由于重新生成了win7引导程序,因此...
  • linux启动引导程序配置文件

    千次阅读 2007-10-19 09:50:00
    启动引导程序配置文件LILO /etc/lilo.confGRUB /boot/grub/menu.lst系统启动文件核脚本主启动控制文件 /etc/inittabSysV启动脚本的位置 /etc/init.d、/etc/rc.d/init.d或/etc/rc.dSysV启动脚本链接的位置 /etc/init....
  • Linux学习笔记:系统启动引导过程

    千次阅读 2015-08-17 00:43:12
    **BIOS**(Basic Input Output System...其实,它是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、开机后自检程序和系统自启动程序,它可从CMOS中读写系统设置的具体信息。
  • Linux系统启动引导过程和服务控制

    千次阅读 2016-04-19 19:36:03
    刚入门的小伙伴们是不是还在迷惑到底系统从我们按下电源键的那一刻,是如何进行一步一步运行的,知道我们输入用户名和密码进入系统,来操作电脑,今天我们就来写一下开机的启动过程以及相关服务的控制。 一. 系统...
  • 一、CentOS系统启动流程图解二、启动详解1.开机自检 服务器主机开机以后,将根据主板BIOS中的设置对CPU、...2. MBR引导 当从本机硬盘中启动系统时,首先根据硬盘第1个扇区中MBR(Master Boot Record主引导记录)的设...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 224,845
精华内容 89,938
关键字:

启动引导程序