我正在尝试开发C函数来获取一些主板信息(名称,ID等),但是我找不到这些信息的存储位置。我看了一下CPUID,但在那里找不到与主板有关的任何东西(尽管有很多有关CPU的信息)。
有谁知道我可以从哪里获得这些信息?
非常感谢。
我正在尝试开发一个简单的操作系统.我以前做过一些装配程序,不得不INT 10h用来在屏幕上显示字符.我知道UEFI支持传统BIOS,并且仍然可以使用INT 10h服务.但是,如果我选择构建纯UEFI可引导操作系统,我应该避免使用INT 10h吗?或者我是以错误的方式看事情的?
换句话说,它的向下钻取printf到stdout(屏幕)最终调用的BIOS INT 10h?或者是问题 - " SYS_WRITE函数调用基于INT 10h吗?" 更合适?
我是否仍然需要创建一个512字节的引导扇区并将它们作为第0扇区放在磁盘(或磁盘映像)上?该位置是否0x7c00具有重要意义?
我想用GRUB2启动一个自定义内核(非多启动),我读过我需要grub.cfg这样的:
menuentry "custom kernel" {
set root=(hd0,0)
chainloader +1
}
Run Code Online (Sandbox Code Playgroud)
所以,我有一些问题:
kernel /boot/kernel.bin)(hd0,0)是硬盘分区,如果我使用CD,我必须放什么?也许(cdrom0,0)?linux命令,我可以使用它来启动我的自定义内核(有一些更改)吗?Protected mode?我对PCI有疑问.PCI有三个地址空间; PCI I/O,PCI内存和PCI配置空间.他们每个人身处何处?在PCI控制器?还是在设备中?它们中的任何一个都是系统RAM的一部分吗?
这个问题主要是出于历史兴趣,但我一直无法找到任何有关它的文档.我在x86实模式下可以找到的所有文档(包括英特尔手册[1]和在线存储器映射[2])都假定系统内存为640KiB.然而,最初的IBM PC只有16KiB或64KiB的RAM [3].
这是怎么回事?两个具体问题:
[1] http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html
我在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输出与程序集链接起来.的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) 我正在编写一个基于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) 我正在虚拟机中编写自定义操作系统,并且无法从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地址已成功标识映射.
看起来还有一些缓存正在进行中.我错过了什么?
编辑
我发现这不是一个缓存问题,而是一些很奇怪的东西 - …
我有一个代码段位于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)