Linux 操作系统启动部分的主要执行流程

本文详细介绍了Linux系统的启动过程,从BIOS自检开始,到GRUB加载,再到内核初始化和启动,包括创建1号进程及执行/sbin/init,以及根据/etc/inittab配置文件进行系统初始化的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 当PC 的电源打开后,80x86 结构的CPU 将自动进入实模式,并从地址0xFFFF0 开始自动执行程序代码,这个地址通常是ROM-BIOS  中的地址。PC 机的BIOS 将执行某些系统的检测,并在物理地址0 处开始初始化中断向量。此后,它将可启动设备的第一个扇区(磁盘引导扇区, 512 字节)读入内存地址0x7C00 处,并跳转到这个地方。启动设备通常是软
驱或是硬盘。这里的叙述是非常简单的,但这已经足够理解内核初始化的工作过程了。
Linux 的最最前面部分是用8086 汇编语言编写的(boot/bootsect.s),它将由BIOS 读入到内存0x7C00处,当它被执行时 就会把自己移到绝对地址0x90000 处,并将启动设备(boot/setup.s)的下2kB 字节的代码读入内存0x90200 处,而内核的其它 部分(system 模块)则被读入到从地址0x10000 开始处,因为当时system 模块的长度不会超过0x80000(即512KB),所以它 不会覆盖在0x90000 处开始的bootsect 和setup
模块。在系统加载期间将显示信息"Loading..."。然后控制权将传递给boot/setup.s 中的代码,这是另一个实模式汇编语言程序。启动 部分识别主机的某些特性以及vga 卡的类型。如果需要,它会要求用户为控制台选择显示模式。然后将整个系统从地址0x10000 移至0x0000  处,进入保护模式并跳转至系统的余下部分(在0x0000 处)。此时所有32 位运行方式的设置启动被完成: IDT、GDT 以及LDT 被加载,处 理器和协处理器也已确认,分页工作也设置好了;最终调用init/main.c 中的main()程序
############################################3#####3
一、Linux的启动流程
1. 从BIOS到KERNEL
  BIOS自检->MBR(GRUB)->KERNEL->KERNEL自解压->内核初始化->内核启动
2. 内核启动:创建1#进程并执行,由它创建若干内核线程(kernel thread),然后装入并执行程序/sbin/init(变成一个用户进程)。此后,init根据/etc/inittab配置文件来执行相应的脚本进 行系统初始化,如设置键盘、字体,装载模块,设置网络等
  对于Redhat来说,执行的顺序为:
  /etc/rc.d/rc.sysinit            # 由init执行的第一脚本
  /etc/rc.d/rc $RUNLEVEL          # init执行指定运行级别($RUNLEVEL为缺省的运行模式)的各脚本;
  /etc/rc.d/rc.local              #运行模式2、3、5时会运行的脚本
  /sbin/mingetty(或getty)        # 等待用户登录
 
  /etc/inittab中指定了系统的运行级别(RUNLEVEL),init根据运行级别启动相关的服务(一些后台进程),实现不同的功能。
  RUNLEVEL值为:0-6
  0:halt, 1:单用户,2:多用户,3:多用户并启动NFS服务
  4:保留,5:运行xdm(X window)以图形界面方式登录
  6:reboot
3、/etc/inittab文件

/etc/inittab的文件内容如下:
  # 设定系统开机预设的RUNLEVEL:
  id:3:initdefault:

  # 开始进行RUNLEVEL的服务启动前,使用来侦测与初始化系统环境的设定文件:
  si::sysinit:/etc/rc.d/rc.sysinit

  # 7 个不同 run level 的,需要启动的服务的 scripts 放置路径:
  l0:0:wait:/etc/rc.d/rc 0
  l1:1:wait:/etc/rc.d/rc 1
  l2:2:wait:/etc/rc.d/rc 2
  l3:3:wait:/etc/rc.d/rc 3
  l4:4:wait:/etc/rc.d/rc 4
  l5:5:wait:/etc/rc.d/rc 5
  l6:6:wait:/etc/rc.d/rc 6

  # 是否允许按下 [ctrl]+[alt]+[del] 就重新开机的设定项目:
  ca::ctrlaltdel:/sbin/shutdown -t3 -r now

  # 本机端终端机启动的个数:
  1:2345:respawn:/sbin/mingetty tty1
  2:2345:respawn:/sbin/mingetty tty2
  3:2345:respawn:/sbin/mingetty tty3
  4:2345:respawn:/sbin/mingetty tty4
  5:2345:respawn:/sbin/mingetty tty5
  6:2345:respawn:/sbin/mingetty tty6

  # 在 X Window (RUNLEVEL 5) 环境下的启动 script 设定项目:
  x:5:once:/etc/X11/prefdm -nodaemon

这个文件的语法是这样的:

  标识符:级别:init 的动作行为:指令项目
1. 标识符:
  最多四个字符,代表 init 的主要工作项目,只是一个简单的代表说明。
2. 级别:
  该项目在哪些 run level 底下进行的意思。如果是 35 则代表 runlevel 3 与 5 都会执行。
3. init 的动作行为:
  主要可以进行的动作项目意义有:
  initdefault    :代表预设的 run level 设定值;
  sysinit    :代表系统初始化的动作项目;
  ctrlaltdel    :代表 [ctrl]+[alt]+[del] 三个按键是否可以重新开机的设定;
  wait        :代表后面接的指令项目必须要执行完毕才能继续后面的动作;
  respawn    :代表后面接的, init 仍会主动的『重新』启动。
  更多的设定项目请参考 man inittab 的说明。
4. 指令项目:
  亦即应该可以进行的指令,通常是一些 script 啰。

说明:如根据上面的文件,init程序执行时根据/etc/inittab文件的内容,完成以下功能
      (1)获取RUNLEVEL(文件中的这一行 id:3:initdefault:)为3
      (2)执行rc.sysinit(文件中的这一行 si::sysinit:/etc/rc.d/rc.sysinit)
      (3)执行/etc/rc.d/rc3.d目录中的脚本(文件中的这一行 l3:3:wait:/etc/rc.d/rc 3,且因为本例RUNLEVEL为3)
      (4)然后设定是否允许按下 [ctrl]+[alt]+[del] 就重新开机(文件中的这一行 ca::ctrlaltdel:/sbin/shutdown -t3 -r now

,当然如果不允许,可把此行注释掉)
      (5)启动六个终端界面tty1-tty6
      (6)最后如果我们使用的是 run level 5 ,那么除了这六个终端机之外, init 还会执行 /etc/X11/prefdm -nodaemon 其主要

的功能就是在启动 X Window 啦!

二、GRUB及其配置
1.GRUB(启动引导器程,低版本的为lilo,其配置文件为:/etc/lilo.conf)简介
  安装Linux后GRUB位于硬盘0柱面,0磁道,1扇区。是计算机启动过程中运行的第一个真正的软件,通常计算机启动时在通过BIOS自

检后读取并运行硬盘的主引导扇中的启动引导器程序,启动引导器再负责加载启动硬盘分区中的操作系统。
2.GRUB的配置文件—grub.conf
  可通过/boot/grub/grub.conf配置GRUB,其文件内容大致如下:

default 0            ----设置GRUB的默认启动项
splashimage (hd0,0)/boot/grub/splash.xpm.gz    ----用于指定某一个文件作为启动菜单的背景图象
timeout 30            ----设置菜单的启动延时

title=Boot Linux using initrd      ----菜单项名称
    root (hd0,0)        ----设置GRUB的根设备(root)为linux内核所在的分区
    kernel /boot/bzImage root=/dev/loop0 init=/initdisk.gz    ----使用kernel命令后跟linux内核文件作为参数,加载

linux的内核文件
    initrd /initdisk.gz      ----使用initrd命令加载镜像文件
title=Windows NT                  ----菜单项名称
    root (hd0,1)        ----设置Windows NT系统所在的分区
    makeactive        ----设置根设备为活动分区(针对windows不能从非活动分区启动)
    chainloader +1        ----使用chainloader命令调用windows分区的启动引导器引导windows系统,+1表示第一个扇区
  3.忘记根口令时的设置
  启动计算机,在显示GRUB菜单时---按e键,进入编辑---选kernel项---按e键---输入空格+single 回车---按b键,重启系统进入单用

户模式,输入以下命令更改口令:
  #passwd root
  #reboot
  4.为grub设置口令
  为防止用户在显示grub菜单时进入编辑,以单用户模式启动更改root用户口令,可给grub设置口令。
  修改/boot/grub/grub.conf文件,加上:password 口令
  (假设密码为123456)
  (1)设置全局口令
  password 123456
  default=1
  timeout=10
  ……
  (2)可使用全局口令锁定启动菜单项
  紧跟在title命令之后添加lock命令
  password 123456
  default=1
  timeout=10
  splashimage=(hd0,7)/grub/splash.xpm.gz
  title Red Hat Linux (2.4.20-8)
  lock           
  root (hd0,7)
  kernel /vmlinuz-2.4.20-8 ro root=LABEL=/
  initrd /initrd-2.4.20-8.img

  (3)设置独立的口令锁定启动菜单项,在菜单项中使用password命令
  可实现全局口令和菜单项口令的分级管理。
  password 123456
  default=1
  timeout=10
  splashimage=(hd0,7)/grub/splash.xpm.gz
  title Red Hat Linux (2.4.20-8)
  password 67890
  root (hd0,7)
  kernel /vmlinuz-2.4.20-8 ro root=LABEL=/
  initrd /initrd-2.4.20-8.img
  (4)可以使用MD5L加密口令
  采用#grub-md5-crypt
  或 #grub
  grub>md5crypt
  Password:
<think>好的,我现在需要帮助用户解决关于Dify循环实现的问题。首先,我需要明确用户的具体需求。他们提到“dify 循环实现”或“dify 如何处理循环”,但Dify本身可能没有直接称为“循环”的功能,所以需要结合现有文档中的信息来推断可能的解决方案。 根据用户提供的引用内容,Dify工作流中有迭代节点[^1]。这可能类似于编程中的循环结构,用于重复执行某个任务。例如,在处理列表数据或需要多次执行同一操作时,迭代节点可以派上用场。我需要详细解释迭代节点的配置和使用步骤,确保用户能够理解如何设置循环次数或遍历数据集。 另外,用户可能对如何处理循环中的错误或性能问题感兴趣。引用[2]提到在Dify中处理PEM文件的问题,这可能涉及在循环中正确处理数据格式,避免错误积累。需要提醒用户在循环中注意错误处理和资源管理,确保每次迭代的稳定性。 引用[3]中的例子展示了如何结合FastAPI和Selenium进行实时监控并生成GIF,这可能涉及循环截取浏览器内容。虽然Dify本身可能不直接控制这类循环,但可以通过外部脚本或定时任务触发工作流,模拟循环执行。这部分需要说明如何将外部循环机制与Dify结合使用。 接下来,我需要组织回答结构。首先介绍迭代节点的基本概念和配置步骤,然后讨论循环中的数据处理和错误处理,最后补充外部触发循环的方法。同时,生成相关问题以帮助用户进一步探索,比如优化循环性能或处理复杂数据结构。 需要确保回答符合格式要求,使用正确的中文表达,行内公式用$...$,独立公式用$$...$$,但当前问题不涉及数学公式,所以可能不需要使用。同时,引用标识要自然地添加到相关段落末尾,如、[^2]、[^3]。 最后,检查是否有遗漏点,比如Dify的其他循环相关功能或用户可能遇到的常见问题,确保回答全面且易于理解。</think>在Dify中处理循环逻辑主要通过**迭代节点**实现,以下是具体实现方式和应用场景的解析: ### 一、Dify循环实现机制 Dify通过**工作流设计器**中的迭代节点处理循环需求,其核心原理类似编程中的`for循环`。迭代节点可遍历以下数据类型: - 数组列表:`["A","B","C"]` - 字典集合:`{"key1":"value1", "key2":"value2"}` - 数值范围:通过`range()`函数生成序列 配置示例: ```python # 模拟迭代节点的数据输入 input_data = { "dataset": [1,2,3,4,5], "process_logic": "item * 2" # 对每个元素执行乘以2的操作 } ``` ### 二、迭代节点的关键配置步骤 1. **数据源绑定**:将数组/字典类型变量连接到迭代节点的输入端口 2. **循环变量命名**:设定当前元素的变量名(默认为`item`) 3. **子流程设计**:在迭代节点内部构建需要重复执行的逻辑模块 4. **结果聚合**:通过`outputs`收集所有迭代结果,支持数组或对象格式 $$ \text{总耗时} = \sum_{i=1}^{n}(单次迭代时间_i) + 系统开销 $$ ### 三、循环中的特殊处理 1. **错误中断控制**: - 启用`continueOnError`参数可跳过失败迭代 - 通过`try-catch`模块包裹敏感操作 2. **并行优化**: ```python # 伪代码示例 Parallel.forEach(dataset, lambda item: process(item)) ``` 3. **结果过滤**: ```python filtered = filter(lambda x: x%2==0, processed_results) ``` ### 四、应用场景案例 1. **批量文件处理**:遍历存储桶中的文件列表进行格式转换 2. **数据清洗**:对数据库查询结果集进行逐条校验 3. **API轮询**:定时循环调用第三方接口直到满足特定条件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值