一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

驅(qū)動(dòng)是如何工作的_Linux設(shè)備驅(qū)動(dòng)的固件加載詳解

電子工程師 ? 作者:工程師a ? 2018-05-20 07:10 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

作為一個(gè)驅(qū)動(dòng)作者, 你可能發(fā)現(xiàn)你面對(duì)一個(gè)設(shè)備必須在它能支持工作前下載固件到它里面。 硬件市場(chǎng)的許多地方的競(jìng)爭(zhēng)是如此得強(qiáng)烈, 以至于甚至一點(diǎn)用作設(shè)備控制固件的 EEPROM 的成本制造商都不愿意花費(fèi)。 因此固件發(fā)布在隨硬件一起的一張 CD 上, 并且操作系統(tǒng)負(fù)責(zé)傳送固件到設(shè)備自身。

硬件越來(lái)越復(fù)雜,硬件的許多功能使用了程序?qū)崿F(xiàn),與直接硬件實(shí)現(xiàn)相比,固件擁有處理復(fù)雜事物的靈活性和便于升級(jí)、維護(hù)等優(yōu)點(diǎn)。固件(firmware)就是這樣的一段在設(shè)備硬件自身中執(zhí)行的程序,通過(guò)固件標(biāo)準(zhǔn)驅(qū)動(dòng)程序才能實(shí)現(xiàn)特定機(jī)器的操作,如:光驅(qū)、刻錄機(jī)等都有內(nèi)部的固件。

固件一般存放在設(shè)備上的flash存儲(chǔ)器中,但出于成本和靈活性考慮,許多設(shè)備都將固件的映像(image)以文件的形式存放在硬盤中,設(shè)備驅(qū)動(dòng)程序初始化時(shí)再裝載到設(shè)備內(nèi)部的存儲(chǔ)器中。這樣,方便了固件的升級(jí),并省略了設(shè)備的flash存儲(chǔ)器。

一、驅(qū)動(dòng)和固件的區(qū)別

計(jì)算機(jī)領(lǐng)域來(lái)說(shuō),驅(qū)動(dòng)和固件從來(lái)沒(méi)有過(guò)明確的定義,就好像今天我們說(shuō)內(nèi)存,大部分人用來(lái)表示SDRAM,但也有人把Android里的“固化的Flash/Storage“稱為“內(nèi)存”,你不能說(shuō)這樣說(shuō)就錯(cuò)了,因?yàn)檫@確實(shí)是一種“內(nèi)部存儲(chǔ)”。

但在Linux Kernel中,Driver和Firmware是有明確含義的,

1、驅(qū)動(dòng)

Driver是控制被操作系統(tǒng)管理的外部設(shè)備(Device)的代碼段。很多時(shí)候Driver會(huì)被實(shí)現(xiàn)為L(zhǎng)KM,但這不是必要條件。driver通過(guò)driver_register()注冊(cè)到總線(bus_type)上,代表系統(tǒng)具備了驅(qū)動(dòng)某種設(shè)備(device)的能力。當(dāng)某個(gè)device被注冊(cè)到同樣的總線的時(shí)候(通常是總線枚舉的時(shí)候發(fā)現(xiàn)了這個(gè)設(shè)備),總線驅(qū)動(dòng)會(huì)對(duì)driver和device會(huì)通過(guò)一定的策略進(jìn)行binding(即進(jìn)行匹配),如果Binding成功,總線驅(qū)動(dòng)會(huì)調(diào)用driver的probe()函數(shù),把設(shè)備的信息(例如端口,中斷號(hào)等)傳遞給驅(qū)動(dòng),驅(qū)動(dòng)就可以對(duì)真實(shí)的物理部件進(jìn)行初始化,并把對(duì)該設(shè)備的控制接口注冊(cè)到Linux的其他子系統(tǒng)上(例如字符設(shè)備,v4l2子系統(tǒng)等)。這樣操作系統(tǒng)的其他部分就可以通過(guò)這些通用的接口來(lái)訪問(wèn)設(shè)備了。

2、固件

Firmware,是表示運(yùn)行在非“控制處理器”(指不直接運(yùn)行操作系統(tǒng)的處理器,例如外設(shè)中的處理器,或者被用于bare metal的主處理器的其中一些核)中的程序。這些程序很多時(shí)候使用和操作系統(tǒng)所運(yùn)行的處理器完全不同的指令集。這些程序以二進(jìn)制形式存在于Linux內(nèi)核的源代碼樹(shù)中,生成目標(biāo)系統(tǒng)的時(shí)候,通常拷貝在/lib/firmware目錄下。當(dāng)driver對(duì)device進(jìn)行初始化的時(shí)候,通過(guò)request_firmware()等接口,在一個(gè)用戶態(tài)helper程序的幫助下,可以把指定的firmware加載到內(nèi)存中,由驅(qū)動(dòng)傳輸?shù)街付ǖ脑O(shè)備上。

所以,總的來(lái)說(shuō),其實(shí)driver和firmware沒(méi)有什么直接的關(guān)系,但firmware通常由驅(qū)動(dòng)去加載。我們討論的那個(gè)OS,一般不需要理解firmware是什么,只是把它當(dāng)做數(shù)據(jù)。firmware是什么,只有使用這些數(shù)據(jù)的那個(gè)設(shè)備才知道。好比你用一個(gè)電話,電話中有一個(gè)軟件,這個(gè)軟件你完全不關(guān)心如何工作的,你換這個(gè)軟件的時(shí)候,就可以叫這個(gè)軟件是“固件”,但如果你用了一個(gè)智能手機(jī),你要細(xì)細(xì)關(guān)系什么是上面的應(yīng)用程序,Android平臺(tái),插件之類的細(xì)節(jié)內(nèi)容,你可能就不叫這個(gè)東西叫“固件”了。

如何解決固件問(wèn)題呢?你可能想解決固件問(wèn)題使用這樣的一個(gè)聲明:

static char my_firmware[] = { 0x34, 0x78, 0xa4, 。.. };

但是, 這個(gè)方法幾乎肯定是一個(gè)錯(cuò)誤。 將固件編碼到一個(gè)驅(qū)動(dòng)擴(kuò)大了驅(qū)動(dòng)的代碼, 使固件升級(jí)困難, 并且非??赡墚a(chǎn)生許可問(wèn)題。 供應(yīng)商不可能已經(jīng)發(fā)布固件映象在 GPL 之下, 因此和 GPL-許可的代碼混合常常是一個(gè)錯(cuò)誤。 為此, 包含內(nèi)嵌固件的驅(qū)動(dòng)不可能被接受到主流內(nèi)核或者被 Linux 發(fā)布者包含。

二、內(nèi)核固件接口

正確的方法是當(dāng)你需要它時(shí)從用戶空間獲取它。 但是, 請(qǐng)抵制試圖從內(nèi)核空間直接打開(kāi)包含固件的文件的誘惑; 那是一個(gè)易出錯(cuò)的操作, 并且它安放了策略(以一個(gè)文件名的形式)到內(nèi)核。 相反, 正確的方法時(shí)使用固件接口, 它就是為此而創(chuàng)建的:

[cpp] view plain copy

1. #include

2.

3. int request_firmware(const struct firmware **fw, char *name, struct device *device);

函數(shù)request_firmware向用戶空間請(qǐng)求提供一個(gè)名為name固件映像文件并等待完成。參數(shù)device為固件裝載的設(shè)備。文件內(nèi)容存入request_firmware 返回,如果固件請(qǐng)求成功,返回0。該函數(shù)從用戶空間得到的數(shù)據(jù)未做任何檢查,用戶在編寫驅(qū)動(dòng)程序時(shí),應(yīng)對(duì)固件映像做數(shù)據(jù)安全檢查,檢查方向由設(shè)備固件提供商確定,通常有檢查標(biāo)識(shí)符、校驗(yàn)和等方法。

調(diào)用 request_firmware 要求用戶空間定位并提供一個(gè)固件映象給內(nèi)核; 我們一會(huì)兒看它如何工作的細(xì)節(jié)。 name 應(yīng)當(dāng)標(biāo)識(shí)需要的固件; 正常的用法是供應(yīng)者提供的固件文件名。 某些象 my_firmware.bin 的名子是典型的。 如果固件被成功加載, 返回值是 0(負(fù)責(zé)常用的錯(cuò)誤碼被返回), 并且 fw 參數(shù)指向一個(gè)這些結(jié)構(gòu):

[cpp] view plain copy

1. struct firmware {

2. size_t size;

3. u8 *data;

4. };

那個(gè)結(jié)構(gòu)包含實(shí)際的固件, 它現(xiàn)在可被下載到設(shè)備中。 小心這個(gè)固件是來(lái)自用戶空間的未被檢查的數(shù)據(jù); 你應(yīng)當(dāng)在發(fā)送它到硬件之前運(yùn)用任何并且所有的你能夠想到的檢查來(lái)說(shuō)服你自己它是正確的固件映象。 設(shè)備固件常常包含標(biāo)識(shí)串, 校驗(yàn)和, 等等; 在信任數(shù)據(jù)前全部檢查它們。

在你已經(jīng)發(fā)送固件到設(shè)備前, 你應(yīng)當(dāng)釋放 in-kernel 結(jié)構(gòu), 使用:

[cpp] view plain copy

1. void release_firmware(struct firmware *fw);

因?yàn)?request_firmware 請(qǐng)求用戶空間來(lái)幫忙, 它保證在返回前睡眠。 如果你的驅(qū)動(dòng)當(dāng)它必須請(qǐng)求固件時(shí)不在睡眠的位置, 異步的替代方法可能要使用:

[cpp] view plain copy

1. int request_firmware_nowait(struct module *module,

2. char *name, struct device *device, void *context,

3. void (*cont)(const struct firmware *fw, void *context));

這里額外的參數(shù)是 moudle( 它將一直是 THIS_MODULE), context (一個(gè)固件子系統(tǒng)不使用的私有數(shù)據(jù)指針), 和 cont. 如果都進(jìn)行順利, request_firmware_nowait 開(kāi)始固件加載過(guò)程并且返回 0. 在將來(lái)某個(gè)時(shí)間, cont 將用加載的結(jié)果被調(diào)用。 如果由于某些原因固件加載失敗, fw 是 NULL.

三、固件如何工作

固件子系統(tǒng)使用 sysfs 和熱插拔機(jī)制。 當(dāng)調(diào)用 request_firmware, 一個(gè)新目錄在 /sys/class/firmware 下使用你的驅(qū)動(dòng)的名子被創(chuàng)建。 那個(gè)目錄包含 3 個(gè)屬性:

loading

這個(gè)屬性應(yīng)當(dāng)被加載固件的用戶空間進(jìn)程設(shè)置為 1. 當(dāng)加載進(jìn)程完成, 它應(yīng)當(dāng)設(shè)為 0. 寫一個(gè)值 -1 到 loading 會(huì)中止固件加載進(jìn)程。

data

data 是一個(gè)二進(jìn)制的接收固件數(shù)據(jù)自身的屬性。 在設(shè)置 loading 后, 用戶空間進(jìn)程應(yīng)當(dāng)寫固件到這個(gè)屬性。

device

這個(gè)屬性是一個(gè)符號(hào)連接到 /sys/devices 下面的被關(guān)聯(lián)入口項(xiàng)。

一旦創(chuàng)建了 sysfs 入口項(xiàng), 內(nèi)核為你的設(shè)備產(chǎn)生一個(gè)熱插拔事件。 傳遞給熱插拔處理者的環(huán)境包括一個(gè)變量 FIRMWARE, 它被設(shè)置為提供給 request_firmware 的名子。 這個(gè)處理者應(yīng)當(dāng)定位固件文件, 并且拷貝它到內(nèi)核使用提供的屬性。 如果這個(gè)文件無(wú)法找到, 處理者應(yīng)當(dāng)設(shè)置 loading 屬性為 -1.

如果一個(gè)固件請(qǐng)求在 10 秒內(nèi)沒(méi)有被服務(wù), 內(nèi)核就放棄并返回一個(gè)失敗狀態(tài)給驅(qū)動(dòng)。 超時(shí)周期可通過(guò) sysfs 屬性 /sys/class/firmware/timeout 屬性改變。

使用 request_firmware 接口允許你隨你的驅(qū)動(dòng)發(fā)布設(shè)備固件。 當(dāng)正確地集成到熱插拔機(jī)制, 固件加載子系統(tǒng)允許設(shè)備簡(jiǎn)化工作”在盒子之外“ 顯然這是處理問(wèn)題的最好方法。

但是, 請(qǐng)?jiān)试S我們提出多一條警告: 設(shè)備固件沒(méi)有制造商的許可不應(yīng)當(dāng)發(fā)布。 許多制造商會(huì)同意在合理的條款下許可它們的固件, 如果客氣地請(qǐng)求; 一些其他的可能不何在。 無(wú)論如何, 在沒(méi)有許可時(shí)拷貝和發(fā)布它們的固件是對(duì)版權(quán)法的破壞并且招致麻煩。

四、固件接口函數(shù)的使用方法

當(dāng)驅(qū)動(dòng)程序需要使用固件驅(qū)動(dòng)時(shí),在驅(qū)動(dòng)程序的初始化化過(guò)程中需要加下如下的代碼:

[cpp] view plain copy

1. if(request_firmware(&fw_entry, $FIRMWARE, device) == 0) /*從用戶空間請(qǐng)求映像數(shù)據(jù)*/

2.

3. /*將固件映像拷貝到硬件的存儲(chǔ)器,拷貝函數(shù)由用戶編寫*/

4. copy_fw_to_device(fw_entry-》data, fw_entry-》size);

5. release(fw_entry);

用戶還需要在用戶空間提供腳本通過(guò)文件系統(tǒng)sysfs中的文件data將固件映像文件讀入到內(nèi)核的緩沖區(qū)中。腳本樣例列出如下:

[cpp] view plain copy

1. #變量$DEVPATH(固件設(shè)備的路徑)和$FIRMWARE(固件映像名)應(yīng)已在環(huán)境變量中提供

2.

3. HOTPLUG_FW_DIR=http://www.eechina.com/usr/lib/hotplug/firmware/ #固件映像文件所在目錄

4.

5. echo 1 》 /sys/$DEVPATH/loading

6. cat $HOTPLUG_FW_DIR/$FIRMWARE 》 /sysfs/$DEVPATH/data

7. echo 0 》 /sys/$DEVPATH/loading

五、固件請(qǐng)求函數(shù)request_firmware

函數(shù)request_firmware請(qǐng)求從用戶空間拷貝固件映像文件到內(nèi)核緩沖區(qū)。該函數(shù)的工作流程列出如下:

a -- 在文件系統(tǒng)sysfs中創(chuàng)建文件/sys/class/firmware/xxx/loading和data,”xxx“表示固件的名字,給文件loading和data附加讀寫函數(shù),設(shè)置文件屬性,文件loading表示開(kāi)/關(guān)固件映像文件裝載功能;文件data的寫操作將映像文件的數(shù)據(jù)寫入內(nèi)核緩沖區(qū),讀操作從內(nèi)核緩沖區(qū)讀取數(shù)據(jù)。

b -- 將添加固件的uevent事件(即”add“)通過(guò)內(nèi)核對(duì)象模型發(fā)送到用戶空間。

c -- 用戶空間管理uevent事件的后臺(tái)進(jìn)程udevd接收到事件后,查找udev規(guī)則文件,運(yùn)行規(guī)則所定義的動(dòng)作,與固件相關(guān)的規(guī)則列出如下:

[cpp] view plain copy

1. $ /etc/udev/rules.d/50-udev-default.rules

2. ……

3. # firmware class requests

4. SUBSYSTEM==”firmware“, ACTION==”add“, RUN+=”firmware.sh“

5. ……

從上述規(guī)則可以看出,固件添加事件將引起運(yùn)行腳本firmware.sh。

d -- 腳本firmware.sh打開(kāi)”裝載“功能,同命令”cat 映像文件 》 /sys/class/firmware/xxx/data“將映像文件數(shù)據(jù)寫入到內(nèi)核的緩沖區(qū)。

e -- 映像數(shù)據(jù)拷貝完成后,函數(shù)request_firmware從文件系統(tǒng)/sysfs注銷固件設(shè)備對(duì)應(yīng)的目錄”xxx“。如果請(qǐng)求成功,函數(shù)返回0。

f -- 用戶就將內(nèi)核緩沖區(qū)的固件映像數(shù)據(jù)拷貝到固件的內(nèi)存中。然后,調(diào)用函數(shù)release_firmware(fw_entry)釋放給固件映像分配的緩沖區(qū)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 驅(qū)動(dòng)
    +關(guān)注

    關(guān)注

    12

    文章

    1916

    瀏覽量

    86897
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11509

    瀏覽量

    213701
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第23章、Linux設(shè)備驅(qū)動(dòng)的移植

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第23章、Linux設(shè)備驅(qū)動(dòng)
    發(fā)表于 10-27 10:58 ?9次下載
    《<b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>開(kāi)發(fā)<b class='flag-5'>詳解</b>》第23章、<b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>的移植

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第20章、USB主機(jī)與設(shè)備驅(qū)動(dòng)

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第20章、USB主機(jī)與設(shè)備驅(qū)動(dòng)
    發(fā)表于 10-27 11:04 ?8次下載
    《<b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>開(kāi)發(fā)<b class='flag-5'>詳解</b>》第20章、USB主機(jī)與<b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第18章、LCD設(shè)備驅(qū)動(dòng)

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第18章、LCD設(shè)備驅(qū)動(dòng)
    發(fā)表于 10-27 11:11 ?13次下載
    《<b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>開(kāi)發(fā)<b class='flag-5'>詳解</b>》第18章、LCD<b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第17章、Linux音頻設(shè)備驅(qū)動(dòng)

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第17章、Linux音頻設(shè)備驅(qū)
    發(fā)表于 10-27 11:14 ?17次下載
    《<b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>開(kāi)發(fā)<b class='flag-5'>詳解</b>》第17章、<b class='flag-5'>Linux</b>音頻<b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第16章、Linux網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第16章、Linux網(wǎng)絡(luò)設(shè)備驅(qū)
    發(fā)表于 10-27 11:17 ?5次下載
    《<b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>開(kāi)發(fā)<b class='flag-5'>詳解</b>》第16章、<b class='flag-5'>Linux</b>網(wǎng)絡(luò)<b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第15章、Linux的I2C核心、總線與設(shè)備驅(qū)動(dòng)

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第15章、Linux的I2C核心、總線與設(shè)備
    發(fā)表于 10-27 11:19 ?8次下載
    《<b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>開(kāi)發(fā)<b class='flag-5'>詳解</b>》第15章、<b class='flag-5'>Linux</b>的I2C核心、總線與<b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第14章、Linux終端設(shè)備驅(qū)動(dòng)

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第14章、Linux終端設(shè)備驅(qū)
    發(fā)表于 10-27 11:22 ?8次下載
    《<b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>開(kāi)發(fā)<b class='flag-5'>詳解</b>》第14章、<b class='flag-5'>Linux</b>終端<b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第13章、Linux設(shè)備驅(qū)動(dòng)

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第13章、Linux設(shè)備驅(qū)動(dòng)
    發(fā)表于 10-27 11:24 ?18次下載
    《<b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>開(kāi)發(fā)<b class='flag-5'>詳解</b>》第13章、<b class='flag-5'>Linux</b>塊<b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第9章、Linux設(shè)備驅(qū)動(dòng)中的異步通知與異步IO

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第9章、Linux設(shè)備驅(qū)動(dòng)
    發(fā)表于 10-27 11:33 ?0次下載
    《<b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>開(kāi)發(fā)<b class='flag-5'>詳解</b>》第9章、<b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>中的異步通知與異步IO

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第8章、Linux設(shè)備驅(qū)動(dòng)中的阻塞與非阻塞IO

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第8章、Linux設(shè)備驅(qū)動(dòng)
    發(fā)表于 10-27 11:35 ?9次下載
    《<b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>開(kāi)發(fā)<b class='flag-5'>詳解</b>》第8章、<b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>中的阻塞與非阻塞IO

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第7章、Linux設(shè)備驅(qū)動(dòng)中的并發(fā)控制

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第7章、Linux設(shè)備驅(qū)動(dòng)
    發(fā)表于 10-27 11:37 ?10次下載
    《<b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>開(kāi)發(fā)<b class='flag-5'>詳解</b>》第7章、<b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>中的并發(fā)控制

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第6章、字符設(shè)備驅(qū)動(dòng)

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第6章、字符設(shè)備驅(qū)動(dòng)
    發(fā)表于 10-27 11:46 ?23次下載
    《<b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>開(kāi)發(fā)<b class='flag-5'>詳解</b>》第6章、字符<b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第5章、Linux文件系統(tǒng)與設(shè)備文件系統(tǒng)

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解》第5章、Linux文件系統(tǒng)與設(shè)備文件系統(tǒng)
    發(fā)表于 10-27 14:13 ?0次下載
    《<b class='flag-5'>Linux</b><b class='flag-5'>設(shè)備</b><b class='flag-5'>驅(qū)動(dòng)</b>開(kāi)發(fā)<b class='flag-5'>詳解</b>》第5章、<b class='flag-5'>Linux</b>文件系統(tǒng)與<b class='flag-5'>設(shè)備</b>文件系統(tǒng)

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解

    Linux設(shè)備驅(qū)動(dòng)開(kāi)發(fā)詳解
    發(fā)表于 10-28 11:03 ?54次下載

    linux驅(qū)動(dòng)程序如何加載進(jìn)內(nèi)核

    ,需要了解Linux內(nèi)核的基本概念和API。以下是一些關(guān)鍵概念: 1.1 內(nèi)核模塊:Linux內(nèi)核模塊是一種動(dòng)態(tài)加載和卸載的代碼,可以在不重新啟動(dòng)系統(tǒng)的情況下加載和卸載。
    的頭像 發(fā)表于 08-30 15:02 ?1096次閱讀