freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

—嵌入式系統(tǒng)軟件開發(fā)技術(shù)(編輯修改稿)

2025-08-13 19:58 本頁面
 

【文章內(nèi)容簡介】 sk_buff ? device指針 ? Protocol ? 目的地址 (daddr) ? 源地址 (saddr) ? 數(shù)據(jù)長度 (len) ? 數(shù)據(jù)長度不要使用 sk_buff中的參數(shù),因為調(diào)用 hard_header時數(shù)據(jù)可能還沒完全組織好 ? saddr是 NULL的話是使用缺省地址 (default) ? daddr是 NULL表明協(xié)議層不知道硬件目的地址 ? 如果 hard_header完全填好了硬件幀頭,則返回添加的字節(jié)數(shù)。 網(wǎng)絡(luò)驅(qū)動程序的基本方法 — 硬件幀頭(續(xù) 2) ? 如果硬件幀頭中的信息還不完全 (比如 daddr為 NULL,但是幀頭中需要目的硬件地址。典型的情況是以太網(wǎng)需要地址解析 (arp)),則返回負(fù)字節(jié)數(shù)。 hard_header返回負(fù)數(shù)的情況下,協(xié)議層會做進(jìn)一步的 build header的工作。 ? 目前 Linux系統(tǒng)里就是做 arp (如果 hard_header返回正,devarp=1,表明不需要做 arp,返回負(fù), devarp=0,做 arp)。 對 hard_header的調(diào)用在每個協(xié)議層的處理程序里。如ip_output。 網(wǎng)絡(luò)驅(qū)動程序的基本方法 — 地址解析 地址解析 (xarp) 有些網(wǎng)絡(luò)有硬件地址 (比如 Ether),并且在發(fā)送硬件幀時需要知道目的硬件地址。這樣就需要上層協(xié)議地址(ip、 ipx)和硬件地址的對應(yīng)。這個對應(yīng)是通過地址 解析完成的。 ? 需要做 arp的的設(shè)備在發(fā)送之前會調(diào)用驅(qū)動程序的rebuild_header方法。調(diào)用的主要參數(shù)包括: ? 指向硬件幀頭的指針 ? 協(xié)議層地址 ? 如果驅(qū)動程序能夠解析硬件地址,就返回 1,如果不能,返回 0。 ? 對 rebuild_header的調(diào)用在 /core/do_dev_queue_xmit()里。 網(wǎng)絡(luò)驅(qū)動程序的基本方法 — 參數(shù)設(shè)置和統(tǒng)計數(shù)據(jù) 參數(shù)設(shè)臵和統(tǒng)計數(shù)據(jù) 在驅(qū)動程序里還提供一些方法供系統(tǒng)對設(shè)備的參數(shù)進(jìn)行設(shè)臵和讀取信息。 ? 一般只有超級用戶 (root)權(quán)限才能對設(shè)備參數(shù)進(jìn)行設(shè)臵。 ? 設(shè)臵方法有: ? devset_mac_address() 當(dāng)用戶調(diào)用 ioctl類型為 SIOCSIFHWADDR時是要設(shè)臵這個設(shè)備的 mac地址。一般對 mac地址的設(shè)臵沒有太大意義的。 網(wǎng)絡(luò)驅(qū)動程序的基本方法 — 參數(shù)設(shè)置和統(tǒng)計數(shù)據(jù)(續(xù)) ? devset_config() 當(dāng)用戶調(diào)用 ioctl時類型為 SIOCSIFMAP時,系統(tǒng)會調(diào)用驅(qū)動程序的set_config方法。用戶會傳遞一個 ifmap結(jié)構(gòu)包含需要的 I/O、中斷等參數(shù)。 ? devdo_ioctl() 如果用戶調(diào)用 ioctl時類型在 SIOCDEVPRIVATE和SIOCDEVPRIVATE+15之間,系統(tǒng)會調(diào)用驅(qū)動程序的這個方法。一般是設(shè)臵設(shè)備的專用數(shù)據(jù)。 讀取信息也是通過 ioctl調(diào)用進(jìn)行。 ? 除次之外驅(qū)動程序還可以提供一個 devget_stats方法,返回一個e_statistics結(jié)構(gòu),包含發(fā)送接收的統(tǒng)計信息。 ? ioctl的處理在 /core/ dev_ioctl()和 dev_ifsioc()里 網(wǎng)絡(luò)驅(qū)動程序中用到的數(shù)據(jù)結(jié)構(gòu) ? 最重要的是網(wǎng)絡(luò)設(shè)備的數(shù)據(jù)結(jié)構(gòu)。它定義在 include/linux/ ? sk_buff ? Linux網(wǎng)絡(luò)各層之間的數(shù)據(jù)傳送都是通過sk_buff 編寫 Linux網(wǎng)絡(luò)驅(qū)動程序中需要注意的問題 ? 中斷共享 ? 硬件發(fā)送忙時的處理 ? 流量控制 (flow control) ? 調(diào)試 中斷共享 ? Linux系統(tǒng)運行幾個設(shè)備共享同一個中斷。需要共享的話,在申請的時候指明共享方式。 ? 系統(tǒng)提供的 request_irq()調(diào)用的定義: int request_irq(unsigned int irq, void (*handler)(int irq, void *dev_id, struct pt_regs *regs), unsigned long irqflags, const char * devname, void *dev_id)。 ? 如果共享中斷, irqflags設(shè)臵 SA_SHIRQ屬性,這樣就允許別的設(shè)備申請同一個中斷。需要注意所有用到這個中斷的設(shè)備在調(diào)用 request_irq()都必須設(shè)臵這個屬性。系統(tǒng)在回調(diào)每個中斷處理程序時,可以用 dev_id這個參數(shù)找到相應(yīng)的設(shè)備。一 般 dev_id就設(shè)為 device結(jié)構(gòu)本身。系統(tǒng)處理共享中斷是用各自的 dev_id參數(shù)依次調(diào)用每一個中斷處理程序。 硬件發(fā)送忙時的處理 ? 主 CPU的處理能力一般比網(wǎng)絡(luò)發(fā)送要快,所以經(jīng)常會遇到系統(tǒng)有數(shù)據(jù)要發(fā),但上一包數(shù)據(jù)網(wǎng)絡(luò)設(shè)備還沒發(fā)送完。因為在 Linux里網(wǎng)絡(luò)設(shè)備驅(qū)動程序一般不做數(shù)據(jù)緩存,不能發(fā)送的數(shù)據(jù)都是通知系統(tǒng)發(fā)送不成功,所以必須要有一個機(jī)制在硬件不忙時及時通知系統(tǒng)接著發(fā)送下面的數(shù)據(jù)。 ? 一般對發(fā)送忙的處理在前面設(shè)備的發(fā)送方法(hard_start_xmit)里已經(jīng)描述過,即如果發(fā)送忙,臵 tbusy為1。處理完發(fā)送數(shù)據(jù)后,在發(fā)送結(jié)束中斷里清 tbusy,同時用 mark_bh()調(diào)用通知系統(tǒng)繼續(xù)發(fā)送。 但在具體實現(xiàn)驅(qū)動程序時發(fā)現(xiàn),這樣的處理系統(tǒng)好象并不能及時地知道硬件已經(jīng)空閑了,即在 mark_bh()以后,系統(tǒng)要等一段時間才會接著發(fā)送。造成發(fā)送效率很低。 ? 實現(xiàn)時不把 tbusy臵 1,讓系統(tǒng)始終認(rèn)為硬件空閑,但是報告發(fā)送不成功。系統(tǒng)會一直嘗試重發(fā)。這樣處理就運行正常了。 流量控制 ? 網(wǎng)絡(luò)數(shù)據(jù)的發(fā)送和接收都需要流量控制。這些控制是在系統(tǒng)里實現(xiàn)的,不需要驅(qū)動程序做工作。 ? 每個設(shè)備數(shù)據(jù)結(jié)構(gòu)里都有一個參數(shù) devtx_queue_len,這個參數(shù) 標(biāo)明發(fā)送時最多緩存的數(shù)據(jù)包。在 Linux系統(tǒng)里以太網(wǎng)設(shè)備(10/100Mbps) tx_queue_len一般設(shè)臵為 100,串行線路 (異步串口 )為 10。 ? 實際上,設(shè)臵了 devtx_queue_len并不是為緩存這些數(shù)據(jù)申請了空間。這個參數(shù)只是在收到協(xié)議層的數(shù)據(jù)包時判斷發(fā)送隊列里的數(shù)據(jù)是不是到了 tx_queue_len的限度,以決定這一包數(shù)據(jù)加不加進(jìn)發(fā)送隊列。發(fā)送時另一個方面的流控是更高層協(xié)議的發(fā)送窗口 (TCP協(xié)議里就有發(fā)送窗口 )。 ? 達(dá)到了窗口大小,高層協(xié)議就不會再發(fā)送數(shù)據(jù)。 ? 接收流控也分兩個層次。 if_rx()緩存的數(shù)據(jù)包有限制。另外高層協(xié)議也會有一個最大的等待處理的數(shù)據(jù)量。 ? 發(fā)送和接收流控處理在 /core/ do_dev_queue_xmit()和if_rx() 中。 調(diào)試 ? 很多 Linux的驅(qū)動程序都是編譯進(jìn)內(nèi)核的,形成一個大的內(nèi)核文件。但對調(diào)試來說,這是相當(dāng)麻煩的。調(diào)試驅(qū)動程序可以用 module方式加載。 ? 支持模塊方式的驅(qū)動程序必須提供兩個函數(shù): int init_module(void)和 void cleanup_module(void)。 ? init_module()在加載此模塊時調(diào)用,在這個函數(shù)里可以 register_dev()注冊設(shè)備。 init_module()返回 0表示成功,返回負(fù)表示失敗。 ? cleanup_module()在驅(qū)動程序被卸載時調(diào)用,清除占用的資源,調(diào)用unregister_dev()。 ? 模塊可以動態(tài)地加載、卸載。在 ,還有 kerneld自動加載模塊,但是 kerneld。手工加載使用 insmod命令,卸載用rmmod命令,看內(nèi)核中的模塊用 lsmod命令。 ? 編譯驅(qū)動程序用 gcc,主要命令行參數(shù) DKERNEL DMODULE。并且作為模塊加載的驅(qū)動程序,只編譯成 obj形式 (加 c參數(shù) )。編譯好的目標(biāo)文件放在 /lib/modules/,在啟動文件里用 insmod加載 Linux驅(qū)動程序可利用資源 互聯(lián)網(wǎng)上有很多驅(qū)動程序資源: ? ? ? 驅(qū)動源代碼 驅(qū)動源代碼 驅(qū)動源代碼 驅(qū)動源代碼 驅(qū)動源代碼 編譯驅(qū)動程序 應(yīng)用程序 編譯應(yīng)用程序 背景知識: Linux設(shè)備管理 主要內(nèi)容 ? 概述 ? 驅(qū)動程序基礎(chǔ) ? 中斷處理 ? 輔助函數(shù) ? 設(shè)備驅(qū)動程序 ? 模塊編程基礎(chǔ) ? 字符設(shè)備 ? 塊設(shè)備 ? 網(wǎng)絡(luò)設(shè)備 概述 ? 輸入輸出子系統(tǒng): 下層:設(shè)備驅(qū)動程序 上層:設(shè)備無關(guān)部分 —— VFS in Linux? ? Unix和 Linux的設(shè)備管理方法: VFS 設(shè)備管理總體結(jié)構(gòu)示意 用戶程序 系統(tǒng)調(diào)用接口 文件系統(tǒng) 高速緩存 字符設(shè)備 塊設(shè)備 驅(qū)動程序 硬件設(shè)備 輸入輸出系統(tǒng)層次結(jié)構(gòu) 用戶進(jìn)程 設(shè)備無關(guān)軟件 設(shè)備驅(qū)動程序 設(shè)備服務(wù)子程序 中斷處理程序 硬件 I/O請求 I/O應(yīng)答 進(jìn)行 I/O調(diào)用; 格式化 I/O 命名、保護(hù)、阻塞、緩沖、分配 建立設(shè)備寄存器、檢測狀態(tài) I/O結(jié)束時,喚醒設(shè)備服務(wù)子程序 執(zhí)行 I/O操作 驅(qū)動程序基礎(chǔ) ——I/O空間 ? Linux中的三種地址空間: CPU Untranslated Address CPU Translated Address Bus Address:一般 PC機(jī)中是一組寄存器 命令 more /proc/ioports ? 常見總線 ISA VESA EISA PCI 驅(qū)動程序基礎(chǔ) ——命名空間 ? 并行設(shè)備: lp 軟盤: fd SCSI盤: sd IDE硬盤: hda1, hda2, hdb等 網(wǎng)絡(luò)設(shè)備: ethn, slipn, pppn等 ? 在寫驅(qū)動程序的時候,需要給函數(shù)名加上選擇的前綴來避免任何混淆。如:foo_read(), foo_write()等。 驅(qū)動程序基礎(chǔ) ——內(nèi)存分配 ? 函數(shù) kmalloc() 內(nèi)存以 2的冪大小的塊分配 有一個優(yōu)先級參數(shù) ? 宏 kfree()和函數(shù) kfree_s() kfree()調(diào)用 kfree_s(),和 free()一樣工作 可以直接調(diào)用 kfree_s(),但是需要知道釋放內(nèi)存塊的大小 驅(qū)動程序基礎(chǔ) ——設(shè)備分類 ? 字符設(shè)備:不使用緩沖區(qū),順序讀寫 foo_read() amp。 foo_write() ? 塊設(shè)備:需要使用緩沖區(qū),隨機(jī)讀寫 策略規(guī)程 ? 網(wǎng)絡(luò)設(shè)備 采用了特殊的處理方法。 Struct device 驅(qū)動程序基礎(chǔ) ——設(shè)備號 ? 主設(shè)備號 amp。次設(shè)備號 主設(shè)備號相同的設(shè)備使用相同的驅(qū)動程序 次設(shè)備號區(qū)分具體設(shè)備的實例 ? 命令: ls –l /dev/had* 驅(qū)動程序基礎(chǔ) ——中斷 vs輪詢 ? 工作機(jī)制的區(qū)別 ? 編程上的區(qū)別: UNIX的系統(tǒng)調(diào)用:執(zhí)行模式的改變 內(nèi)核模式下的進(jìn)程訪問進(jìn)程原來所在的用戶空間的存儲: get_fs_*()和 memcpy_fromfs()讀用戶空間,put_fs_*()和 memcpy_tofs()寫入用戶空間內(nèi)存 。 在進(jìn)程運行時調(diào)用,不需要考慮地址的問題。 在中斷發(fā)生時,這些宏不能使用 。 因為它們可能覆蓋其他運行著的進(jìn)程的隨機(jī)空間。 必須提供臨時空間存放信息。 對于塊設(shè)備,由 cache緩沖機(jī)制自動提供;字符設(shè)備需要驅(qū)動程序分配。 驅(qū)動程序基礎(chǔ) ——DMA方式 ? 用于傳送大規(guī)模的數(shù)據(jù) ? PC機(jī)上的 ISA DMA控制器 8條 DMA通道。每條通道聯(lián)系著一個 16位地址寄存器和 16位計數(shù)器 ? DMA直接訪問物理內(nèi)存 ? DMA通道不能被共享。一些設(shè)備擁有固定的DMA通道。 ? Struct dma_chan結(jié)構(gòu): 每個通道擁有一個此結(jié)構(gòu) 兩個域:指向該通道擁有者的字符串指針 指示該通道是否已分配的標(biāo)志 驅(qū)動程序基礎(chǔ) ——睡眠喚醒機(jī)制 ? TASK_INTERRUPTIBLE TASK_UNITERUPTIBLE, 決定于睡眠是否能夠被系統(tǒng)調(diào)用一類的事情打斷。一般來說,如果設(shè)備比較慢、可以被無限阻塞,包括終端、網(wǎng)絡(luò)設(shè)備或偽設(shè)備,睡眠應(yīng)該是可中斷的 ? _sleep_on() ? Struct wait_queue {struct task_struct *task。 struct wait_queue *next。 }。 驅(qū)動程序基礎(chǔ) ——設(shè)備文件 ? 設(shè)備管理的 “ 上半部分 ” ? Struct file結(jié)構(gòu)
點擊復(fù)制文檔內(nèi)容
外語相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1