我有点困惑,我从许多不同的网站上阅读,但我不清楚:
每个段寄存器都有可见部分和不可见部分。可见部分称为段选择器,并且有直接指令来加载段选择器。
请求者特权级别(RPL):该字段标识提供受保护的数据访问的特权级别。
好的,我知道我可以在汇编中使用指令,例如加载选择器,但我无法修改 RPL,对吧?它从何而来?CPU是如何选择的呢?谢谢
我按照 Bare Bones 教程创建了一个内核。我添加了一些对终端滚动的支持,但它并没有真正起作用。当我在 VirtualBox 中运行最终的 ISO 映像时,出现了严重错误。日志文件充满了乱码。目前,我的终端滚动功能是:
void terminal_scroll()
{
uint8_t attribyte = (0 << 4) | (15 & 0x0F);
uint16_t blank = 0x20 | (attribyte << 8);
unsigned int i;
for (i = 0*80; i < 24*80; i++)
terminal_buffer[i] = terminal_buffer[i + 80]
for (i = 24*80; i < 25*80; i++)
terminal_buffer[i] = blank;
}
Run Code Online (Sandbox Code Playgroud) 有什么影响?内核是用静态库编译的还是内在实现的?
此外,根据this,内核代码不能使用任何浮点运算。这是为什么?
我在做一个操作系统的实现工作。
首先是代码:
//generate software interrupt
void generate_interrupt(int n) {
asm("mov al, byte ptr [n]");
asm("mov byte ptr [genint+1], al");
asm("jmp genint");
asm("genint:");
asm("int 0");
}
Run Code Online (Sandbox Code Playgroud)
我正在用-masm=intelgcc 中的选项编译上面的代码。此外,这不是生成软件中断的完整代码。
我的问题是我收到错误n undefined,我该如何解决,请帮忙?
我正在开发自己的引导加载程序 + 内核。我创建了一个项目放在github上:https : //github.com/rprata/ubootlua(分支tmp-libc-implementation)
我尝试使用 QEMU 运行我的 boot.bin:
qemu-system-i386 -fda boot.bin -nographic -serial stdio -monitor none
但是会发生崩溃:
> qemu-system-i386 -fda ./deploy/boot.bin -nographic -serial stdio -monitor none
> WARNING: Image format was not specified for './deploy/boot.bin' and probing guessed raw.
> Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
> Specify the 'raw' format explicitly to remove the restrictions.
> qemu: fatal: Trying to execute code outside RAM or …Run Code Online (Sandbox Code Playgroud) 操作系统如何知道 EIP 不再是有效/合法的指令并且该应用程序已崩溃?它如何知道何时生成故障转储数据?
我正在开发我的操作系统。
我在启动操作系统时出错。
错误是:
未找到 KERNEL.BIN!
以下是代码:
启动文件
; The Aqua_Seven_OS Operating System bootloader
; ==================================================================
BITS 16
jmp short bootloader_start ; Jump past disk description section
nop ; Pad out before disk description
; ------------------------------------------------------------------
; Disk description table, to make it a valid floppy
; Note: some of these values are hard-coded in the source!
; Values are those used by IBM for 1.44 MB, 3.5" diskette
OEMLabel db "MIKEBOOT" ; Disk label
BytesPerSector dw 512 ; Bytes per …Run Code Online (Sandbox Code Playgroud) 我知道GDT(全局描述符表)是如何实现的以及段寄存器和段描述符的使用。然而,如何/何时访问 GDT 条目呢?
是否可以通过基本 mov 指令访问,例如
mov [eax],ebx
Run Code Online (Sandbox Code Playgroud)
这是否隐式调用 ds 段寄存器,然后访问 GDT 段描述符,或者是否有其他方式访问 GDT 条目?
我是 OS 的学习者,正在尝试编写内核。
我在谷歌上搜索了“AMD x2APIC”,发现一些关于 EPYC 7002 系列的信息似乎支持它。
但我找不到相关文档。
所以我想问一下最近的AMD处理器是否支持它,如果是,我在哪里可以找到文档。
我正在尝试编写自己的操作系统,但到了需要设置分页的地步。我写了一些似乎有效的代码,但我意识到我不明白分页是如何工作的。现在我将尝试解释我是如何理解事物的,我将有一些问题!
所以据我所知,分页是一种将地址映射到其他地址的方式,以便每个应用程序都可以看到完整的地址空间(?)。有一种叫做页目录的东西,它存储 1024 个 4 字节的条目,每个条目包含一个指向页表的指针,该页表也有 1024 个条目。页表的每个条目都有一个指向 4 KiB 物理地址块开头的指针。这意味着 4096 字节 * 页表中的 1024 个条目 * 页目录中的 1024 个条目 = 可以映射的 4 GiB 内存。例如,我可以将应用程序加载到 0x80000000 并将该地址映射到 0x00000000,应用程序将看到其地址从 0x00000000 开始。
问题:
osdev ×10
x86 ×9
assembly ×6
apic ×1
bare-metal ×1
bootloader ×1
c ×1
c++ ×1
cpu ×1
crash ×1
gcc ×1
gdt ×1
linux-kernel ×1
memory ×1
nasm ×1
page-tables ×1
paging ×1
privileges ×1
qemu ×1
scroll ×1
terminal ×1
x86-16 ×1