zoukankan      html  css  js  c++  java
  • Cosmos动手练习(基于里程碑2的代码).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

    好了,练习完毕,

    最后还是广告时间,大家懂的:

    欢迎大家经常光顾小弟的淘宝充值店:http://hundre.taobao.com/

    好了,多谢大家捧场 微笑

  • 相关阅读:
    Xfire的aegis绑定方式配置小结
    ExtJS入门
    InstallScript 中数组的使用
    [转]手把手教你用C#(.NET)打包应用程序(安装程序)【卸载模块已添加】
    [VB]全局钩子
    VB.NET 反射机制取得当前函数名 类名等
    [.Net][转]dotNet取得各种系统信息
    [VB]清空Clipboard
    [VB]取得本机的网络连接(类似netstat 命令)
    [InstallShield] 安装时添加一个进度对话框Dialog
  • 原文地址:https://www.cnblogs.com/li0803/p/2329158.html
Copyright © 2011-2022 走看看