2013-07-23 32 views
0

我正在使用英特爾酷睿2雙核CPU和Windows 7操作系統。我聽說每個設備都映射到內存中,如果有的話我怎樣才能得到連接到我的系統的鍵盤的地址?我的意圖是將鍵盤輸入讀入一個volatile變量。那可能嗎 ?如何找出鍵盤的地址

+0

您可以使用scanf語句將從標準輸入輸入的數據讀入變量。 –

+1

簡答:是的,您可以將鍵盤輸入讀入變量。儘管你的問題的其餘部分沒有意義。 1.>爲什麼你想要鍵盤的映射內存的地址?你正在編寫一個操作系統或驅動程序?爲什麼你的變量是volatile? –

+0

@Santhosh Pai:是的,我可以做到這一點,但我想知道更多關於揮發性變量。是否可以直接從對應於鍵盤的地址讀取? –

回答

8

這將是您的鍵盤連接到USB控制器的地址。但是,知道這將不會讓你直接訪問鍵盤,因爲:

  1. 它是一個USB控制器,而不是鍵盤本身。鍵盤將消息發送到USB控制器,而USB控制器又被OS解釋爲「鍵盤事件」。

  2. 操作系統保護硬件地址,這樣你只能通過適當的設備驅動程序訪問它們。

在過去,它用來甚至可以不是存儲器,鍵盤變爲一個「鍵盤控制器」芯片,其在I/O端口60和64(或60/61出現在非常原始IBM PC和XT PC)。儘管如此,在現代操作系統中,如果沒有設備驅動程序,您無法「窺視」或「戳穿」鍵盤。

+0

啊,'偷看'!美好的過去! :-) –

+0

@Mats Petersson:我只是想通過執行一個程序來測試一個volatile變量。有沒有辦法讓我可以得到一個原始的可訪問地址(其內容隨時間變化)。 –

+0

@Mats Petersson:我如何獲得USB控制器的地址? –

0

我不知道Windows 7操作系統,但我敢肯定它不會讓你直接訪問鍵盤設備,如果只是出於安全原因。

1

鍵盤是一個標準輸入設備和scanf可用於從鍵盤來閱讀。

+2

這個答案有什麼問題? –

1

volatile在內核空間大多被使用。如果你想看到這個關鍵字的行動,最簡單的方法是編寫一個簡單的Linux內核模塊,它讀取一些隨機的CPU周邊寄存器。

UPDATE

即使volatile經常被用來讀取硬件寄存器中,例如,微控制器固件,它不是唯一的用例。在下面的一些評論之後,很明顯的是,其他一些真實場景也是可能的,例如內存映射文件。 「內存」的內容可能會發生變化,程序不會看到任何寫入內容。如果不使用volatile,編譯器會相應地優化讀取操作,導致返回/處理錯誤的數據。

+0

有沒有可能在Windows中讀取CPU周邊寄存器 Os? –

+0

不,除非你正在編寫驅動程序,我希望你明白一個簡單的事實:現在每個用戶進程都在自己的地址空間中運行,並且無法訪問系統內存? –

+0

如何訪問Linux CPU寄存器? –

1

我不知道如何訪問MS Windows中的受限內存區域。在Linux中,您可以使用iopermiopl來獲得I/O端口特權。

鍵盤映射到0x60狀態寄存器和0x64輸入緩衝存儲器位置。你可以得到如何閱讀,並直接從鍵盤寫的東西一個很好的概述:http://www.brokenthorn.com/Resources/OSDev19.html

而且你可能想看看Linux的鍵盤驅動程序源代碼。

但是,如果您有計劃使用這些端口直接讀取鍵盤中輸入的字符,就像您在getcharscanf等中那樣,那麼這是不正確的。使用這些端口,您需要編寫自己的鍵盤驅動程序,以解碼通過這些端口發送的任何內容,然後將它們映射到要按的字符,小心或切換鍵等等。

+0

So code like const volatile char * keyBoardInput =(const volatile char *)0x60;將按鍵讀入? –

+0

不,您需要使用'in'和'out'彙編指令從端口讀取。否則,您可以使用Linux中提供的'inb'和'outb'宏。 – phoxis

+0

在哪個頭文件中我可以找到inb和outb宏? –