GRUB 和 vmlinuz 结构, 从 _ 开始到 Linux 的第一个进程
来源:http://www.tudoupe.com时间:2021-11-18
文章目录
- Linux的初始化:GRUB和vmlinuz结构
- 全局流程
- 从BIOS到GURUB 从BIOS到GURUB
- GRUB是怎么开始的?
- 描述 vmlinuz 文件的结构 。
- 重点回顾
- Linux 启动: 从_ 开始到第一个进程
- 解压后内核初始化
- 为何要从_ start 开始?
- 设置结构_标题
- 16 位基本函数
- 启动_ 32 是一个函数 。
- 功能启动_64
- 方法提取内核
- Linux 内核的启动_ 64
- Linux 核心的第一个 C 函数
- 众所周知的启动内核函数
- Linux 第一用户程序
- 重点回顾
Linux的初始化:GRUB和vmlinuz结构
全局流程
在计算机供电后,BIOS将进行自我检查,该区将接受BIOS装载制导装置的指导。 Linux操作系统通常安装在方向部分(视窗安装不同)的GRUB的一小部分。 最后,GRUB将装入Linux vmlinuz的内核图像,如下图所示。
在以上说明中,指挥设备通常是系统中的硬盘,但也可以是U盘、CD-ROM或甚至软盘。 BIOS自动读取CMOS中的指导设备信息。
从BIOS到GURUB 从BIOS到GURUB
正如我们在先前的课程中所看到的那样,CPU仅用于运行记忆中的程序,没有办法直接运行保存在硬盘或U版上的操作系统程序。
如果您希望在U磁盘上操作硬盘驱动器或软件,您必须首先将其装入内存(内存)中。这是因为硬盘和U盘(外部存储装置)没有直接连接到CPU,它们的访问程序和位置与内存有很大差异。
当出现断电时, BIOS 是如何开始的? 在设计 CPU 时, 硬件工程师必须设定 CS 注册值为 0XF00, IP 注册值在增电时设定为 0XFF0 。
此物理地址连接板上的一个小ROM芯片。 和 RAM 一样, 这种芯片存取方法和定位搜索只是它不会在停电时丢失数据, 数据一般无法在这里写入, 它是一个只读存储器, 并且 BIOS 软件被嵌入 ROM 芯片中 。
CS:IP指向 0X#0 这个位置, 这是 BIOS 程序的入口地址, 表明 BIOS 正在正式启动。
BIOS 初始初始初始化 CPU, 然后检查和初始化内存, 然后将一部分内容复制到内存中, 最后跳转到内存执行。 BIOS 的下一个阶段是初始化本地设备, 并进行相关检查以评估硬件是否损坏, 在此期间, BIOS 将要求对其它设备( 如可见卡、 网卡等) 进行固化程序 。
当启动和检查阶段完成时, BIOS 将在 RAM 中安装折叠表和中断服务程序, Linux 需要启动这些程序, 因为它会使用这些程序 。
BIOS将用内存地址(0x00) usatg 1KB 内存空间(0x00x003FF) 构建断开表,在断开表之后立即的位置,在 BIOS 数据区域(0x00400x004FF) 使用 256KB 内存空间,在 0x005b 上将装载与断开表相应的8KB 大小中断服务程序。
断开表格有256个条目,每个条目需要4个字节,其中2个是 CS 登记员值,2个是 IP 登记员值。每个条目链接到一个独立的断开程序。
要在外部存储库启动程序, BIOS 将查找导引设备, 其顺序由 CMOS 设置信息控制( 如我们过去所说, BIOS 中启动设备的顺序 ) 。 一个是软驱动器, 一个是光驱动器, 一个是硬驱动器, 一个可能是网络设备, 甚至是一个带有usb 界面的U盘, 可以用作启动设备 。
当然, Linux 通常从硬盘驱动器开始。硬盘驱动器的第一个区段(每个区段512字节)被称为 MBR(主要启动记录),由简单的 GURUB 发射软件和分区表组成,安装时自动写入此区段,而当 MIOS 将 MBR 装入内存空间时,从 0x7c00 地址开始, BIOS 将控制器传送到 MCR 。
BIOS直到GRUB程序结束
GRUB是怎么开始的?
基于以上所述, BIOS 将仅装入硬盘驱动器上的部门 1 。 然而, 这个部门只有 512 字节, 这 512 字节还包含 分区表 64 字节, 加上 2 字节启动信号, 显然, 446 字节的空间剩下了 446 字节, 与 GRUB 等巨大的共同指南不相容。 因此, GURB 装载被分为多个部分, 而 GURB 则分为多个部分, 与上述部分不同, BIOS 将只 硬盘上 部门 1 。 但是, 这个部门只有 512 字节, 这 512 字节还包含 分区表 64 字节 加上 2 字节启动信号, 显然, 446 字节的空间被留下 与 GRUB 一样巨大的共同指南不相容 。
GRUB安装程序使用其他GRUB模块文件动态, 取决于安装时的环境信息。 对不起,核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心、核心
Ing的第一个部门是磁盘软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体的软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软体软件件。
因为磁盘软盘软盘. Img 文件目前无法识别文件系统, 我们将进入核心 。 所有 Img 文件的位置都记录在文件块列表中, 记录在磁盘软盘软盘软盘文件中. Img 文件. 这就是我们如何确保这样做的适当方法, 磁盘软盘软盘软体. Img 文件. 对不起, Corp.
由于情况如此,核心.Img文件包含足够数量的功能模块,以保证GRUB能够检测硬盘分区文件系统,能够访问/启动/灌木目录,并能够装载适当的配置文件和功能模块进行相关操作,如装载启动菜单、目标操作系统等等。
因为 GRUB2 使用大量的动态装载模块, Ing 文件的大小缩小了。 GRUB 的核心也缩小了。 一旦 Ing 文件开始运作, vmlinuz 内核文件可能会被装入 Linux 系统 。
描述 vmlinuz 文件的结构 。
vmlinuz 文件可以在 / bot 目录中找到 。 是什么原因导致它出现? 它是从 Linux 编译的 bizimage 文件中克隆的, 而您可以通过自己下载它获得最新的 Linux 代码 。
我们一致将 Linux 源压缩为 Linux 目录, 这意味着我们总是开始从 Linux 目录中寻找 Linux 源文件, 并移动到代码目录中, 使 ARCH=x86_64, 然后安装将生成 vmlinuz 文件, 您可以参考随后的 makefile 代码 。
我不知道你们在说什么,安装.sh 文稿文件基本上是复制程序, 因此我们需要做的就是理解比平面文件结构, 这等于了解 vmlinuz 文件结构。 我们要做的就是按照 Makefile 指令创建比平面文件。 语法如下:
根据前代代码,要建立bzimage文件需要三个依附文件:设置。我不知道,bin,vmlinux.bin,linux/arch/x86/boot/tools。
基本上,建设只是HOSTOS程序, 将会被设置起来。 我不知道, bin, vmlinux。 垃圾箱会合并成一个bzimage文件, 如下图所示:
剩下的就是找出答案。 我不知道, bin, vmlinux。 这两个文件的结构, 让我们来看看设置。 Bin 文件, 设置. bin 文件, 设置bin 文件, 由 objcop 命令设置创建的. ilf 生成。 我不知道您在说什么, 坐下。 精灵文件是如何生成的? 让我们看看后面的代码 。
根据此代码, 设置. bin 文件是由 / arch/ x86/boot / 下的匹配源代码文件序列创建的, 头. S 文件及主文件 。 c 特别关键 。 不要担心 。 让我们来看看这个。 如何成长 bin, 构建 vmlinux 。 bin 规则仍然在 linux/ arch/ x86/ bout/ 目录内的 Makefile 文档中, 具体如下 :
此代码表示 vmlinux 。 本文档依赖于 Linux/ arch/ x86/ bot/ 压缩/ 目录下的 vmlinux 目标, 我们将移动到下面的 Linux/ arch/ x86/ bot/ 压缩/ 目录。 打开目录下的 Makefile 并找到以下代码 。
关于这个代码,我们发现 在Linux/arch/x86/bot/压缩目录下面的Vmlinux 是目录o or head_64下的头号32。我不知道你在说什么。 我不知道你在说什么。 我不知道你在说什么。
特别是, vmlinux. lds 是一个链接的脚本文件。 在完成任何编译步骤之前, 前方依赖于列表中任何目标文件的来源( 不包括小猪 ) 。
例如, Head_64.o 互惠源文件头_64.Sstring. o 互惠源文件串。对不起, c.m.sc.o 互惠源文件等待。
但问题是,为什么我们不能发现呢?o 来源文件,比如小猪。 我不知道, c, pig, c, pig, c, pig, c, pig, c, c, pig, pig, c, c, pig, c, c, pig, c, c, c, pig, c, pig, c, pig, pig, pig, c, pig, pig, pig, pig.
我们开放了,老猪。 哦,通过小猪。S编译代码生成, 和小猪。S是动态地由Mkpiggy(HIST OS下的应用软件)在建造Linux内核时建造的, 这就是为什么我们无法发现它。
对不起,小猪。 First S Reliance File vmlinux. 我不知道你在说什么, bin.$(后缀-y) 表示与内核压缩类型的后缀匹配的后缀。
从先前的材料中可以看出, Linux 内核可能会被压缩成多种形式。 我们仍不知道文件夹文件的来源, 但我们可以看到, Makefile 文件中的以下代码存在于 Linux/arch/x86/boot/ 压缩目录中 。
因此, arc/x86/boot/ compressed vmlinux.bin 是由一个通过 vmlinux 目标的 objopy 工具创建的, 而 vmlinux 目标缺少前缀和依附目标, 表明它是顶层目录中的一个 vmlinux 文件 。
当我们继续调查时, objopy 工具只是删除了 vmlinux 文件 " 。 备注段落以及符号表和迁移表(如参数-S给出的)仍然在 vmlinux 文件的 ELF 格式中, 如果不需要 ELF 格式的内核, 这里可以插入 " O二进制 " 选项。
现在,让我们来澄清一下Vmlinux文件是如何构建的。
事实上, vmlinux 文件是通过编集完整的 Linux 内核源文件而形成的, Linux 的代码在多个代码目录下分发, 那里有一个目录, Linux 的 kbuilding 系统被翻译成每个目录, Makefile 选择要编译的文件 。
当某个特定文档被编译时, 将在目录下创建一个链接, 链接到已经在目录下编译的文件 。 ° 文件将被添加到顶层目录 。 ° 文件将被连接到一起 。
层目录然后返回到顶端目录, 所有内建的. o 文件链接生成 vmlinux 文件, 并转换成 vmlinux. bin 文档。 尽管如此, vmlinux. bin 文件仍然是 ELF 文件 。
最后, 工具软件将压缩为 vmlinux 。 我不清楚您用 bin. gz 文件是什么意思; 我们在此压缩 gzip 模式 。
返回到 mkpigy 命令, mkpigy 是一个工具程序, 用于内核自载、 将输出转向文件, 以及创建 pigpigy. S 编译文件, 其源代码如下:
这只小猪非常简单,使用编译指令 Incbin会压缩Vmlinux。 我不知道你在说什么, bin.gz 内核图像文件,pig. 它也定义为理解压力Vmlinux。我不知道你在说什么,bin.gz内核图像文件,pig.
这个信息和Vmlinux。我不知道你是什么意思, bin.gz 文件, 它们是一起创建的。 易用, 然后小猪。 Documentation and ( v m l i n u x − o b j s − y ) (vmlinux-objs-y) ( v m l i n u x − o b j s − y ) (efi-obj-y)中的目标文件已链接,导致 Linux/arch/x86/boot/压缩目录中的 vmlinux 。
要理解 Linux 启动程序, 您必须首先掌握其 vmlinuz 的文件结构 。 这些基础允许您同时学习 。
重点回顾
我们检查了GRUB启动过程,BIOS装载了GRUB的第一部分,其中装满了GRUB的剩余部分。最终,我们完全掌握了Linux内核启动文件Vmlinuz的结构及其形成程序。
Linux 启动: 从_ 开始到第一个进程
解压后内核初始化
接下来,我们将从设置开始。 将条目_ 开始插入到文件夹文件, 以了解启动信息结构, 然后将 CPU 从 16 位主函数切换到受保护模式, 并输入 vmlinux。 启动_ 32 函数在文件夹文件中被重新装入 。
如果是 64 位的系统,就要进入 startup_64 函数,切换到 CPU 到长模式,最后调用 方法提取内核解压 Linux 内核,并进入内核的 startup_64 函数,由此 Linux 内核开始运行。
为何要从_ start 开始?
我们研究了上一个类中的 vmlinuz 文件结构, 发现了 vmlinux 。 如何制作 bin 是 Linux/ arch/ x86/ bout/ 压缩目录中的目标文件, 而 pigle. S 包含一个 vmlinux. I don't know what you're talking about, bin. 压缩的 gz 文件是一起生成的 。
我不确定,Vmlinux,vmlinux,vmlinux,vmlinux,vmlinux,vmlinux,vmlinux,vmlinux,vmlinux,vmlinux,vmlinux,vmlinux,vmlinux,vmlinux.我不知道你在说什么,bin.gz文件是一个由开发的Linux内核创建的精灵格式的Vmlinux文件。
CPU 无法识别压缩文件中命令的直接操作, 必须首先以 elf 格式解压缩文件, 然后将命令和数据段装入指定的内存区域, 然后再由 CPU 执行 。 这是设置前必须使用的 。 Bin 文件, _ startupup. bin 文件项, 头部. S 在文档中描述如下 。
设置结构_标题
下面我们重点研究一下 设置结构_标题,这对我们后面的流程很关键。它定义linux/arch/x86/include/uapi/asm/bootparam.h 文件中,如下所示。
如前所述,硬盘驱动器上的MBR是由 GRUB Boot. Img 创建的, 所以这里是 Linux/ arch/ x86/boot/ head. S 中的启动区块对硬盘启动毫无意义 。 GRUB 将设置 vmlinuz.bin 部分扫描存储地址 0x900, 然后跳到 0x90200 开始, 简单地跳过前 512 byte BootSector, 从_ start 开始 。
16 位基本函数
我们通常使用 C 编译器生成的代码为 32 位保护模式或 64 位长模式, 但很少被转换为 16 位实际模式, 实际设置 。 b 代码一般为 16 位实际模式 。 我们可以看到 linux/ arch/ x86/boot/head. S 调用 linux/ arch/x86/boot/main 的主要函数 。
上述功能在与 Linux/arch/x86/bout/目录对应的文档中,所有这些功能都被 BIOS 阻止, 您可以为自己查看细节。 我在此列出的代码只是为了帮助您清理进程。 我们回到 Linux/ arch/x86/boot/ pm.c/ 的函数。 代码如下 。
保护_mode_jump 是 Linux/arch/x86/boot/pmjump.S 文件中的一个编译函数。 代码逻辑与我们早先学到的受保护模型相同。 处理参数的逻辑性非常之大, 也就是跳跃到 boot_ params. 对不起, hdr. 代码 32_ start 中的地址。 这个地址在 linux/ arch/x86/ bout/head.
应该观察的是,GRUB将从 vmlinuz.bin 组件中抓取 vmlinuz, 从 1MB 开始的记忆空间中抓取 vmlinuz 。 通过这个跳跃, 我们正式进入 vmlinux. bin 。
启动_ 32 是一个函数 。
在计算 vmlinux 之前, 启动_ 32 必须重新装入 。 内核将重置, 以查看 CPU 是否支持长模式, 然后计算 vmlinux. Bin 装入地址, 以确定 vmlinux 。 I'm not sure you're talking about, bin. gz uncompressed 地址 。
如果 CPU 支持长模式, 将建立一个全球 64 位配置文件, 以启用 CPU 的 PAE 物理地址扩展功能。 最后, 以下代码打开断端, 进入长模式, 跳转到启动_ 64 。
功能启动_64
今天, 我们终于开始使用 CPU 长模式, 从64 启动开始, 正式进入 64 位元时代 。 启动64 函数, 如 S 文件所描述的, 在长模式下初始化数据段内存, 找到最后未压缩的地址, 然后将压缩的 vmlinux. bin 复制到地址, 转到解压缩内核地址, 并开始解压缩 vmlinux 。
上述代码中最后到了 方法提取内核,它就是解压内核的函数,下面我们就来研究它。
方法提取内核
从 startup_32 函数到 startup_64 函数,其间经过了保护模式、长模式,最终到达了 方法提取内核,方法提取内核根据 piggy.o 中的信息从 vmlinux.bin.gz 中解压出 vmlinux。
根据前面的知识点,我们知道 vmlinux 正是编译出 Linux 内核 elf 格式的文件,只不过它被去掉了符号信息。所以,方法提取内核不仅仅是解压,还需要解析 elf 格式。方法提取内核是在 linux/arch/x86/boot/compressed/misc.c 文件中定义的。
正如上面代码所示,方法提取内核调用decompress 函数,对 vmlinux.bin.gz 使用特定的解压算法进行解压。解压算法是编译内核的配置选项决定的。
尽管如此,减压函数显示 vmlinux 文件为精灵格式, 因此, 剖析elf 函数被用于进一步理解精灵格式, 根据精灵的信息和要求, 将 vmlinux 中的命令、 数据和 BSS 段落返回到命令段的条目地址 。
请你注意,在 Lrelocated 函数的最后一条指令:jmp *rax,其中的 rax 中就是保存的 方法提取内核返回的入口点,就是从这里开始进入了 Linux 内核。
Linux 内核的启动_ 64
启动_ 64 函数目前不参与先前的链接工作。 启动_ 64 函数定义在 Linux/ arch/ x86/ 内核/ head_ 64. S 文件中, 这是内核的入口函数, 如下文所示 。
上述代码已从与程序有关的代码中删除,对于SMP系统,公共汽车仲裁机制选取一个称为BSP的多个CPU,或第一个CPU,导致BSP CPU先开始,另一个CPU等BSP CPU醒来。
以下是我要告诉你们的:对于第一个启动 CPU 的 CPU, 第二个_ startup_ 64 函数将被旋转为 1 的标记, 对于其他已觉醒的 CPU, 第二个_ startup_ 64 函数将被直接运行。 接下来, 我会给您一个第二个_ startup_ 64 函数的简短通行证, 我忽略了其他 CPU 属性( 设置 GDT、 IDT、 处理 MMU 标签等等 ) 。 因为, 如下文所示, 我们已熟悉这些职责 。
当所有功能都为第二个_ startup_64 函数准备就绪时, x86_64_start_内核函数将被调用测试,如果它的名字看起来是内核的启动功能,但这是真的吗?
Linux 核心的第一个 C 函数
若不是经历了前面的分析讲解。要是我问你 Linux 核心的第一个 C 函数是什么,你可能无从说起,就算一通百度之后,仍然无法确定。但是,只要我们跟着代码的执行流程,就会发现在 secondary_startup_64 函数的最后,调用的 x86_64_start_kernel 函数是用 C 语言写的,那么它一定就是 Linux 核心的第一个 C 函数。它在 linux/arch/x86/kernel/head64.c 文件中被定义,这个文件名你甚至都能猜出来,如下所示。
在 Linux 中, x86_ 64_ start_ 内核函数管理管理页面表格, 该页面表格管理着内核虚拟地址空间。 Linux 虚拟地址空间逐渐建立。 x86_ 64_ start_ 内核功能随后复制了指导信息, 即 struct Boot_ params 结构。 最终, x86_ 64_ start_ 内核功能被使用, 该功能处理平台可靠性的关键部分, 即著名的启动内核功能 。
众所周知的启动内核函数
启动内核功能是众所周知的,因为Linux内核的名称所反映的其位置和作用在互联网和关键的Linux书籍中得到了广泛宣传。这是内核的开始。
问题就在这里:我们走到了这么远,发现在启动内核功能之前有很多代码, 这不是内核的开始。 当然,这是内核的开始, 内核的开始, 前面。 事实上, 启动内核功能, 在 / linux/ init/ main. c 文档中指定, 需要大量的启动程序来启动 Linux 内核功能 。
如果启动内核函数不简化, 启动内核函数有200多行, 全部都是初始化常规, 我留下几个重要的初始化功能, 这些功能的细节我们不需要担心。 可以看到, 启动内核函数要求Linux内核所有功能的初始化功能, 这就是为什么它如此出名和重要 。
启动内核功能一经完成, Linux 内核就有可能为应用程序提供各种功能服务。 为了我们的目的,我们将只关注 aarch_call_rest_init 函数。 如下文所示。
此方法非常基本; 它是一个仅仅直接调用 resep_ init 函数的容器函数。 剩余_ init 函数的基本功能是生成两个 Linux 内核线条非常简单; 它只是直接调用 resep_ init 函数的容器函数。 其余_ init 函数的基本功能是创建两个 Linux 内核线条。 让我们查看一个简化的休息- init 函数 :
Linux 内核线可以执行内核函数, 但它也有它自己的线条上下文, 由 Linux 进程调度器安排。 内核_ init 函数被 Kenel_ init 线调用 。
Linux 第一用户程序
代表 Linux 内核的第一个过程已经接近完成, 当我们能够建立第一个用户过程。 在“ 长途航行” 之后, 我们到达了 。 Linux 内核的第一个用户状态过程是由 Kenel_ init 线生成的, 由 kenel_ init 函数执行 。
除上述代码外,Ramdisk_execute_command and execute_command是可在 GRUB 启动选项中更改的内核启动参数。
例如,通常铅内核到内核的参数是 Init=xx, 而对于内核的参数是 init=xx。 但是,通常我们不发送参数, 所以这个函数运行上面列出的代码的15行, 因此这个函数运行上面列出的代码的15行, 试图用/sbin/ init, /etc/ init, /bin/ init, /bin/ sh, 只要其中之一能成功, 通常铅内核到内核的参数是 init=xx, 而对于它们通过 rdinit=xx。 但是, 我们通常不发送参数, 所以这个函数执行上面列出的15行代码, 反过来尝试用/sbin/ init, /etc/ init, /bin/ init, /bin/ shs, 只要其中之一能成功, 来构建执行可执行的流程。
Linux内核目前已经形成其第一个进程,Linux内核的启动程序已经结束。
重点回顾
1.GRUB 加载 vmlinuz 文件之后,会把控制权交给 vmlinuz 文件 的 setup.bin 的部分中 _start,它会设置好栈,清空 bss,设 置 好 设置结构_标题,调用 16 位 main 切换到保护模 式,最后跳转到 1MB 处的 vmlinux.bin 文件中。
从 vmlinux.bin 文件中 startup32、startup64 函数开始建立新的全局段描述符表和 MMU 页表,切换到长模式下解压 vmlinux.bin.gz。释放出 vmlinux 文件之后,由解析 elf 格式的函数进行解析,释放 vmlinux 中的代码段和数据段到指定的内存。然后调用其中的 startup_64 函数,在这个函数的最后调用 Linux 核心的第一个 C 函数。
Linux 内核第一个 C 函数重新设置 MMU 页表,随后便调用了最众所周知的启动内核函数, start_kernel 函数中调用了大多数 Linux 内核功能性初始化函数,在最后调用 rest_init 函数建立了两个内核线程,在其中的 kernel_init 线程建立了第一个用户态进程。

下一篇:LG电脑如何改变靴子驱动器?
相关新闻
- 2023-05-07 小白u盘启动盘软件下载(u盘启动盘
- 2023-05-07 u盘启动盘里的iso文件需要解压(is
- 2023-05-07 k555lu盘启动盘(u盘启动盘怎么进入
- 2023-05-07 u盘启动盘cmos(U盘启动盘装系统)
- 2023-05-07 电脑pe制作u盘启动盘(微pe制作u盘启
- 2023-05-07 u盘启动盘改ntfs格式化吗(u盘格式化
- 2023-05-07 深度装机大师恢复u盘启动盘(深度装
- 2023-05-07 win7系统制作到u盘启动盘(如何制作
- 2023-05-06 u盘启动盘制作工具efi(U盘启动盘制
- 2023-05-06 u盘启动盘修复win7系统(如何用u盘启
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
