osdev相关内容

寻呼到底是什么?OSDEV

我正在尝试编写自己的操作系统,到了需要设置分页的时候。我编写了一些代码,这些代码似乎可以工作,但我意识到我不理解分页是如何工作的。现在我会试着解释我是如何理解事情的,我会有几个问题! 据我所知,分页是一种将地址映射到其他地址的方式,以便每个应用程序都可以看到完整的地址空间(?)。有一种叫做页目录的东西,它存储了1024个4字节的条目,每个条目都包含指向页表的指针,页表也有1024个条目。页表的每 ..
发布时间:2022-09-06 15:37:18 其他开发

为什么QEMU在填写PML4的上半部分时返回错误的地址?

我正在编写一个使用UEFI引导的小型x86-64操作系统。我试图通过将内核的可执行文件移到0x800000000000来使内核成为更高的半内核。此地址应该在PML4的中间。基本上,我应该填写PML4的第256项来处理这较高的一半。我试图这样做,但我的代码出现了三重错误。由于我在QEMU上测试内核并使用gdb进行调试,因此我在gdb中使用monitor info mem来查看虚拟地址到物理地址的映射 ..
发布时间:2022-08-02 23:14:07 其他开发

英特尔x86-中断服务例程职责

我没有这个词的真正意义上的问题,而是我将尝试澄清一个内容问题。假设我们有一个微内核(PC Intel x86;32位保护模式),对于每个CPU异常,都使用中断描述符表(IDT)和中断服务例程(ISR)。如果出现Division by Zero异常,则ISR调用成功。 global ir0 extern isr_handler isr0: cli push 0x00 ; ..
发布时间:2022-05-08 20:33:59 其他开发

x86 程序集上的保护模式键盘访问

我正在为我正在开发的一个非常基本的内核处理键盘输入,但我完全陷入困境.我似乎无法在网上找到任何可以显示我需要知道的信息的信息. 我的内核现在在保护模式下运行,所以我不能使用实模式键盘例程而不跳转到实模式并返回,这是我试图避免的.我希望能够从保护模式访问我的键盘.有谁知道如何做到这一点?到目前为止,我发现的唯一一件事是它涉及直接使用输入/输出端口与控制器对话,但除此之外,我感到很困惑.当然,这 ..
发布时间:2022-01-13 22:17:05 其他开发

如何在旧台式计算机上构建小型操作系统?

这可能是徒劳的,因为我知道编写操作系统非常复杂(尤其是自己编写). 我不希望构建下一个 linux 或 windows. 我知道这会很糟糕,而且很麻烦,而且不会起作用,但没关系. 我想自己编写所有东西,用 Assembly、C 和(一些)C++. 这是一个未来的项目,因为我目前正忙于其他事情,没有时间,但我想我现在会问它,所以也许我可以得到很多答案,它可以构建并成为这种方法 ..
发布时间:2022-01-11 23:44:35 其他开发

x86 处理器如何在引导加载程序加载 GDT 之后获取指令?

在为 x86 编写的典型简单引导加载程序中,我们有以下代码来加载 GDT 并执行远跳转(注意在执行以下代码之前 CS 为 0x0): lgdt gdtdesc移动 %cr0, %eaxorl $1, %eax移动 %eax, %cr0# 跳转到下一条指令,但在 32 位代码段中.# 将处理器切换到 32 位模式.ljmp $0x8, $protcseg.code32 # 汇编为 32 位模式程序 ..
发布时间:2022-01-11 23:41:05 其他开发

对于内核/操作系统,C 仍然是它吗?

我喜欢操作系统,并最终希望成为一名主要从事内核开发的操作系统开发人员.将来,C 语言仍将是首选语言,我还应该尝试学习什么? 解决方案 我认为可以肯定地说操作系统的低级部分(例如内核)将继续用 C 编写,因为它的速度.就像其他地方提到的那样,您需要了解内核某些部分的汇编程序(需要将内核加载到内存中).但是您可以在很少或根本没有汇编知识的情况下使用内核.一个很好的例子是如果你正在实现一个文件系 ..
发布时间:2022-01-11 23:19:57 其他开发

操作系统开发入门有哪些资源?

我一直想做的一件事是开发自己的操作系统(不一定像 Linux 或 Windows 那样花哨,但比我已经做过的简单引导加载程序更好). 我很难找到资源/指南来帮助您完成编写简单的“Hello World".操作系统. 我知道很多人可能会推荐我看看 Linux 或 BSD;但是像这样的系统的代码库(大概)太大了,我不知道从哪里开始. 有什么建议吗? 更新:为了让那些通过 Goo ..
发布时间:2022-01-11 22:42:11 其他开发

如何在编译/链接时使用地址进行计算?

我编写了一些代码来初始化 IDT,它将 32 位地址存储在两个不相邻的16 位半.IDT 可以存储在任何地方,您可以通过运行 LIDT 指令告诉 CPU 在哪里. 这是初始化表格的代码: void idt_init(void) {/* 不幸的是,我们不能把它写成循环.第一个选项,* 用地址初始化 IDT,在这里循环它,并且* 重新初始化描述符不起作用,因为分配了一个*一个uintptr_t ..
发布时间:2022-01-11 15:24:53 其他开发

为 x86 架构开发操作系统

我计划为 x86 架构开发一个操作系统. 我有哪些编程语言可供选择? 有哪些类型的编译器可用,最好在 Windows 环境中使用? 是否有任何好的来源可以帮助我了解有关操作系统开发的更多信息? 是在虚拟机上还是在物理硬件上测试我的操作系统更好? 有什么建议吗? 解决方案 在我最后一年的拼贴项目中,我开发了一个带有虚拟内存管理器、虚拟文件系统和完全抢占式多任务处理的小型 x ..
发布时间:2022-01-06 13:10:08 其他开发

为什么将字符传递给函数会改变它在 c 中的值?

我目前正在关注 此工作簿关于构建操作系统. 我的意图是编写一个 64 位内核.我已经在文本模式下加载“内核"代码并将单个字符写入帧缓冲区. 当我通过将代码包装在一个函数中来添加一个间接级别以将单个字符写入帧缓冲区时,我的问题出现了.传递给函数的 char 值似乎以某种方式被破坏了. 我有三个文件: bootloader.asm ;引导程序.asm[组织 0x7c00]内核 ..
发布时间:2022-01-06 13:07:52 其他开发

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

我正在为我正在开发的一个非常基本的内核处理键盘输入,但我完全卡住了.我似乎无法在网上找到任何可以显示我需要了解的信息的信息. 我的内核现在正在保护模式下运行,所以我无法使用实模式键盘例程而不跳转到实模式并返回,我试图避免这种情况.我希望能够从保护模式访问我的键盘.有谁知道如何做到这一点?到目前为止我发现的唯一一件事是它涉及使用输入/输出端口直接与控制器对话,但除此之外我很难过.当然,这不是经 ..
发布时间:2022-01-06 13:02:11 其他开发

直接打印到文本视频内存时出现意外输出

我正在用 C 开发内核,并创建了一些可以在视频内存的屏幕上打印的内容.我希望视频内存中的第一个字节是要打印的字符,第二个字节告诉颜色.但我的程序有一些不同的东西,但它有效!!这是非常出乎意料和不寻常的. 我的内核代码- #define VIDEO_MEM 0xb8000void write_string( int colour, const unsigned char *string ); ..
发布时间:2022-01-06 12:31:53 其他开发

如何从 Rust 调用原始地址?

我正在用 Rust 编写操作系统,需要直接调用我正在计算的虚拟地址(u32 类型).我希望这相对简单: let code = virtual_address as (extern "C" fn());(代码)(); 然而,这抱怨演员是非原始的.它建议我使用 From 特性,但我看不出这有什么帮助(尽管我对 Rust 比较陌生,所以可能会遗漏一些东西). error[E0605]: non-p ..
发布时间:2021-12-25 09:46:11 其他开发

如何修复“os.asm:113: error: TIMES value -138 is negative"汇编语言

我正在用汇编语言开发操作系统.在某个时间,我从 NASM 收到此错误: os.asm:113: 错误:TIMES 值 -138 为负 我想把这个项目进行到底.只有这样的错误让我绝望! 代码如下: BITS 16开始:移动斧头,07C0h;在此引导加载程序之后设置 4K 堆栈空间添加斧头,288;(4096 + 512)/每段 16 字节mov ss, 斧头mov sp, 409 ..
发布时间:2021-12-18 09:32:28 其他开发

如何将 bin 文件(512 字节)写入软盘的第一个扇区(扇区 0)?

如何将 .bin 文件写入软盘/虚拟软盘/软盘映像的第一个扇区? 我正在尝试启动一个简单的 512 字节引导加载程序.到处都显示“512 字节"的大小,所以我应该已经很好了. 附加信息: 引导加载程序只显示一个字符串,我正在学习简单汇编.一些工作在 Windows 中完成,一些在 Ubuntu 14.04(可信赖的塔尔)(如果这很重要). 即使有引导加载程序标志,它也无法启 ..
发布时间:2021-12-18 09:21:10 其他开发

用于在第二阶段引导实模式代码的传统 BIOS 引导加载程序

我正在编写自己的操作系统.到目前为止,我的代码超过了 512 字节,这对于一个简单的引导扇区来说太大了. 我知道我现在必须编写一个引导加载程序来读取任意代码,这些代码可能大于或不大于单个 512 字节扇区. 引导加载程序需要: 用作具有磁盘签名 0xaa55 的引导记录. 从内存地址 0x7E00 开始,从任意长度的 LBA 1(LBA 0 是引导扇区)开始读取第二阶段(测试代 ..
发布时间:2021-12-18 08:53:37 其他开发

如何为我的引导加载程序制作内核?

我正在尝试制作自己的自定义操作系统,但我的代码需要一些帮助.这是我的bootloader.asm: [ORG 0x7c00]开始:命令行异或斧头,斧头mov ds, 斧头mov ss, 斧头移动,斧头mov [BOOT_DRIVE], dl移动 bp, 0x8000mov sp, bp移动 bx, 0x9000mov dh, 5mov dl, [BOOT_DRIVE]调用 load_kernel ..
发布时间:2021-12-18 08:53:08 其他开发

如何在没有操作系统的情况下运行程序?

如何在不运行操作系统的情况下自行运行程序?您能否创建计算机可以在启动时加载和运行的汇编程序,例如从闪存驱动器启动计算机并运行 CPU 上的程序? 解决方案 如何在不运行操作系统的情况下自行运行程序? 您将二进制代码放在处理器重新启动后查找的位置(例如 ARM 上的地址 0). 您能否创建计算机可以在启动时加载和运行的汇编程序(例如,从闪存驱动器启动计算机并运行驱动器上的程序 ..
发布时间:2021-11-30 11:16:24 其他开发