Linux中Framebuffer驅動詳解1

2021-06-23 07:15:18 字數 2168 閱讀 3379

之前看過很多書籍和網上資料,了解了linux中framebuffer的框架和一些結構體以及必備的硬體知識。但令本人深感"痛恨"的是,這些資料無不是點到為止(有些深入一些有些只介紹大概),貼**的時候總是省略了很多內容,難道就不能有一本書或一篇文章將整個framebuffer**全部講完嗎?在這裡我想"挑戰"一下。

本篇文章基於核心版本linux3.0.x,雖然已經不是很新,但驅動中的機制是萬變不離其宗的,因此版本顯得不是那麼重要了。

linux中framebuffer驅動動能主要涉及以下兩個檔案:

1.kernel源**/include/linux/fb.h: framebuffer驅動的標頭檔案;

2.kernel源**/drivers/video/fbmem.c: framebuffer驅動的核心實現檔案。

剛上手的人都迫不及待地想直接看源**,我當初上手時這種願望尤其強烈,因此在這裡先跳過頭檔案,直接看原始檔中的**。

先看入口函式,在fbmem.c中:

/**

* fbmem_init - init frame buffer subsystem

** initialize the frame buffer subsystem.

** note: this function is _only_ to be called by drivers/char/mem.c.

**/

static int __init

fbmem_init(void)

return 0;

}

#ifdef module

module_init(fbmem_init);

static void __exit

fbmem_exit(void)

module_exit(fbmem_exit);

module_license("gpl");

module_description("framebuffer base");

#else

subsys_initcall(fbmem_init);

#endif

這段**即是framebuffer的入口點,一切從這裡開始.

#ifdef自不必多說,學過c語言的都知道這是預編譯指令,這裡不想多說,看到核心驅動級**的人不會連這個都不知道.這段**的意思是如果framebuffer驅動作為模組載入,則執行以下這段:

static int __init

fbmem_init(void)

return 0;

}

module_init(fbmem_init);

static void __exit

fbmem_exit(void)

module_exit(fbmem_exit);

module_license("gpl");

module_description("framebuffer base");

如果不是作為模組載入,而是直接編譯進核心,則執行以下這句:

subsys_initcall(fbmem_init);

其中:kernel源**/include/linux/init.h中:

#define module_init(x)__initcall(x);

#define __initcall(fn) device_initcall(fn)

#define device_initcall(fn) __define_initcall("6",fn,6)

#define subsys_initcall(fn)__define_initcall("4",fn,4)

具體意義這裡不作過多解釋,後續我會專門發文章介紹。只要記住乙個是模組初始化,乙個是子系統初始化。

module_init()或subsys_initcall()中呼叫了fbmem_init(),module_exit()中呼叫了fbmem_exit(),此外還有一些結構體和一些呼叫函式。這些都是什麼意思?

要弄清楚這些內容,且聽下回分解。

Linux中許可權

當你在linux下用命令ll 或者ls la的時候會看到這些字眼,這些字眼表示為不同使用者組的許可權 r read就是讀許可權 數字4表示 w write就是寫許可權 數字2表示 x excute就是執行許可權 數字1表示 讀 寫 執行三項許可權可以用數字表示,就是r 4,w 2,x 1。所以,rw...

Linux中控制代碼

1.控制代碼就是乙個識別符號,只要獲得物件的控制代碼,我們就可以對物件進行任意的操作。2.控制代碼不一定是指標。作業系統用控制代碼可以找到一塊記憶體,這個控制代碼可能是識別符號,例如map的key,也可能是指標,看作業系統怎麼處理的了。fd算是在某種程度上替代控制代碼吧 linux 有相應機制,但沒...

Linux中的時鐘概念Linux中的時鐘概念

linux的時鐘中斷中涉及至二個全域性變數乙個是xtime,另乙個則是jiffies。有乙個與時間有關的時鐘 實時時鐘 rtc 這是乙個硬體時鐘,用來持久存放系統時間,系統關閉後靠主機板上的微型電池保持計時。系統啟動時,核心 通過讀取rtc來初始化wall time,並存放在xtime變數中,即xt...