標籤

2017年2月23日 星期四

[轉] 在 Windows 8 裡面安裝 .NET Framework,許多舊軟體才能跑

轉自: http://www.techbang.com/posts/12495-install-the-net-framework-bu-qiu-ren

已經升級 Windows 8 的人說來也不少,新手上路除了得習慣 Modern UI,難免還會碰上些問題。就像使用半新不舊的軟體,可能跳出要求安裝 .NET Framework 的畫面,其實 Windows 8 已經內建,只是需要動手執行安裝而已。

懶人用上網下載安裝法

前些時間傳出「Yahoo!奇摩輸入法」將停止維護,連同下載服務也會一併關閉,不少人搶著下載備份。想將它安裝在Windows 8問題就來了,像它這樣需要.NET Framework 3.5的軟體不算少,是該去哪兒變出來呢?其實系統內建支援4.5、3.5、3.0、2.5等版本,但是預設只會安裝4.5版,幸好Microsoft設計還算大心,出現提醒畫面時選擇「安裝此功能」,也能自動上網下載安裝。
建議Windows 8灌好後,先將硬體裝置驅動程式裝妥,然後立馬進行.NET Framework 3.5安裝設定,就不會被應用軟體煩到。進入「控制台」點選「程式與功能」,再選擇「開啟或關閉Windows功能」,將眼前「.NET Framework 3.5(包括.NET 2.0和3.0)」打勾勾並按下「確定」,就能自動從網路下載並且完成安裝。
▲過去Windows 7也經常出現這類訊息,上網下載是最簡單的解決方式。
▲Windows 8內建支援舊版本,控制台內的新增方式,也是從網路下載。

遇到問題就手動作業吧

無奈有時願與事違,搞老了老半天仍然無法下載安裝,說來真是令人氣結。或者沒有網際網路資源、3G上網有封包限制的壓力,以及其他疑難雜症時,倒不如手動作業來得乾脆。
進階操作方式不用連接網際網路,只需要準備好Windows 8安裝光碟,以管理員身分開啟「命令提示字元」輸入下列操作指令,就會自動從光碟抓出檔案來進行安裝。指令中x:是放置Windows 8光碟的磁碟機代號,實體DVD、虛擬光碟機、USB等都可以,自行依電腦環境組態修改代號即可。
Dism /online /enable-feature /featurename:NetFx3 /All /Source:❌:\sources\sxs /LimitAccess

▲在命令提示字元輸入操作指令,只需要準備安裝光碟而不用連上網路。
有些人安裝時會遇到「0x800F0906」錯誤碼,可以試著在「執行」輸入「gpedit.msc」,進入「本機群組原則編輯器」。依序點開「電腦設定、系統管理範本、系統」,找到「指定選用之元件安裝和元件修復的相關設定」,將「已啟用」和「直接連絡Windows Update下載修復內容,而不是從Windows Server Update Services(WSUS)」點選、打勾,最後按下「確定」儲存。之後到「命令提示字元」輸入「gpupdate /force」指令,讓剛設定好的修改值套用,應該就能解決了。
▲修改本機群組原則編輯器設定值,可以解決部分無法順利安裝的問題。

2017年2月15日 星期三

我對中斷的理解(以IRQ為主) - 1

太多轉貼的網誌有點無聊,今天來寫寫自己對於中斷的理解。


1. 軟體中斷與硬體中斷。

OS必須要知道硬體中斷的發生,像是我們敲敲鍵盤動動滑鼠的動作,OS都必須要去讀取keystroke,我們必須做更多事來處理硬體中斷,來確保CPU能夠順利再回到原來的狀態,這篇文章會提到比較多的IRQ便是屬於硬體中斷。

而軟體中斷,常見的TRAP或EXCEPTION,我都是用除以零去理解,當CPU都收到這種要求,產生算術邏輯錯誤,便會產生一個軟體中斷去中止PROGRAM。

2. IRQ的產生
Device要跟CPU要資源做事有兩種方式,一種是CPU來POLLING,但這種方式太浪費CPU資源,所以便有了IRQ( interrupt request),當Device需要CPU幫忙,便透過中斷跟CPU要資源。

3. 誰會發IRQ
這邊要講的是PCI device,一個PCI device會有四隻腳讓他發IRQ,INTA# INTB# INTC# INTD#,如果你是single function PCI device,就是透過INTA#,這部分是Boad designer去設計,BIOS只能read。

4. 8259 PIC - Programmable Interrupt Controller
早期需要中斷的DEVICE就是KEYBOARD、MOUSE、CMOS等等,後來越來越多device需要發中斷,而處理這些事情,便是靠傳說中的8259,8259長這樣:
「8259」的圖片搜尋結果
我們可以看到它是兩個接在一起的,就是說明IRQ不夠用的最佳例子(一個不夠我就接兩個),其中大部分的IRQ都被占用了,這部分可以參考WIKI: https://en.wikipedia.org/wiki/Interrupt_request_(PC_architecture)
可鍵盤滑鼠計時器等等都有占用到固定的IRQ了,一般而言沒有用的還有IRQ10, IRQ11就是我們可以用來分配的。對於8259而言,IRQ number小的優先權較大,由於IRQ2是用來串接的,所以優先權依序為0~1, 8~15, 3~7。

3.1 8259暫存器
暫略

3.2 Shared IRQ
8根不夠用,難道15根就夠用嗎,如果還是不夠怎麼辦。所以IRQ有共享的觀念,那要怎麼共享呢?很簡單,我們在IRQ前面加個P,他就Programmable了。

3.3. PIRQ
當然不是加個P就好了,share IRQ的同時,我們需要做什麼呢? INTEL當初的設計是找廠商在設計幾根PIN,線路圖長這樣。

這張圖是網路找的,應該是當初有根INTEL合作的廠商吧,我們可以看到這個CHIP有四根腳,分別是PIRQA#, PIRQB#, PIRQC#, PIRQD#。BIOS在POST的時候,會把可以用的IRQ收集起來,根據SYSYEM的狀況,把這些可用的PIN填入PIRQA# PIRQB# PIRQC# PIRQD#對應的register,這張圖為例,當我的PCI Slot 1透過INT A#發出了中斷,他接到了PIRQA#,透過register 60H,router知道要用IRQ9,最終便透過IRQ9發出,若透過INT C#發出中斷,對應到62H,一樣是IRQ9,自此IRQ透過register就Programmable,共享的概念就達成了。

到最後PIRQ也不夠用了,所以又多了PIRQE#...PIRQH#,是不是蠻無言的,這也為日後APIC的出現留下伏筆,下篇再談。

難道這樣就完成了嗎,不我們還差一點點,到這邊為止device只是發出IRQ,但是OS只知道有人發了IRQ,並不知道是誰發的,所以有了IRQ routing table。

4.1 IRQ routing table
早期這個table存在於memory,現在就是用ACPI去規範他。我節錄ACPI的sample code如下

Method(_PRT,0) {
Package(){0x0000FFFF, 0, LNKA, 0 },
Package(){0x0000FFFF, 1, LNKB, 0 },
Package(){0x0000FFFF, 2, LNKC, 0 },
Package(){0x0000FFFF, 3, LNKD, 0 },
}
這邊第一個參數就交代了device的訊息(D0, any fucntion)。
APIC在這邊的描述又有些不同,以後再提。

5.後述
可以看出即便在IRQ不夠的狀態下,錢還是要賺,硬體還是要出,所以出現了許多過渡產品,之後為了要相容這些,也衍生出不少問題。
無論如何,這都是我粗淺的理解,之後會繼續往下衍生,有錯還請先進指正。

2014年10月27日 星期一

How to use RTC reigister to set wake up time

From EDKII, It is simple but useful. If your BIOS vendor not provide the items in setup menu, you may give it a try.

1. Check your RTC_EN at PCH.
2. Refer to http://stanislavs.org/helppc/cmos_ram.html, set your alarm time, don't forget to set update enable/disable and AIE bit.

That's all,  EDKII sample code as below

LibSetWakeupTime (
  IN BOOLEAN      Enabled,
  OUT EFI_TIME    *Time
  )
{
  EFI_STATUS            Status;
  EFI_TIME              RtcTime;
  RTC_REGISTER_B        RegisterB;
  UINT8                 Century;
  EFI_TIME_CAPABILITIES Capabilities;

  if (Enabled) {

    if (Time == NULL) {
      return EFI_INVALID_PARAMETER;
    }
    //
    // Make sure that the time fields are valid
    //
    Status = RtcTimeFieldsValid (Time);
    if (EFI_ERROR (Status)) {
      return EFI_INVALID_PARAMETER;
    }
    //
    // Just support set alarm time within 24 hours
    //
    LibGetTime (&RtcTime, &Capabilities);
    if (Time->Year != RtcTime.Year ||
        Time->Month != RtcTime.Month ||
        (Time->Day != RtcTime.Day && Time->Day != (RtcTime.Day + 1))
        ) {
      return EFI_UNSUPPORTED;
    }
    //
    // Make a local copy of the time and date
    //
    CopyMem (&RtcTime, Time, sizeof (EFI_TIME));

  }
  //
  // Acquire RTC Lock to make access to RTC atomic
  //
  EfiAcquireLock (&mRtc.RtcLock);

  //
  // Wait for up to 0.1 seconds for the RTC to be updated
  //
  Status = RtcWaitToUpdate (100000);
  if (EFI_ERROR (Status)) {
    EfiReleaseLock (&mRtc.RtcLock);
    return EFI_DEVICE_ERROR;
  }
  //
  // Read Register B, and inhibit updates of the RTC
  //
  RegisterB.Data      = RtcRead (RTC_ADDRESS_REGISTER_B);

  RegisterB.Bits.SET  = 1;
  RtcWrite (RTC_ADDRESS_REGISTER_B, RegisterB.Data);

  if (Enabled) {
    ConvertEfiTimeToRtcTime (&RtcTime, RegisterB, &Century);

    //
    // Set RTC alarm time
    //
    RtcWrite (RTC_ADDRESS_SECONDS_ALARM, RtcTime.Second);
    RtcWrite (RTC_ADDRESS_MINUTES_ALARM, RtcTime.Minute);
    RtcWrite (RTC_ADDRESS_HOURS_ALARM, RtcTime.Hour);

    RegisterB.Bits.AIE = 1;

  } else {
    RegisterB.Bits.AIE = 0;
  }
  //
  // Allow updates of the RTC registers
  //
  RegisterB.Bits.SET = 0;
  RtcWrite (RTC_ADDRESS_REGISTER_B, RegisterB.Data);

  //
  // Release RTC Lock.
  //
  EfiReleaseLock (&mRtc.RtcLock);

  return EFI_SUCCESS;
}

2014年2月18日 星期二

UEFI edkI vs edkII


其實由intel和這種大企業制定的標準,本來就會比較OOXX。
現在又來個大改版,更加模組化。
光看資料的長相就大不同。



UEFI從edk到edkII,來小小整理一下,希望不要理解錯誤

UFEI是個interface,跟windows很像((畢竟就是這些人訂的
像是FV->folder, FFS->file,
所有描述的方式都是為了讓UFEI"認識"這是什麼東西。

到了edkII,又多了一個package,要讓他更模組化。
以往寫的driver或是module,就是一隻一隻的,沒有模組的概念。
現在可以把這些driver包起來變成一package。
蠻直觀,EX: Securitypkg,那大概裡面放的都是跟security有關的driver,
裡面會有自己的dsc,也可以分開build 這些package。
如果你發現package folder裡面沒有dsc檔,那是因為bios vendor幫你auto generate。
而且是for 整個project,我覺得失去edk2的原意,但你還是可以自己寫code去build。

缺點,是我覺得讓整個CODE又更加肥大了。

為了這樣的改變,就必須多一些描述,讓UEFI認識這些新東西。
像是inf裡面
[Packages]
  MdePkg/MdePkg.dec
  MdeModulePkg/MdeModulePkg.dec
[Pcd]
  gEfiMdeModulePkgTokenSpaceGuid.PcdLoadFixAddressBootTimeCodePageNumber    ## SOMETIMES_CONSUMES
  gEfiMdeModulePkgTokenSpaceGuid.PcdLoadFixAddressRuntimeCodePageNumber     ## SOMETIMES_CONSUMES
  gEfiMdeModulePkgTokenSpaceGuid.PcdLoadModuleAtFixAddressEnable            ## CONSUMES
  gEfiMdeModulePkgTokenSpaceGuid.PcdMaxEfiSystemTablePointerAddress         ## CONSUMES

多了packages and PCD的描述

至於PCD,platform configuration database,又讓code海更加茫茫。
翻開SPEC可用的protocol很簡單,不是get就是set。

我暫時簡單理解他像Setup variable那樣,也實際佔了ROM size,只是用途不同,可以runtime改變這些PCD的值((透過PCD的PROTOCOL去存取。
實作上還完全不明白。

DEC
定義PCD的entry,PCD entries會被build tool自動產生成 autogen.h autogen.c。

待續






Not least of which

"Not the least of which" usually follows a plural noun phrase that implies a set of things or qualities, and draws attention to a significant member of that set, e.g.

1. Tom has many engaging qualities, not the least of which is his considerable good humour.

Thus here, the underlined part is the set, and the emboldened part is the significant member of that set.

In your example, which is extremely elliptic, the set is only implicit:

2. Tom is a bad guy, [with many bad qualities], not the least of which [is the fact that] he is always criticizing others.

http://forum.wordreference.com/showthread.php?t=1442830