亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 997 | 回復: 0
打印 上一主題 下一主題

2_2_0___設(shè)計 [復制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2008-05-08 21:06 |只看該作者 |倒序瀏覽

                2_2_0___設(shè)計
    因為 pipe 模塊實現(xiàn)的機能很簡單,因此作為字符設(shè)備驅(qū)動程序,我實現(xiàn)了 open / release / write / read ,另外 skyeye 使用了 select 方法監(jiān)視設(shè)備,因此又添加了 poll 實現(xiàn)。
    當用戶空間讀取 pipe 的時候,可能還沒有數(shù)據(jù),或者寫入的時候沒有空間了,這應(yīng)該是最經(jīng)典的情況,我按照 linux設(shè)備驅(qū)動程序(LDD)第3版 第6章 阻塞和非阻塞 的方法進行了對應(yīng):
    如果是非阻塞讀取:
    1 有數(shù)據(jù),立刻返回真實的數(shù)據(jù)。
    2 沒有數(shù)據(jù),立刻返回 0。
    如果是阻塞讀。
    1 有數(shù)據(jù),立刻返回真實讀取數(shù)據(jù)的大小。
    2 沒有數(shù)據(jù),睡眠等待數(shù)據(jù)到來。
    3 在睡眠的過程中,如果被信號啥的喚醒了,則立刻返回 -ERESTARTSYS。
    4 如果被其他什么東西喚醒了,繼續(xù)檢查有無數(shù)據(jù),沒有的話,繼續(xù)睡覺。
    如果是非阻塞寫入:
    1 有空間,立刻返回真實寫入的大小。
    2 沒有空間,立刻返回 0。
    如果是阻塞寫入:
    1 有空間,立刻返回真實寫入的大小。
    2 沒有空間,水面等待數(shù)據(jù)到來。
    3 在睡眠的過程中,如果被信號啥的喚醒了,則立刻返回 -ERESTARTSYS。
    4 如果被其他什么東西喚醒了,繼續(xù)檢查有無空間,沒有的話,繼續(xù)睡覺。
   
    在編碼形式上,因為需要創(chuàng)建兩個字符設(shè)備,一個是 pipe0 一個是 pipe1 ,而這兩個設(shè)備對應(yīng)的 能力(read/write啥的)是完全一樣,因此他們公用同一套處理函數(shù),只不過在處理函數(shù)中通過判斷 字符設(shè)備的 minor 號判斷當前應(yīng)用程序正在處理哪一個設(shè)備文件。
    另外,如果存在多人讀取或者多人寫入的情況,那么讀取到的數(shù)據(jù)就是不確定的,為了避免這種情況我之允許 pipe0 和 pipe1 在同一時刻只能被打開一次,多次打開返回錯誤 -EBUSY。
    按照上面的想法,對于 linux  內(nèi)核方法的使用,主要用了 自旋鎖(spinlock) ,等待隊列(waitqueue) 的方法。
    數(shù)據(jù)結(jié)構(gòu)的設(shè)計:
    pipe0 和 pipe1 各自私有一個數(shù)據(jù)結(jié)構(gòu),這個數(shù)據(jù)結(jié)構(gòu)主要是描述 設(shè)備本身是誰(minor號),以及數(shù)據(jù)緩沖,當然還有輔助的數(shù)據(jù)結(jié)構(gòu)。
    因此從邏輯上可以分成 2 個數(shù)據(jù)結(jié)構(gòu),一個用于描述 設(shè)備,一個用于描述 緩沖。
    在 設(shè)備結(jié)構(gòu) 中,
    需要一個 鎖 和 變量 來標識 設(shè)備被打開的次數(shù)。(本來想用atmoc_t實現(xiàn)的,但是沒編譯通過)
    需要一個 真正的 數(shù)據(jù)緩沖,考慮到交互的數(shù)據(jù)不大,我覺得 4000 字節(jié)應(yīng)該夠了。
    為了提高代碼的通用性,又定義了 wb 指針指向?qū)Ψ降?數(shù)據(jù)緩沖, rb 指向自己的緩沖。
    在 緩沖結(jié)構(gòu) 中,
    需要一個 鎖 防止對關(guān)鍵數(shù)據(jù)的重入。(寫入位置 和 讀取位置)
    需要一個 針對讀取的 等待隊列。
    需要一個 針對寫入的 等待隊列。
    需要緩沖區(qū)的描述 : 寫入位置/讀取位置/緩沖區(qū)
    在設(shè)計 寫入位置/讀取位置 的時候,我習慣性的使用了指針,但是發(fā)現(xiàn)判斷 沒有數(shù)據(jù) 和 初始化狀態(tài)的時候,會很困難,因為都會指向緩沖區(qū)的頭,翻閱 LDD 的時候,發(fā)現(xiàn)內(nèi)核已有實現(xiàn)比較巧妙,因此借鑒了它的方法。用相對位置,然后再轉(zhuǎn)化為絕對位置。 ( 內(nèi)核目錄 include/linux/kfifo.h  kernel/kfifo.c )
    下面是數(shù)據(jù)結(jié)構(gòu)圖:
    2_2_1___pipe_struct.dia
   
    2_2_1___pipe_struct.png


返回目錄



本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u2/68424/showart_681427.html
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP