bloggerads

2015年12月31日 星期四

C# : algorithm "List" sample code

namespace List
{
    class Program
    {
        static void Main(string[] args)
        {
            List<int> list = new List<int>(new int[] { 19, 23, 29 });

            int index = list.IndexOf(23); // Check if 23 Exists.
            Console.WriteLine(index);

            index = list.IndexOf(10); // Does not exist.
            Console.WriteLine(index);

            list.Add(35);
            list.Insert(1, 40);
            list.Remove(23); // RemoveAt(index) method, or the Remove(obj)
            list.RemoveAt(0); // RemoveAt(index) method, or the Remove(obj)

            foreach (int x in list)
            {
                Console.WriteLine(x);    
            }

            Console.ReadLine();
        }
    }
}


C# : algorithm "Dictionary" sample code

The following sample code was searched from internet, It's a good example to show how C++ map work on C# as Dictionary


// Algorithm map
namespace Map
{
    class Program
    {
        static void Main(string[] args)
        {
            // Use Dictionary as a map.
            var map = new Dictionary<string, string>();

            // ... Add some keys and values.
            map.Add("cat", "orange");
            map.Add("dog", "brown");

            // ... Loop over the map.
            foreach (var pair in map)
            {
                string key = pair.Key;
                string value = pair.Value;
                Console.WriteLine(key + "/" + value);
            }

            // ... Get value at a known key.
            string result = map["cat"];
            Console.WriteLine(result);

            // ... Use TryGetValue to safely look up a value in the map.
            string mapValue;
            if (map.TryGetValue("dog", out mapValue))
            {
                Console.WriteLine(mapValue);
            }
        }
    }
}

2015年12月30日 星期三

C# : The difference between C# and C in initializing a struct array

The difference between  C# and C in initializing a struct array

// C#
struct st
{
    public int x;
    public int y;
} 
public static void Main(string[] args)
{
    st [] o = new st [] {
        new st { x=2, y=3 },
        new st { x=3, y=4 }
    };
}

// C/C++
struct st
{
    int x;
    int y;
};

int main()
{
    st o[] = {
        {.x=2, .y=3},
        {.x=3, .y=4}
    };
}

2015年12月29日 星期二

ACPI: Power Management

ACPI: Advanced Configuration & Power Interface

ACPI分別對系統(Gx), 周邊裝置(Dx), 睡覺層級(Sx), CPU(Cx) 定義電源層級, 如下

1. Gx (Global state, 整個系統) :
  • G0 = Working state (C0~C3)
  • G1 = Sleeping state (S2~S4)
  • G2 = Soft off (S5)正常關機,電源還插著因此主機板還有standby power,可被外部如LAN喚醒開機
  • G3 = 拔電源(Mechanical off)
2. Dx (Device state, 周邊設備) :
  • D0 = 正常運作
  • 耗電 D1 > D2
  • D3 = 斷電

2015年12月24日 星期四

x86 spec / Bios 常見術語

[ CPUID ] 
CPUID 是 80486 CPU 新增的一個指令,它的用途在於鑑別 CPU 種類或提供 CPU 特性,讀取方式如下:

void cpuid (DWORD  idx) // idxindex, 不同index得到不同資料
{
    _asm
    {
        mov eax, idx
        cpuid     
    }
    // eax, edx, ecx,...值為CPU相關的資訊
}

Check fingerprint of SSH public key (Linux command)

//
// Check SSH public key fingerprint
//
[root@martin Desktop]# ls /etc/ssh/*key*
/etc/ssh/ssh_host_ecdsa_key      /etc/ssh/ssh_host_ed25519_key.pub
/etc/ssh/ssh_host_ecdsa_key.pub  /etc/ssh/ssh_host_rsa_key
/etc/ssh/ssh_host_ed25519_key    /etc/ssh/ssh_host_rsa_key.pub

[root@martin Desktop]# ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub 
2048 99:d1:36:00:44:0a:cb:70:83:c8:21:76:c5:2a:d7:d9   (RSA)   // fingerprint

2015年12月22日 星期二

pscp (putty) : Transfer data between Windows / Linux

Step 1: Install putty, I use pscp command in putty in Windows side (client)


Step 2: Install openssh-server openssh-client in Linux side (server)

sudo apt-get install openssh-server openssh-client

Step 3: Demonstrate a example (The default path in Linux is Home)

# I am in windows (client), trying to copy file e:\MyFile.xxx from / to Linux(server)

My Linux configure --->  IP: 111.111.111.111, 
Admin_Name/Password: MartinLee/8888, 
file at Home/Documents/MyFile.xxx


2015年12月7日 星期一

ACPI: APEI (ACPI Platform Error Interfaces)

ACPI: OS和Bios溝通的介面,APCI定義有3個Runtime元件(ACPI Registers/ACPI Bios/ACPI Tables)



OSPM: 支援ACPI規範的OS
ACPI Bios: 支援ACPI規範的Bios

2015年12月5日 星期六

UEFI : programming notes


UEFI是Intel為了取代傳統的Bios而定義的一個架構並將其open source,而Bios vendor基於Intel release的UEFI原始碼下去增加功能以及維護。晶片廠/系統廠的target則是使用Bios vendor提供微調過的版本來撰寫自己特定功能的DXE driver以及PEI階段晶片的Internal setting, 還有安裝一些特定的SMI handle來處理板子相關的硬體問題。

UEFI一共分成SEC->PEI->DXE->BDS->TSL->RT->AL這幾種階段。
我們會將晶片的一些driving 值寫在PEI stage。DXE階段大部分Bios Vendor都有提供相對應的driver。目前只有碰到為了寫Option Rom或做實驗才針對這個device去寫DXE driver。

焦點回到PEI->DXE這兩個關鍵的階段並列出一些重要的觀念:

1.  在boot時,PEI的階段基本上會有兩條路,一條是正常開機呼叫到的function,另一種則是S3 resume呼叫到的function,而Bios 在S3不做DXE init。因此如果是為了加code來patch 問題,必須知道patch的點

2.  PEI 裡面的程式都是叫做module, PEIM, 這些module有些是有相依性的。PEI和PEI互相溝通的橋梁就是PPI,透過這個interface, (*PeiServices)->LocatePpi(), 可以去呼叫已被安裝的service以及去讀取外部的參數

3.  在PEI到DXE時,會透過HOB, (*PeiServices)->GetHobList去得到由PEI階段pass過來的資料

4. 在x86架構就是使用PCI架構及其定義的三種空間, (CFG space / MMIO / IO space),基本上掌握住這三種空間的access方式,加code就不會太難。在早期legacy Bios + DOS的年代要access就是: MMIO 透過指標,IO及CFG space透過IN/OUT指令就可以完成了。UEFI的架構則最好是透過PEI service/ DXE protocol來做。DXE的部分就是使用 EFI PCI IO PROTOCOL 這個protocol

2015年12月3日 星期四

MSI Capability (0x05) 和 MSIX Capability (0x11)

MSI (Message Signaled Interrupts) :

MSI的優點是透過軟體的方式來產生中斷而非透過HW Interrupt pin,在線路上比較簡單。透過給定MSI Control Register可以依device的能力(bit3:1)決定要使用1,2,4,...,32個中斷(設定6:4),並在所指定的Message Address寫入含有中斷向量資訊的Message就可以完成。



2015年12月1日 星期二

SMBus (System Management Bus)

X86架構下要access SMBus device,可以透過 SMBus Controller (D31:F3)的IO Base address ,Intel定義這個IO位置在PCI configuration space的0x20~0x23


從0x20~0x23得到SMBus IO Base address後,主要是操作下列0~7 offset IO registers就可以完成Byte/Word/Block command的R/W