我可以在OS开发中使用rust而不是c ++

时间:2014-10-05 14:03:58

标签: rust osdev

我想知道生锈的编译代码是否包含与操作系统相关的代码。(不是说像打印一样的东西)

例如

let x  = (4i,2i,3i)
let y  = (3i,4i,4i)

现在,如果比较x == y使用它的某些库,如果是,则取决于平台。

编辑: 就像在C ++中一样,我们不应该使用new,try catch或任何标准的lib。 在生锈的时候我们应该避免什么。

2 个答案:

答案 0 :(得分:4)

您可以看到Rust编译器为自己的代码段生成的代码,而不必在本地安装Rust。

只需访问基于网络的围栏,然后在其中输入您的代码段。您可以运行该程序(从而观察它通过print语句执行的操作),或者更有用的是,在这种情况下,您可以将程序编译到生成的程序集,然后检查它以查看它是否调用了底层系统例程。

如果你转到这个链接:http://is.gd/Be6YVJ我已经将这样的程序放入了围栏中。 (有关实际的程序文本,请参阅本文的底部。)

如果按下asm按钮,则可以看到每个例程的程序集。 (我已将inline(never)个属性添加到相关函数中,以确保它们不会被编译器优化掉。)

下面是bar生成的程序集,这个函数调用高阶函数来获取一对3元组,然后将它们进行相等性比较:

    .section    .text._ZN3bar20h2bb2fd5b9c9e987beaaE,"ax",@progbits
    .align  16, 0x90
    .type   _ZN3bar20h2bb2fd5b9c9e987beaaE,@function
_ZN3bar20h2bb2fd5b9c9e987beaaE:
    .cfi_startproc
    cmpq    %fs:112, %rsp
    ja  .LBB0_2
    movabsq $56, %r10
    movabsq $0, %r11
    callq   __morestack
    retq
.LBB0_2:
    subq    $56, %rsp
.Ltmp0:
    .cfi_def_cfa_offset 64
    movq    %rdi, %rax
    leaq    8(%rsp), %rdi
    callq   *%rax
    movq    8(%rsp), %rcx
    xorl    %eax, %eax
    cmpq    32(%rsp), %rcx
    jne .LBB0_5
    movq    40(%rsp), %rcx
    cmpq    %rcx, 16(%rsp)
    jne .LBB0_5
    movq    48(%rsp), %rax
    cmpq    %rax, 24(%rsp)
    sete    %al
.LBB0_5:
    addq    $56, %rsp
    retq
.Ltmp1:
    .size   _ZN3bar20h2bb2fd5b9c9e987beaaE, .Ltmp1-_ZN3bar20h2bb2fd5b9c9e987beaaE
    .cfi_endproc

所以你可以看到,它唯一要求的是一个辅助例程__morestack,它检查堆栈溢出(或在具有分段堆栈支持的系统中分配更多堆栈)。 (因此,对于这样的示例,这是您自己需要提供的唯一核心功能;请注意,您可以让它暂停内核。)

以下是我放入围栏的程序:

#[inline(never)]
fn bar(f: fn() -> ((int, int, int), (int, int, int))) -> bool {
    let (x, y) = f();
    x == y
}

#[inline(never)]
fn foo_1() -> ((int,int,int), (int,int,int)) {
    let x  = (4i,2i,3i);
    let y  = (3i,4i,4i);
    (x, y)
}

#[inline(never)]
fn foo_2() -> ((int,int,int), (int,int,int)) {
    let x  = (4i,2i,3i);
    (x, x)
}

fn main() {
    println!("bar(foo_1): {}", bar(foo_1));
    println!("bar(foo_2): {}", bar(foo_2));
}

答案 1 :(得分:1)

Rust旨在允许用户实现操作系统内核,驱动程序或甚至没有操作系统并在裸机硬件上运行的应用程序。

目前Rust的标准运行时可以在代码中使用#![no_std]属性禁用。您仍然可以使用某些库,例如libcore。没有运行时你将无法获得的一件事是format!println!宏,sprintf()printf()等价物。

有关今天可以做的事情的示例,请查看Zinc project