核心中與驅動相關的記憶體操作之十一 IO記憶體

2021-06-20 09:45:29 字數 1833 閱讀 9732

裝置通常會提供一組暫存器用於控制裝置、讀定裝置和獲取裝置狀態

,即控制暫存器、資料暫存器和狀態暫存器

.這些暫存器可能位於

i/o空間

,也可能位於記憶體空間

.當位於

i/o空間時

,通常被稱為

i/o埠

,位於記憶體空間時

,對應的記憶體空間被稱為

i/o記憶體

.在嵌入式

linux中,

我們接觸最多的就是

i/o記憶體

:

#define request_mem_region(start,n,name) __request_region(&iomem_resource, (start), (n), (name), 0)
向核心申請

n個記憶體位址

,這些位址從

first

開始,name

引數為裝置的名稱

.如果分配成功返回值為非

null,

如果返回

null,

則意味著申請

i/o記憶體失敗

.其相反的動作函式為

:

int release_resource(struct resource *old)
這對函式一般用來判斷

i/o記憶體是否已經被占用了

.它一般配合

platform_get_resource()

函式來使用

.platform_get_resource()

用來獲取平台裝置端的

i/o記憶體位址空間

,並以其返回值為引數.如下

:

struct resource *platform_get_resource(struct platform_device *dev,unsigned int type, unsigned int num)
以s3c2440的rtc為例,簡單說明:

1.	static int __devinit s3c_rtc_probe(struct platform_device *pdev)  

2.

9.

10. s3c_rtc_mem = request_mem_region(res->start,res->end-res->start+1,pdev->name);

11. ... ...;

12. }

[注:]i/o記憶體一般只用來判斷我們目標操作記憶體是否被占用,但是這並不是必須的. 在對

i/o記憶體的訪問核心提供了專門的

api:

1.	unsigned readb(address);  

2. unsigned readw(address);

3. unsigned readl(address);

4.

5. void writeb(unsigned value, address);

6. void writew(unsigned value, address);

7. void writel(unsigned value, address);

例如

s3c2440

的lcd

驅動裡面,對

lcd主控端暫存器的配置

:

1.	static int __init s3c24xxfb_probe(struct platform_device *pdev,enum s3c_drv_type drv_type)  

2.

核心中與驅動相關的記憶體操作之十 記憶體屏障

雖然實際驅動中不常用 但是閱讀核心比較深層的 經常會遇到 為什麼存在記憶體屏障呢 先看一下下面的場景 編譯器和處理器為了提高效率 可能對讀和寫操作重新進行了排序,例如 在某些處理器上 以下 a 1 b 2 有可能在 a中存放新值之前就在 b中存放新值.但是,我們在操作記憶體或者和硬體互動時 常常需要...

核心中與驅動相關的記憶體操作之八 面向頁的記憶體分配

1.概述 當我們在核心驅動 中需要用到大量記憶體時,一般建議採用面向頁的記憶體管理.面向頁的記憶體管理有如下優點 高效利用記憶體,避免記憶體碎片的產生.因為核心都是基於頁為基本單位去管理記憶體的.面向頁的記憶體管理,顧名思義,就是以頁為基本單位來操作記憶體的.它比kmalloc 對記憶體使用上效率會...

Linux核心裝置驅動之核心中煉表的使用筆記整理

核心中煉表的應用 1 介紹 在linux核心中使用了大量的鍊錶結構來組織資料,包括裝置列表以及各種功能模組中的資料組織。這些鍊錶大多採用在include linux list.h實現的乙個相當精彩的鍊錶資料結構。鍊錶資料結構的定義很簡單 struct list head list head結構包含兩...