由於linux體系特殊的結構,於是我們在嵌入式linux中是不能夠直接訪問暫存器的。比如,我們在51中,想讓乙個io口輸出高電平,只需要讓相應的暫存器置1就可以,但是,linux為了保證其程式的可移植性,以及程式的穩定性,不允許這樣直接訪問暫存器。
那麼,linux中怎樣才能夠像我們平常操作微控制器一樣來操作暫存器呢?
這就必須涉及到linux的體系結構了。linux把記憶體劃分為所謂的「核心空間」和「使用者空間「,在使用者空間中,記憶體是虛擬出來的,每乙個程序都有乙個單獨的虛擬記憶體(什麼叫做程序呢?簡單的乙個理解方式,就是我們平常所寫的乙個main函式),這個虛擬記憶體是從0開始的,無論使用者想寫什麼程式,訪問哪一段記憶體,都是可以訪問的。但是,值得注意的是,這裡的記憶體是虛擬出來的,並不是我們平時用微控制器訪問的實實在在的記憶體。
而核心空間中,訪問的記憶體都是真實存在的。但是,真實存在,並不一定代表你能夠訪問這個位址——核心這個東東需要得到保護,倘若程式設計人員不小心誤操作,在核心執行的記憶體中寫入了不該寫入的東西,那麼就kernel panic了,就悲劇了...
於是,linux專門開闢了一段記憶體不用的區域,用來給提供給使用者來訪問真實的暫存器。但是,這一段記憶體的位址,和我們微控制器(比如arm9)中暫存器的位址極有可能不一樣,那麼怎麼辦呢?
於是,有了記憶體重定向的乙個概念,把一段記憶體對映到另外一段記憶體中去,最終,我們實際上訪問的是重定向之後的記憶體空間。
這篇帖子裡面的內容。
多說一句,這裡的重定向,是指在驅動程式裡面,可以進行記憶體的重定向——驅動程式是執行在使用者空間和核心空間的乙個介面,因此可以訪問實際的記憶體位址(無論是不是重定向了)。但是,我們寫的使用者空間的應用程式,是無論如何也訪問不了實際的記憶體的——想想就明白了,因為整個程式都是執行在虛擬記憶體中,怎麼能意識到自己實際上在**呢?
說到最後,所謂虛擬記憶體,其實就是類似於《黑客帝國1》裡面的neo,生活在乙個大的虛擬記憶體(虛擬空間)中,卻從來感覺不到自己是虛擬出來的。而每次他需要進入虛擬空間的那個東西,就是從腦子後面插進去的那個東西,就相當於驅動程式麼,把使用者空間(虛擬記憶體,虛擬世界)和核心空間(真實記憶體,真實世界)聯絡起來了。
Linux 下訪問PHY晶元暫存器
mdio eth0 1 讀取phy暫存器1的數值 mdio eth0 0 0x1120 將0x1120寫入 phy暫存器1 eth0 為mac層控制器的名稱,一般為eth0 或mgmt0。include include include include include include include ...
mysql 訪問暫存器 暫存器 記憶體訪問
一 ds和 address cpu要讀寫乙個記憶體單元的時候,必須先給出這個記憶體單元的位址,在8086pc中記憶體位址有段位址和偏移位址組成。ds 資料暫存器 中通常存放要訪問資料的段位址。比如要讀取1000h單元的內容,可以用下面這段 mov bx,1000h mov ds,bx mov al,...
Linux下讀寫暫存器
arm裸機下讀寫暫存器很容易,各個暫存器和記憶體的位址是單一位址空間,他們是用相同的指令進行讀寫操作的.而在linux下就要複雜很多,因為linux支援多個體系架構的cpu。比如arm和x86就不一樣,具體的差別我暫時也說不上來,這個涉及到cpu體系的設計。目前我只關心 linux為了支援多個硬體體...