据我所知,Cosmos和SharpOS已经制作了自己的编译器来构建C#的二进制代码,但是你可以使用Microsoft的.NET AOT来做同样的事情吗?将C#编译为x86,即.我假设您将不得不遗漏使用语句,就像包含语句时的OS开发一样.任何反馈意见.谢谢
编辑:我想在内核开发中使用C#的主要原因是托管代码带来的内存管理,特别是单地址空间属性.是否有必要引导JIT编译器,然后编译C#?或者那时的环境是否仍然过于瘫痪?感谢您的反馈
希望有人可以提供帮助,我很沮丧!我在网上找不到任何进一步的帮助,主要是因为我的代码在虚拟机中完美运行,但在真正的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) 我正在写一个小操作系统作为学校分配的一部分,但是当我得到键盘输入时我被卡住了(按键 - >在屏幕上显示它).我正在使用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) 假设我们有一个单地址空间的操作系统.为了保持稳定性,我们需要强制用户应用程序的内存保护,例如禁止使用'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)
上面的实现有一个严重的问题.它允许读取包含引用的结构.那我怎么解决这个问题呢?
根据架构概述文档,Aarch64支持4k和64k页面.一些CPU也支持16k页.查看地址转换方案的详细信息,我得出的结论是,这些CPU 不支持同时存在不同大小的页面(与允许的x86_64不同).我对吗?
我正在用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) 执行以下操作的正确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) 我正在为学校项目编写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) 我一直在遵循本指南进行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的本指南。
我正在尝试使用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)