我很难理解简单的引导装载程序是如何工作的.我正在谈论的引导加载程序是麻省理工学院"操作系统工程"课程中的一个.
首先,让我向您展示BIOS执行的一段汇编代码:
[f000:fec3] 0xffec3: lidtw %cs:0x7908
[f000:fec9] 0xffec9: lgdtw %cs:0x7948
[f000:fecf] 0xffecf: mov %cr0,%eax
[f000:fed2] 0xffed2: or $0x1,%eax
[f000:fed6] 0xffed6: mov %eax,%cr0
[f000:fed9] 0xffed9: ljmpl $0x8,$0xffee1
Run Code Online (Sandbox Code Playgroud)
从它的外观来看,此代码设置中断表和描述符表,然后打开保护模式.
转到启动加载程序代码 -
# Switch from real to protected mode, using a bootstrap GDT
# and segment translation that makes virtual addresses
# identical to their physical addresses, so that the
# effective memory map does not change during the switch.
lgdt gdtdesc
movl %cr0, %eax
orl …
Run Code Online (Sandbox Code Playgroud) 我正在为键盘输入工作,我正在开发一个非常基本的内核,而且我完全卡住了.我似乎无法在网上找到任何可以向我显示我需要知道的信息.
我的内核现在正在保护模式下运行,所以我无法使用实模式键盘例程而不会跳转到实模式和后退,这是我试图避免的.我希望能够从保护模式访问我的键盘.有谁知道如何做到这一点?到目前为止我唯一发现的是它涉及使用输入/输出端口直接与控制器通信,但除此之外我感到难过.当然,这不是经常出现的事情.通常,Assembly教程假设您正在运行下面的操作系统.
我是x86程序集的新手,所以我只是在寻找一些好的资源来处理来自保护模式的标准硬件.我正在用NASM编译汇编源代码并将其链接到用DJGPP编译的C源代码.有什么建议?
我想问一下,在启动过程中是否将GRUB切换到保护模式,或者它是Linux内核.而且我想问一下 - 内核本身(vmlinuz)是ELF还是纯二进制格式?谢谢.
我目前正在玩x86 Assember,以提高我的低级编程技能.目前,我在32位保护模式下的寻址方案面临一些问题.
情况如下:
我有一个程序加载在0x7e0,它将CPU切换到保护模式并跳转到代码中的相应标签:
[...]
code to switch CPU in Protected Mode
[...]
jmp ProtectedMode
[...]
bits 32
ProtectedMode:
.halt:
hlt
jmp .halt
Run Code Online (Sandbox Code Playgroud)
到目前为止这个工作绝对正常."jmp ProtectedMode"在没有显式远跳的情况下工作以清除预取队列 - 因为该程序加载了偏移量0(开头的org 0) - 导致代码段指向正确的位置.
我现在的问题是,在"ProtectedMode"标签中我想跳转到另一个加载到0x8000的程序(我用内存转储检查了这个,加载函数确实正常工作,程序正确加载到0x8000) .
由于CPU现在处于ProtectedMode而不再是RealMode,因此寻址模式不同.ProtectedMode使用描述符选择器查找基址和描述符表中的限制,以添加给定的偏移量并检索物理地址(据我所知).因此,在进入ProtectedMode之前必须安装GDT.
我看起来如下:
%ifndef __GDT_INC_INCLUDED__
%define __GDT_INC_INCLUDED__
;*********************************
;* Global Descriptor Table (GDT) *
;*********************************
NULL_DESC:
dd 0 ; null descriptor
dd 0
CODE_DESC:
dw 0xFFFF ; limit low
dw 0 ; base low
db 0 ; base middle
db 10011010b ; access
db 11001111b ; granularity
db 0 …
Run Code Online (Sandbox Code Playgroud) 我正在用C#编写IE扩展(BHO).在受保护模式下运行时(IE的新UAC兼容模式会强制所有扩展以低完整性运行),它会失败,因为它无法访问appdata文件夹中的user.config.
是否有某种方法可以通过较低完整性的进程来标记文件?
如果不这样做,是否有某种方法可以迫使BHO以中等程度的完整性运行?
如果失败了,有没有办法在低完整性文件夹中创建一个低完整性的符号链接,指向AppData中的中等完整性文件?
如果失败了,是否有某种方法可以强制应用程序在LocalLow文件夹中使用user.config文件?如何在.net中获取此文件夹的路径(它未在Environment.SpecialFolder下列出)?我是否可以退回运行XP的用户或关闭保护模式,而不会丢失所有user.config数据?
我正在做一些操作系统实验.到目前为止,我的所有代码都使用实模式BIOS中断来操作硬盘和软盘.但是一旦我的代码启用了CPU的保护模式,所有实模式BIOS中断服务程序将不可用.IR/W如何硬盘和软盘?我现在需要做一些硬件驱动吗?我该怎么开始?这是操作系统如此难以开发的原因之一吗?
我知道硬件都是通过读取和写入某些控制或数据寄存器来控制的.例如,我知道硬盘的命令块寄存器范围从0x1F0到0x1F7.但我想知道PC平台上这么多不同硬件的寄存器地址是否相同?或者我必须在使用之前检测到它?如何检测它们?
由于我不确定如何在保护模式下使用R/W软盘或硬盘,我现在必须使用BIOS中断将所有必要的内核文件从软盘加载到内存中.但是,如果我的内核文件超过实际模式1M空间限制,我该怎么办?
对于任何回复,我表示深深的感谢.
我依旧回忆起有一种方法可以先切换保护模式然后切换回实模式.然后我们可以在保护模式下使用BIOS例程.也许我记得错了.有人记得吗?
在我的Silverlight应用程序中,我使用常规SaveFileDialog来提示用户保存一些文件.
问题是在某些Windows 7计算机上,如果用户在保护模式下使用IE,并尝试保存到例如桌面上,则保存路径最终会像这样:
C:\Users\<user>\Appdata\Local\Microsoft\Windows\Temporary Internet Files\Virtualized\C\Users\<user>\Desktop
Run Code Online (Sandbox Code Playgroud)
有没有人知道我在哪里可以找到标志或值,表明这条路径将被用来代替Windows上的常规路径?
谢谢
c# silverlight internet-explorer protected-mode silverlight-oob
在学校,我们一直使用引导程序来运行没有操作系统的独立程序.我一直在研究这个程序,当启用保护模式时,通过直接将操作码和操作数组合为程序中的数据来执行远程跳转.这是为GNU汇编程序:
/* this code immediately follows the setting of the PE flag in CR0 */
.byte 0x66, 0xEA
.long TARGET_ADDRESS
.word 0x0010 /* descriptor #2, GDT, RPL=0 */
Run Code Online (Sandbox Code Playgroud)
首先,为什么要这样做(而不是指令助记符)?
我一直在看英特尔的手册,但我仍然对代码感到困惑.特别是在第2A卷第3-549页,有一个操作码表.相关条目:
EA *cp* JMP ptr16:32 Inv. Valid Jump far, absolute, address given in
operand
实际的操作码是显而易见的,但是第一个字节0x66让我感到困惑.参考英特尔手册中的表格,cp显然意味着将遵循一个6字节的操作数.显然,在接下来的两行中会有6个字节.0x66编码'操作数大小覆盖前缀'.这与表中的cp有什么关系?我原以为cp会有一些十六进制值,而是有这个覆盖前缀.有人可以帮我清楚一下吗?
这是od的转储:
c022 **ea66 0000 0001 0010** ba52 03f2 c030
TARGET_ADDRESS定义为0x00010000.
我也对最后两个字节的重要性感到困惑.然而,这似乎是另一个问题.现在已经很晚了,我一直盯着代码和英特尔手册几个小时,所以我希望我明白我的观点.
谢谢你的期待!
我正在构建一个IE扩展,我需要将我的Access数据库文件保存在Appdata文件夹中.它工作正常.但在IE IE保护模式为ON的许多系统中,它崩溃,我想这是因为IE保护模式不允许Extensions访问Appdata.我试图寻找出路,以便通过我的扩展程序检测IE是否处于保护模式.请提供一些代码片段和一些链接,让我摆脱这个问题.
问候
我也附上了错误的屏幕截图.
我正在开发一个操作系统项目,使用isolinux(syslinux 4.5)作为引导加载程序,使用组织在0x200000的多引导头加载我的内核.
据我所知,内核已经处于32位保护模式.我的问题:有没有更简单的方法来访问BIOS中断?(基本上我想要0x10:D)
加载后,我的内核设置了自己的GDT和IDT条目,并进一步重新映射IRQ.因此,在内核加载并设置VGA/SVGA模式(VBE 2.0模式)后,是否可以跳转到实模式.然后,我将继续我的内核并跳转到保护模式,我使用VBE 2.0物理缓冲区地址写入屏幕?如果有,怎么样?我尝试了很多,但没有成功:(
旁注:我在互联网上搜索了很多,发现syslinux 1.x +提供了_intcall api,我对此并不是100%肯定.请参阅"syslinux 4.5\com32\lib\sys\initcall.c"
protected-mode ×10
x86 ×5
assembly ×4
c# ×3
osdev ×2
bho ×1
bios ×1
bootloader ×1
cpu ×1
gnu ×1
grub ×1
interrupt ×1
kernel ×1
keyboard ×1
linux ×1
linux-kernel ×1
opcode ×1
silverlight ×1
syslinux ×1
x86-16 ×1