Scull字元裝置驅動模組的記憶體使用分析

2021-04-03 00:32:27 字數 1394 閱讀 2751

先看一下每個scull_dev的資料結構的定義:

struct scull_qset ;

struct scull_dev ;

每個scull裝置都有乙個資料指標,每個指標都指向下乙個scull_qset資料結構。每個記憶體區成為乙個量子quantum,這個指標陣列即它的長度成為量子集qset,這個兩個值可以在scull.h定義初始值,也可以通過ioctl函式自定義其大小,在此例子的原始碼中每個scull_qset的data裡定義了1000個指標(qset)的陣列,每個指標都指向乙個4000位元組的區域(quantum)。

這個記憶體使用圖在《linux驅動程式》上作了說明,可以比較一下第三版和第二版對這個**釋的區別,以下我的應用的程式都是針對第三版發布的源**。

我們要對這個記憶體作讀取訪問,首先傳到核心空間的是乙個loff_t *offp指標,表示使用者對這個檔案的讀或寫操作的位置。首先可以通過這個offp可以獲取乙個資訊,這個loff_t *offp指標指在哪個struct scull_qset上,看原始碼,在ssize_t scull_read(struct file *filp, char __user *buf, size_t count,loff_t *f_pos):

/* find listitem, qset index, and offset in the quantum */

item = (long)*f_pos / itemsize;

rest = (long)*f_pos % itemsize;

s_pos = rest / quantum; q_pos = rest % quantum;

/* follow the list up to the right position (defined elsewhere) */

dptr = scull_follow(dev, item);

通過scull_follow()函式定位offp指標所在的scull_qset,而在讀取資料的時候是針對某一塊記憶體quantum來讀取;

item = (long)*f_pos / itemsize:資料在鍊錶的哪個scull_qset裡面?

rest = (long)*f_pos % itemsize:在這個scull_qset裡面資料偏移量為多少?

s_pos = rest / quantum:在這個scull_qset裡面的哪乙個quantum?

q_pos = rest % quantum:在這個quantum裡面偏移量多少?

指標loff_t *f_pos成功定位!

if (copy_to_user(buf, dptr->data[s_pos] + q_pos, count)),核心資料到使用者空間的拷貝,成功之後更新偏移指標:*f_pos += count。

下篇文章就介紹對scull原始碼的簡單移植,並提供所有原始碼 ,赫赫,今天先到這裡,休息休息......

Linux字元驅動 scull

源 除錯環境 ubuntu14.04 核心版本 3.13.0 32 scull.c include include include include include include include include include scull.h int scull major scull major ...

scull裝置的使用

scull裝置的使用 by 吳垠date 2007 07 05 email lazy.fox.wu gmail.com homepage 1.寫在前面 a.在進行下面的工作之前請先閱讀我 的文章 在 linux 2.6核心下編譯可以載入的核心模組 配 置好可載入核心模組的linux環境 b.c.d....

裝置驅動例項 字元裝置驅動

在整個linux裝置驅動學習中,字元裝置驅動較為基礎。通過對它的學習,對裝置驅動進一步加深了解 cdev 結構體struct cdev 講下比較重要的成員變數 dev t dev 定義了32位的裝置號,其中12位是主裝置號,20位是從裝置號。獲取主裝置號 major dev t dev 獲取從裝置號...