标签: osdev

使用ngen.exe编译内核

据我所知,Cosmos和SharpOS已经制作了自己的编译器来构建C#的二进制代码,但是你可以使用Microsoft的.NET AOT来做同样的事情吗?将C#编译为x86,即.我假设您将不得不遗漏使用语句,就像包含语句时的OS开发一样.任何反馈意见.谢谢

编辑:我想在内核开发中使用C#的主要原因是托管代码带来的内存管理,特别是单地址空间属性.是否有必要引导JIT编译器,然后编译C#?或者那时的环境是否仍然过于瘫痪?感谢您的反馈

c# ngen osdev

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

装配启动加载程序在虚拟PC上工作,而不是在真正的PC上

希望有人可以提供帮助,我很沮丧!我在网上找不到任何进一步的帮助,主要是因为我的代码在虚拟机中完美运行,但在真正的PC上启动时却没有(从USB检测到USB硬盘驱动器的USB笔驱动器.)

在virtualbox中; 代码将磁盘的扇区2和3读入内存,打印前128个字节(作为调试步骤),然后执行存储在这些扇区中的代码.

在我的真实PC上,它成功地将正确的字节打印到屏幕上(显然正确地读取磁盘,并将其写入内存中的预期位置)但是然后在该点停止执行而不是跳转.

为什么会有所不同,我可能做错了什么?

ORG 0x7C00;

; Load Sector 2&3 from disk to 0x1000

mov bx , 0x1000             
mov ah , 0x02   
mov al , 0x02   
mov ch , 0x00   
mov dh , 0x00   
mov cl , 0x02   
int 0x13;


;Print 0x1000 + 128 bytes

mov ah, 0x0e        
mov bx ,0x1000;
loop2:          

mov al, [bx]        
cmp bx, 0x1000+128  

je end2
int 0x10        
add bx , 1;     
jmp loop2;

end2:

; Run our code


call 0x1000

jmp $;

TIMES 510 …
Run Code Online (Sandbox Code Playgroud)

x86 assembly osdev bootloader

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

自己内核的键盘中断处理程序(C)

我正在写一个小操作系统作为学校分配的一部分,但是当我得到键盘输入时我被卡住了(按键 - >在屏幕上显示它).我正在使用osdev.org的bare Bones教程(gcc交叉编译器,GRUB引导程序,ld链接器),因为我处于保护模式,所以我不能使用BIOS中断进行输入,这就是为什么我必须编写自己的中断处理程序( ?)但即使在我阅读了一些osdev文章和论坛讨论后,我也不确定该怎么做.非常相似的问题(http://forum.osdev.org/viewtopic.php?f=1&t=9746),除了我不知道如何"设置中断".

#if !defined(__cplusplus)
#include <stdbool.h> /* C doesn't have booleans by default. */
#endif
#include <stddef.h>
#include <stdint.h>
#define INT_DISABLE 0
#define INT_ENABLE  0x200
#define PIC1 0x20
#define PIC2 0xA0

#define ICW1 0x11
#define ICW4 0x01

void outb( unsigned short port, unsigned char val )
{
   asm volatile("outb %0, %1" : : "a"(val), "Nd"(port) );
}

static __inline unsigned char inb (unsigned short int port)
{
  unsigned char _v;

  __asm__ __volatile__ ("inb %w1,%0":"=a" (_v):"Nd" …
Run Code Online (Sandbox Code Playgroud)

x86 gcc kernel inline-assembly osdev

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

Helper功能可以安全地从流中读取结构

假设我们有一个单地址空间的操作系统.为了保持稳定性,我们需要强制用户应用程序的内存保护,例如禁止使用'unsafe'关键字,除非用户具有特殊功能.

我们的用户需要有一种方法可以安全地从/向字节流(例如文件)读/写任意结构.当然,我们谈论的是不包含引用的结构(否则我们会失去内存安全性).

现在我尝试实现这种通用的阅读器功能:

#![feature(core)]

use std::io;
use std::mem;
use std::raw;

fn read<T>(reader: &mut io::Read, dest: &mut T) -> io::Result<usize> {
    let slice = raw::Slice{ data:dest, len:mem::size_of::<T>() };
    let buf: &mut [u8] = unsafe { mem::transmute(slice) };
    reader.read(buf)
}
Run Code Online (Sandbox Code Playgroud)

上面的实现有一个严重的问题.它允许读取包含引用的结构.那我怎么解决这个问题呢?

osdev rust

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

在Aarch64上同时存在不同大小的页面

根据架构概述文档,Aarch64支持4k和64k页面.一些CPU也支持16k页.查看地址转换方案的详细信息,我得出的结论是,这些CPU 不支持同时存在不同大小的页面(与允许的x86_64不同).我对吗?

paging arm osdev virtual-memory arm64

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

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

我正在用C开发一个内核,并在屏幕上创建了一些在视频内存上打印的内容.我预计视频内存中的第一个字节将是要打印的字符,第二个字节将告诉颜色.但我的程序有一些不同但它的工作原理!! 这是非常意外和不寻常的.

我的内核代码 -

#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 successfully!!");
}

void write_string( int colour, const unsigned char *string ) {
    unsigned char *vid = (unsigned char*) VIDEO_MEM;
    while(*string != 0)
    {
        *(vid) = *string;
        *(vid+2) …
Run Code Online (Sandbox Code Playgroud)

c x86 kernel osdev bootloader

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

有没有一种方法可以在gnu汇编常量中使用数学表达式?

执行以下操作的正确gnu汇编语法是什么:

.section .data2
.asciz "******* Output Data ********"
total_sectors_written:   .word 0x0
max_buffer_sectors: .word ((0x9fc00 - $data_buffer) / 512)  # <=== need help here
.align 512
data_buffer: .asciz "<The actual data will overwrite this>"
Run Code Online (Sandbox Code Playgroud)

具体来说,我正在编写一个玩具OS。上面的代码是16位实模式。我正在设置一个数据缓冲区,该缓冲区将转储回启动磁盘。我想计算之间的扇区数data_buffer放置在内存中的位置与该数据缓冲区的上限。(地址0x9fc00是缓冲区将运行到保留用于其他目的的RAM的位置。)

我知道我可以编写汇编代码来计算这个;但是,由于它是在构建时就知道的常数,所以我很好奇能否让汇编器为我计算它。

我遇到了三个具体问题:

(1)如果我使用$data_buffer此错误:

os_src/boot.S: Assembler messages:
os_src/boot.S:497: Error: missing ')'
os_src/boot.S:497: Error: can't resolve `L0' {*ABS* section} - `$data_buffer' {*UND* section}
Run Code Online (Sandbox Code Playgroud)

我会感到困惑,因为$当我想要标签的内存地址时,应该使用它,对吗?

(2)如果我使用data_buffer而不是$data_buffer,则会出现此错误:

os_src/boot.S: Assembler messages:
os_src/boot.S:497: Error: missing ')'
os_src/boot.S:497: Error: value of 653855 too …
Run Code Online (Sandbox Code Playgroud)

assembly gcc gnu-assembler osdev x86-16

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

试图从软盘驱动器读取扇区时,INT 13、2挂在x86实模式下

我正在为学校项目编写DOS克隆,并尝试使用BIOS INT 13、2从软盘驱动器(主要是FAT12文件系统的根目录,扇区19)读取某些扇区。我将参数设置正确-或至少我认为是这样做的-然后用AH = 2调用INT 0x13。然后,系统挂起。我不知道为什么。

我正在使用以下代码来调用中断:

mov ah, 0x2   ;Read sectors function
mov al, 1     ;I want to read one sector
mov ch, 0     ;From track 0
mov cl, 2     ;Sector 2
mov dh, 1     ;Head 1
mov dl, [device_number] ;Obtained from BIOS during boot
mov bx, 0x7C0 ;Buffer located at 0x7C00:0x0000*
mov es, bx
mov bx, 0
stc           ;Set carry for older BIOSes that just unset it.
int 0x13      ;Call BIOS INT 0x13
jc .error     ;If there's an …
Run Code Online (Sandbox Code Playgroud)

x86 assembly bios osdev x86-16

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

如何在Linux上的NASM中创建UEFI内核

我一直在遵循本指南进行OS开发Windows上的OS开发

但是,我不喜欢Windows开发环境,因此我试图将这些指令转移到我首选的Linux环境中。

我已经尝试了Rod's Books的教程,并且所有内容都能正确编译,并且收到hello.efi文件...但是如何从中启动?我使用命令qemu-system-x86_64 -bios OVMF.fd -kernel hello.efi -net none,但仅获得典型的EFI shell。

我真正想要的是拥有Linux版的Hacker Pulp指南。

我还尝试过kalzlauskas的本指南以及osdev UEFI Bare Bones的本指南。

x86 kernel qemu osdev uefi

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

一次中断后,C上的中断处理程序不起作用

我正在尝试使用C和QEMU实现键盘中断处理程序。但是,当我执行程序时,我的处理程序仅打印一个字符。之后,处理程序将根本无法工作。

我的IDT设置:

struct IDT_entry {
    unsigned short int offset_lowerbits;
    unsigned short int selector;
    unsigned char zero;
    unsigned char type_attr;
    unsigned short int offset_higherbits;
};

void setup_idt() {
    struct IDT_entry IDT[256];
    unsigned long keyboard_address;
    unsigned long idt_address;
    unsigned long idt_ptr[2];

    keyboard_address = (unsigned long) keyboard_handler;
    IDT[0x21].offset_lowerbits = keyboard_address & 0xffff;
    IDT[0x21].selector = 0x8;
    IDT[0x21].zero = 0;
    IDT[0x21].type_attr = 0x8e;
    IDT[0x21].offset_higherbits = (keyboard_address & 0xffff0000) >> 16;

    /*
                PIC1   PIC2
    Commands    0x20   0xA0
    Data        0x21   0xA1

    */

    // ICW1 - init
    outb(0x20, …
Run Code Online (Sandbox Code Playgroud)

c assembly gcc osdev interrupt-handling

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