标签: protected-mode

bootloader - 将处理器切换到保护模式

我很难理解简单的引导装载程序是如何工作的.我正在谈论的引导加载程序是麻省理工学院"操作系统工程"课程中的一个.

首先,让我向您展示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)

从它的外观来看,此代码设置中断表和描述符表,然后打开保护模式.

  1. 为什么我们在BIOS中进入保护模式?引导程序不应该以实模式运行(顺便说一下 - 为什么它需要在实模式下运行?)
  2. 我搜索但没有找到ljmpl指令的确切工作方式,并且它与ljmp和常规jmp之间的区别 - 如果有人指向正确的方向,我将不胜感激.
  3. 我们为什么要跳跃?这条指令的目的是什么?

转到启动加载程序代码 -

# 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)

x86 assembly operating-system protected-mode bootloader

27
推荐指数
1
解决办法
9784
查看次数

x86组件上的保护模式键盘访问

我正在为键盘输入工作,我正在开发一个非常基本的内核,而且我完全卡住了.我似乎无法在网上找到任何可以向我显示我需要知道的信息.

我的内核现在正在保护模式下运行,所以我无法使用实模式键盘例程而不会跳转到实模式和后退,这是我试图避免的.我希望能够从保护模式访问我的键盘.有谁知道如何做到这一点?到目前为止我唯一发现的是它涉及使用输入/输出端口直接与控制器通信,但除此之外我感到难过.当然,这不是经常出现的事情.通常,Assembly教程假设您正在运行下面的操作系统.

我是x86程序集的新手,所以我只是在寻找一些好的资源来处理来自保护模式的标准硬件.我正在用NASM编译汇编源代码并将其链接到用DJGPP编译的C源代码.有什么建议?

keyboard x86 kernel protected-mode osdev

15
推荐指数
1
解决办法
6623
查看次数

GRUB是否切换到保护模式?

我想问一下,在启动过程中是否将GRUB切换到保护模式,或者它是Linux内核.而且我想问一下 - 内核本身(vmlinuz)是ELF还是纯二进制格式?谢谢.

linux cpu grub protected-mode linux-kernel

15
推荐指数
2
解决办法
4884
查看次数

汇编程序使用GDT跳转到保护模式

我目前正在玩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)

x86 assembly protected-mode addressing-mode

12
推荐指数
1
解决办法
8392
查看次数

如何在IE保护模式下访问AppData(来自托管BHO)

我正在用C#编写IE扩展(BHO).在受保护模式下运行时(IE的新UAC兼容模式会强制所有扩展以低完整性运行),它会失败,因为它无法访问appdata文件夹中的user.config.

是否有某种方法可以通过较低完整性的进程来标记文件?

如果不这样做,是否有某种方法可以迫使BHO以中等程度的完整性运行?

如果失败了,有没有办法在低完整性文件夹中创建一个低完整性的符号链接,指向AppData中的中等完整性文件?

如果失败了,是否有某种方法可以强制应用程序在LocalLow文件夹中使用user.config文件?如何在.net中获取此文件夹的路径(它未在Environment.SpecialFolder下列出)?我是否可以退回运行XP的用户或关闭保护模式,而不会丢失所有user.config数据?

c# internet-explorer bho protected-mode

10
推荐指数
2
解决办法
3379
查看次数

实模式BIOS例程和保护模式

我正在做一些操作系统实验.到目前为止,我的所有代码都使用实模式BIOS中断来操作硬盘和软盘.但是一旦我的代码启用了CPU的保护模式,所有实模式BIOS中断服务程序将不可用.IR/W如何硬盘和软盘?我现在需要做一些硬件驱动吗?我该怎么开始?这是操作系统如此难以开发的原因之一吗?

我知道硬件都是通过读取和写入某些控制或数据寄存器来控制的.例如,我知道硬盘的命令块寄存器范围从0x1F0到0x1F7.但我想知道PC平台上这么多不同硬件的寄存器地址是否相同?或者我必须在使用之前检测到它?如何检测它们?

由于我不确定如何在保护模式下使用R/W软盘或硬盘,我现在必须使用BIOS中断将所有必要的内核文件从软盘加载到内存中.但是,如果我的内核文件超过实际模式1M空间限制,我该怎么办?

对于任何回复,我表示深深的感谢.

更新

我依旧回忆起有一种方法可以先切换保护模式然后切换回实模式.然后我们可以在保护模式下使用BIOS例程.也许我记得错了.有人记得吗?

x86 assembly operating-system protected-mode x86-16

10
推荐指数
2
解决办法
4312
查看次数

在某些计算机上使用虚拟化路径的临时目录

在我的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

10
推荐指数
1
解决办法
1121
查看次数

有人可以解释这个直接组装的x86 JMP操作码吗?

在学校,我们一直使用引导程序来运行没有操作系统的独立程序.我一直在研究这个程序,当启用保护模式时,通过直接将操作码和操作数组合为程序中的数据来执行远程跳转.这是为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.

我也对最后两个字节的重要性感到困惑.然而,这似乎是另一个问题.现在已经很晚了,我一直盯着代码和英特尔手册几个小时,所以我希望我明白我的观点.

谢谢你的期待!

x86 assembly gnu opcode protected-mode

8
推荐指数
1
解决办法
6314
查看次数

如何使用c#检测IE保护模式

我正在构建一个IE扩展,我需要将我的Access数据库文件保存在Appdata文件夹中.它工作正常.但在IE IE保护模式为ON的许多系统中,它崩溃,我想这是因为IE保护模式不允许Extensions访问Appdata.我试图寻找出路,以便通过我的扩展程序检测IE是否处于保护模式.请提供一些代码片段和一些链接,让我摆脱这个问题.

问候

我也附上了错误的屏幕截图. 替代文字

c# internet-explorer protected-mode

8
推荐指数
1
解决办法
1672
查看次数

BIOS在保护模式下中断

我正在开发一个操作系统项目,使用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"

interrupt bios protected-mode osdev syslinux

7
推荐指数
2
解决办法
2339
查看次数