新聞中心
在操作系統(tǒng)中,設(shè)備驅(qū)動(dòng)程序是一個(gè)非常重要的組件。它們溝通計(jì)算機(jī)硬件設(shè)備與操作系統(tǒng),使其獲得正確的輸入和輸出,進(jìn)而讓用戶(hù)使用這些設(shè)備。在Linux中,驅(qū)動(dòng)程序可以分為字符設(shè)備驅(qū)動(dòng)和塊設(shè)備驅(qū)動(dòng)。這篇文章將重點(diǎn)介紹。

創(chuàng)新互聯(lián)建站是專(zhuān)業(yè)的華安網(wǎng)站建設(shè)公司,華安接單;提供成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專(zhuān)業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行華安網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專(zhuān)業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專(zhuān)業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
1. 了解字符設(shè)備驅(qū)動(dòng)和Linux內(nèi)核
在開(kāi)始編寫(xiě)字符設(shè)備驅(qū)動(dòng)之前,需要先對(duì)字符設(shè)備驅(qū)動(dòng)和Linux內(nèi)核有一定的了解。字符設(shè)備驅(qū)動(dòng)是一種設(shè)備驅(qū)動(dòng)程序,用于連接操作系統(tǒng)和字符設(shè)備,如串口、鍵盤(pán)、鼠標(biāo)等。Linux內(nèi)核是操作系統(tǒng)的核心部分,負(fù)責(zé)管理計(jì)算機(jī)硬件的資源和運(yùn)行程序的資源,其中也包含了設(shè)備驅(qū)動(dòng)程序的管理。因此,了解這些定義和概念將有助于更好地理解Linux字符設(shè)備驅(qū)動(dòng)程序的編寫(xiě)。
2. 設(shè)計(jì)字符設(shè)備驅(qū)動(dòng)程序
在開(kāi)始編寫(xiě)字符設(shè)備驅(qū)動(dòng)程序之前,需要設(shè)計(jì)它的接口和功能。這涉及到向內(nèi)核注冊(cè)設(shè)備驅(qū)動(dòng)程序,并提供一組數(shù)據(jù)結(jié)構(gòu)和操作函數(shù),以便內(nèi)核可以和設(shè)備進(jìn)行通信和管理。數(shù)據(jù)結(jié)構(gòu)和操作函數(shù)將被稱(chēng)為“設(shè)備節(jié)點(diǎn)”,并被保存在內(nèi)核的一個(gè)“設(shè)備文件系統(tǒng)”中。在此過(guò)程中,需要考慮的因素包括操作系統(tǒng)和設(shè)備的整體架構(gòu)、設(shè)備的通信接口、數(shù)據(jù)傳輸協(xié)議等。
3. 編寫(xiě)字符設(shè)備驅(qū)動(dòng)程序
一旦完成了設(shè)計(jì),就可以開(kāi)始編寫(xiě)驅(qū)動(dòng)程序。因?yàn)長(zhǎng)inux內(nèi)核已經(jīng)定義好了一些通用的設(shè)備驅(qū)動(dòng)接口,所以設(shè)計(jì)程序時(shí)通??梢越梃b這些接口。然后,通過(guò)函數(shù)來(lái)實(shí)現(xiàn)各種驅(qū)動(dòng)功能,并將這些函數(shù)與驅(qū)動(dòng)程序的主體代碼進(jìn)行鏈接。這些函數(shù)包括open,read,write,close等,它們分別表示打開(kāi)設(shè)備、讀取設(shè)備、寫(xiě)入設(shè)備和關(guān)閉設(shè)備的功能。其中,每個(gè)函數(shù)都需要有正確的參數(shù)和返回值,才能正確地完成其任務(wù)。
4. 測(cè)試和調(diào)試驅(qū)動(dòng)程序
當(dāng)驅(qū)動(dòng)程序編寫(xiě)完畢后,就需要進(jìn)行測(cè)試和調(diào)試。在Linux內(nèi)核中,可以使用模塊加載器來(lái)顯示驅(qū)動(dòng)程序的消息,以幫助進(jìn)行測(cè)試和調(diào)試。模塊加載器負(fù)責(zé)將驅(qū)動(dòng)程序加載到內(nèi)核中,并在設(shè)備的前端添加一個(gè)設(shè)備節(jié)點(diǎn)。然后,可以通過(guò)命令行輸入來(lái)測(cè)試驅(qū)動(dòng)程序的功能,從而確定是否需要進(jìn)行進(jìn)一步的修補(bǔ)和調(diào)試。
結(jié)語(yǔ):
Linux字符設(shè)備驅(qū)動(dòng)程序的設(shè)計(jì)和編寫(xiě)需要一定的技能和知識(shí)。但是,如果按照上述的步驟,通過(guò)逐步學(xué)習(xí)和實(shí)踐,就可以掌握這些技能,成功地編寫(xiě)出一個(gè)高效、可靠的驅(qū)動(dòng)程序。因此,對(duì)于任何一個(gè)想要進(jìn)一步深入了解操作系統(tǒng)和硬件資源交互的技術(shù)人員來(lái)說(shuō),學(xué)習(xí)和掌握Linux字符設(shè)備驅(qū)動(dòng)程序編寫(xiě)技術(shù)是非常有必要的。
相關(guān)問(wèn)題拓展閱讀:
- 如何系統(tǒng)的學(xué)習(xí)Linux驅(qū)動(dòng)開(kāi)發(fā)
如何系統(tǒng)的學(xué)習(xí)Linux驅(qū)動(dòng)開(kāi)發(fā)
先熟悉module的使用和編寫(xiě)
一、什么是module
從名字上看就是模塊的意思,我個(gè)人的理解就是一個(gè)一個(gè)的小程序,可以進(jìn)行動(dòng)態(tài)的安裝和卸載,而在這里面就實(shí)現(xiàn)一些功能,其中驅(qū)動(dòng)就是在module中。
二、編寫(xiě)一個(gè)最簡(jiǎn)單的module
編寫(xiě)一個(gè)最簡(jiǎn)單的module只需要兩個(gè)文件即可:Makefile和xxx.c
(1)Makefile
1 #ubuntu的內(nèi)核源碼樹(shù),如果要編譯在ubuntu中安裝的模塊就打開(kāi)這2個(gè) 2 #KERN_VER = $(shell uname -r) 3 #KERN_DIR = /lib/modules/$(KERN_VER)/build
6 #開(kāi)發(fā)板的linux內(nèi)核的源碼樹(shù)目蔽耐錄 7 KERN_DIR = /root/3288_5.1/kernel
8 9 obj-m += module_test.o10 11 all:make -C $(KERN_DIR) M=`pwd` modules
13 14 .PHONY: clean
15 clean:make -C $(KERN_DIR) M=`pwd` modules clean
在上面的Makefile中,最核心的一句就是make -C $(KERN_DIR) M=`pwd` modules
這句話的意思就是進(jìn)宏手春入到kernel的源碼目薯腔錄中,使用內(nèi)核源碼中的編譯規(guī)格來(lái)進(jìn)行編譯這個(gè)模塊。
其目的主要是為了將module和kernel保持一致,在加載module時(shí)就不會(huì)出錯(cuò)。
(2)module_test.c
1 #include// module_init module_exit 2 #include// __init __exit 3 4 // 模塊安裝函數(shù) 5 static int __init chrdev_init(void) 6 {
7 printk(KERN_INFO “chrdev_init helloworld init\n”);return 0;10 }11 12 // 模塊卸載函數(shù)13 static void __exit chrdev_exit(void)14 {printk(KERN_INFO “chrdev_exit helloworld exit\n”);16 }17 18 module_init(chrdev_init);19 module_exit(chrdev_exit);20 21 // MODULE_xxx這種宏作用是用來(lái)添加模塊描述信息22 MODULE_LICENSE(“GPL”); // 描述模塊的許可證23 MODULE_AUTHOR(“xuan”); // 描述模塊的作者24 MODULE_DESCRIPTION(“module test”); // 描述模塊的介紹信息25 MODULE_ALIAS(“alias xxx”);// 描述模塊的別名信息
(3)編譯和安裝module
進(jìn)入到代碼的文件夾中,輸入:make
然后,將生成的.ko文件放到平臺(tái)中,輸入:inod xxx.ko
根據(jù)這個(gè)思路去學(xué)習(xí)
建議在看看這本書(shū)《Linux就該這么學(xué)》
在學(xué)習(xí)之前一直對(duì)驅(qū)動(dòng)開(kāi)發(fā)非常的陌生,感覺(jué)有點(diǎn)神秘。不知道驅(qū)動(dòng)開(kāi)發(fā)和普通的程序開(kāi)發(fā)究竟有什么不同;它的基本框架又是什么樣的;他的開(kāi)發(fā)環(huán)境有什么特殊的地方;以及怎么寫(xiě)編寫(xiě)一個(gè)簡(jiǎn)單的字符設(shè)備驅(qū)動(dòng)前編譯加載,下面我就對(duì)這些問(wèn)題一個(gè)一個(gè)的介紹。
一、驅(qū)動(dòng)的基本框架
1. 那么究竟什么是驅(qū)動(dòng)程序,它有什么用呢:
l 驅(qū)動(dòng)是硬件設(shè)備與應(yīng)用程序之間的一個(gè)中間軟件層
l 它使得某個(gè)特定硬件能夠響應(yīng)一個(gè)定義良好的內(nèi)部編程接口,同時(shí)完全隱蔽了設(shè)備的工作細(xì)節(jié)
l 渣巖叢 用戶(hù)通過(guò)一組與具體設(shè)備無(wú)關(guān)的標(biāo)準(zhǔn)化的調(diào)用來(lái)完成相應(yīng)的操作
l 驅(qū)動(dòng)程序的任務(wù)就是把這些標(biāo)準(zhǔn)化的系統(tǒng)調(diào)用映射到具體設(shè)備對(duì)于實(shí)際硬件的特定操作上
l 如櫻 驅(qū)動(dòng)程序是內(nèi)核的一部分,可以使用中斷、DMA等操作
l 驅(qū)動(dòng)程序在用戶(hù)態(tài)和內(nèi)核態(tài)之間傳遞數(shù)據(jù)
2. Linux驅(qū)動(dòng)的基本框架
3. Linux下設(shè)備驅(qū)動(dòng)程序的一般可以分為以下三類(lèi)
1)字符設(shè)備
a)所有能夠象字節(jié)流一樣訪問(wèn)的設(shè)備都通過(guò)字符設(shè)備來(lái)實(shí)現(xiàn)
b)它們被映射為文件系統(tǒng)中的節(jié)點(diǎn),通常在/dev/目錄下面
c)一般要包含open read write close等系統(tǒng)調(diào)用的實(shí)現(xiàn)
2)塊設(shè)備
d)通常是指諸如磁盤(pán)、內(nèi)存、Flash等可以容納文件系統(tǒng)的存儲(chǔ)設(shè)備。
e)塊設(shè)備也是通過(guò)文件系統(tǒng)來(lái)訪問(wèn),與字符設(shè)備的區(qū)別是:內(nèi)核管理數(shù)據(jù)的方式不同
f)它允許象字符設(shè)備一樣棗困以字節(jié)流的方式來(lái)訪問(wèn),也可一次傳遞任意多的字節(jié)。
3)網(wǎng)絡(luò)接口設(shè)備
g)通常它指的是硬件設(shè)備,但有時(shí)也可能是一個(gè)軟件設(shè)備(如回環(huán)接口loopback),它們由內(nèi)核中網(wǎng)絡(luò)子系統(tǒng)驅(qū)動(dòng),負(fù)責(zé)發(fā)送和接收數(shù)據(jù)包。
h)它們的數(shù)據(jù)傳送往往不是面向流的,因此很難將它們映射到一個(gè)文件系統(tǒng)的節(jié)點(diǎn)上。
二、怎么搭建一個(gè)驅(qū)動(dòng)的開(kāi)發(fā)環(huán)境
因?yàn)轵?qū)動(dòng)是要編譯進(jìn)內(nèi)核,在啟動(dòng)內(nèi)核時(shí)就會(huì)驅(qū)動(dòng)此硬件設(shè)備;或者編譯生成一個(gè).o文件, 當(dāng)應(yīng)用程序需要時(shí)再動(dòng)態(tài)加載進(jìn)內(nèi)核空間運(yùn)行。因此編譯任何一個(gè)驅(qū)動(dòng)程序都要鏈接到內(nèi)核的源碼樹(shù)。所以搭建環(huán)境的之一步當(dāng)然是建內(nèi)核源碼樹(shù)
1.怎么建內(nèi)核源碼樹(shù)
a) 首先看你的系統(tǒng)有沒(méi)有源碼樹(shù),在你的/lib/ modules目錄下會(huì)有內(nèi)核信息,比如我當(dāng)前的系統(tǒng)里有兩個(gè)版本:
#ls /lib/ modules
2.6.15-rc7 2.6.21-1.3194.fc7
查看其源碼位置:
## ll /lib/modules/2.6.15-rc7/build
lrwxrwxrwx 1 root root 19:19 /lib/modules/2.6.15-rc7/build -> /root/xkli/linux-2.6.15-rc7
發(fā)現(xiàn)build是一個(gè)鏈接文件,其所對(duì)應(yīng)的目錄就是源碼樹(shù)的目錄。但現(xiàn)在這里目標(biāo)目錄已經(jīng)是無(wú)效的了。所以得自己重新下載
b)下載并編譯源碼樹(shù)
有很多網(wǎng)站上可以下載,但官方網(wǎng)址是:
下載完后當(dāng)然就是解壓編譯了
# tar –xzvf linux-2.6.16.54.tar.gz
#cd linux-2.6.16.54
## make menuconfig (配置內(nèi)核各選項(xiàng),如果沒(méi)有配置就無(wú)法下一步編譯,這里可以不要改任何東西)
#make
…
如果編譯沒(méi)有出錯(cuò)。那么恭喜你。你的開(kāi)發(fā)環(huán)境已經(jīng)搭建好了
三、了解驅(qū)動(dòng)的基本知識(shí)
1.設(shè)備號(hào)
1)什么是設(shè)備號(hào)呢?我們進(jìn)系統(tǒng)根據(jù)現(xiàn)有的設(shè)備來(lái)講解就清楚了:
#ls -l /dev/
crwxrwxrwx 1 root root 1,1 16:36 null
crwroot root 4,1 16:35 systty
crw-rw-rw- 1 root tty,1 16:36 tty
crw-rwroot tty,1 16:35 tty0
在日期前面的兩個(gè)數(shù)(如之一列就是1,3)就是表示的設(shè)備號(hào),之一個(gè)是主設(shè)備號(hào),第二個(gè)是從設(shè)備號(hào)
2)設(shè)備號(hào)有什么用呢?
l 傳統(tǒng)上, 主編號(hào)標(biāo)識(shí)設(shè)備相連的驅(qū)動(dòng). 例如, /dev/null 和 /dev/zero 都由驅(qū)動(dòng) 1 來(lái)管理, 而虛擬控制臺(tái)和串口終端都由驅(qū)動(dòng) 4 管理
l 次編號(hào)被內(nèi)核用來(lái)決定引用哪個(gè)設(shè)備. 依據(jù)你的驅(qū)動(dòng)是如何編寫(xiě)的自己區(qū)別
3)設(shè)備號(hào)結(jié)構(gòu)類(lèi)型以及申請(qǐng)方式
l 在內(nèi)核中, dev_t 類(lèi)型(在 中定義)用來(lái)持有設(shè)備編號(hào), 對(duì)于 2.6.0 內(nèi)核, dev_t 是 32 位的量, 12 位用作主編號(hào), 20 位用作次編號(hào).
l 能獲得一個(gè) dev_t 的主或者次編號(hào)方式:
MAJOR(dev_t dev); //主要
MINOR(dev_t dev);//次要
l 但是如果你有主次編號(hào), 需要將其轉(zhuǎn)換為一個(gè) dev_t, 使用: MKDEV(int major, int minor);
4)怎么在程序中分配和釋放設(shè)備號(hào)
在建立一個(gè)字符驅(qū)動(dòng)時(shí)需要做的之一件事是獲取一個(gè)或多個(gè)設(shè)備編號(hào)來(lái)使用. 可以達(dá)到此功能的函數(shù)有兩個(gè):
l一個(gè)是你自己事先知道設(shè)備號(hào)的
register_chrdev_region, 在 中聲明:
int register_chrdev_region(dev_t first, unsigned int count, char *name);
first 是你要分配的起始設(shè)備編號(hào). first 的次編號(hào)部分常常是 0,count 是你請(qǐng)求的連續(xù)設(shè)備編號(hào)的總數(shù). name 是應(yīng)當(dāng)連接到這個(gè)編號(hào)范圍的設(shè)備的名子; 它會(huì)出現(xiàn)在 /proc/devices 和 sysfs 中.
l第二個(gè)是動(dòng)態(tài)動(dòng)態(tài)分配設(shè)備編號(hào)
int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name);
使用這個(gè)函數(shù), dev 是一個(gè)只輸出的參數(shù), 它在函數(shù)成功完成時(shí)持有你的分配范圍的之一個(gè)數(shù). fisetminor 應(yīng)當(dāng)是請(qǐng)求的之一個(gè)要用的次編號(hào); 它常常是 0. count 和 name 參數(shù)如同給 request_chrdev_region 的一樣.
5)設(shè)備編號(hào)的釋放使用
不管你是采用哪些方式分配的設(shè)備號(hào)。使用之后肯定是要釋放的,其方式如下:
void unregister_chrdev_region(dev_t first, unsigned int count);
6)
2.驅(qū)動(dòng)程序的二個(gè)最重要數(shù)據(jù)結(jié)構(gòu)
1)file_operation
倒如字符設(shè)備scull的一般定義如下:
struct file_operations scull_fops = {
.owner = THIS_MODULE,
.llseek = scull_llseek,
.read = scull_read,
.write = scull_write,
.ioctl = scull_ioctl,
.open = scull_open,
.release = scull_release,
};
file_operation也稱(chēng)為設(shè)備驅(qū)動(dòng)程序接口
定義在 , 是一個(gè)函數(shù)指針的. 每個(gè)打開(kāi)文件(內(nèi)部用一個(gè) file 結(jié)構(gòu)來(lái)代表)與它自身的函數(shù)相關(guān)連( 通過(guò)包含一個(gè)稱(chēng)為 f_op 的成員, 它指向一個(gè) file_operations 結(jié)構(gòu)). 這些操作大部分負(fù)責(zé)實(shí)現(xiàn)系統(tǒng)調(diào)用, 因此, 命名為 open, read, 等等
2)File
定義位于include/fs.h
struct file結(jié)構(gòu)與驅(qū)動(dòng)相關(guān)的成員
lmode_t f_mode 標(biāo)識(shí)文件的讀寫(xiě)權(quán)限
lloff_t f_pos當(dāng)前讀寫(xiě)位置
lunsigned int_f_flag 文件標(biāo)志,主要進(jìn)行阻塞/非阻塞型操作時(shí)檢查
lstruct file_operation * f_op 文件操作的結(jié)構(gòu)指針
lvoid * private_data 驅(qū)動(dòng)程序一般將它指向已經(jīng)分配的數(shù)據(jù)
lstruct dentry* f_dentry 文件對(duì)應(yīng)的目錄項(xiàng)結(jié)構(gòu)
3.字符設(shè)備注冊(cè)
1)內(nèi)核在內(nèi)部使用類(lèi)型 struct cdev 的結(jié)構(gòu)來(lái)代表字符設(shè)備. 在內(nèi)核調(diào)用你的設(shè)備操作前, 必須編寫(xiě)分配并注冊(cè)一個(gè)或幾個(gè)這些結(jié)構(gòu). 有 2 種方法來(lái)分配和初始化一個(gè)這些結(jié)構(gòu).
l如果你想在運(yùn)行時(shí)獲得一個(gè)獨(dú)立的 cdev 結(jié)構(gòu),可以這樣使用:
struct cdev *my_cdev = cdev_alloc();
my_cdev->ops = &my_fops;
l如果想將 cdev 結(jié)構(gòu)嵌入一個(gè)你自己的設(shè)備特定的結(jié)構(gòu); 你應(yīng)當(dāng)初始化你已經(jīng)分配的結(jié)構(gòu), 使用:
void cdev_init(struct cdev *cdev, struct file_operations *fops);
2)一旦 cdev 結(jié)構(gòu)建立, 最后的步驟是把它告訴內(nèi)核, 調(diào)用:
int cdev_add(struct cdev *dev, dev_t num, unsigned int count);
說(shuō)明:dev 是 cdev 結(jié)構(gòu), num 是這個(gè)設(shè)備響應(yīng)的之一個(gè)設(shè)備號(hào), count 是應(yīng)當(dāng)關(guān)聯(lián)到設(shè)備的設(shè)備號(hào)的數(shù)目. 常常 count 是 1, 但是有多個(gè)設(shè)備號(hào)對(duì)應(yīng)于一個(gè)特定的設(shè)備的情形.
3)為從系統(tǒng)去除一個(gè)字符設(shè)備, 調(diào)用:
void cdev_del(struct cdev *dev);
4.open 和 release
無(wú)根之木不活,無(wú)基之樓不立,無(wú)論是學(xué)習(xí)哪個(gè)領(lǐng)域知識(shí),基礎(chǔ)是重中之重。
針對(duì)學(xué)習(xí)linux驅(qū)動(dòng),滑卜我們來(lái)仔細(xì)談?wù)劊?/p>
個(gè)人認(rèn)為C語(yǔ)言和數(shù)據(jù)結(jié)構(gòu)就是重中之重!Linux系統(tǒng)更優(yōu)秀的地方就在于內(nèi)核。無(wú)論悄純是進(jìn)程調(diào)度,內(nèi)存管理,還是數(shù)據(jù)的組織形式,而這些算法的基礎(chǔ)就是一個(gè)高效而精簡(jiǎn)的數(shù)據(jù)結(jié)構(gòu),紅黑樹(shù)也好,內(nèi)核鏈表也好,看不懂C語(yǔ)言,搞不清數(shù)據(jù)結(jié)構(gòu),基本上談不上做驅(qū)動(dòng)?;A(chǔ)不扎實(shí)不要談上層建筑,資源不全面就不要談合作,很簡(jiǎn)單的道理。
假設(shè)樓主的C語(yǔ)言和數(shù)據(jù)結(jié)構(gòu)都是勉強(qiáng)過(guò)關(guān)的(分得清指針函數(shù)函數(shù)指針,能夠熟練自定義鏈表并進(jìn)信運(yùn)穗行增刪改查等鏈表或樹(shù)的算法重組)。我們來(lái)談下一個(gè)階段,讓我們對(duì)類(lèi)Unix系統(tǒng)的基本操作有一個(gè)基本的了解,打開(kāi)文件,切換路經(jīng),更改個(gè)密碼,填個(gè)用戶(hù)什么的。
接下來(lái)我們來(lái)談驅(qū)動(dòng),做驅(qū)動(dòng)就得有做驅(qū)動(dòng)的樣子,不知道樓主之前玩過(guò)裸板51或者AVR沒(méi)有,如果沒(méi)有,盡快搞通,資源很多,跟著人家把電平配一遍,來(lái)個(gè)矩陣鍵盤(pán),組個(gè)跑馬燈,有成就感的同時(shí)也打下了硬件基礎(chǔ),好處大大滴。
基于操作系統(tǒng)的驅(qū)動(dòng),即必須了解內(nèi)核對(duì)驅(qū)動(dòng)程序的管理方法,怎樣劃分一個(gè)具體的設(shè)備,是字符型?塊設(shè)備?還是別的什么,或者從總線的角度來(lái)劃分一個(gè)設(shè)備,i2c也好,USB也罷,還是數(shù)據(jù)地址控制這么一個(gè)三總線形式,都是有必要掌握的東西。
上升到應(yīng)用,任何一個(gè)實(shí)踐項(xiàng)目中很難會(huì)有一個(gè)板子讓你從零開(kāi)始寫(xiě)驅(qū)動(dòng),百分之九十九是拿來(lái)改,這就是一個(gè)熟練的過(guò)程,做到一定多的東西,就會(huì)下意識(shí)地覺(jué)得,這個(gè)地方可能會(huì)有問(wèn)題,我需要留意一下。
總結(jié)一下,驅(qū)動(dòng)工程師其實(shí)也是一種硬件翻譯型工程師,其任務(wù)就是看懂手冊(cè)上的表格,然后體現(xiàn)在代碼里面??陀^地說(shuō),我們這個(gè)行業(yè)門(mén)檻較高,隊(duì)友較少,不過(guò)等到真正入門(mén)之后,那種成就感是無(wú)與倫比的。
可以讀讀內(nèi)核源碼,比如說(shuō)minix。你看的那本書(shū)還不錯(cuò),還有一本“設(shè)備驅(qū)動(dòng)程序”,好像是電力出版社的。另外你可以搞兩臺(tái)虛擬機(jī)試著做做東西,寫(xiě)程序經(jīng)驗(yàn)和感覺(jué)都很重要。
個(gè)人感覺(jué)書(shū)還是要紙質(zhì)的書(shū),確實(shí)如此,網(wǎng)上下的東西,看起來(lái)總覺(jué)得力不從心。
我旁讓前個(gè)人的感覺(jué)是有興趣內(nèi)核源碼要研究一下,很有幫助。另外有時(shí)候?qū)憱|西對(duì)概念的理解很重要,VC其實(shí)也不錯(cuò),因?yàn)檫\(yùn)清現(xiàn)在會(huì)VC的人越來(lái)越少了,我曾經(jīng)做過(guò)一段時(shí)間,滑羨那是n年前的事情了,因?yàn)橐恢弊鯨inux和JAVA,現(xiàn)在已經(jīng)徹底丟了,我們是做設(shè)備的,LInux,windows都需要做驅(qū)動(dòng),我們一直招這種人招不到,即使招到也是做應(yīng)用的。
做嵌入式應(yīng)用的話一般的編程就可以了。那么嵌入式驅(qū)動(dòng)開(kāi)陸純發(fā)與內(nèi)核開(kāi)發(fā)的話就需要學(xué)習(xí)多個(gè)方面的知識(shí)。我就把這方面的要求給你交流一下:
(一家之言啊,自己多年從事嵌入式開(kāi)發(fā)的一點(diǎn)感悟)
嵌入式驅(qū)動(dòng)開(kāi)發(fā)需要了解的知識(shí)大概有以下幾類(lèi):
1 嵌入式操作系統(tǒng)驅(qū)動(dòng)框架。每一個(gè)操作系統(tǒng)都有自己的構(gòu)架,應(yīng)該了解驅(qū)動(dòng)在整個(gè)系統(tǒng)中的具置與構(gòu)建驅(qū)動(dòng)程序的主要事項(xiàng)
2 總線知識(shí),比如PCI、USB總線。
3 芯片知識(shí)。驅(qū)動(dòng)其實(shí)就是對(duì)設(shè)備上一些寄存器的配置、CPU與設(shè)備本身的通訊以及對(duì)不同命令的處理
4 要做好驅(qū)動(dòng),必須對(duì)所使用的CPU體系結(jié)構(gòu)有一個(gè)比較深刻的認(rèn)識(shí)
5 C++基本用不上,主要是C和匯編。
6 做驅(qū)動(dòng)更好雹悉冊(cè)要懂內(nèi)核調(diào)試(比如源宏說(shuō)linux)
關(guān)于linux字符驅(qū)動(dòng)編寫(xiě)的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開(kāi)通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過(guò)10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開(kāi)發(fā)經(jīng)驗(yàn)。專(zhuān)業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊(cè)、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
分享名稱(chēng):Linux字符設(shè)備驅(qū)動(dòng)編寫(xiě)指南(linux字符驅(qū)動(dòng)編寫(xiě))
網(wǎng)站URL:http://www.dlmjj.cn/article/dhijejc.html


咨詢(xún)
建站咨詢(xún)
