您好,根据你给的那些可以看出,你说的不是DOS而是BIOS(也就是主板设置)你应该选first boot device--cd rom。您的问题我已经回答完了。下面是一些解释,您可以选择是否看下去。 Standard Cmos Features
Date日期
Time时间
IDE channel 0 Master [ST2120022A] IDE在0通道的主控装置
IDE channel 0 Slave [None] IDE在0通道的被控装置
IDE channel 1 Master [SAMSUNG CD-ROM SH-1] IDE在1通道的主控装置
IDE channel1 Slave [None]IDE在1通道的被控装置
Drive A [None]驱动器A
Drive B [None]驱动器B
Video [EGA/VGA]视频 [EGA/视频图形适配器]
Halt on [All Errors]停止 [所有的错误]
base Memory 640K 基本的内存
Extended Memory 523264K扩展的内存
Total Memory 524288K总的内存
二 Advanced BIOS Features 进化了的基本输入系统特征
Hard Disk Boot priority [press Enter]硬盘引导启动
cho M =ST3120022A
Bootable Add-incards 引导增加
Virus warning [Disbled]病毒警告
CPU nternal Cache [Enabled]处理器nternal缓存
External Cache [Enabled]外部缓存
CPU L2 Cache ECC checking[Enabled]处理器二级缓存ECC检查
Quick Power on self Test[Enabled]
Frist boot Device [Hard Disk]第一启动设备
Second Boot Device [Hard Disk]第二启动设备
Third Boot Device [CDROM] 第三启动设备
Boot other Device [Enabled]其他启动设备
Swap Floppy Drive [Disabled]交换软驱驱动器
Boot up Floppy seek [Disabled]启动软驱搜索
Boot up NumLock Status [on]启动在NumLock状态上
Typematic Rate setting [Disabled]Typematic的速度设定
* Typematic Rate (chars/sec)6 Typematic速度
* Typematic Delay (Msec)250 Typematic延迟
Security Option [Steup]安全选项
APIC Mode [Enabled]APIC 模式
OS select For DRAM >64MB [Non-OS2]为动态随机存取储存器 >64 万位元组的操作系统选择
Video BIOS shadow [Enabled]视频基本输出入系统图像
三 Advanced chipst Features 进化的chipst 特征
DRAM Configuration动态随机存取储存器结构
Current FSB Frequency 200MHZ现在的 FSB 频率 200 MHZ
Current DRAM Frequency 200MHZ现在的动态随机存取储存器频率 200 MHZ
Max Memclock (Mhz) [Auto]最大的Memclock [自动]
Dram Commad Rate [Auto]动态存取记忆体Commad速度
CAS# latency |TCL| [Auto]
RAS#to CAS# delay(Tred) [Auto]
Min RAS# actire time(Tras)[Auto]
ROW precharge Time (Trp) [Auto]
AGP&2P Bridge Control AGP& P2P 桥控制
AGP Aperture Size [128M]AGPAGP区域内存容量大小:该选项指定了分配给视频适配器的内存值。某些视频适配器可能要求多于默认值的内存量。
AGP Driving Control [Auto]AGP驱动控制
*AGP Driving Value 9B AGP驱动值
AGP Fast Write [Disabled]
DBI output for AGP Trans [Disabled]AGP Trans 的 DBI 输出
AGP Master 1 ws write [Disabled]
AGP Master 1 ws Read [Disabled]
LDT&CI Bus Control 总线控制LDT& PCI
Upstream LDT Bus Width [16bit] 上传LDT总线宽度
Downstream LDT Bus Width [16bit]下传LDT总线宽度
LDT Bus Frequency [800MHZ]LDT总线频率
PCI 1 Master 0 Ws Write [Enabled]
PCI 2 Master 0 Ws Write [Enabled]
PCI 1 Post write [Enabled]
PCI 2 Post write [Enabled]
Memory Hole [Disabled]内存接口
Vlink Aate Rate [8X]link的速率
Init Display Frist [AGP]
System BIOS Cacheable [Disabled]系统基本输出入缓存
四 Integrated Peripherals 整个外部设备
VIA onchip IDE Device [Press Enter]VIA芯片IDE装置
onchip SATA [Enabled]芯片启动
SATA Mode [IDE]启动模式
onchip IDE channe I0 [Enabled]芯片IDE通道 I0
onchip IDE channe I1 [Enabled]芯片IDE通道 I1
IDE Prefetch Mode [Enabled]IDE Prefetch模式
Primary Master PIO [Auto]第一主控装置PIO
Primary Slave PIO [Auto]第一被控装置PIO
Secondary Master PIO [Auto]第二主控装置PIO
Secondary Slave PIO [Auto]第二被控装置PIO
Primary Master UDMA [Auto]第一主控装置UDMA
Primary Slave UDMA [Auto]第一被控装置UDMA
Secondary Master UDMA [Auto]第二主控装置UDMA
Secondary Slave UDMA [Auto]第二被控装置UDMA
TDE HDD Block Mode [Enabled]TDE 硬盘区段模态
VIA onchip PCI Device [Press Enter]VIA 芯片PCI装置
VIA -3058 AC97 Audio [Auto]VIA-3058 AC97 音频
VIA -3043 onchip LAN [Enabled]VIA -3043芯片网络
onboard Lan Boot ROM [Enabled]在主板网启动ROM
onchip USB Controller [All Enabled]USB芯片控制器
onchip EHCI Controller [Enabled]onchip EHCI 控制器
USB Emulation [OFF]USB效仿
*USB Keyboard Support Disabled USB总线键盘支持 关闭的
*USB Mouse Sopport Disabled USB总线鼠标支持 关闭的
SuperI0 Device [Press Enter] SuperI0 装置 [进入]
onboard FDC Controller [Enabled]主板上FDC控制器
onboard Serial Port 1 [Auto]主板上串连端口 1
onboard Serial Port 2 [Auto]主板上串连端口 2
UART Mode Select [Normal]通用非同步收发传输器模态选择
*UR2 Duplex Mode Half UR2 双三极管模态一半
onboard Parullel Port [378/IPQ7] 主板上并口端口
Parallel Port Mode [spp]并口端口模式
*Ecpmode Use DMA 3 Ecp模式使用直接内存存取 3
Game Port Address [201]游戏端口地址
Midi Port Address [330]数位音乐系统端口地址
Midi Port IRQ [10]数位音乐系统IRQ
五 Power Management Setup 电源管理设置
ACPI function [Enabled] ACPI功能
ACPI Supend Type [Si(Pos)] ACPI Supend Type类型
Power Management Option [User Define] 电源管理选项
HDD Power Down [Disabled] 硬盘电源
Suspend Mode [Disabled] 中止模式
Video off option [suspend--off] 视频外选项 [中止-关]
Video off method [V/H SYNC+Blank]视频分类 [V/H 同步+空格]
MODEMUSE TRQ [3]
Soft-off by PWRBTN [Instant - off]
RUN VGABIOS if S3 Resume [Auto] 如果 S3 重新开始运行VGA基本输入
AC Loss Auto Restart [on] AC 损失自动重新开始
AMD k8 cool'n' Quiet contro [Auto]
IRQ/Event Activity Detect [Press Enter]
六 PNP/PCI configurations PNP/PCI 结设置
PNPOS Intalled [No]
Reset Configaration Date [Disabled] 重新设定 Configaration 日期
Resources Controlled By [Auto(ESCD)] 被控制的资源
*IRQ Resources [Press Enter] IRQ资源
PCI/VGA Dalette VGA [Enabled] PCI/视频图形适配器 Dalette 视频图形适配器
Assign IRQ For VGA [Enabled] 为视频图形适配器分配 IRQ
Assign IRQ For USB [Enabled] 为USB总线分配IRQ
七 SmartDoc Anti-Barn shield
Vcore 1.07V
VDD 2.59V
+3.3V 3.32V
+5V 4.94V
+12V 11.71V
-12V (一) 11.37
+1.5V 1.51V
+5Vsb 4.99V
Voltage Battory 3.26V 电压 Battory
CPU Internal Temp 39'C
SYSTEM Temp 19'C
Cpu Fan Speed 3245~3308RPM CPU风扇速度
System Fan Speed 0 RPM 系统引擎速度
八 Frequency/Voltage Control 频率/电压控制
CPU Ratio [Star Up] CPU比率
Auto Detect PCI Clk [Enabled]
Spread Spectrum [Disabled]
CPU Clock [200MHz] 处理器 时钟频率
CPU Vcore Select [Default] 处理器 供电 选择
AGP Voltage Select [1.50V] AGP 电压选择
DIMM Voltage Select [2.60V] DIMM 电压选择
桌面好物推荐,扩展面积提升效率和舒适感
保护模式, (Protected Mode,或有时简写为 pmode) 是一种 80286 系列和之后的 x86 兼容 CPU 操作模式。保护模式有一些新的特色,设计用来增强 多工 和系统稳定度,像是 内存保护,分页 系统,以及硬件支援的 虚拟内存。大部分的现今 x86 操作系统 都在保护模式下运行,包含 Linux、FreeBSD、以及 微软 Windows 2.0 和之后版本。
另外一种 286 和其之后 CPU 的操作模式是 真实模式,一种向前兼容且关闭这些特色的模式。设计用来让新的芯片可以执行旧的软件。依照设计的规格,所有的 x86 CPU 都是在真实模式下开机来确保传统操作系统的向前兼容性。在任何保护模式的特色可用前,他们必须要由某些程序手动地切换到保护模式。在现今的电脑,这种切换通常是由 操作系统 在开机时候必须完成的第一件工作的一个。它也可能当 CPU 在保护模式下运行时,使用 虚拟86模式 来执行设计给真实模式的程序码。 尽管用软件的方式也有某些可能在真实模式的系统下使用多工,但保护模式下内存保护的特色,可以避免有问题的程序破坏其他工作或是 操作系统 核心所拥有的内存。保护模式也有中断正在执行程序的硬件支援,可以把 execution content 交给其他工作,得以实现 先占式多工。 大部分可以使用保护模式的 CPU 也拥有 32 位元暂存器 的特色 (例如 80386 系列和其后任何的芯片),导入了融合保护模式而成为 32 位元处理的概念。80286 芯片虽有支援保护模式,但是仍然只有 16 位元暂存器。Windows 2.0 和之后版本中的保护模式增强称为 "386 增强模式",是因为他们除了保护模式外,还需要 32 位元的暂存器,并且无法在 286 上面执行 (即使 286 支援保护模式)。 即使在 32 位元芯片上已经打开了保护模式,但是 1 MB 以上的内存并无法存取,是由于一种仿照 IBM XT 系统设计特性的 memory wrap-around(内存连续) 的因素。这种限制可以由打开 A20 line 来回避。 在保护模式下,前面 32 个中断都是保留给 CPU 例外处理用。举个例子,中断 0D (十进制 13) 是 一般保护模式错物 和 中断 00 是 除以零。 在8086/8088时代,处理器只存在一种操作模式(Operation Mode),当时由于不存在其它操作模式,因此这种模式也没有被命名。自从80286到80386开始,处理器增加了另外两种操作模式——保护模式PM (Protected Mode)和系统管理模式SMM(System Management Mode),因此,8086/8088的模式被命名为实地址模式RM(Real-address Mode)。 PM是处理器的native模式,在这种模式下,处理器支持所有的指令和所有的体系结构特性,提供最高的性能和兼容性。对于所有的新型应用程序和操作系统来说,建议都使用这种模式。为了保证PM的兼容性,处理器允许在受保护的,多任务的环境下执行RM程序。这个特性被称做虚拟8086模式(Virtual -8086 Mode),尽管它并不是一个真正的处理器模式。Virtual-8086模式实际上是一个PM的属性,任何任务都可以使用它。 RM提供了Intel 8086处理器的编程环境,另外有一些扩展(比如切换到PM或SMM的能力)。当主机被Power-up或Reset后,处理器处于RM下。 SMM是一个对所有Intel处理器都统一的标准体系结构特性。出现于Intel386 SL芯片。这个模式为OS实现平台指定的功能(比如电源管理或系统安全)提供了一种透明的机制。当外部的SMM interrupt pin(SMI#)被激活或者从APIC(Advanced Programming Interrupt Controller)收到一个SMI,处理器将进入SMM。在SMM下,当保存当前正在运行程序的整个上下文(Context)时,处理器切换到一个分离的地址空间。然后SMM指定的代码或许被透明的执行。当从SMM返回时,处理器将回到被系统管理中断之前的状态。 由于机器在Power-up或Reset之后,处理器处于RM状态,而对于Intel 80386以及其后的芯片,只有使用PM才能发挥出最大的作用。所以我们就面临着一个从RM切换到PM的问题。 本文不讨论SMM,本节的重点集中于在Booting阶段如何从RM切换到PM,这里不会过多的讨论PM的细节,因为《Intel Architecture Software Developer’s Manual Volume 3: System Programming》中有非常详尽和准确的介绍。
编辑本段What is GDT
在Protected Mode下,一个重要的必不可少的数据结构就是GDT(Global Descriptor Table)。 为什么要有GDT?我们首先考虑一下在Real Mode下的编程模型: 在Real Mode下,我们对一个内存地址的访问是通过Segment:Offset的方式来进行的,其中Segment是一个段的base Address,一个Segment的最大长度是64 KB,这是16-bit系统所能表示的最大长度。而Offset则是相对于此Segment base Address的偏移量。base Address+Offset就是一个内存绝对地址。由此,我们可以看出,一个段具备两个因素:base Address和Limit(段的最大长度),而对一个内存地址的访问,则是需要指出:使用哪个段?以及相对于这个段base Address的Offset,这个Offset应该小于此段的Limit。当然对于16-bit系统,Limit不要指定,默认为最大长度64KB,而 16-bit的Offset也永远不可能大于此Limit。我们在实际编程的时候,使用16-bit段寄存器CS(Code Segment),DS(Data Segment),SS(Stack Segment)来指定Segment,CPU将段积存器中的数值向左偏移4-bit,放到20-bit的地址线上就成为20-bit的base Address。 到了Protected Mode,内存的管理模式分为两种,段模式和页模式,其中页模式也是基于段模式的。也就是说,Protected Mode的内存管理模式事实上是:纯段模式和段页式。进一步说,段模式是必不可少的,而页模式则是可选的——如果使用页模式,则是段页式;否则这是纯段模式。 既然是这样,我们就先不去考虑页模式。对于段模式来讲,访问一个内存地址仍然使用Segment:Offset的方式,这是很自然的。由于 Protected Mode运行在32-bit系统上,那么Segment的两个因素:base Address和Limit也都是32位的。IA-32允许将一个段的base Address设为32-bit所能表示的任何值(Limit则可以被设为32-bit所能表示的,以2^12为倍数的任何指),而不象Real Mode下,一个段的base Address只能是16的倍数(因为其低4-bit是通过左移运算得来的,只能为0,从而达到使用16-bit段寄存器表示20-bit base Address的目的),而一个段的Limit只能为固定值64 KB。另外,Protected Mode,顾名思义,又为段模式提供了保护机制,也就说一个段的描述符需要规定对自身的访问权限(Access)。所以,在Protected Mode下,对一个段的描述则包括3方面因素:[base Address, Limit, Access],它们加在一起被放在一个64-bit长的数据结构中,被称为段描述符。这种情况下,如果我们直接通过一个64-bit段描述符来引用一个段的时候,就必须使用一个64-bit长的段积存器装入这个段描述符。但Intel为了保持向后兼容,将段积存器仍然规定为16-bit(尽管每个段积存器事实上有一个64-bit长的不可见部分,但对于程序员来说,段积存器就是16-bit的),那么很明显,我们无法通过16-bit长度的段积存器来直接引用64-bit的段描述符。 怎么办?解决的方法就是把这些长度为64-bit的段描述符放入一个数组中,而将段寄存器中的值作为下标索引来间接引用(事实上,是将段寄存器中的高13 -bit的内容作为索引)。这个全局的数组就是GDT。事实上,在GDT中存放的不仅仅是段描述符,还有其它描述符,它们都是64-bit长,我们随后再讨论。 GDT可以被放在内存的任何位置,那么当程序员通过段寄存器来引用一个段描述符时,CPU必须知道GDT的入口,也就是基地址放在哪里,所以Intel的设计者门提供了一个寄存器GDTR用来存放GDT的入口地址,程序员将GDT设定在内存中某个位置之后,可以通过LGDT指令将GDT的入口地址装入此积存器,从此以后,CPU就根据此积存器中的内容作为GDT的入口来访问GDT了。 GDT是Protected Mode所必须的数据结构,也是唯一的——不应该,也不可能有多个。另外,正象它的名字(Global Descriptor Table)所揭示的,它是全局可见的,对任何一个任务而言都是这样。 除了GDT之外,IA-32还允许程序员构建与GDT类似的数据结构,它们被称作LDT(Local Descriptor Table),但与GDT不同的是,LDT在系统中可以存在多个,并且从LDT的名字可以得知,LDT不是全局可见的,它们只对引用它们的任务可见,每个任务最多可以拥有一个LDT。另外,每一个LDT自身作为一个段存在,它们的段描述符被放在GDT中。 IA-32为LDT的入口地址也提供了一个寄存器LDTR,因为在任何时刻只能有一个任务在运行,所以LDT寄存器全局也只需要有一个。如果一个任务拥有自身的LDT,那么当它需要引用自身的LDT时,它需要通过LLDT将其LDT的段描述符装入此寄存器。LLDT指令与LGDT指令不同的时,LGDT指令的操作数是一个32-bit的内存地址,这个内存地址处存放的是一个32-bit GDT的入口地址,以及16-bit的GDT Limit。而LLDT指令的操作数是一个16-bit的选择子,这个选择子主要内容是:被装入的LDT的段描述符在GDT中的索引值——这一点和刚才所讨论的通过段积存器引用段的模式是一样的。 LDT只是一个可选的数据结构,你完全可以不用它。使用它或许可以带来一些方便性,但同时也带来复杂性,如果你想让你的OS内核保持简洁性,以及可移植性,则最好不要使用它。 引用GDT和LDT中的段描述符所描述的段,是通过一个16-bit的数据结构来实现的,这个数据结构叫做Segment Selector——段选择子。它的高13位作为被引用的段描述符在GDT/LDT中的下标索引,bit 2用来指定被引用段描述符被放在GDT中还是到LDT中,bit 0和bit 1是RPL——请求特权等级,被用来做保护目的,我们这里不详细讨论它。 前面所讨论的装入段寄存器中作为GDT/LDT索引的就是Segment Selector,当需要引用一个内存地址时,使用的仍然是Segment:Offset模式,具体操作是:在相应的段寄存器装入Segment Selector,按照这个Segment Selector可以到GDT或LDT中找到相应的Segment Descriptor,这个Segment Descriptor中记录了此段的base Address,然后加上Offset,就得到了最后的内存地址。如下图所示:
编辑本段Setup GDT
由上一节的讨论得知,GDT是Protected Mode所必须的数据结构,那么我们在进入Protected Mode之前,必须设定好GDT,并通过LGDT将其装入相应的寄存器。 尽管GDT允许被放在内存的任何位置,但由于GDT中的元素——描述符——都是64-bit长,也就是说都是8个字节,所以为了让CPU对GDT的访问速度达到最快,我们应该将GDT的入口地址放在以8个字节对齐,也就是说是8的倍数的地址位置。 GDT中第一个描述符必须是一个空描述符,也就是它的内容应该全部为0。如果引用这个描述符进行内存访问,则是产生General Protection异常。 如果一个OS不使用虚拟内存,段模式会是一个不错的选择。但现代OS没有不使用虚拟内存的,而实现虚拟内存的比较方便和有效的内存管理方式是页式管理。但是在IA-32上如果我们想使用页式管理,我们只能使用段页式——没有方法可以完全禁止段模式。但我们可以尽力让段的效果降低的最小。 IA-32提供了一种被称作“Basic Flat Model”的分段模式可以达到这种效果。这种模式要求在GDT中至少要定义两个段描述符,一个用来引用Data Segment,另一个用来引用Code Segment。这2个Segment都包含整个线性空间,即Segment Limit = 4 GB,即使实际的物理内存远没有那么多,但这个空间定义是为了将来由页式管理来实现虚拟内存。 在这里,我们只是处于Booting阶段,所以我们只需要初步设置一下GDT,等真正进入Protected Mode,启动了OS Kernel之后,具体OS打算如何设置GDT,使用何种内存管理模式,由Kernel自身来设置,Booting只需要给Kernel的数据段和代码段设置全部线性空间就可以了。 段描述符的格式如下图所示: 具体到代码段和数据段,它们的格式如下图所示: 下面就是在Booting阶段为进入Protected Mode而设置的临时的gdt。这里定义了3个段描述符:第一个是系统规定的空描述符,第2个是引用4 GB线性空间的代码段,第3个是引用4 GB线性空间的数据段。这是"Basic Flat Model"所要求的最下GDT设置,但就booting阶段,只是为了进入Protected Mode,并为内核提供一个连续的,最大的线性空间这个目的而言,已经足够了。 # Descriptor tables gdt: .word 0, 0, 0, 0 # dummy .word 0xFFFF # 4Gb - (0x100000*0x1000 = 4Gb) .word 0 # base address = 0 .word 0x9A00 # code read/exec .word 0x00CF # granularity = 4096, 386 # (+5th nibble of limit) .word 0xFFFF # 4Gb - (0x100000*0x1000 = 4Gb) .word 0 # base address = 0 .word 0x9200 # data read/write .word 0x00CF # granularity = 4096, 386 # (+5th nibble of limit)
编辑本段Load GDT
设置好GDT之后,我们需要通过LGDT指令将设定的gdt的入口地址和gdt表的大小装入GDTR寄存器。 GDTR寄存器包括两部分:32-bit的线性基地址,以及16-bit的GDT大小(以字节为单位)。需要注意的是,对于32-bit线性基地址,必须是32-bit绝对物理地址,而不是相对于某个段的偏移量。而我们在Booting阶段,在进入Protected Mode之前,我们CS和DS设置很可能不是0,所以我们必须计算出gdt的绝对物理地址。 为了执行LGDT指令,你需要把这两部分内容放在内存的某个位置,然后将这个位置的内存地址作为操作数传递给LGDT指令。然后LGDT指令会自动将保存在这个位置的这两部分值装入GDTR寄存器。 # 这是存放GDTR所需的两部分内容的位置 gdt_48: .word 0x8000 # gdt limit=2048, # 256 GDT entries .word 0, 0 # gdt base (filled in later) # 下面这段代码用来计算GDT的32-bit线性地址,并将其装入GDTR寄存器。 xorl %eax, %eax # Compute gdt_base movw %ds, %ax # (Convert %ds:gdt to a linear ptr) shll , %eax addl $gdt, %eax movl %eax, (gdt_48+2) lgdt gdt_48 # load gdt with whatever is appropriate
编辑本段Other Preparing Stuff
在进入Protected Mode之前,除了需要设置和装入GDT之外,还需要做如下一些事情: 屏蔽所有可屏蔽中断; 装入IDTR; 所有协处理器被正确的Reset。 由于在Real Mode和Protected Mode下的中断处理机制有一些不同,所以在进入Protected Mode之前,务必禁止所有可屏蔽中断,这可以通过下面两种方法之一: 使用CLI指令; 对8259A可编程中断控制器编程以屏蔽所有中断。 即使当我们进入Protected Mode之后,也不能马上将中断打开,这时因为我们必须在OS Kernel中对相关的Protected Mode中断处理所需的数据结构正确的初始化之后,才能打开中断,否则会产生处理器异常。 在Real Mode下,中断处理使用IVT(Interrupt Vector Table),在Protected Mode下,中断处理使用IDT(Interrupt Descriptor Table),所以,我们必须在进入Protected Mode之前设置IDTR。 IDTR的格式和GDTR相同,IDTR的装入方式和GDTR也相同。由于IDT中相关的中断处理程序需要让OS Kernel来设定,所以在Booting阶段,我们只需要将IDTR中IDT的基地址和Size都设为0就可以了,随后,等进入Protected Mode之后,由OS Kernel来真正设置它。 关于中断机制和中断处理,请参考 Interrupt & Exception ,这里不再赘述。 # # 这是存放IDTR所需的两部分内容的位置 # idt_48: .word 0 # idt limit = 0 .word 0, 0 # idt base = 0L # 对于IDTR的处理,只需要这一条指令即可 lidt idt_48 # load idt with 0,0 # # 通过设置8259A PIC,屏蔽所有可屏蔽中断 # movb xFF, %al # mask all interrupts for now outb %al, xA1 call delay movb xFB, %al # mask all irq's but irq2 which outb %al, x21 # is cascaded # 保证所有的协处理都被正确的Reset xorw %ax, %ax outb %al, xf0 call delay outb %al, xf1 call delay # Delay is needed after doing I/O delay: outb %al,x80 ret 5. Let's Go 好了,一切准备就绪,Fire!:) 进入Protected Mode,还是进入Real Mode,完全靠CR0寄存器的PE标志位来控制:如果PE=1,则CPU切换到PM,否则,则进入RM。 设置CR0-PE位的方法有两种: 第一种是80286所使用的LMSW指令,后来的80386及更高型号的CPU为了保持向后兼容,都保留了这个指令。这个指令只能影响最低的4 bit,即PE,MP,EM和TS,对其它的没有影响。 # #通过LMSW指令进入Protected Mode # movw , %ax # protected mode (PE) bit lmsw %ax # This is it! 第二种是Intel所建议的在80386以后的CPU上使用的进入PM的方式,即通过MOV指令。MOV指令可以设置CR0寄存器的所有域的值。 # #通过MOV指令进入Protected Mode # movl %cr0, %eax xorb , %al # set PE = 1 movl %eax, %cr0 # go!! OK,现在已经进入Protected Mode了。 很简单,right?But It's not over yet!
编辑本段Start Kernel
我们已经从Real Mode进入Protected Mode,现在我们马上就要启动OS Kernel了。 OS Kernel运行在32-bit段模式,而当前我们却仍然处于16-bit段模式。这是怎么回事?为了了解这个问题,我们需要仔细探讨一下IA-32的段模式的实现方法。 IA-32共提供了6个16-bit段寄存器:CS,DS,SS,ES,FS,GS。但事实上,这16-bit只是对程序员可见的部分,但每个寄存器仍然包括64-bit的不可见部分。 可见部分是为了供程序员装载段寄存器,但一旦装载完成,CPU真正使用的就只是不可见部分,可见部分就完全没有用了。 不可见部分存放的内容是什么?具体格式我没有看到相关资料,但可以确定的是隐藏部分的内容和段描述符的内容是一致的(请参考段描述的格式),只不过格式可能不完全相同。但格式对我们理解这一点并不重要,因为程序员不可能能够直接操作它。 我们以CS寄存器为例,对于其它寄存器也是一样的: 在Real Mode下,当我们执行一个装载CS寄存器的指令的时候(jmp,call,ret等),相关的值会被装入CS寄存器的可见部分,但同时CPU也会根据可见部分的内容来设置不可见部分。比如我们执行"ljmp x1234, $go "之后,CS寄存器的可见部分的内容就是1234h,同时,不可见部分的32-bit base Address域被设置为00001234h,20-bit的Limit域被设置为固定值10000h,也就是64 KB,Access Information部分的其它值我们不去考虑,只考虑其D/B位,由于执行此指令时处于Real Mode模式,所以D/B被设置为0,表示此段是一个16-bit段。当对CS寄存器的可见部分和不可见部分的内容都被设置之后,CS寄存器的装载工作完成。随后当CPU需要通过CS的内容进行地址运算的时候,则仅仅引用不可见部分。 在Protected Mode下,当我们执行一个装载CS寄存器的指令的时候,段选择子(Segment Selector)被装入CS寄存器的可见部分,同时CPU根据此选择子到相应的描述符表中(GDT或LDT)找到相应的段描述符并将其内容装载入CS寄存器的不可见部分。随后CPU当需要通过CS的内容进行地址运算的时候,也仅仅引用不可见部分。 从上面的描述可以看出,事实上CPU在引用段寄存器的内容进行地址运算时,Real Mode和Protected Mode是一致的。另外,也明白了为什么我们在Real Mode下设置的段寄存器的内容到了Protected Mode下仍然引用的是16-bit段。 那么我们如何将CS设置为引用32-bit段?方法就像我们前面所讨论的,使用jmp或call指令,引用一个段选择子,到GDT中装载一个引用32-bit段的段描述符。 需要注意的是,如果CS寄存器的内容指出当前是一个16-bit段,那么当前的地址模式也就是16-bit地址模式,这与你当前是出于Real Mode还是Protected Mode无关。而我们装载32-bit段的jmp指令或call指令必须使用的是32-bit地址模式。而我们当前的boot部分代码是16-bit代码,所以我们必须在此jmp/call指令前加上地址转换前缀代码66h。 下面的例子就是使用jmp指令装入32-bit段。Jmpi指令的含义是段间跳转,其Opcode为Eah,其格式为:jmpi Offset, Segment Selector。 # 由于当前的代码是16-bit代码,而我们要执行32-bit地址模式的指令,指令前 # 需要有地址模式切换前缀66h,如果我们直接写jmp指令,由编译器来生成代码 # 的话,是无法作到这一点的,所以我们直接写相关数据。 .byte 0x66, 0xea # prefix + jmpi-opcode .long 0x1000 # Offset .word __KERNEL_CS # CS segment selector 上面的代码相当于32-bit指令: jmpi 0x1000,__KERNEL_CS 如果__KERNEL_CS段选择子所引用的段描述符设置的段空间为线形地址[0,4 GB],而我们将OS Kernel放在物理地址1000h,那么此jmpi指令就跳转到OS Kernel的入口处,并开始执行它。 此时,Booting阶段结束,OS正式开始运行!
Ciao Bello,我是老房。
趁着最近居家办公终于有时间把家里电脑桌面整理了一遍,主要核心思想就是扩展桌面可用面积,提升工作效率。在办公的时候多屏幕、多设备互动,地方小了着实不行。不仅摆放,充电也都成了问题。
老规矩先上图。
这次就结合本期桌面布局,聊一聊能够扩展使用面积、提升效率和舒适度的桌面好物。
桌面上最占空间的设备之一肯定有显示器底座,稍微小一点的起码占地 20*30cm ,像明基 SW270C 这种专业显示器底座更是达到了 30*40cm 还多。老房目前桌面上有三台显示器,只是这些底座就已经占去了很大的面积,更换显示器支架是提升桌面使用空间最立竿见影的办法。
老房这次选择的是北弧 Brateck 显示器支架,更换中间和左侧两台。其中中间主屏幕明基 EW2780U 大约不到 5kg;左侧的 SW270C 就沉了,单裸屏就有 6.5Kg,再加上遮光罩达到了 10.6Kg。
在选购前其实老房也一直对北弧显示器支架的性能抱有怀疑,因为它家的价格实在太便宜了。像最大承重 9Kg 的 E350 属于百元价位,配合 SW270C 使用的最大承重 15Kg 的北弧 LDT23 也不过三百出头,“便宜无好货?”当年老房买的第一个显示器支架可是花了我 1000 多元...
不过咨询了好几个朋友都表示不用担心,它家打的就是性价比,安全性方便不用担心。
战战兢兢的下单入手,在收到货开箱后,顾虑消失,还真挺好。
首先是用料扎实,铝材和钣金主体拿上去就沉甸甸的,瞬间安全感就上来了。其次是做工精细,无论是夹板底座还是悬臂,光滑无毛刺。
E350 和 LDT23 都支持夹装和穿孔安装,支持 75*75mm 和 100*100mm VESA 标准挂壁接口。为了保护桌子以及后续方便移动,老房都选择了夹持安装。
安装过程非常简单,根据说明书一步一步来大概三五分钟就能装好。
底座根据使用需求夹在桌子边缘,拧紧螺丝。
然后再套上悬臂,最后把显示器固定即可。
而将支架与显示器固定这点相对来说稍显麻烦。
不过 LDT23 提供了一个非常便捷的设计,也就是卡扣背板和支架悬臂分离。我们只需先把背板与显示器 VESA 接口固定,再挂到支架悬臂上即可,类似于快拆式设计,安装省力很多,一个人就能搞定,免去了一边托着沉重的显示器屏幕不敢乱动一边小心翼翼拧螺丝的尴尬。
北弧显示器支架 E350 采用的是机械弹簧支撑,LDT23 采用的是气压弹簧,两款的稳定性都不错。不过重点都必须先通过连接处的六角螺丝调整力度,便可以实现单手操作、无极调控、随意悬停,长时间使用后也都没有发生“缓降、低头”等现象。
北弧 LDT23 和 E350 两款屏幕支架都配置了理线槽,可以顺着悬臂的位置把线材藏进去,让整体观看更为整洁。不过老房的显示器和主机之间的距离有些远,线不够长...先这么露在外面吧...
显示器支架的底座和显示器自带的底座比起来要小太多了,北弧 LDT23 和 E350 两款产品的底座都在 10*10mm 左右,只有显示器底座的六分之一甚至 SW270C 的十二分之一,大大节省了空间,能够放置更多的东西。
北弧显示器支架的可调节范围也非常广,上下前后自不多说,屏幕还可以进行 90 度的上下倾斜、360 度的旋转,想怎么看就怎么看。
配合不同的使用场景,调整最适合观看的显示器位置,用眼更舒适。
腾出来更多的桌面空间就是为了能够放下更多的设备(误),电子产业越来越多,充电就成了问题。前段时间老房入手了个绿联 30W 智充魔盒 Life,收音机一般的造型,马卡龙绿的配色,放在桌面上清新自然。
智充魔盒 Life 配有两个 USB-A 接口、一个 Type-C 接口以及两个 220V 新国标插口,接口丰富,但是 USB 类的最大输出只有 30W,充手机可以,充笔记本电脑就略显不够。
所有这次又入手了一款功率更大的 65W 氮化镓智充魔盒 Cube,基本能满足绝大多数设备的充电需求了。
绿联氮化镓智充魔盒 Cube 造型就是一个“盒子”,当然也可以说是和常见的魔方插排类似。不过和普通的插排不同的是,绿联智充魔盒 Cube 还提供了四个 USB 系列插口,能够直接接线使用。
绿联智充魔盒 Cube 正面配置了两个 USB-A 接口和两个 Type-C 接口,支持 PDQC3.0SCP 等多种快充协议。其中单 USB-A 接口输出为 22.5W,单 Type-C 接口最大输出功率达到了 65W,给 iPad Pro 或者 Surface Pro 充电完全没有问题。
正面面板四周还进行了环形的金色电镀,提升视觉效果和造型艺术性,低调却不单调。
双口输出时,其中一个 Type-C 接口也可以达到 45W 的快充;四口快充时,Type-C 接口1 输出功率为 30W、C 口 2 为 20W、两个 USB-A 接口也能达到 15W 输出,多设备同时使用的适用性还是挺强的。
顶部及两侧各配置了一个新国标插座,位置的设计很人性化,三个插座都不会影响其他插座使用。其实现在还是有很多设备无法通过数据线充电的,必须插头直插插座,比如相机电池充电器。终于不用再每次都弯腰探身到桌子底下找插座用了。
其实绿联氮化镓智充魔盒 Cube 的核心竞争力也就是和其他魔方插座有区别的地方就是其采用了氮化镓 GaN 快充技术,众所周知氮化镓作为第三代新型半导体材料,具有高耐压、高频率、高稳定性的特点,在同等输出功率下,其体积更小、重量更轻、安全性更高。
在智充魔盒 Cube 背后还设置了一个总控开关,出远门不使用的时候一键断电,更加放心。
在添置充电魔盒的同时,老房同时入手了一个 Apple Watch 苹果手表充电器。
其实老房忍受 Apple Watch 原装充电器太久了!从初代到现在用的 Series 5,留那么长的线干啥?每次都卷的一塌糊涂,还不容易收拾...而且虽然 Apple Watch 续航时间有了一定的提升,但一天一充还是避免不了的,家里、办公室都得备一个,就一起选择了绿联的苹果手表磁吸充电器。
绿联的 Apple Watch 充电器通过了苹果 MFi 认证,也就是说这是苹果官方认可的设备,尽可以放心大胆使用。
在造型上绿联舍弃了苹果原装的超长延长线设计,就是直接一个磁吸充电器加 Type-C 接口,清清爽爽,没有线材的束缚和累赘,非常适合办公室特别是出差旅行的时候携带使用。
即插即充,插到充电宝上或者插到笔记本电脑接口上就能充电,也无需再到处找充电头了。
通过 MFi 认证,除了要使用 Apple 原装芯片以外,还要通过苹果一系列严苛的测试,比如说手表充电器的这个磁吸功能,必须要稳。
绿联做到了,吸附力很强,而且它还提供了一个额外的小支撑配件,在竖直使用充电的时候更加稳定。
搭配智充魔盒 Life 的顶部 Type-C 接口使用正好,充电稳定不发烫。
结合 WatchOS 的新特性,充电的时候变成了一个小小时钟,别有一番风格。
作为半个机械键盘爱好者,老房尝试使用过好几种不同按键数 的键盘,80、96、101、108 等等,按键数少的键盘尺寸小、不占地,但没有小键盘和部分功能键,并不适合快速输入;多任务办公还是得需要 108 按键数的标准全键位键盘了。
ikbc x 中国航天火星任务版,是老房手里的第二把 ikbc 中国航天联名键盘了。
第一款为蓝白配色款,更贴近于中国航天的官方配色,象征着对天空和星辰的向往。
第二款为稍后推出的火星任务版,以灰色为基调,加上橘红色与红色的点缀,象征着火星虽然狂暴无常,但中国航天天问 探索 火星任务必将成功。
ikbc 航天联名版机械键盘的一大特色就是中文标注的所有功能键,像 Delete 为删除、Ctrl 为控制、Enter 为回车等,虽然刚上手不太适应但是不是很亲切?要知道在中国空间站里同样是所有的按钮都是中文标识,无论是谁上去都要去习惯。
键帽为 PBT 材质,长时间使用不打油。在几个特殊键帽的设计上 ikbc 同样很用心,不如回车键和 Esc 键就是天问一号着陆器。
空格键上为祝融号火星车和着陆器。
这款机械键盘同样为 108 键设计,非常适合工作。在我们计算数据、处理材料的时候,小键盘的使用频率很高,所以如果同坐需要还是推荐大家入手 108 键的键盘。
中国航天联名机械键盘的轴体为 TTC 轴,共有红轴、青轴、茶轴可选择,同时也有有线版和 2.4G 无线版可以选择。
工作写报告需要长时间打字,还是红轴比较合适,当然这也看个人的喜好啦。
工作繁忙,拒绝无趣,还是得在桌面上摆放一点奇趣好物,偶尔放松下紧张的心情。
比如这款电平拾音表拾音灯...
两个圆形 UV 表充满了复古的气息,现在日常生活中应该很少见到类似的仪器了。乍一眼看上去是不是有点像老式的收音机?
背面是开关、电源线、模式选择以及收音麦克风,这款拾音灯的工作原理就是通过麦克风收音控制电路使得 UV 表指针随着节奏摆动。不是音箱、不是功放、没有蓝牙、不能充电,至于上面写的 DTS、杜比音效等等,没看到作者直接说了么,“None of Them”,全都没有...
但就这一个简单的功能对于老房这样的钢铁直男来说真的是充满了吸引力,尤其是在听摇滚的时候,随着节奏指针卡点摆动——当然这也得益于设备选用了手机使用的同类型麦克风更为灵敏——感觉超带劲儿,我能盯着它看一下午,什么工作辛苦通通不是事儿。
产品的整体尺寸为 160*44*54mm,不算太大,摆放在桌面上刚刚好。四周的栅格化设计,也让 EleksMaker 更加的 Cyberpunk。
正前方中间栅格内的 RGB 灯也可以调整颜色和模式,丰富了可玩性。
你说它有啥用呢?但就是喜欢...
又如这款区块化 USB 独立控制排插...
方方正正的机械风格,硬派金属拨杆开关,我想没有男人能抵挡得住这种“硬核之美”吧...
而且,它支持一分为六 USB-A 接口输出,只需一个输入接口就能给六个设备充电/供电,并通过正面的金属拨杆来进行独立控制供电,听上去是不是很厉害!
但是!它不支持任何快充...最大输出也只是传统的 5V3A 15W...
是的,这个区块化开关,仅仅是一个类“USB-A Hub”而已,还不支持连电脑、不能传输数据,只能够为小功率电器供电。如果充电,也只适合给耳机、手表等使用。
不过如果用好了,区块化开关还是非常好用的。后面的六个接口可以接满 EleksMaker 家所有的设备同时使用(老板就是这么打广告的)...比如辉光灯、拾音器等,像显示器屏幕挂灯也可以,不再需要翻转设备或者伸手到背面摸索,通过拨杆即可“咔哒”开启关闭,便捷的同时仪式感十足。
这两款新品 EleksMaker 在风格上做了统一设计,相同尺寸和造型,摆放在一起更别致、更和谐、更赛博朋克。
这次 EleksMaker 的外包装也全新升级了,突出了 EleksMaker 品牌和特性。
EleksMaker 的老板也是个非常有趣的人,当年因为爱好而制作这些小摆件。无意中一炮走红之后便辞去了工作专心搞设计,从这几款新品中也能看到在理念和设计感上的升级。
以上就是本次桌面更新的好物推荐,欢迎各位在评论区交流,分享您认为“值”的新奇好物。
谢谢大家,我是老房,咱们下次再见。
免责声明:本平台仅供信息发布交流之途,请谨慎判断信息真伪。如遇虚假诈骗信息,请立即举报
举报