标签: osdev

如何使用CPUID查找主板信息?

我正在尝试开发C函数来获取一些主板信息(名称,ID等),但是我找不到这些信息的存储位置。我看了一下CPUID,但在那里找不到与主板有关的任何东西(尽管有很多有关CPU的信息)。

有谁知道我可以从哪里获得这些信息?

非常感谢。

c x86 motherboard osdev hardware-id

3
推荐指数
1
解决办法
1308
查看次数

在EFI模式下启动是否意味着我无法访问BIOS中断?

我正在尝试开发一个简单的操作系统.我以前做过一些装配程序,不得不INT 10h用来在屏幕上显示字符.我知道UEFI支持传统BIOS,并且仍然可以使用INT 10h服务.但是,如果我选择构建纯UEFI可引导操作系统,我应该避免使用INT 10h吗?或者我是以错误的方式看事情的?

换句话说,它的向下钻取printfstdout(屏幕)最终调用的BIOS INT 10h?或者是问题 - " SYS_WRITE函数调用基于INT 10h吗?" 更合适?

我是否仍然需要创建一个512字节的引导扇区并将它们作为第0扇区放在磁盘(或磁盘映像)上?该位置是否0x7c00具有重要意义?

boot operating-system bios osdev efi

3
推荐指数
1
解决办法
3861
查看次数

使用GRUB2引导非多引导内核

我想用GRUB2启动一个自定义内核(非多启动),我读过我需要grub.cfg这样的:

menuentry "custom kernel" {
    set root=(hd0,0)
    chainloader +1
}
Run Code Online (Sandbox Code Playgroud)

所以,我有一些问题:

  1. grub如何检测内核?(我使用的多引导规范kernel /boot/kernel.bin)
  2. 我的内核必须如何(抱歉我的英文不好)?它必须是512字节(如自定义引导加载程序,加载到0x7c00)?
  3. (hd0,0)是硬盘分区,如果我使用CD,我必须放什么?也许(cdrom0,0)
  4. 要启动Linux内核我们可以使用linux命令,我可以使用它来启动我的自定义内核(有一些更改)吗?
  5. 格鲁布会不会进入Protected mode

x86 grub osdev

3
推荐指数
1
解决办法
2149
查看次数

PCI地址空间

我对PCI有疑问.PCI有三个地址空间; PCI I/O,PCI内存和PCI配置空间.他们每个人身处何处?在PCI控制器?还是在设备中?它们中的任何一个都是系统RAM的一部分吗?

osdev pci

3
推荐指数
1
解决办法
474
查看次数

x86实模式如何在内存<640K的机器上运行?

这个问题主要是出于历史兴趣,但我一直无法找到任何有关它的文档.我在x86实模式下可以找到的所有文档(包括英特尔手册[1]和在线存储器映​​射[2])都假定系统内​​存为640KiB.然而,最初的IBM PC只有16KiB或64KiB的RAM [3].

这是怎么回事?两个具体问题:

  1. 如果访问的内存不存在,CPU的行为如何?英特尔手册[1]指出,对于实模式,某些指令会触发#GP(一般保护故障)"如果内存操作数有效地址超出CS,DS,ES,FS或GS段限制",并且对于其他人,"如果操作数的任何部分位于从0到FFFFH的有效地址空间之外." 这似乎并不表明您可以获得#GP来访问不存在的良好寻址的内存.那么在这种情况下CPU会做什么?
  2. 根据存储器映射[2],BIOS通常将MBR加载到0x7c00,该存储器空间位于仅具有16KiB RAM的原始"廉价"IBM PC的存储器空间之外.它是如何应对这一点的?(BIOS设计最初是不是将代码加载到0x7c00?)

[1] http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html

[2] http://wiki.osdev.org/Memory_Map_(x86)

[3] http://en.wikipedia.org/wiki/IBM_Personal_Computer#PC

x86 osdev x86-16

3
推荐指数
1
解决办法
287
查看次数

玩具OS文件系统

我在assembly/c中开发了一个运行基本终端的基本内核.我把它设置为用grub运行iso.

我想继续这个操作系统,但没有文件系统,我觉得我真的没有别的办法.经过很长一段时间在互联网上,我已经想出了实现这一点我真的无能为力.

人们已经说过实现FAT或制作VFS,但没有任何进一步,也没有教程,也没有任何参考.

有人可以解释文件系统是如何工作的,我可以在哪里开始/我可以连接预制系统,以及如何使用它?

另外,在编译我的操作系统时,我无法访问标准库.我使用gcc,nasm,ld和grub-mkrescue(用于磁盘映像).我使用qemu进行模拟.

编辑减少OT

有人可以详细描述文件系统的工作原理,所以当我查看已经实现的文件系统的来源(如FAT)时,我能理解如何将它应用到我自己的操作系统中吗?

编辑 - 更简单

更容易.我怎么能直接访问硬盘?我的内核完全在保护模式下运行,因此我可以切换并直接写入硬盘驱动器.可以使用如下文件实现文件系统:

name 特殊字符 文本 特殊字符

即:

hello world.script 0x00 println"Hello,world !!" 为0x00

在不需要特殊分段的地方,你只需查看文件名和特殊字符(不是像'\ 0'这样的字符串),然后读取,直到找到第二个非字符串字符.

是否有办法通过切入和退出保护模式或写入硬盘驱动器来实现这一点?

c filesystems assembly kernel osdev

3
推荐指数
1
解决办法
1340
查看次数

无法识别的仿真模式:MinGW32上的elf_i386

我正在尝试创建一个内核,我无法将C输出与程序集链接起来.的ld.我收到错误:

无法识别的仿真模式:elf_i386

我正在使用Windows 10专业版与MinGW32和MSYS.我正在使用的代码:

link.ld

/*
*  link.ld
*/
OUTPUT_FORMAT(elf32-i386)
ENTRY(start)
SECTIONS
 {
   . = 0x100000;
   .text : { *(.text) }
   .data : { *(.data) }
   .bss  : { *(.bss)  }
 }
Run Code Online (Sandbox Code Playgroud)

kernel.c

/*
*  kernel.c
*/
void kmain(void)
{
    const char *str = "my first kernel";
    char *vidptr = (char*)0xb8000;  //video mem begins here.
    unsigned int i = 0;
    unsigned int j = 0;

    /* this loops clears the screen
    * there are 25 lines …
Run Code Online (Sandbox Code Playgroud)

c x86 assembly linker osdev

3
推荐指数
1
解决办法
4548
查看次数

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

我正在编写一个基于OSDev Wiki和一些相关书籍的信息的操作系统.我发现在跳转到保护模式后,段初始化例程没有正确执行.这是我的第二阶段加载器和内核代码:

; stage2
; still -f bin
[org 0xd200] ; calculated by first stage loader

; GDTs are defined here
jmp entry

GDT_DESC_START:

GDT0:
dw 0 ; Limit 0~15
dw 0 ; Base 0~15
db 0 ; Base 16~23
db 0 ; Access Byte
db 0 ; Limit 16~19 + Flags
db 0 ; Base 24~31

DESCRIPTOR_CODE:
dw 0xffff ; Limit 0~15
CODE_BASE_AX dw 0 ; Base 0~15
CODE_BASE_EAHL db 0 ; Base 16~23
db 0x9a ; …
Run Code Online (Sandbox Code Playgroud)

x86 assembly nasm osdev bootloader

3
推荐指数
1
解决办法
242
查看次数

写入mmio寄存器时如何避免缓存?

我正在虚拟机中编写自定义操作系统,并且无法从IOAPIC mmio寄存器中成功编写和读取.即它似乎忽略了索引寄存器写入.加载后R8与IOAPIC基地址(从ACPI枚举确定为0xFEC00000),我使用下面的程序来读/写:

; -----------------------------------------------------------------------------
; IN :  RAX = ioapic address, EBX = index register
; OUT:  ECX = return value
ioapic_read:
    mov [r8], ebx
    mov ecx, [r8 + 0x10]
    ret
; -----------------------------------------------------------------------------
; IN :  RAX = ioapic address, EBX = index register, ECX = value
; OUT:  -
ioapic_write:
    mov [r8], ebx
    mov [r8 + 0x10], ecx
    ret        
Run Code Online (Sandbox Code Playgroud)

但是ioapic_read将始终返回写入的最后一个值(通过ioapic_write),而不管使用的索引如何.我有身份分页设置使用0x9B我认为应该禁用缓存.

我试过pause在每个movs 之后使用.没有帮助.在mfences之间试过mov.没有帮助.

我已确认0xFEC00000地址已成功标识映射.

看起来还有一些缓存正在进行中.我错过了什么?

编辑

我发现这不是一个缓存问题,而是一些很奇怪的东西 - …

assembly caching x86-64 osdev apic

3
推荐指数
1
解决办法
273
查看次数

8086汇编:将变量区域放在代码段的开头

我有一个代码段位于boot.img文件的扇区37,在我的主启动记录中,我将此代码加载到内存0x5678:0x1234,这是我的asm代码:

[BITS 16]               ;Set code generation to 16 bit mode

ORG 0x1234      ;set addressing to begin at 0x5678:0x1234
mov ax, cs
mov ds, ax
mov es, ax



  call cls  ;call routine to clear screen
  call dspmsg   ;call routine to display message

startdt:
  call date
  call cvtmo
  call cvtday
  call cvtcent
  call cvtyear
  call dspdate

  call time
  call cvthrs
  call cvtmin
  call cvtsec
  call dsptime

  jmp startdt   ;use infinite loop to halt?

cls:             
  mov ah,06h    ;function 06h (Scroll Screen)
  mov al, …
Run Code Online (Sandbox Code Playgroud)

x86 assembly osdev dosbox x86-16

3
推荐指数
1
解决办法
737
查看次数