问题标签 [protected-mode]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
operating-system - 如何在c中以保护模式打印字符串
我是 os Deving 的入门者,并设法制作了一个引导加载程序,然后是一个内核。我成功地跳转到了保护模式并将控制权转移到了内核。我可以写单个字符但打印字符串不起作用。这是我的 printString()功能。
我的打印字符功能在这里
这是函数调用
请帮助我,我是操作系统开发的初学者
assembly - 操作系统开发 - 在保护模式下执行第一条指令
我指的是Broken Thorn的操作系统开发教程。我目前正处于执行第二阶段引导加载程序以加载 GDT 并进入保护模式的阶段。
我了解 GDT 的工作原理以及如何进入保护模式。但是,我的困惑是加载cr0
寄存器后执行的第一条指令:
此时,CS 尚未加载指向代码描述符的选择器值,我们已经处于保护模式。此 CS 值可能与用于执行实模式指令的值不同,因此添加 IP 的值也会导致地址与jmp
. 那么这不会导致基于 CS 的值执行一些垃圾代码吗?还是我缺少什么?
assembly - 这可以在保护模式或实地址模式下运行,我如何更改它正在运行的模式?
关于我的编程课的另一个问题,实际上是几个。首先,程序已经编写好了,代码可以在下面找到。
问题一:
现在,在说明中明确指出程序可以在保护模式或实地址模式下完成。我相当肯定 Windows 在保护模式下运行,因此这意味着我已经以这种方式完成了练习。如果我愿意,如何改变程序执行的模式?我说 Windows 在保护模式下运行是否正确?
问题2:
我在下面的汇编代码中写了一些注释,说明如何正确填充寄存器的前 16 位?
问题 3:
最后,在最终提交中包含清单文件和地图文件的指令要求,我找不到这些文件。
assembly - 如何在 IN 指令汇编保护模式下使用组合键?
我正在使用此代码从键盘获取输入,但我想不出一种方法来获取像“shift + a”= A 这样的组合键
注意 - putchar 是我制作的一个程序,它可以在 al 中打印任何内容。
interrupt - BIOS Interrupts in protected mode
I'm working on an operating system project, using isolinux (syslinux 4.5) as bootloader, loading my kernel with multiboot header organised at 0x200000.
As I know the kernel is already in 32-bit protected mode. My question: Is there any easier way to get access to BIOS Interrupts? (Basically I want 0x10 :D)
After loading, my kernel sets up its own GDT and IDT entries and further remaps IRQs. So, is it possible to jump into real mode just after the kernel is loaded and set up VGA/SVGA modes (VBE 2.0 mode). Then after I'll proceed with my kernel and jump into protected mode where I use VBE 2.0 physical buffer address to write onto screen? If yes how? I tried a lot but didn't get success :(
Side note: I searched a lot on internet and found that syslinux 1.x+ provides _intcall api, I'm not 100% sure about it. Refer to "syslinux 4.5\com32\lib\sys\initcall.c"
assembly - Infinite loop when i try to compile a C program, with self made kernel,in protected mode, using nasm and qemu
My operating system is Ubuntu. I am trying to follow through a tutorial building a kernel..Even though i ve built the kernel, when i try to compile a simple C program that prints an 'X' on the top left corner of the screen in qemu,the screen just loops infinitely between some Real-Mode print commands, without ever landing in protected mode.. The program includes loading some extra sectors with disk_load.asm, then switching to 32 bit protected mode with switch_to_pm, and then executing the C code
Here is the code.
boot_sect.asm
disk_load.asm
switch_to_pm.asm
the GDT code, that contains the gdt_descriptor
gdt.asm
print_string.asm
That is the C program that prints an 'X'
kernel.c
In order to make the C code, raw machine code we type in the directory we have saved the kernel.c file
then in order to create the binary file for qemu
and finally
to execute the code as a floppy
and now instead of printing an 'X' it just loops infinitely, printing only the Real Mode strings("Started in 16 bit Real-Mode"and "Loading Kernel into memory.", and not entering 32bit protected mode. I tried running every piece of code in nasm one by one,and then adding every individual piece of code together, and it seemed like the loop began when the switch_to_pm piece of code was added.Why is that? (i think something is faulty with switch_to_pm code) Thank you a lot.
assembly - GDT 的粒度位在寻址内存方面到底有什么变化?
如果该位为零,那么内存是逐字节寻址的吗?如果它是 1,那么内存是 4Kb x 4Kb 寻址的吗?
例如,如果该位设置为 0,并且我寻址内存位置 a000h,那么我将寻址该位置的字节,对吗?如果我寻址下一个位置 a001h,那么那将是内存中的下一个字节,对吗?
但是如果这个位是 1,我会寻址 4Kb 块吗?
那么寻址a000h会给我一个4Kb的块,而a001是内存中的下一个4Kb吗?
assembly - 在 CR0 中设置 PE 标志如何启用保护模式?
我试图了解机器如何从开机到运行内核。从我收集到的信息来看,在启动期间切换到保护模式以访问更多可寻址内存是很有用的,即使我们最终会切换到更传统的虚拟内存计划,其中页目录和页表以及分段关闭.
似乎要切换到保护模式,必须做 3 件事:
- 建立一个全局描述符表(gdt)并使用
lgdt
指令加载它 - 将控制寄存器 CR0 中的 PE 标志/位设置为启用(即值 1)
- 执行跳远
ljmp
我想知道将段寄存器和指令指针转换为与 gdt 一起使用的索引和偏移量的逻辑。这个逻辑是硬件完成的吗?如果是,那是哪块硬件,为什么要执行ljmp
部分过程?为什么不简单地将 CR0 中的 PE 标志设置为启用保护模式(没有后续ljmp
)?
c++ - C++ - 32 位保护模式
我正在开发一个将用 32 位 C++ 编写的操作系统内核。我需要弄清楚如何在 C++ 中启用 32 位保护模式/启用 a20 门。那么,你能告诉我这是否可能,如果可能,如何?谢谢你。
protected-mode - 进入保护模式重启
为了了解操作系统的工作原理,我制作了一个简单的引导加载程序,它加载了一个用于测试保护模式等的小型测试应用程序。引导扇区在 0x7c00 加载后,引导加载程序在段 0x2000 加载测试代码并启动第一条指令。但是当我尝试进入保护模式时,系统会重新启动。谁能帮我解决这个问题?
这是我在 0x2000 部分的代码