bloggerads

2015年9月14日 星期一

DOS boot menu problem (autoexec.bat + exe file )

在dos下想要做選單連結一些執行檔,但是將執行檔路徑寫在autoexec.bat 常常會碰到顏色花掉以及執行完執行檔卻回不了DOS的問題。
原因是因為在執行autoexec.bat時DOS initial還沒完成(還必須設定VGA mode跟執行int 21h回到Dos),因此autoexec.bat內不能直接執行用C寫的程式,要先寫執行一個組合語言寫的程式切video mode 以及呼叫DOS中斷來回到DOS,才會完整跑完DOS initial的流程。
在autoexec.bat最前面先放以下這隻程式,之後再跑其他的C語言寫的執行檔都能順正常執行,執行完後也能順利回到DOS

2015年8月20日 星期四

SATA : PMP (Port Multiplier)

這份spec常常被人遺忘,但她又確確實實定義在AHCI和SATA裡,先不論市場的接受度如何,相信做碟機相關技術的朋友都很好奇這個是什麼。

首先先看看spec所給的架構圖:


2015年8月12日 星期三

DRAM overview

每周部門meeting都會討論各function owner的issue,然後幾乎都是一堆DRAM的issue。
我自己也不是很懂,不過我把比較常聽到同事講的東西加上自己的理解寫一篇來分享

1. DRAM Data的寬度是 8 bytes (64bits)/ 含有ECC的則是72bits

2. Channel/Rank/記憶體顆粒的解釋:
  1. 1個channel可以有很多Dimm, 但每個channel有支援Rank的數量限制 (如H61/H81單一Channel只能接受2個Rank)
  2. 1條Dimm可以有很多Rank. (一條記憶體目前最多是有4個Rank)
  3. 1個Rank資料寬度是64bit, 由許多記憶體顆粒組成這個資料寬度, 1個記憶體顆粒資料寬度可能是8bit, 16bit,.同一個Rank上的記憶體顆粒他們的CS都是接在一起。
  4. bank則是cell 組成的二維陣列(Row & Column), 使用控制訊號為BA0, BA1,.
3. DRAM 頻率的算法
  • IO clock (或稱Bus clk, 外頻) = Memory clock (或稱Internal clk, 內頻)* 1或2或4或8 (要看是DDR或DDR2或DDR3或DDR4)
  • Data rate (數據速率) = Memory clock * 2或4或8或16 (要看是DDR或DDR2或DDR3或DDR4)
  • ex: 模組名稱: PC3-6400 (DDR3-800): IO clock=400MHz(因為是double date rate), 記憶體clock=100MHz, 數據速率=800MT/s
4. Bios會透過SMBUS讀取每根Dimm上的SPD來知道他的大小、資料寬度、速度以及電壓

5. Bank Interleaving技術: 原理是將奇數位址和偶數位址分在不同bank,減少讀寫當前字元而影響下一個字元的時間

6. CPU 至 DRAM 顆粒層級由大至小為 channel>DIMM>rank>chip>bank>row/column

2015年8月1日 星期六

UEFI : ROM 格式

相關設定請參考 .fdf (Flash Description Files)檔案

UEFI對於ROM的格式,可以分為下面幾項:(由大集合到小集合)

 Firmware Device (FD):
Bios Rom即是一個 FD, 一個FD可以由多個FV組成
 Firmware Volume (FV):
每個FV通常是由一個 header+N個Firmware Files所組成, 一般說的Boot Firmware Volume/ Recovery Firmware Volume/ Main Firmware Volume就是以這個為單位, FV的細部定義如下:

2015年7月26日 星期日

C# 呼叫 VC++ 的dll 檔

fallowing example been tested ok in VC 2010

UEFI 各階段資料的傳遞方式

  將bios 選單變數(ex: SetupData.my_var)傳遞到PEI及DXE的方法


  //
  // PEI 接收資料
  //
  Status = (*PeiServices)->LocatePpi (
                          PeiServices,
                          &gEfiPeiReadOnlyVariablePpiGuid,
                          0,
                          NULL,
                          &ReadOnlyVariable
                          );
                          
  ASSERT_PEI_ERROR (PeiServices, Status);
  VariableSize = sizeof (SETUP_DATA);
  
  Status = ReadOnlyVariable->GetVariable (
                            PeiServices,
                            L"Setup",
                            &gEfiSetupGuid,
                            NULL,
                            &VariableSize,
                            &SetupData
                            );
                            
  if (EFI_ERROR (Status)) 
      return;

SMBios (System Management Bios)

使用者可以透過SMBios知道這台電腦的詳細規格,RW everything / RW這些tool都有提供SMBios data查詢。

SMBios是一份軟體的spec, 他定義了兩個table, 即EPS ( Entry Point structure) 和 Structure Table

EPS位於記憶體1MB以下64K之間,也就是0xF0000 ~ 0xFFFFF之間。透過程式搜尋搜尋_SM_和_DMI_這兩個Keyword可以找到這個table。

以下是 SMBIOS 2.1 (32-bit) Entry Point structure,這邊列出比較重要的部分


Offset
Name
Length
Description
00h
Anchor String
4 BYTEs
_SM_, specified as four ASCII characters (5F 53 4D 5F).
10h
Intermediate Anchor String
5 BYTEs
_DMI_, specified as five ASCII characters (5F 44 4D 49 5F)
16h
Structure Table Length
WORD
Total length of SMBIOS Structure Table, pointed to by the Structure Table Address, in bytes
18h
Structure Table Address
DWORD
32-bit physical starting address of the read-only SMBIOS Structure
1Ch
Number of SMBIOS Structures
WORD
Handle的數量