首页 文章
  • 66 votes
     answers
     views

    开发操作系统的资源[关闭]

    我打算编写一个操作系统,我对操作系统知之甚少 . 是否有任何好的资源或书籍可供我学习?你有什么建议?
  • 110 votes
     answers
     views

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

    这可能是徒劳的,因为我知道编写一个操作系统是无法忍受的复杂(尤其是自己) . 我不希望构建下一个linux或windows . 我知道这将是可怕的,而且越野车,并且不起作用,但那没关系 . 我想在Assembly,C和(某些)C中自己编写所有内容 . 这是一个未来的项目,因为我现在忙于其他一些事情并且没有立即的时间,但我想我现在会问它,所以也许我可以得到很多答案,它可以构建并成为这种方...
  • 5 votes
     answers
     views

    Bootloader在真实硬件上打印垃圾

    我正在尝试编写自己的bootloader . 虽然它在QEMU,Bochs和VirtualBox中运行良好,但我似乎无法在笔记本电脑上运行 . 在我的笔记本电脑上,引导加载程序与所有模拟器的行为完全不同,挂起看似随机的地方,拒绝打印,甚至跳过一些 jmp $ 指令 . 虽然我对“真实硬件”有很多麻烦,但我认为它们都有一个原因 . 以下代码是一个短引导加载程序,应该打印“TEST”消息3次,然后跳转...
  • 2 votes
     answers
     views

    内存映射i / o操作(在intel处理器中)使用输入/输出指令...仍然被缓存?

    即使我使用输入/输出指令,如果映射的i / o的地址范围被输入为回写(WB),是否仍会缓存内存映射的i / o操作(在intel处理器中)? 编辑:这个问题解决了 . 我发现MMIO是可缓存的,MMIO操作可以根据它的内存类型重新排序 . 这就是为什么英特尔建议使用MTRR设置MMIO作为UC(不可缓存)..我在英特尔软件开发人员手册v3A上找到了它,它也可能应用于amd处理器......
  • 3 votes
     answers
     views

    OS开发 - 在保护模式下执行第一条指令

    我指的是Broken Thorn的操作系统开发教程 . 我目前正处于执行第二阶段引导加载程序以加载GDT并进入保护模式的阶段 . 我了解GDT如何工作以及如何进入保护模式 . 但是,我的困惑是加载 cr0 寄存器后执行的第一条指令: jmp 08h:Stage3 ; far jump to fix CS. Remember that the code selector is 0x8! ...
  • 4 votes
     answers
     views

    跳入保护模式时出现三重故障

    我正在开发一个启动加载程序,它将在切换到保护模式后启动到一个简单的内核 . 我在第四章或第五章的某处使用了this paper作为教程 . 从理论上讲,它应该以16位实模式启动,将内核加载到内存中,切换到32位保护模式并开始执行内核代码 . 但是,当我切换到保护模式并远程跳转或跳转到另一个段时,它会出现三重故障 . 这是主引导扇区代码: [org 0x7c00] KERNEL_OFFSET eq...
  • 1 votes
     answers
     views

    链接内核后跳转到保护模式不起作用

    我一直在开发一个Bootloader,并且在将c代码链接到我的程序集stage2代码之前遇到问题,然后我将文件链接到第二阶段会跳转到保护模式然后转到长模式而没有任何问题但是现在在我链接之后似乎跳转到保护模式时出现问题以下是我用来跳转到保护模式的代码: main: ;first stage of bootloader is loaded at the address 0x07...
  • 1 votes
     answers
     views

    32位保护模式启动加载器光标在没有显示代码的屏幕上竞争?

    我正在使用https://www.cs.bham.ac.uk/~exr/lectures/opsys/10_11/lectures/os-dev.pdf作为我的教科书从头开始编写基本内核 . 我已经编写了基本的16位引导加载程序,我只是根据本文编写了切换到保护模式的代码 . 它定义了一个基本的通用描述符表,加载它,并在cr0特殊寄存器中翻转一下 . 但是,当我尝试启动代码时,我会在屏幕底部反复出现...
  • 6 votes
     answers
     views

    使用LLDT并为其配置GDT

    我正在开发一个小型操作系统,它将为每个进程使用单独的本地描述符表 . 我知道我需要使用 lldt 指令从我的GDT加载LDT段 . 我已经使用有效的GDT在保护模式下运行我的内核,但我无法弄清楚我的LDT的GDT条目应该是什么样子 . 我知道它的基地址应该指向我的LDT,但我不知道特权级别和其他属性应该是什么 . 这是代表我的GDT中的LDT条目的NASM代码: localTable equ $-...
  • 1 votes
     answers
     views

    切换到保护模式后,跳转到32位代码似乎没有生效

    经过与我自己的争论,我终于决定将我的操作系统转移到保护模式 . 但是,我在执行保护模式代码时遇到了一些问题 . OSDev wiki的第一步是启用A20系列,因为快速门,我没有遇到什么麻烦 . 第二部分是加载全局描述符表 . 我按照BrokenThorn娱乐教程使用它作为我的GDT的粗略基础,并将一些长二进制值转换为漂亮和短的十六进制值 . 最后,我将cr0寄存器的最低位设置为1进入保护模式 ....
  • 3 votes
     answers
     views

    在保护模式下进行间接远程跳转/呼叫

    如何在保护模式下执行间接远程跳转/呼叫?首先,我认为这样做是允许的: jmp 0x10:eax; (不要担心段选择器..我的GDT的第二个条目是一个有效的代码段) 但是当nasm组装它时,这是一个语法错误 . 查看英特尔(指令集参考)手册的第2a册,它只能使用 jmp ptr16:32 来完成,其中 ptr16:32 是立即值,或者使用 jmp m16:32 ,其中 m16:32 是包含48位跳...
  • 1 votes
     answers
     views

    无法在磁盘上保存引导扇区并在磁盘上运行OS然后将其加载到内存中

    背景资料 我正在开发一个简单的DOS操作系统 . 所以我不打算很快进入保护模式 . 操作系统将以汇编语言编写;顺便说一句NASM语法 . 引导扇区应该将引导扇区保存在硬盘的第一个扇区上,OS代码保存在第二个扇区上 . 这样它就可以从硬盘启动,而不是从CD映像启动 . 问题 问题是启动扇区似乎可以在硬盘上正确保存所有内容 . 但是当我重新启动VMware Player并弹出虚拟CD-ROM时 . 它...
  • 1 votes
     answers
     views

    设置全局描述符表和保护模式后不断重新启动

    我必须做错 GDT setup 并切换到 protected mode 因为它不断重启 . 这是我的 kernel.asm 应该设置 GDT 并切换到 protected mode : bits 16 jmp main %include "gdt.inc" main: cli xor ax,ax mov...
  • 3 votes
     answers
     views

    为什么在切换到保护模式之前在引导加载程序中测试端口0x64?

    在我的麻省理工学院OS课程(686)中,我发现了一些代码,我试图理解boot / boot.S中的指令 inb $0x64, %al . 我的理解是它从数据端口0x64读取一个字节到AL,什么是端口0x64?它忙于测试哪种设备或机制?我对代码忙的评论感到困惑?评论意味着什么,它指的是什么? # Enable A20: # For fascinating historical reasons ...
  • 2 votes
     answers
     views

    进入长模式

    我一直在研究引导加载程序,目前正试图让它切换到长模式 . 到目前为止我已经切换到保护模式,我确信它有效,但似乎当我启用分页进入长模式时会导致故障 . 我想这可能是因为我的页面表 . 这是代码: [BITS 16] org 0x2000 Start: jmp main ;Constants %DEFINE TEAL 0x03 %DEFINE RED 0x04 %DEFINE ...
  • 4 votes
     answers
     views

    在保护模式下重新启动

    在x86实模式下,重启非常简单 . 您可以使用BIOS或: jmp 0xFFFF:0000 但是如何在保护模式下重启?
  • 3 votes
     answers
     views

    无法在保护模式下设置GS寄存器

    我正在编写一个基于OSDev Wiki和一些相关书籍的信息的操作系统 . 我发现在跳转到保护模式后,段初始化例程没有正确执行 . 这是我的第二阶段加载器和内核代码: ; stage2 ; still -f bin [org 0xd200] ; calculated by first stage loader ; GDTs are defined here jmp entry GDT_DESC_...
  • 3 votes
     answers
     views

    保护模式寻址

    我正在尝试启动加载程序开发教程 . 我能够使用FAT12约定读取stage2引导加载程序 . 现在我试图在实模式下加载内核,然后将其复制到0x0100000地址 . 我在复制跳转到0x0100000时遇到三重故障 . 基本上我无法弄清楚如何访问或跳转到0x0100000 . 我的代码在我使用时有效 IMAGE_PMODE_BASE equ 0x1000 IMAGE_RMODE_BASE equ 0...
  • 1 votes
     answers
     views

    进入保护模式并执行远jmp后的三重故障[重复]

    这个问题在这里已有答案: Constant reboot after setting up the Global Descriptor Table and protected mode 1回答 我正在写一个业余爱好OS内核 . 每次内核进入保护模式并跳转到其保护模式部分时,Bochs会将故障三重并给我: 00014918914i[BIOS ] Booting from 0000:7c00 0...
  • 561 votes
     answers
     views

    什么是开始操作系统开发的资源? [关闭]

    我一直想做的一件事是开发我自己的操作系统(不一定像Linux或Windows那样花哨,但比我已经完成的简单的引导加载程序更好) . 我很难找到资源/指南,让你过去编写一个简单的“Hello World”操作系统 . 我知道很多人可能会建议我看看Linux或BSD;但是像这样的系统的代码库(大概)是如此之大,以至于我不知道从哪里开始 . 有什么建议? 更新:为了让通过Google登陆此帖子的人们更容...
  • 3 votes
     answers
     views

    在平面二进制文件中包含char数组的内容

    我使用平面二进制文件作为我的操作系统的外部程序 . 当我编译它们时,如下: gcc -Wall ctest.c -o ctest.bin -nostdlib -Wl,-Ttext=0x8000,-nostdlib -masm=intel objcopy -O binary -j .text ctest.bin ctest 但是这样做,字符数组的内容不会放在文件中 . 这是我的代码: static...
  • 1 votes
     answers
     views

    无法将平面二进制文件加载到内核中

    注意 - 我还没有设置分页,我的内核是多引导,ELF . 我确实有irqs和isrs完成 . 所以我在这里有这个GAS文件: .section .text .global _start _start: mov $0xDEADBEEF, %eax 并且GRUB2设置加载平面二进制文件: menuentry "fOS-Terminal (25x80)" { mu...
  • 3 votes
     answers
     views

    如何将部分映射到ELF输出文件中的段?

    好吧,我已经在程序集中编写了一个bootloader并试图从中加载一个C内核 . 这是引导程序: bits 16 xor ax,ax jmp 0x0000:boot extern kernel_main global boot boot: mov ah, 0x02 ; load second stage to memory mov al, 1 ...

热门问题