zoukankan      html  css  js  c++  java
  • .net/C#开源操作系统学习系列

    直接开始吧,在KenelTest文件夹下面添加一个自己的项目,这里我的项目是PCIDeviceEnumerator,列出当前自己机子上的PCI设备的VendorID和DeviceID以及设备类型

    image

    敲入如下代码:

    using System;
    using System.Collections.Generic;
    using System.Text;
    using Cosmos.Build;
    using Cosmos.Hardware.PC;

    namespace PCIDeviceEnumerator
    {
        class Program
        {

            //这个是项目的启动函数
            [STAThread]
            static void Main(string[] args)
            {

                //在里程碑2中,COSMOS项目还需要自己调用编译器对自己进行编译,生成最后的ISO,并调用模拟器启动我们自己的操作系统
                var xbuilder = new Cosmos.Build.Windows.Builder();
                xbuilder.Build();
            }

            //这个是操作系统的入口函数,操作系统就从这里开始进入我们的代码的

            public static void Init()
            {
                Cosmos.Kernel.Boot.Default();//操作系统初始化,详细解释可以参看下小弟之前的拙文
                var DeviceCollect = Cosmos.Hardware.PC.Bus.PCIBus.Devices;//获取机子上所有的PCI设备

                //遍历设备,并列出VendorID和DeviceID以及设备类型
                foreach (var device in DeviceCollect)
                {
                    Console.WriteLine(device.VendorID + " | " + device.DeviceID + " | "+ device.GetClassInfo());
                }
            }
        }
    }

    以下是这次动手练习中遇到的一些问题下面一个个解释:

    image

    上图:可以看到代码中红色的部分,对于项目的启动函数需要加上STAThread属性,由错误提示可知,一些UI组件需要STA,这里摘录一段网上对STAThread的解释

    ——————————————————————————————————————————————————

    [STAThread]
    是一种线程模型,用在程序的入口方法上(在C#和VB.NET里是Main()方法),来指定当前线程的ApartmentState 是STA。用在其他方法上不产生影响。在aspx页面上可以使用AspCompat = "true" 来达到同样的效果。这个属性只在 Com Interop 有用,如果全部是 managed code 则无用。简单的说法:[STAThread]指示应用程序的默认线程模型是单线程单元 (STA)。启动线程模型可设置为单线程单元或多线程单元。如果未对其进行设置,则该线程不被初始化。也就是说如果你用的.NET Framework,并且没有使用COM Interop,一般不需要这个Attribute。其它的还有MTA(多线程套间)、Free Thread(自由线程)。

    ——————————————————————————————————————————————————

    对于这个的解释,我们先看一下下面的这个UI界面,有项目类型可知这是一个WPF的项目,个人理解,由于项目的界面调用到了一些COM的组件来进行绘制或者需要和某些COM组件来进行交互,所以我们自己创建的项目的启动函数里面需要加上STAThread属性。

    image

    现在看下图的这个错误,提示在XXXXXX目录下找不到XXXXX.dll文件,我们在结合上图,留意到“Current build path is:“这个属性,这里指定了在编译过程中需要用到的程序集的路径,现在的这个是在编译器启动时的默认值,我们需要把它修改成我们需要的值(注:目前这个路径只支持英文名)

    image

    我们在启动编译器的界面项目中可以找到如下代码,位于Cosmos.Build.Windows项目的BuildRegister.cs文件中。

    public static class BuildRegistry
        {
            public static void Write(string key, string value)
            {
                RegistryKey xKey = Registry.CurrentUser.CreateSubKey(@"Software\Cosmos");
                xKey.SetValue(key, value);
            }

            public static string Read(string key)
            {
                try
                {
                    RegistryKey xKey = Registry.CurrentUser.OpenSubKey(@"Software\Cosmos");
                    return (string)xKey.GetValue(key);
                }
                catch
                {
                    return null;
                }
            }
        }

    这里在注册表中写入了一条记录,其实这就是Current build path is:属性的默认值,找到该记录把它的值改成我们项目生成的地址,通常我们的项目生成之后所在的目录一般为:XXXXXX\bin\debug\

    image

    这下我们就可以通过编译了,操作系统启动之后会列出本机上的所有PCI设备的VendorID和DeviceID以及设备类型,由下图我们可以知道,小弟的机子上有:

    一个PCI桥(用来在CPU和PCI之间进行通信)

    还有一个PCI桥(用来在PCI和ISA之间进行通信--不知道ISA的朋友百度一下吧,一种比较古老的总线)

    一个IDE硬盘

    还是一个PCI桥(但是小弟做的这个操作系统无法识别,个人觉得应该是用来在PCI和USB之间进行通信的)

    一个VGA显示卡(就是显卡)

    一个以太网卡

    image

    好了,练习完毕,

    操作系统

     
    摘要: 直接开始吧,在KenelTest文件夹下面添加一个自己的项目,这里我的项目是PCIDeviceEnumerator,列出当前自己机子上的PCI设备的VendorID和DeviceID以及设备类型阅读全文
    posted @ 2012-03-05 12:33 Hundre 阅读(933) | 评论 (0) 编辑
    摘要: 访问PCI配置空间可通过两个访问寄存器,CONFIG_ADDRESS寄存器和CONFIG_DATA寄存器。这两个寄存器在PC中分别对应着CF8h和CFCh端口,并且是32位端口,即读写要用的32为IN和OUT汇编指令。当然Cosmos已经对汇编指令进行了封装,我们就不需要直接对汇编指令进行操作了,直接调用即可。阅读全文
    posted @ 2012-01-16 08:22 Hundre 阅读(990) | 评论 (1) 编辑
    摘要: 启动RTL8139 发送0x00到config1(0x52)寄存器来设置LWAKE+LWPTN(这两个应该是针脚的名字)为高电平(to active high.)这一步是启动该设备的关键操作。 软复位 接下来我们应该做一次软复位来清理RX和TX缓冲区并设置所有东西回默认值。这一操作用来清除在通电启动时候仍然留在缓冲区或者寄存器中的垃圾。 发送0x01到Command寄存器(0x37)将会使RTL8139进入软复位。只要这个字节被发送过去,可以检查RST位来确认芯片是否完成复位。如果RST位为high(1),那么复位仍在进行中。 另:在Qemu模拟器中有个小小的bug,如果在执行软复位前检查command寄存器,你可能会发现RST是high(1)。这时,尽管忽略它继续进行初始化操作。 初始化接收缓冲区 这一部分,我们将设置一段芯片地址位置为接收缓存的开始地址。一种方法是,定义个缓存变量并把这个变量地址发送到PBSTART寄存器(0x30),如: char rx_buffer[8192+16]; // declare the阅读全文
    posted @ 2011-09-28 17:50 Hundre 阅读(1385) | 评论 (4) 编辑
    摘要: 既然COSMOS使用C#来写的,为什么我们需要一个如此底层的调试?我们觉得很多用户可能只需要用到C#调试器。尽管如此,汇编级调试器对工作在编译器上的用户或者在直接和硬件交互的调试中的用户来说是一个很大的帮助。阅读全文
    posted @ 2011-09-21 17:52 Hundre 阅读(254) | 评论 (0) 编辑
    摘要: 介绍 这篇文章将展示在COSMOS中如何实现基于WINDOWS API调用和内部调用的.net代码。另外,也包含了如何使用COSMOS,汇编或者X#语言与硬件直接进行交互。 Cosmos是什么 Cosmos一个使用Visual Studio作为开发环境的操作系统开发工具(development kit)。尽管如此,任何基于.net的语言,包括VB.NET,Fortran,Delphi Prism,IronPython,F#等等都可以用来进行开发。Cosmos本省和内核运行都是使用C# 来写的,所以命名为Cosmos。而且,NOSMOS(.NET Open Source Managed Operating System)听起来太蠢了。 Cosmos不是传统意义上的操作系统,它更应该叫做操作系统工具(Operating System Kit) ,或者正如我所说的叫做“Operating System Legos”(不知如何翻译,嘿嘿)。Cosmos让您能像使用Visual Studio和C#创建应用程序一样创建操作系统。大部分用户可以在几分钟之内自己写和引导阅读全文
    posted @ 2011-08-11 03:18 Hundre 阅读(862) | 评论 (0) 编辑
    摘要: 在各种库中,有一部分的库是封装了对底层硬件的操作的,例如在屏幕上输入字符,使用网卡发送数据包等。因为是直接对硬件进行操作,所以这一种类型的库的代码是和硬件相关的,这就是为什么我们会有x86的标准C程序库和arm的标准C程序库,两套不同的硬件体系,需要不同的库来完成对硬件的实际操作,每一套库中,都根据不同的硬件情况,按照硬件的规格定义好数据的排列方式(这就是为什么会有int,int16,int32,int64这么多蛋疼的数据类型的原因之一,因为编译器编译后有些数据必须占有足够长的位数以符合硬件产品的规格要求),以及根据硬件的功能提供出相应的函数,然后编译器编译时就能编译出符合硬件要求的格式的数据排列方式和操作这些数据的机器码。阅读全文
    posted @ 2011-04-18 17:15 Hundre 阅读(1999) | 评论 (3) 编辑
    摘要: 对于IBM-PC兼容机的硬件启动流程我目前理解是这样的:通电->BIOS初始化与自检->CPU初始化->加载硬盘的0磁道0柱面1扇区的内容进内存并开始执行这一部分的内容。到此,硬件的过程—注意是硬件--就走完了,剩下的就都交给0磁道0柱面1扇区的程序来执行,这里面的东西就是我们程序员要做的东西了。 这里如果没有操作系统的话,那么从0磁道0柱面1扇区开始执行的程序就是我们自己写的程序,但这样一次只能执行一个,很浪费硬件资源,如果要换别的程序的话还得重新启动一次硬件,所以我们希望这个首先执行的程序可以一直运行,然后再向这个程序发出命令,让这个程序来执行我们想要执行的程序,这样就可以不用重启硬件就能运行多个程序了,慢慢地这个我们对其发出命令让其运行别的程序的程序就变成了我们所谓的操作系统了。阅读全文
    posted @ 2011-03-28 12:06 Hundre 阅读(2388) | 评论 (10) 编辑
    摘要: 由于是纯C#的开发环境,因此IL2CPU责任重大,需要实现C#语言的各种特性,包括对象的初始化、多态、事件、委托等等,当然到cosmos-12304为止,这些特性还没有全部实现(后面的应该会一步一步的都实现,不过还没有看过后面的源代码,只是猜测而已)。除此之外,IL2CPU还负责处理对.net的运行库(这个运行库并不是.net framework,这个库是COSMOS自己实现的与.net framework类似但要小很多很多的一个库,以后再讲这一部分)阅读全文
    posted @ 2011-02-23 11:31 Hundre 阅读(2150) | 评论 (12) 编辑
    摘要: 编译过LINUX的朋友应该都熟悉Make文件吧,在这里面可以清楚的看到使用编译器把C源代码编译成二进制源代码的流程,中间干了什么都可以看得清清楚楚。但使用VS的朋友一般都是程序写好之后直接F5就运行了,后面做了什么我们根本不知道。对于COSMOS的源代码,VS只是帮我们编译成了IL的代码,这种代码无法在没有CLR环境中运行,所以VS还需要把IL代码编译为针对CPU的本地代码。这中间的流程都由MSBuild这个东西控制。对于MSBuild的介绍可以直接查看MSDN文档。总的来说这个东西的地位就相当于Make文件的地位吧,指导VS如何生成可以引导的二进制文件。阅读全文
    posted @ 2011-02-03 08:40 Hundre 阅读(2134) | 评论 (5) 编辑
    摘要: cosmos全称C# open source manage operation system,是一个使用C#语言基于.net framwark框架编写的开源操作系统,主页www.gocosmos.org。可从cosmos.codeplex.com获取最新的源代码。阅读全文
    posted @ 2011-01-31 11:48 Hundre 阅读(3065) | 评论 (7) 编辑
  • 相关阅读:
    基本数据类型相互转换及操作方法
    python以及计算机原理基础简要摘录
    Linux程序包管理
    rpm命令详解
    Linux程序包管理
    Linux任务计划
    压缩,解压缩工具及bash脚本编程
    btrfs文件系统管理与应用
    LVM应用
    CSS核心技术
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2392211.html
Copyright © 2011-2022 走看看