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

  免費注冊 查看新帖 |

Chinaunix

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

關(guān)于字符驅(qū)動的問題 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2008-07-11 14:46 |只看該作者 |倒序瀏覽
本人linux新手,
最近看 《linux驅(qū)動程序設(shè)計》

第三章遇到問題實在無法理解,

file結(jié)構(gòu)體里面的f_ops到底是什么,指向文件的當(dāng)前位置,但他的具體值到底是什么?
他是指向一個結(jié)構(gòu)體的指針嗎?那用一個地址的值除以一個量子集的大小怎么能得到在鏈表結(jié)構(gòu)中的具體位置item?

    int itemsize = quantum * qset;
   
    item = (long)*f_pos / itemsize;


因為沒有先看內(nèi)核,所以對內(nèi)核的詳細(xì)原理還不清楚,請哪位大哥幫幫忙啊
這個問題一直想不明白。


[ 本帖最后由 冰伊羅 于 2008-7-11 14:48 編輯 ]

論壇徽章:
0
2 [報告]
發(fā)表于 2008-07-11 14:53 |只看該作者
你看書不夠仔細(xì)。
好好看一下你自己的帖子!

論壇徽章:
0
3 [報告]
發(fā)表于 2008-07-11 14:57 |只看該作者
沒看出什么問題啊?
能否請樓上的大哥詳細(xì)說明下為什么可以這樣算啊,這個問題我實在是看不明白了。

論壇徽章:
0
4 [報告]
發(fā)表于 2008-07-11 15:09 |只看該作者
我再詳細(xì)點
把read函數(shù)的代碼貼出來吧

ssize_t scull_read(struct file *filp, char __user *buf, size_t count,

                loff_t *f_pos)

{

    struct scull_dev *dev = filp->private_data;

    struct scull_qset *dptr;   

    int quantum = dev->quantum, qset = dev->qset;

    int itemsize = quantum * qset;

    int item, s_pos, q_pos, rest;

    ssize_t retval = 0;

    item = (long)*f_pos / itemsize;     //這里為什么要這樣算??意圖我知道,要計算出在scull_dev 鏈表中的位置,
                                      //但怎么能用指針值除以一個量子集的大?這得出的是什么?為什么能這么算
                                       //呢?

    rest = (long)*f_pos % itemsize;

    s_pos = rest / quantum;
  
    q_pos = rest % quantum;
  
    dptr = scull_follow(dev, item);   //查找再鏈表中的當(dāng)前位置


    if (count > quantum - q_pos)

        count = quantum - q_pos;


    if (copy_to_user(buf, dptr->data[s_pos] + q_pos, count)) {

        retval = -EFAULT;

        goto out;

    }

    *f_pos += count;

    retval = count;



  out:

    return retval;

}

[ 本帖最后由 冰伊羅 于 2008-7-11 15:11 編輯 ]

論壇徽章:
0
5 [報告]
發(fā)表于 2008-07-11 16:27 |只看該作者
f_ops 和 f_pos 是同一個東西嗎?

另外,你的 C 語言基礎(chǔ)也不夠扎實哦。

論壇徽章:
0
6 [報告]
發(fā)表于 2008-07-11 17:53 |只看該作者
?????
樓上的大哥??
我說的是file結(jié)構(gòu)體里面的   f_pos;
第一個是我打錯了,
能不能幫我解決問題?算我打錯了,OK?
但你說的都沒用啊,問題還沒解決。。。。。。。
我又看了看,是一個64位的數(shù)值。這個值是什么?
是在private_data中的數(shù)據(jù)的大小值嗎?

struct file {
       /*
         * fu_list becomes invalid after file_free is called and queued via
        * fu_rcuhead for RCU freeing
        */
         union {
                 struct list_head        fu_list;
                struct rcu_head         fu_rcuhead;
         } f_u;
         struct path             f_path;
#define f_dentry        f_path.dentry
#define f_vfsmnt        f_path.mnt
         const struct file_operations    *f_op;
         atomic_t                f_count;
        unsigned int            f_flags;
        mode_t                  f_mode;
       loff_t                  f_pos;
         struct fown_struct      f_owner;
         unsigned int            f_uid, f_gid;
        struct file_ra_state    f_ra;

       u64                     f_version;
#ifdef CONFIG_SECURITY
       void                    *f_security;
#endif
        /* needed for tty driver, and maybe others */
       void                    *private_data;

#ifdef CONFIG_EPOLL
       /* Used by fs/eventpoll.c to link all the hooks to this file */
         struct list_head        f_ep_links;
         spinlock_t              f_ep_lock;
#endif /* #ifdef CONFIG_EPOLL */
         struct address_space    *f_mapping;
#ifdef CONFIG_DEBUG_WRITECOUNT
         unsigned long f_mnt_write_state;
#endif
};

[ 本帖最后由 冰伊羅 于 2008-7-11 17:54 編輯 ]

論壇徽章:
0
7 [報告]
發(fā)表于 2008-07-11 18:02 |只看該作者
今天下午忙一直沒看到回復(fù)

這個第三章我看了4天了。。。
因為內(nèi)核部分缺陷不少,花了不少時間了
我自己按照這個思路自己寫了一個例子,但是這個問題還是不明白,沒人幫幫我嗎?
不行只有自己printk打出來看看了。。。

論壇徽章:
0
8 [報告]
發(fā)表于 2008-07-11 23:40 |只看該作者
用 (long)*f_pos / itemsize 不就可以得出所求的位置在第幾個 item 里面了嗎?有何不理解?

論壇徽章:
0
9 [報告]
發(fā)表于 2011-04-11 18:35 |只看該作者
你看是不是這樣?

論壇徽章:
0
10 [報告]
發(fā)表于 2011-04-11 19:01 |只看該作者
你的一個scull里面盛放的是一個鏈表scull_qset,一個鏈表又有許多的鏈表項(item)組成,而每個item中又存放了1000個指針(也就是這個item中數(shù)組的大小quanset),這些指針中,每個指針都可以指向一塊內(nèi)存,這塊內(nèi)存大小就是quantum(也就是書上講的4000),那么,這一個item就可以操作的內(nèi)存大小itemsize=(item中的指針數(shù))*(每個指針可以指向的內(nèi)存大小,也就是量子大。=quanset*quantum=1000*4000,對吧?這個應(yīng)該可以理解吧?
接下來我們看看(long) *f_pos,這個指針變量就是我們文件相對于文件起始位置的偏移量啊,用(long) *f_pos表示一個長整形,可以取的大小為0—2^64-1,這是文件的最大范圍。注意不能超過他,否則goto out;我們假設(shè)現(xiàn)在這個數(shù)沒有超過,那么,想一想,這個鏈表的每一項item所能操作的內(nèi)存大小是多少?
不就是itemsize么?
如果你的這個(long)*f_pos超過一個itemsize怎么辦?比如現(xiàn)在(long)*f_pos=4 000 001,那么當(dāng)程序讀完第一個item中的4000 000個字節(jié)以后,就要到鏈表項的第二個item開始讀啊!對吧?那么我們怎么知道我要從第幾個鏈表項開始讀?
就用(long)*f_pos/itemsize 來算,還是剛才的假設(shè),(long)*f_pos=4 000 001,又因為itemsize=4000 000
所以(long)*f_pos/itemsize =?應(yīng)該為1,這不就是第二個鏈表項嗎?注意,c語言從0開始計數(shù)(這個估計大家都知道,呵呵)。
在注意一下,剛才的(long)*f_pos/itemsize =1,那么(long)*f_pos%itemsize =?,也是1,這個是item中的偏移量,可以認(rèn)為是哪個指針數(shù)組的偏移量,它就從第一個指針開始取數(shù),第一個指針指向的是第二個item的第一個量子,ok


申明:因為本人也是菜鳥,所以可能解釋的不一定對,希望大蝦批評指正,謝謝!
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(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