Tag: osdev

从我的启动加载程序加载elf-i386

我正在做操作系统项目,直到现在我的bootloader都在运行。 我可以使用bios interuppt加载二进制文件,但我无法从ELF文件格式加载和调用C函数: 这是我想要最终执行的C程序: //build :: cc -m32 -nostdlib -nostdinc -fno-builtin -fno-stack-protector -c -o kmain.o kmain.c void kmain(){ int a = 5; for(;;); } 这是调用kmain()的汇编代码 ; build :: nasm -f elf loader.asm [BITS 32] [GLOBAL start] [EXTERN kmain] section .text start: mov eax, 0 call kmain 这是我的链接器脚本 ENTRY(start) 这就是我如何把所有东西连在一起 ld -m elf_i386 -T link.ld -o […]

x86内核中的键盘IRQ

我正在尝试编写一个非常简单的内核用于学习目的。 在阅读了大量有关x86架构中PIC和IRQ的文章后,我发现IRQ1是键盘处理程序。 我正在使用以下代码打印正在按下的键: #include “port_io.h” #define IDT_SIZE 256 #define PIC_1_CTRL 0x20 #define PIC_2_CTRL 0xA0 #define PIC_1_DATA 0x21 #define PIC_2_DATA 0xA1 void keyboard_handler(); void load_idt(void*); struct idt_entry { unsigned short int offset_lowerbits; unsigned short int selector; unsigned char zero; unsigned char flags; unsigned short int offset_higherbits; }; struct idt_pointer { unsigned short limit; unsigned int base; […]

无法识别的仿真模式: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) } } kernel.c /* * kernel.c */ void kmain(void) { const char *str = “my first kernel”; char *vidptr = (char*)0xb8000; […]

玩具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函数的值返回给ASM

我正试图从ASM中调用一个函数。 我知道如何调用它,但我很难找到如何获得此函数的返回值。 一个例子如下: C代码: int dummy() { return 5; } (N)ASM代码: dummyFunction: call dummy ;grab return into eax inc eax ; eax should be 6 now ret 有任何想法吗?

内存映射显示的RAM多于实际可用内存

我正在研究一个小的x86内核。 我正在访问并尝试读取GRUB在多引导头中提供的内存映射。 我有一个Intel i3 cpu和4 GiB的RAM。 在这台机器上运行时,我正在阅读以下内存映射: –Base Address– –Length– –Type– 0x0000000000000000 0x000000000009d000 0x1 0x000000000009d000 0x0000000000003000 0x2 0x00000000000e0000 0x0000000000020000 0x2 0x0000000000100000 0x00000000bb53f000 0x1 0x00000000bb63f000 0x0000000000080000 0x2 0x00000000bb6bf000 0x0000000000100000 0x4 0x00000000bb7bf000 0x0000000000040000 0x3 0x00000000bb7ff000 0x0000000000001000 0x1 0x00000000bb800000 0x0000000004800000 0x2 0x00000000e0000000 0x0000000010000000 0x2 0x00000000feb00000 0x0000000000004000 0x2 0x00000000fec00000 0x0000000000001000 0x2 0x00000000fed10000 0x0000000000004000 0x2 0x00000000fed18000 0x0000000000002000 0x2 0x00000000fed1b000 0x0000000000005000 […]

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

我目前正在关注构建操作系统的这本工作簿 。 我的目的是编写一个64位内核。 在文本模式下,我已经加载了“内核”代码并将单个字符写入帧缓冲区。 当我通过将代码包装在函数中来添加一个间接级别来将单个字符写入帧缓冲区时,我的问题出现了。 看来传递给函数的char值在某种程度上被破坏了。 我有三个文件: bootloader.asm ; bootloader.asm [org 0x7c00] KERNEL_OFFSET equ 0x1000 mov bp, 0x9000 mov sp, bp ; load the kernel from boot disk mov bx, KERNEL_OFFSET mov dl, dl ; boot drive is set to dl mov ah, 0x02 ; bios read sector mov al, 15 ; read 15 sectors […]

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

我正在用C开发一个内核,并在屏幕上创建了一些可以在video内存上打印的内容。 我预计video内存中的第一个字节将是要打印的字符,第二个字节会告诉颜色。 但我的程序有一些不同,但它的工作原理! 这是非常意外和不寻常的。 我的内核代码 – #define VIDEO_MEM 0xb8000 void write_string( int colour, const unsigned char *string ); void main() { unsigned char *vid = (unsigned char*) VIDEO_MEM; int i=0; for (i = 0; i < 2000; i++) { *vid = ' '; *(vid+2) = 0x1f; vid += 2; } write_string(0x1f,"The Kernel has been loaded […]