osdev

    1热度

    1回答

    我目前遵循启用GDT分段的指南。我使用GNU汇编程序,用Bochs进行仿真。 我知道我需要用GDT描述符加载GDT寄存器。我已经完成了,接下来的步骤是现在将所有带有偏移量的段寄存器加载到代码/数据段描述符的各个位置。这样做的代码表述为以下几点: reloadSegments: ; Reload CS register containing code selector: JMP

    -1热度

    1回答

    编辑:对于源代码,您可以在Github上检查我的回购:https://github.com/tuhdo/os-study。 我映射到2层的PIC(86)到第32项及以后在IDT的的IRQ。为了测试PIC中断,我把前31个例程设置为相同的功能。问题是,我无法获得第15个中断入口,因为它是根据Interrupt Vector Table保留的。也就是说,只要我进入保护模式,启用后的模式cr0然后跳转到

    -9热度

    1回答

    我目前正在使用我的操作系统。自从前天开始,我已经开始构建它。我想知道如何使用C语言或程序集打开.bin文件。我希望它在我的操作系统运行时打开,然后单击一个按钮。 我只能集中使用或C.

    -2热度

    2回答

    我正在用C语言和程序集编写操作系统,并且在实现EXT2文件系统时遇到了问题。我需要在C中将十六进制的四个字节转换为十进制。例如,将00 00 01(10000)转换为65536。我需要转换为十进制,因为解析超级块需要所有值都是十进制。最特别的ext2文件我的工作是在这里: #include "ext2.h" #include <stdlib.h> long hex2dec(unsigned c

    1热度

    1回答

    我在GDT,IDT和ISR上关注Bran's tutorial。我写了异常处理程序,但是当我通过除零来测试它时,它发生了三重故障。我不确定我做错了什么。这里是descriptor_table.h: #ifndef VOS_DESCRIPTOR_TABLE_H #define VOS_DESCRIPTOR_TABLE__H #include <stddef.h> #include <stdi

    0热度

    3回答

    我正在写一点操作系统,我需要能够打印添加的变量。我有一个工作atoi函数,所以我倒过来给我一个itoa函数。没有办法访问空闲内存,所以我需要弄清楚为了创建适当大小的字符数组的位数。我想我需要用10除以得到它,然后将这些值模数化到正确的位置。这是我的C代码到目前为止: char* itoa(int res) { int size = 0; int t = res; w

    1热度

    1回答

    我想在x86程序集(16位实模式)中创建一个简单的第二阶段命令系统。函数com_dir假设在扇区以字母'F'开始时读取720KB软盘和打印字符串。 这里是第二个阶段: [BITS 16] [ORG 0x0000] mov ax, cs mov ds, ax mov [drive_num], dl mov [root_drive], dl mov bx, load_msg call

    1热度

    1回答

    根据体系结构概述文档,Aarch64支持4k和64k页面。一些CPU也支持16k页。查看地址翻译方案的细节我得出这样的结论:这种CPU 不支持同时存在不同大小的页面(不同于x86_64允许)。我对吗?

    1热度

    1回答

    我的引导程序代码遇到问题。我尝试用BOCHS将INT 13h AH = 42h:“Extended Read Sectors From Drive”BIOS 3.0版本的功能(EDD-3.0)从实际模式中将硬盘映像中的内核代码复制到0x100000以上的内存位置。 当我使用INT13 AH = 41h BX = 55AAh函数来检查EDD-3.0的支持时,我得到了肯定的结果。我正在使用BOCHS

    -1热度

    2回答

    我正在编写一个小型业余操作系统作为学习体验。它针对32位x86架构。 我处于需要创建初始page_directory的位置,以便启用分页。此时分页(因此VM)未启用。 我有一个功能,保留4kb未使用的内存并返回此内存块的起始地址。 我想创建一个数组,page_dir(由1024个int组成),位于上述函数返回的内存位置。 我明白基本指针(我认为),但我无法弄清楚如何做到这一点。 如何在运行时返回的