从BIOS到Loader:手把手教你构建操作系统启动流程

深入解析BIOS启动流程:从BDS到OS Loader的关键阶段剖析 本文深入解析了BIOS/UEFI启动流程中的BDS阶段,详细阐述了其初始化控制台、加载驱动、枚举并生成启动菜单的核心任务。文章进一步剖析了从BDS移交控制权后,系统经历的TSL、RT、AL等关键过渡阶段,完整揭示了从固件到操作系统加载的完整链条与内部机制。 阅读详情

1. 计算机启动流程全景解析

当你按下电脑开机键的那一刻,一场精密的接力赛就在硬件层面悄然展开。这个过程就像一场精心编排的芭蕾舞,每个组件都知道自己该在什么时间点登场。作为开发者,理解这个过程不仅能满足好奇心,更能帮助你在系统出现启动问题时快速定位症结所在。

计算机启动流程的核心参与者有三个:BIOS、MBR和Loader。BIOS是固件层面的初始化程序,存储在主板的一个特殊芯片中;MBR是硬盘第一个扇区的512字节特殊区域;Loader则是真正负责加载操作系统的程序。他们各司其职,完成从硬件上电到操作系统加载的全过程。

现代计算机虽然普遍采用UEFI和GPT分区方案,但传统的BIOS-MBR启动方式仍然是理解计算机启动原理的基础。而且很多嵌入式系统和特殊场景中,这种启动方式依然被广泛使用。接下来,我将带你深入每个环节,并用实际代码演示如何自己实现这些组件。

2. BIOS:启动流程的第一棒

BIOS的全称是Basic Input/Output System,它是存储在主板ROM芯片中的一段固件程序。当你按下电源按钮,CPU会从特定地址0xFFFF0开始执行第一条指令,这个位置正好是BIOS程序的入口点。

BIOS的工作流程可以分为几个关键阶段:首先是硬件自检(POST),检查CPU、内存、显卡等关键组件是否正常工作;然后是初始化硬件,建立中断向量表;最后是扫描可启动设备,寻找有效的MBR。

; BIOS执行的基本流程
jmp far f000:e05b      ; 跳转到BIOS主程序
call hardware_test     ; 硬件自检
call init_interrupts   ; 初始化中断向量表
call find_boot_device ; 查找可启动设备

在实际开发中,我们可以使用Bochs这样的模拟器来观察BIOS的行为。Bochs提供了一个完整的x86硬件环境,让我们能够单步调试启动过程。

提示:现代计算机中,传统BIOS正在被UEFI取代,但基本原理相通。UEFI提供了更强大的功能和更好的安全性,但启动流程的核心思想没有改变。

3. MBR:512字节的引导艺术

MBR(Master Boot Record)位于硬盘的第一个扇区,只有512字节大小。这有限的空间内要容纳引导代码、分区表和结束标志。BIOS在完成初始化后,会检查每个存储设备的第一个扇区,寻找最后两个字节为0x55和0xAA的扇区,这就是MBR的魔法数字。

MBR的主要职责是找到并加载下一个阶段的引导程序——Loader。由于512字节的限制,MBR本身做不了太多事情,它更像是一个引路人,指引系统找到真正的引导程序。

让我们看一个实际的MBR汇编代码示例:

SECTION MBR vstart=0x7c00
    mov ax, cs
    mov ds, ax
    mov es, ax
    mov ss, ax
    mov fs, ax
    mov sp, 0x7c00
    
    ; 清屏操作
    mov ax, 0x600
    mov bx, 0x700
    mov cx, 0
    mov dx, 0x184f
    int 0x10
    
    ; 设置光标位置
    mov dh, 0
    mov dl, 0
    mov bh, 0
    int 0x10
    
    ; 显示加载信息
    mov ax, message
    mov bp, ax
    mov cx, 16
    mov ax, 0x1301
    mov bx, 0x2
    int 0x10
    
    jmp $
    
message db "Loading System..."
times 510-($-$$) db 0
db 0x55, 0xaa

这段代码演示了一个最简单的MBR,它只是在屏幕上显示"Loading System..."然后进入循环。在实际系统中,MBR需要读取分区表,找到活动分区,然后加载该分区的第一个扇区(通常是Loader)。

4. 硬盘读取:端口操作详解

在实模式下,我们无法使用高级的文件系统API,只能通过硬盘控制器端口直接操作硬盘。这个过程就像与硬盘控制器进行一场古老的对话,每个端口都有特定的含义。

硬盘读取的基本步骤是:设置要读取的扇区数→指定LBA地址→发送读取命令→等待硬盘准备就绪→从数据端口读取数据。下面是具体的实现:

rd_disk_m_16:
    ; 输入参数:eax=LBA扇区号,ebx=目标内存地址,ecx=读取扇区数
    mov esi, eax      ; 备份eax
    mov di, cx        ; 备份cx
    
    ; 设置读取扇区数
    mov dx, 0x1f2
    mov al, cl
    out dx, al
    
    ; 设置LBA地址
    mov eax, esi
    mov dx, 0x1f3
    out dx, al
    
    mov cl, 8
    shr eax, cl
    mov dx, 0x1f4
    out dx, al
    
    shr eax, cl
    mov dx, 0x1f5
    out dx, al
    
    shr eax, cl
    and al, 0x0f
    or al, 0xe0
    mov dx, 0x1f6
    out dx, al
    
    ; 发送读取命令
    mov dx, 0x1f7
    mov al, 0x20
    out dx, al
    
.not_ready:
    nop
    in al, dx
    and al, 0x88
    cmp al, 0x08
    jnz .not_ready
    
    ; 读取数据
    mov ax, di
    mov dx, 256
    mul dx
    mov cx, ax
    mov dx, 0x1f0
    
.go_on_read:
    in ax, dx
    mov [bx], ax
    add bx, 2
    loop .go_on_read
    ret

这段代码展示了如何通过端口操作读取硬盘数据。每个out指令都在向特定的端口发送命令,而in指令则从端口读取状态或数据。这种底层操作虽然繁琐,但让我们完全掌控了硬件行为。

5. Loader:迈向保护模式的关键一步

Loader是启动流程中的关键过渡阶段。它没有MBR的512字节限制,可以完成更复杂的任务,最重要的是为进入保护模式做好准备。保护模式是现代操作系统运行的基础,它提供了内存保护、虚拟内存等关键特性。

Loader的主要任务包括:启用A20地址线、加载全局描述符表(GDT)、设置控制寄存器切换到保护模式。让我们一步步来看:

; 启用A20地址线
in al, 0x92
or al, 00000010b
out 0x92, al

; 加载GDT
lgdt [gdt_ptr]

; 切换到保护模式
mov eax, cr0
or eax, 0x00000001
mov cr0, eax

; 跳转到保护模式代码
jmp dword SELECTOR_CODE:p_mode_start

; GDT定义
gdt:
    dd 0, 0
    dd 0x0000ffff, 0x00cf9a00
    dd 0x0000ffff, 0x00cf9200
gdt_ptr:
    dw $ - gdt - 1
    dd gdt

A20地址线的历史可以追溯到早期的IBM PC,为了兼容性,默认是关闭的,我们需要手动启用才能访问1MB以上的内存。GDT定义了内存段的属性和权限,是保护模式的基石。

切换到保护模式后,我们需要重新设置段寄存器,使用新的选择子:

p_mode_start:
    mov ax, SELECTOR_DATA
    mov ds, ax
    mov es, ax
    mov fs, ax
    mov gs, ax
    mov ss, ax
    mov esp, 0x7c00

现在系统已经运行在保护模式下,可以访问4GB的内存空间,为加载操作系统内核做好了准备。

6. 现代Linux的GRUB实现对比

虽然我们自己实现的Loader很教育意义,但现代Linux系统使用更多的是GRUB(GRand Unified Bootloader)。GRUB是一个功能强大的引导加载程序,相比我们简单的Loader,它有以下优势:

GRUB支持多种文件系统,可以直接读取内核镜像文件,而不需要像我们的Loader那样直接操作硬盘扇区。它提供了交互式的菜单界面,允许用户选择不同的操作系统或启动选项。还支持模块化设计,可以通过模块扩展功能。

GRUB的工作流程分为多个阶段:stage1(相当于MBR)、stage1.5(文件系统驱动)、stage2(主引导程序)。这种分阶段的设计使得GRUB既保持了兼容性,又提供了强大的功能。

如果你使用的是Linux系统,可以查看/boot/grub目录下的配置文件:

# 查看GRUB配置文件
cat /boot/grub/grub.cfg

# 查看磁盘的MBR内容
sudo dd if=/dev/sda bs=512 count=1 | hexdump -C

GRUB的配置通常包括菜单项定义、内核参数设置等内容。通过分析这些配置,可以更好地理解现代引导加载程序的工作方式。

7. 实战开发与调试技巧

现在让我们进入实战环节。要开发自己的操作系统启动流程,你需要准备以下工具:NASM汇编器、Bochs模拟器、磁盘映像工具。我推荐在Linux环境下进行开发,因为工具链更加完善。

首先创建基本的项目结构:

mkdir myos
cd myos
mkdir src build iso

编写Makefile来自动化构建过程:

ASM = nasm
ASMFLAGS = -f bin
SOURCES = src/mbr.asm src/loader.asm
TARGETS = build/mbr.bin build/loader.bin
IMAGE = build/system.img

all: $(TARGETS) $(IMAGE)

build/mbr.bin: src/mbr.asm
    $(ASM) $(ASMFLAGS) $< -o $@

build/loader.bin: src/loader.asm
    $(ASM) $(ASMFLAGS) $< -o $@

$(IMAGE): build/mbr.bin build/loader.bin
    dd if=/dev/zero of=$@ bs=512 count=2880
    dd if=build/mbr.bin of=$@ conv=notrunc
    dd if=build/loader.bin of=$@ seek=1 conv=notrunc

clean:
    rm -f $(TARGETS) $(IMAGE)

.PHONY: all clean

使用Bochs进行调试是开发过程中最重要的环节之一。Bochs提供了强大的调试功能:

# 启动Bochs调试器
bochs -q -f bochsrc.txt

# 在Bochs调试器中的常用命令
vb 0x7c00          # 在MBR入口设置断点
c                  # 继续执行
n                  # 单步执行
r                  # 显示寄存器状态
x /10i 0x7c00      # 反汇编指定地址的代码
info gdt           # 显示GDT内容

调试MBR和Loader时,最重要的是关注寄存器状态和内存内容。特别是在模式切换时,要确保所有段寄存器都正确设置。

常见的坑包括:忘记启用A20地址线导致无法访问1MB以上内存、GDT设置错误导致保护模式异常、堆栈指针设置不当导致程序崩溃。通过仔细的调试和Bochs的帮助,这些问题都可以解决。

8. 从实模式到保护模式的完整示例

让我们来看一个完整的Loader示例,它演示了从实模式到保护模式的完整转换过程:

org 0x8000

start:
    ; 初始化段寄存器
    mov ax, cs
    mov ds, ax
    mov es, ax
    mov ss, ax
    mov sp, 0x7c00

    ; 清屏
    mov ax, 0x0600
    mov bx, 0x0700
    mov cx, 0
    mov dx, 0x184f
    int 0x10

    ; 显示加载信息
    mov si, msg_loading
    call print_string

    ; 启用A20
    call enable_a20

    ; 加载GDT
    lgdt [gdt_descriptor]

    ; 进入保护模式
    mov eax, cr0
    or eax, 0x1
    mov cr0, eax

    ; 跳转到保护模式代码
    jmp CODE_SEG:init_pm

enable_a20:
    in al, 0x92
    or al, 2
    out 0x92, al
    ret

print_string:
    mov ah, 0x0e
.next_char:
    lodsb
    cmp al, 0
    je .done
    int 0x10
    jmp .next_char
.done:
    ret

[bits 32]
init_pm:
    mov ax, DATA_SEG
    mov ds, ax
    mov es, ax
    mov fs, ax
    mov gs, ax
    mov ss, ax
    mov ebp, 0x90000
    mov esp, ebp

    ; 现在处于保护模式
    mov esi, msg_pm
    call print_string_pm

    jmp $

print_string_pm:
    mov edi, 0xb8000
    mov ah, 0x0f
.loop:
    lodsb
    stosw
    cmp al, 0
    jne .loop
    ret

; 数据定义
msg_loading db "Loading system...", 0
msg_pm db "Protected mode enabled!", 0

; GDT定义
gdt_start:
gdt_null:
    dd 0x0
    dd 0x0
gdt_code:
    dw 0xffff
    dw 0x0
    db 0x0
    db 10011010b
    db 11001111b
    db 0x0
gdt_data:
    dw 0xffff
    dw 0x0
    db 0x0
    db 10010010b
    db 11001111b
    db 0x0
gdt_end:

gdt_descriptor:
    dw gdt_end - gdt_start - 1
    dd gdt_start

CODE_SEG equ gdt_code - gdt_start
DATA_SEG equ gdt_data - gdt_start

这个示例展示了Loader的完整功能:初始化环境、启用A20、加载GDT、切换到保护模式,并在保护模式下显示信息。每个步骤都有详细注释,方便理解。

在实际项目中,你还需要添加错误处理、内存检测等功能。这个示例提供了一个坚实的基础,你可以在此基础上继续扩展,构建更完整的引导加载程序。

开发自己的操作系统启动流程是一次极具教育意义的经历。虽然现代系统使用了更复杂的引导方式,但理解这些基础知识仍然非常重要。它们不仅帮助你理解计算机如何启动,还能在系统出现问题时提供排查思路。

操作系统启动背后的故事:BIOS、BootLoader和CPU控制权移交 以X86架构为例,BIOS的内存空间地址为CS:IP=0xf000:fff0,其中CS代表段寄存器,IP代表指令寄存器。通常位于硬盘的第一个主引导扇区。BIOS的任务就是在硬盘的这个特定位置找到BootLoader,并将其加载到内存中。在X86架构中,BootLoader通常被加载到内存的0x7C00位置,占据512字节的空间。每个阶段完成后,都需要将CPU控制权移交给下一阶段,以确保整个启动过程的顺利进行。随着UEFI(统一可扩展固件接口)的普及,传统的BIOS正在被逐渐替代,启动过程也有所变化。 阅读详情

相关推荐

16.启动流程、模块管理与Loader

一、 Linux的启动流程分析1. 启动流程:1. 加载 BIOS 的硬件资讯与进行自我测试,并依据配置取得第一个可启动的装置;2. 读取并运行第一个启动装置内 MBR 的 boot Loader (亦即是 grub, spfdisk 等程序);3. 依据 boot loader 的配置加载 Kernel ,Kernel 会开始侦测硬件与加载驱动程序;4. 在硬件驱动成功后,Kernel 会主动呼...

小茗同学IT的博客 508

小型互联网业务环境的搭建(非云平台)

现在越来越多企业已经搭建自己的网站,或者已经部署了互联网业务。随着云环境大火,更多人业务已经部署上云,但是某些场景仍需要在内部部署一套业务环境并提供外网服务。本文简单描述了一个非云平台互联网业务环境的搭建,环境规模较小(普通业务,非流服务),规划对外提供http、https服务。 拓扑图如下,搭建环境用到的设备有防火墙(图中Firewall)、交换机(图中switch)、内部服务器。ISP接口设备在图中没画出,不同运营商(电信、移动、联通、广电)不同业务类型提供的设备各有差异。 下面从内部主机.

kitgenius的博客 1051

计算机启动流程分析--以JOS为例(从BIOS到刚进入boot loader)

    最近的OS课程(借鉴自MIT6.828)学习了PC boot的过程,自己也动手完成了6.828的lab1,对启动流程有了一定认识。    环境:jos,QEMU为lab的实验环境。    CPU加电后,先进入预先写好的BIOS程序执行,首先执行:[f000:fff0] 0xffff0: ljmp $0xf000,$0xe05b    f000:fff0是这条语句的地址,必须注意:BIO...

old_memory的博客 1056

简单小型局域网搭建

工具:路由器,交换机,宽带 对象:小型公司或对网络结构要求不高的单位 拓扑: 内网网段:192.168.1.0/24 运营商地址:1.1.1.1/30 配置: 出口路由器route 1,配置公网地址(wan) [route-GigabitEthernet0/0/1]ip address 1.1.1.1 30 与运营商互联的接口配置地址(运营商提供的公网地址) 2,配置内网地址(lan) [route-GigabitEthernet0/0/1]ip address 192.168.1.

weixin_51685970的博客 1万+

搭建小型网络

搭建一个小型的网络,这个网络中不同的VLAN(虚拟局域网)之间进行通讯 路由器运行的是RIP协议,其中一个路由器的一个子接口虚拟成三个子接口,对应三个不同的VLAN,各网段的客户端IP动态获取,

双足肌肉骨骼机器人

Clone Alpha的技术突破标志着人类进入生物-机械融合的新纪元,但其影响远超技术范畴。从伦理框架重建(如拉马克进化算法中的知识传递机制)到经济模式革新(如UBI应对机器人失业潮),需全球协作制定前瞻性政策。若放任技术无序扩张,人类社会或将面临“能力断层”与“控制权丧失”的双重危机;反之,若以人类福祉为核心导向,仿生机器人亦可成为弥合残障歧视、提升整体文明层级的钥匙。当下选择,将决定人类究竟是技术的创造者,还是被重构的客体。

百态·数智思维 | 聚焦大数据、量化与未来AI 988

企业网络-小型企业网络搭建

企业网络-小型企业网络搭建

weixin_52439435的博客 6821

告别概念晕眩:用TC3xx SMU和TLF35584的配置实例,搞懂ASIL D功能安全落地

本文通过英飞凌TC3xx系列MCU的SMU模块与TLF35584电源管理芯片的协同配置实例,详细解析了如何实现符合ASIL D功能安全标准的刹车辅助ECU。文章涵盖SMU报警源配置、响应动作类型、TLF35584的安全状态管理,以及构建完整安全闭环的实践方法,帮助工程师将抽象的安全概念落地为具体设计方案。

weixin_30647065的博客 439

实现小型网络搭建(简易版)

骨干及环回IP地址配置完成之后,对用户配置IP,在对R3进行配置IP时,已创建与用户连接的子接口,在交换机LSW1和LSW2中分别创建VLAN2和VLAN3,创建完成之后,将接口划分到各自的VLAN中,随后在两个交换机之间建立trunk干道,最后再将R3所创建的子接口划分到属于各自的VLAN中,便可完成VLAN的建立。接口GigabitEthernet0/0/2创建了子接口,故存在0/0/2.1和0/0/2.2。VLAN建立完成后,对所有路由器配置静态路由,来使拓扑全网可达;至此,全网可达,练习完成。

Nyqfjgk的博客 565

R爬虫RSelenium环境搭建及简单应用

这是鄙人自己实践的一种可行的环境搭建,我会尽量详细的写下大家步骤。

weixin_44349986的博客 2015

基于PCIe的NVMe协议在FPGA中实现方法

NVMe协议是工作在PCIE的最上层协议层的,故需要先搞清楚PCIE。本文基于Xilinx的UltraScale+,开发工具为Vivado2021.2。NVMe的学习仍以spec为主,其它资料辅助理解,有冲突时以spec为准,必要时可对比最新版本spec。(此文重点介绍学习方法及资料,有时间再加细节)。 主要参考的文章是《老男孩读PCIe》,同时参考《古猫先生》,重点学习TLP报文部分,数据链路层和物理层的内容可以先不看。再买一本书《PCI Express 体系结构导读-王齐》用来查阅做笔记。

leixj的博客 1万+

浅谈操作系统-启动过程

前言时光匆碌,不知不觉都大三了,在众多的专业课的学习中也算是找到了一些乐趣,纸上得来终觉浅,所以决定完整的回顾一下整个操作系统的知识,为了理论与实践相结合,以学校实验室的EOS操作系统为例进行实践操作,作为一个刚刚开始学习操作系统的新手,如果有说的不对的地方还请多多指教。 EOS 是一个可以在 Intel X86 平台上运行的、面向教学的开源操作系统。为了让 EOS 适合于教学,EOS 被设计的

WchStrife的博客 3万+

室内无线传播损耗分析与传播模型验证课程设计

室内无线传播损耗分析与传播模型验证课程设计

a_zxswer的博客 188

从BIOS到Boot再到Loader它们各自都干了些什么

CPU加电启动从BIOS到Boot再到Loader他们各自都干了些什么 BIOS CPU加电启动CS:IP寄存器的初始值为0xF000:0xFFF0,此时CPU处于实模式下,这个CS:IP指向的地址的求法是 CS<<4+IP,即CS*16+IP,对应的物理地址为0xFFFF0,这个位置对应一条长跳转指令jmp F000:E05B,此时就会 跳转到BIOS固件所在的内存地址,然后控制权交由BIOS固件,此时BIOS固件完成下列操作: 检测各个硬件设备是否正常运行 从磁盘(软盘)的第一扇区里面

qq_48201696的博客 1036

fanuc机器人I/O分配

FANUC机器人在和其他外部设备进行通讯时,需要对信号进行配置。 在机器人处于UOP自动分配状态时,系统会自动检索已配对设备,并分配相应的机架号。 当我们需要手动对信号进行分配时,可参考以下机架号进行配置。 不同的通讯协议对应的机架号不同,外部通讯协议常用的机架号参考下表: 序号 机架号 通讯类型 1 0 Process I/O 2 1-15

haier123888的博客 1万+

手把手教你玩转CPU微架构专栏--​​​​1.5 工具准备:用Gem5模拟器“看见”微架构(安装、基础仿真命令)​

本文介绍了如何使用Gem5模拟器进行微架构学习和实验。Gem5是一款支持多种指令集的开源微架构模拟器,可模拟CPU流水线、缓存等核心组件。文章详细说明了在Ubuntu和macOS上安装Gem5的步骤,包括依赖安装、源码编译和验证方法。通过一个简单的加法指令测试程序,演示了如何运行基础仿真并解读输出日志,包括指令执行流程和性能统计数据。此外,还提供了两个实战实验:修改L1缓存大小和观察分支预测失败,帮助读者理解微架构参数对性能的影响。最后指出Gem5是学习微架构的"显微镜",能直观观察指令

xiaoheshang_123的博客 142

BIOS、UEFI、Boot Loader都是些什么

BIOS、UEFI、Boot Loader都是些什么 文章目录BIOS、UEFI、Boot Loader都是些什么什么是BIOS基本的输入输出是什么自检程序“检”了什么系统自启动了什么什么是UEFI BIOSUEFI和BIOS的区别GPT分区的结构UEFI与硬件初始化什么是Boot Loader 什么是BIOS Basic Input Output System(基本输入输出系统) 其实就是一组保存着计算机最重要的基本输入输出的程序、开机后自检程序、系统自启动程序,并固化到计算机内主板上的一个ROM芯片上

Mxdon_on的博客 4259

电池模拟器【 电化学模型深度解析:PNGV模型原理与应用(专业科普版)】

1. 模型起源PNGV(Partnership for a New Generation of Vehicles)模型诞生于1993年美国“新一代汽车合作计划”,旨在提升混合动力汽车电池系统的建模精度。该模型最初针对铅酸电池设计,后经改进广泛用于锂离子电池、镍氢电池等动态特性仿真。2. 模型定位PNGV属于**等效电路模型(ECM)**的进阶版本,介于简单Rint模型与复杂电化学模型(如P2D模型)之间,兼顾计算效率与精度,是BMS(电池管理系统)中SOC/SOH估算的主流选择。PNGV模型凭借。

优快云-新能源汽车研发测试专业博主 1701

Linux 之旅 19:启动流程、模块管理与loader

Linux 之旅 19:启动流程、模块管理与loader 图源:pexels Linux启动流程分析 启动流程一览 通常操作系统的启动过程可以分为以下几个步骤: 加载BIOS以获取硬件信息并进行自检,这样就可以获取到第一个可启动设备。 读取并执行第一个可启动设备的MBR内的启动引导程序(grub2、spfdisk等)。 根据启动引导程序的设置加载Kernel,Kernel进行硬件检测并加载需要的驱动和模块。 Kernel启动Systemd进程,并且用default.target模式准备操作系统环境:

梦幻天空 1627

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

揭秘 Unix 启动流程:从 BIOS 到 init 进程的完整链路拆解

Unix 启动流程从 BIOS/UEFI 到 init 进程,是一个层层递进的链条:BIOS/UEFI 初始化硬件,Boot Loader 加载内核,内核初始化核心系统,initramfs 提供临时支持,最后 init 启动用户空间。整个过程强调可靠性和顺序性,确保系统从裸机到多用户环境的平稳过渡。

2501_93878496的博客 580

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

从0写自己的操作系统(1) boot->loader引导程序

计算机启动流程与内核寄存器详解 计算机启动过程分为三个阶段:BIOS自检、bootloader引导和操作系统加载。BIOS首先执行硬件检测,然后将磁盘第0扇区(MBR)加载到内存0x7C00处,检查末尾是否为0x55AA标志。bootloader(512字节)负责加载更大的loader程序,后者准备OS运行环境并加载内核。 x86架构的关键寄存器包括: 通用寄存器:EAX(运算)、EBX(基址)、ECX(计数)、EDX(数据)、ESI/EDI(地址指针)、EBP/ESP(栈指针) 特殊寄存器:EIP(指令指

qq_45720531的博客 1321

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

操作系统内存布局的艺术:从BIOS到内核的空间博弈

本文解析x86架构内存布局设计原理,揭示操作系统启动过程中的内存管理艺术。文章从低地址到高地址分层剖析:0x0000-0x7C00为BIOS固件区,0x7C00-0x7E00存储MBR引导代码;0x7E00-0x90000作为过渡区存放VBE显卡信息和内存映射表;0x10000-0x90000为LOADER运行区,负责加载内核到1MB以上地址;高地址区域则保留兼容传统设备。该分层设计通过隔离固件、引导程序与内核空间,在有限物理内存中构建出清晰的功能边界,为系统启动和运行提供可靠保障。

fearhacker的专栏 1489

BIOS和UEFI区别,以及Boot Loader【上】

BIOS和UEFI定义和区别 1、BIOS就是BIOS,UEFI就是UFEI。但因为传统,不论传统BIOS还是UEFI BIOS都会被简称为BIOS。 2、PC的启动固件的引导流程从IBM PC机诞生第一天起,本质没改变过。 3、1999年:EFI 1.0 推出。2005年:UEFI论坛成立,改名为UEFI,Intel继续推动发展。 4、UEFI目的:扫平传统BIOS割裂生态,打通PC固件之间的鸿沟,提供给OS统一接口。 5、终极目的:标准接口、开放统一和开源。初始化硬件和提供硬件的软件抽象,和启

XJYSober的博客 4873

CentOS 7.x系统启动流程(BIOS/Boot Loader/Kernel)

CentOS 6 runlevel执行等级 Linux通过设置runlevel等级来规定系统使用不同的服务来启动,使得Linux的启动环境不同。 runlevel配置文件 /etc/inittab:系统默认级别设置在配置文件中 runlevel查看方式 # runlevel # cat /etc/inittab runlevel修改方式 临时修改# init 切换的运行级别 永久修改:# vim /etc/inittab id:切换的运行级别:initdefault: CentOS 7

hawava的博客 2391

操作系统的安装、启动过程

操作系统的安装、启动过程

xie__jin__cheng的博客 2348
上一篇: ESP32多I2C总线驱动VL53L0X:硬件Wire库的实战配置与避坑指南
下一篇: TabLayout性能优化与架构思考:从源码剖析到多场景解决方案
ruby5
博客等级 码龄15年 29粉丝 893原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值