2017-09-25 104 views
0

就像用來指向頁面目錄的CR3寄存器一樣。 Linux也使用分頁,並用C編寫,但C中如何使用這些寄存器(如何使用C選擇特定的寄存器)?C中如何使用寄存器?

+3

如果您想直接使用寄存器,則需要使用匯編語言進行編碼。 –

+0

以及宏如何初始化?(我的意思是我已經閱讀了一些宏來選擇寄存器),我還沒有看到Linux中的分頁源代碼中的彙編語言。該代碼如何工作? –

+3

你正在努力達成什麼目標。通常情況下,你不需要在C中使用CPU寄存器,BTW C語言沒有指定如何訪問寄存器。但是許多編譯器都有擴展,允許您直接尋址CPU寄存器。 –

回答

5

C語言無法訪問特定的處理器寄存器。這完全取決於編譯器。

要訪問特定的寄存器,您必須至少將這部分代碼寫入彙編器。

+0

我的意思是你的回答沒有回答這個問題,你應該將它作爲評論發佈。 –

+3

@MichaelWalz - 但它確實回答了這個問題。 OP在純C的範圍內詢問。純C不允許。因此,這是答案。短暫不會減損它。 – StoryTeller

+0

@StoryTeller好的,也許我會刪除我的評論。 –

4

您所談論的寄存器不是該語言的屬性,而是您運行程序的硬件的屬性。我相信你在談論x86類型的硬件。 cr0-4和其他特定的regs是操作系統的一個屬性,由它管理,包括分頁表。

因此,該語言不提供訪問這些hw專用寄存器的方法。唯一的方法是編寫彙編代碼(特定於硬件)來操作它們。該語言提供的唯一東西是允許在程序中插入彙編代碼的asm()運算符。

+1

'__asm__ '是由特定實現提供的*擴展*;它不是標準C語言定義的一部分。 –

+0

@JohnBode對,標準的是'asm()'。我修好了它。 – Serge

+2

'asm'作爲一個通用擴展名在J.5.10下列出,但它不是核心語言或庫的一部分。正如J.5/1中所述:「以下擴展在許多系統中得到廣泛應用,但不適用於所有 實現。」 –

3

標準C不提供任何工具來直接訪問處理器寄存器。一些實現可能提供擴展,允許您將彙編代碼嵌入到您的C代碼中(例如gcc提供的asm擴展)。一般來說,如果您需要直接訪問處理器寄存器(或其他特定於硬件的位置),則可以使用匯編器編寫該例程並將其鏈接到較大的程序中。