欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: C語(yǔ)言竟是這樣調(diào)用硬件的 [打印本頁(yè)]

作者: 51hei小林    時(shí)間: 2016-9-25 11:15
標(biāo)題: C語(yǔ)言竟是這樣調(diào)用硬件的
大家都知道我們可以使用C語(yǔ)言寫(xiě)一段程序來(lái)控制硬件工作,但你知道其工作原理嗎?
網(wǎng)友北極C語(yǔ)言在實(shí)際運(yùn)行中,都是以匯編指令的方式運(yùn)行的,由編譯器把C語(yǔ)言編譯成匯編指令,CPU直接執(zhí)行匯編指令。
所以這個(gè)問(wèn)題就變成,匯編指令是如何操作硬件的?
如果把硬件平臺(tái)限制在x86環(huán)境下,那么匯編指令操作硬件基本上只有兩種方式:
方式一:
通過(guò)向內(nèi)存空間寫(xiě)數(shù)據(jù)。硬件會(huì)把硬件上的各種寄存器(外行可以理解為訪問(wèn)硬件的接口或者操作硬件的工具)映射到某一塊內(nèi)存地址空間上,之后只要用匯編指令,甚至C語(yǔ)言去讀寫(xiě)這一段內(nèi)存地址空間(并非真正操作物理內(nèi)存),就可以達(dá)到操作硬件的目的了。
如果題主還有WindowsXP環(huán)境(虛擬機(jī)也可以),就可以用匯編指令直接操作顯存:
MOV AX,B800
MOV ES,AX
XOR DI,DI
MOV CX,0800
MOV AX,5555
REPZ STOSB
硬件的各種寄存器會(huì)被映射到某一塊物理內(nèi)存中,這種方式稱(chēng)為MMIO,在Windows的設(shè)備管理器里,右鍵點(diǎn)設(shè)備,看屬性-》資源里,不少硬件設(shè)備都有“內(nèi)存范圍”的參數(shù),這里的內(nèi)存范圍就表示這個(gè)硬件的資源可以通過(guò)訪問(wèn)這一段內(nèi)存來(lái)控制它。
具體如下圖:

方式二:
x86匯編中,還有兩個(gè)特殊的指令是IN和OUT,這是x86平臺(tái)獨(dú)有的,上面圖里的I/O范圍,就是用IN/OUT這兩個(gè)指令來(lái)訪問(wèn)和控制的。
以上兩種訪問(wèn)硬件的方式,第一種是可以用C語(yǔ)言實(shí)現(xiàn)的,上面一段匯編,本質(zhì)上類(lèi)似于C語(yǔ)言代碼:
char ptr = 0xB8000;
int i;
for (i = 0; i 《0x800; i++)
{
ptr + i = 0x55;
}
第二種IN/OUT方式?jīng)]有直接的C語(yǔ)言語(yǔ)法對(duì)應(yīng),需要自己封裝匯編。
那么為什么平時(shí)很難用C語(yǔ)言操作硬件呢?這是因?yàn)槠綍r(shí)寫(xiě)的代碼大多數(shù)都在保護(hù)模式下,保護(hù)模式下,直接訪問(wèn)物理地址會(huì)受到限制,C語(yǔ)言操作的地址都是虛地址。
對(duì)于Windows來(lái)說(shuō),要訪問(wèn)物理地址,需要工作在內(nèi)核模式,也就是的寫(xiě)驅(qū)動(dòng)才行。
而在顯存方面,首先,題主要先明白物理地址和虛擬地址的概念。
原來(lái)的8086cpu設(shè)計(jì)的時(shí)候,地址空間有一塊區(qū)域(640K-1M)之間,有一塊作為顯存使用
這里你說(shuō)的預(yù)留的地址,是指物理地址,這一段地址的準(zhǔn)確范圍是000A0000-000BFFFF,不管是32位還是64位CPU,這一段物理內(nèi)存地址一直都保留給顯存使用,不區(qū)分32位還是64位,也不區(qū)分保護(hù)模式還是實(shí)模式。
以下是我電腦上的截圖(系統(tǒng)環(huán)境為Win7 64位,CPU是i7 4770K):

可見(jiàn)這一段內(nèi)存至今仍然是留給顯卡使用的。
那么現(xiàn)在為什么不能直接用這段內(nèi)存了?
因?yàn)楝F(xiàn)在的軟件都運(yùn)行在保護(hù)模式下,訪問(wèn)的地址都是虛擬地址,而并非物理地址,包括你使用cmd命令打開(kāi)的環(huán)境,都是虛擬地址,雖然32位XP里能用debug命令向000B8000上寫(xiě)數(shù)據(jù)并能顯示在cmd的界面里,但本質(zhì)上,這都是虛擬出來(lái)的。
如果要想用這段顯存怎么辦?
自己寫(xiě)一個(gè)簡(jiǎn)易的操作系統(tǒng),不啟動(dòng)顯卡的各種圖形加速功能,CPU進(jìn)入保護(hù)模式后在GDT里映射一個(gè)4G的數(shù)據(jù)段,與物理地址一致,那么向000B8000上寫(xiě)數(shù)據(jù),就會(huì)像過(guò)去DOS一樣顯示在屏幕上,所以保護(hù)模式下也可以訪問(wèn)這一段內(nèi)存。所以,保護(hù)模式下,也可以用它。
顯卡那么多顯存是怎么映射的?
再看截圖:

有很多內(nèi)存地址被映射給顯存了,就是通過(guò)這種映射關(guān)系,把一些物理地址留給顯存,使得CPU能像訪問(wèn)內(nèi)存一樣訪問(wèn)顯存資源。
當(dāng)然,實(shí)際情況是,2G顯存未必完全映射,而是只映射一部分地址,顯卡有一些開(kāi)放的寄存器能夠控制哪部分顯存映射過(guò)來(lái),這樣就能使得CPU在使用比較少的物理地址范圍的情況下,訪問(wèn)全部的顯存。
還有一個(gè)很有意思的事情:在虛擬機(jī)里,找到映射的高地址部分的第一塊內(nèi)存區(qū)域,寫(xiě)一個(gè)能直接訪問(wèn)物理地址的程序(比如一個(gè)驅(qū)動(dòng)),去讀這一塊內(nèi)存,然后寫(xiě)到文件里,再用屏幕截圖,也寫(xiě)到文件里,會(huì)發(fā)現(xiàn)截圖的內(nèi)容和顯存里讀出來(lái)的內(nèi)容基本上是一樣的。
 網(wǎng)友a(bǔ)wayisblue要回答你的問(wèn)題,我們需要要知道:
網(wǎng)友Chow Anod北極已經(jīng)說(shuō)的很到位了。我補(bǔ)充一些知識(shí)點(diǎn):
1  語(yǔ)言層面上,C能直接操作的“硬件”只有內(nèi)存地址。雖然C支持register關(guān)鍵字,但是不能指定某個(gè)特定的寄存器,所以只有內(nèi)存地址。而C中操作內(nèi)存地址的方式就是指針。例如:
char p = 。..;p = 。..;
2  根據(jù)1反推,可以明白如果要開(kāi)放給C來(lái)操作某個(gè)硬件,最直接的方案就是設(shè)計(jì)硬件的時(shí)候預(yù)先分配好一些固定的地址的用途,然后實(shí)際項(xiàng)目中往這些固定地址寫(xiě)入合法的數(shù)據(jù)。這樣就可以通過(guò)類(lèi)似
uint32_t p = SCREEN_ADDR;p = RGBA(0xff,0xff,0xff,0xff);
這樣的代碼來(lái)實(shí)現(xiàn)對(duì)硬件的操作了。
3  那這個(gè)地址怎么拿到呢?什么樣的數(shù)據(jù)才是合法的呢?要解答這些問(wèn)題,就需要查閱具體設(shè)備的spec了。例如這個(gè)一眼看過(guò)去就能的明白的例子(一眼沒(méi)看明白請(qǐng)反復(fù)閱讀以完全理解上面第二點(diǎn)內(nèi)容):
PS:x86架構(gòu)的代碼不能這么寫(xiě),原因見(jiàn)北極的回答。
網(wǎng)友北極我們是用電腦的鍵盤(pán)來(lái)輸入的指令,每一個(gè)指令都對(duì)應(yīng)一個(gè)ASCII碼,而這里的ASCII碼就是有序的電壓的高低(或電流的有無(wú),下面只提電壓的高低),即我們輸入的是電壓的高低,你所看到代碼是這些電壓的高低控制顯示器所顯示的圖像,其實(shí)電腦也不知道它是什么,只知道這樣顯示。

結(jié)論:代碼其實(shí)就是存儲(chǔ)在存儲(chǔ)器(內(nèi)存、硬盤(pán)或者閃存等等)中有序的電壓的高低。

再說(shuō)編譯:

編譯是一個(gè)有序的電壓的高低向另一種有序的電壓高低的一種轉(zhuǎn)換過(guò)程,下面以52單片機(jī)為例,我們編譯是從表示ASCII碼的那種有序電壓高低轉(zhuǎn)換為52單片機(jī)能夠識(shí)別的另一種規(guī)定好的有序電壓高低,即表示HEX文件的電壓高低。

結(jié)論:編譯出的結(jié)果還是電腦中存儲(chǔ)的有序電壓高低。

到單片機(jī)燒錄:

接下倆就是燒錄,理解了上面兩點(diǎn)就很容易理解下面的內(nèi)容,燒錄就是電腦中的有序電壓高低通過(guò)數(shù)據(jù)線傳輸?shù)絾纹瑱C(jī)中的ROM中。

接下來(lái)ROM就可以釋放其中的電壓來(lái)控制外圍的電路。

總結(jié):從代碼的編輯到最后對(duì)電路的控制都是電壓在起作用,只是為了方面我們而給我們展現(xiàn)的形式不一樣而已,而其本質(zhì)都是電壓,這樣也就不存在轉(zhuǎn)換。

理解這句話:世界上沒(méi)有軟件,軟件只是對(duì)硬件的一種反映,就像意識(shí)是對(duì)世界的一種反映是一樣的!

相信這樣就很容易理解了。

看到有人贊同了我的觀點(diǎn),很開(kāi)心,針對(duì)題目我再補(bǔ)充一點(diǎn):

只要你提到0/1,提到軟件,這個(gè)問(wèn)題就沒(méi)法理解。..因?yàn)檐浖景?/1】和硬件始終存在一道無(wú)法跨越的鴻溝;

你說(shuō)你在單片機(jī)中寫(xiě)0,請(qǐng)問(wèn)你是如何寫(xiě)0的?在鍵盤(pán)上敲個(gè)0?實(shí)際還是電平【和我們理解的數(shù)字沒(méi)關(guān)系】,那個(gè)0只是你在電腦顯示器上電平的呈現(xiàn)形式,那個(gè)所謂的0【實(shí)質(zhì)是電平】可以傳輸?shù)絾纹瑱C(jī)中的ROM中,電平控制電平?jīng)]什么疑問(wèn)吧,這樣就輸出低電平了。..

有錯(cuò)誤歡迎指出。







歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1