<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>http://wiki.foofun.cn//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=117.91.55.219</id>
	<title>osdev - 用户贡献 [zh-cn]</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.foofun.cn//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=117.91.55.219"/>
	<link rel="alternate" type="text/html" href="http://wiki.foofun.cn//index.php?title=%E7%89%B9%E6%AE%8A:%E7%94%A8%E6%88%B7%E8%B4%A1%E7%8C%AE/117.91.55.219"/>
	<updated>2026-04-06T17:10:59Z</updated>
	<subtitle>用户贡献</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>http://wiki.foofun.cn//index.php?title=C_Sharp_Bare_Bones&amp;diff=329</id>
		<title>C Sharp Bare Bones</title>
		<link rel="alternate" type="text/html" href="http://wiki.foofun.cn//index.php?title=C_Sharp_Bare_Bones&amp;diff=329"/>
		<updated>2022-01-26T02:03:39Z</updated>

		<summary type="html">&lt;p&gt;117.91.55.219：创建页面，内容为“{{BeginnersWarning}} {{Rating|2}}  本教程旨在帮助你在  C# 中编写一个简单的 'Hello World' 操作系统，然后你可以编译为IA32体系结构的机器代码并通过GRUB启动。  有许多用于将C# 编译到 CIL 的工具，包括微软的csc (与 [http://www.microsoft.com/net Microsoft.NET] 一起分发) 和mcs/gmcs/dmcs (与 [mono-project.com Mono] 一起分发)。  此外，还有许多以提前编译方式将 CI…”&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{BeginnersWarning}}&lt;br /&gt;
{{Rating|2}}&lt;br /&gt;
&lt;br /&gt;
本教程旨在帮助你在 [[C Sharp | C#]] 中编写一个简单的 'Hello World' 操作系统，然后你可以编译为IA32体系结构的机器代码并通过[[GRUB]]启动。  有许多用于将C# 编译到 [[CIL]] 的工具，包括微软的csc (与 [http://www.microsoft.com/net Microsoft.NET] 一起分发) 和mcs/gmcs/dmcs (与 [mono-project.com Mono] 一起分发)。  此外，还有许多以提前编译方式将 [[CIL]] 编译到本机机器代码的工具，包括Microsoft的ngen，mono (带有-aot选项)，[http://gocosmos.org Cosmos]的 IL2CPU，来自 [http:// mosa-project.org/projects/mosa MOSA项目]的mosacl 和来自 [http://www.tysos.org/redmine/projects/tysos/ tysos] 项目的tysila。  鉴于作者对tysos的较为程度，我们在这里重点介绍tysos。&lt;br /&gt;
&lt;br /&gt;
== 先决条件 ==&lt;br /&gt;
&lt;br /&gt;
你将需要一个binutils，它可以从.net，grub及其xorriso依赖 (用于生成iso图像)，[[NASM]]/[[YASM]]/类似的汇编Stub，当然还有tysila，以上这些工具逐步完成针对elf_i386仿真，mono (对于gmcs编译器) 或csc的目标构建。  对于基于debian的系统，请尝试运行sudo apt-get install nasm xorriso qemu mono-devel。&lt;br /&gt;
&lt;br /&gt;
对于tysila，你可以从以下位置下载预编译的二进制文件 http://www.tysos.org/files/tysila/tysila-latest.tar.bz2 (http://web.archive.org/web/20170317154703/http://www.tysos.org/files/tysila/tysila-latest.tar.bz2) 然后在路径下解压它们。  请注意，由于当前Microsoft CLR中的错误，这些二进制文件在64位Windows上不起作用 (请参阅 [http://connect.microsoft.com/VisualStudio/feedback/details/635365/runtimehelpers-initializearray-fails-on-64b-framework 此处])，因此你必须从源代码构建它。&lt;br /&gt;
&lt;br /&gt;
== 构建tysila ==&lt;br /&gt;
&lt;br /&gt;
仅当你尚未下载上述预编译的二进制文件时，才需要这样做。  使用subversion获取最新的源代码 “svn co http://www.tysos.org/svn/trunk tysos” (不在Wayback Machine中)，或从http://www.tysos.org/files/src/tysos-latest.tar.bz2下载最新的tar包(http://web.archive.org/web/*/http://www.tysos.org/files/src/tysos-latest.tar.bz2)。  Tysos是一个在C# 中开发完整的OS内核和驱动程序的项目，但是我们只想要编译器，因此我们只想编译构建树的一部分。  进入tysos目录并运行&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd tybuild &amp;amp;&amp;amp; make &amp;amp;&amp;amp; cd ..&lt;br /&gt;
cd mono/corlib &amp;amp;&amp;amp; make mscorlib.dll &amp;amp;&amp;amp; cd ../..&lt;br /&gt;
cd tysila2 &amp;amp;&amp;amp; make &amp;amp;&amp;amp; cd ..&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
你需要将mono/corlib/mscorlib.dll、tysila2/bin/Release/tysila2.exe、tysila2/bin/Release/libsupcs.dll、tysila2/bin/Release/libtysila.dll、tysila2/bin/Release/tydbfile.dll、tysila2/bin/Release/tydisasm.dll和tybuild/bin/Release/tybuild.exe文件放在路径中的某个地方。&lt;br /&gt;
&lt;br /&gt;
你可能需要为mono启用binfmt_misc支持 (如果在linux上尝试此功能)。  如何做到这一点不在本文档的范围内，但答案很容易通过Google获得。&lt;br /&gt;
&lt;br /&gt;
== 目录布局 ==&lt;br /&gt;
&lt;br /&gt;
我们将创建一个目录来构建我们的操作系统和ISO文件。  像mkdir -p barebones/iso/boot/grub这样应该足够了。  进入barebones目录，开始创建一些文件。&lt;br /&gt;
&lt;br /&gt;
===loader.asm===&lt;br /&gt;
&lt;br /&gt;
这是汇编Stub，它要包含一个多引导头。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
global sthrow&lt;br /&gt;
&lt;br /&gt;
extern kmain&lt;br /&gt;
&lt;br /&gt;
MODULEALIGN       equ     1&amp;lt;&amp;lt;0&lt;br /&gt;
MEMINFO           equ     1&amp;lt;&amp;lt;1&lt;br /&gt;
FLAGS             equ     MODULEALIGN | MEMINFO&lt;br /&gt;
MAGIC             equ     0x1BADB002&lt;br /&gt;
CHECKSUM          equ     -(MAGIC + FLAGS)&lt;br /&gt;
&lt;br /&gt;
section .text&lt;br /&gt;
&lt;br /&gt;
align 4&lt;br /&gt;
dd MAGIC&lt;br /&gt;
dd FLAGS&lt;br /&gt;
dd CHECKSUM&lt;br /&gt;
&lt;br /&gt;
sthrow:&lt;br /&gt;
    hlt&lt;br /&gt;
    jmp sthrow&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===kernel.cs===&lt;br /&gt;
&lt;br /&gt;
这是实际的简单内核-它只是将消息打印到屏幕上。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
namespace BareBones&lt;br /&gt;
{&lt;br /&gt;
    class Program&lt;br /&gt;
    {&lt;br /&gt;
        static int pos = 0;&lt;br /&gt;
&lt;br /&gt;
        unsafe static void Main()&lt;br /&gt;
        {&lt;br /&gt;
            // Clear the screen&lt;br /&gt;
            for(int i = 0; i &amp;lt; 80 * 25 * 2; i++)&lt;br /&gt;
                *(byte *)(0xb8000 + i) = 0;&lt;br /&gt;
&lt;br /&gt;
            // Say hi&lt;br /&gt;
            Print(&amp;quot;Hello World!&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        static void Print(string s)&lt;br /&gt;
        {&lt;br /&gt;
            foreach(char c in s)&lt;br /&gt;
                Print(c);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        unsafe static void Print(char c)&lt;br /&gt;
        {&lt;br /&gt;
            *(byte *)(0xb8000 + pos) = (byte)c;&lt;br /&gt;
            *(byte *)(0xb8000 + pos + 1) = 0x0f;&lt;br /&gt;
            pos += 2;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===linker.ld===&lt;br /&gt;
&lt;br /&gt;
链接器脚本&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
ENTRY (_start)&lt;br /&gt;
&lt;br /&gt;
SECTIONS&lt;br /&gt;
{&lt;br /&gt;
    . = 0x00100000;&lt;br /&gt;
&lt;br /&gt;
    .text ALIGN(0x1000) :&lt;br /&gt;
    {&lt;br /&gt;
        *(.text)&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    .rodata ALIGN(0x1000) :&lt;br /&gt;
    {&lt;br /&gt;
        *(.rodata*)&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    .data ALIGN(0x1000) :&lt;br /&gt;
    {&lt;br /&gt;
        *(.data)&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    .bss ALIGN(0x1000) :&lt;br /&gt;
    {&lt;br /&gt;
        *(COMMON)&lt;br /&gt;
        *(.bss)&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===iso/boot/grub/grub.cfg===&lt;br /&gt;
这是一个简短的文件，告诉grub在哪里可以找到我们的内核&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
multiboot /kernel.bin&lt;br /&gt;
boot&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 把它全部构建起来 ==&lt;br /&gt;
以下命令应该构建你的新C#内核。首先，组装multiboot stub:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;nasm -felf -o loader.o loader.asm&amp;lt;/source&amp;gt;&lt;br /&gt;
为了编译.cs文件到a.exe你可以选择三个选项 (取决于你的体系结构):&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
gmcs /target:exe /out:kernel.exe /unsafe kernel.cs&lt;br /&gt;
csc /target:exe /out:kernel.exe /unsafe kernel.cs&lt;br /&gt;
tybuild.exe /unsafe kernel.cs&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
要编译kernel.exe到机器码，我们使用tysila:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;tysila2.exe --arch i586-elf-tysos -fno-rtti -o kernel.o kernel.exe&amp;lt;/source&amp;gt;&lt;br /&gt;
在这里，-fno-rtti切换禁用运行时类型信息，如果对其支持将大大扩大内核的大小，并要求你提供大量的运行时功能来支持这一点。&lt;br /&gt;
&lt;br /&gt;
开始链接:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;ld -m elf_i386 -T linker.ld -o iso/kernel.bin loader.o kernel.o&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
然后我们建立一个可启动ISO映像:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;grub-mkrescue -o barebones.iso iso&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
并在qemu上运行它:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;qemu-system-i386 -cdrom barebones.iso&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:Bare bones tutorials]]&lt;br /&gt;
[[Category:CSharp]]&lt;/div&gt;</summary>
		<author><name>117.91.55.219</name></author>
	</entry>
</feed>