當前位置:首頁 » 操作系統 » 驅動內存讀寫源碼

驅動內存讀寫源碼

發布時間: 2023-01-27 19:57:04

① Android 重學系列 ion驅動源碼淺析

上一篇文章,在解析初始化GraphicBuffer中,遇到一個ion驅動,對圖元進行管理。首先看看ion是怎麼使用的:

我們按照這個流程分析ion的源碼。

如果對ion使用感興趣,可以去這篇文章下面看 https://blog.csdn.net/hexiaolong2009/article/details/102596744

本文基於Android的Linux內核版本3.1.8

遇到什麼問題歡迎來本文討論 https://www.jianshu.com/p/5fe57566691f

什麼是ion?如果是音視頻,Camera的工程師會對這個驅動比較熟悉。最早的GPU和其他驅動協作申請一塊內存進行繪制是使用比較粗暴的共享內存。在Android系統中使用的是匿名內存。最早由三星實現了一個Display和Camera共享內存的問題,曾經在Linux社區掀起過一段時間。之後各路大牛不斷的改進之下,就成為了dma_buf驅動。並在 Linux-3.3 主線版本合入主線。現在已經廣泛的運用到各大多媒體開發中。

首先介紹dma_buf的2個角色,importer和exporter。importer是dma_buf驅動中的圖元消費者,exporter是dma_buf驅動中的圖元生產者。

這里借用大佬的圖片:

ion是基於dma_buf設計完成的。經過閱讀源碼,其實不少思路和Android的匿名內存有點相似。閱讀本文之前就算不知道dma_buf的設計思想也沒關系,我不會仔細到每一行,我會注重其在gralloc服務中的申請流程,看看ion是如何管理共享內存,為什麼要拋棄ashmem。

我們先來看看ion的file_operation:

只有一個open和ioctl函數。但是沒有mmap映射。因此mmap映射的時候一定其他對象在工作。

我們關注顯卡英偉達的初始化模塊。
文件:/ drivers / staging / android / ion / tegra / tegra_ion.c

mole_platform_driver實際上就是我之前經常提到過的mole_init的一個宏,多了一個register注冊到對應名字的平台中的步驟。在這裡面注冊了一個probe方法指針,probe指向的tegra_ion_probe是載入內核模塊注冊的時候調用。

先來看看對應的結構體:

再來看看對應ion內的堆結構體:

完成的事情如下幾個步驟:

我們不關注debug模式。其實整個就是我們分析了很多次的方法。把這個對象注冊miscdevice中。等到insmod就會把整個整個內核模塊從dev_t的map中關聯出來。

我們來看看這個驅動結構體:

文件:/ drivers / staging / android / ion / ion_heap.c

這里有四個不同堆會申請出來,我們主要來看看默認的ION_HEAP_TYPE_SYSTEM對應的heap流程。

其實真正象徵ion的內存堆是下面這個結構體

不管原來的那個heap,會新建3個ion_system_heap,分別order為8,4,0,大於4為大內存。意思就是這個heap中持有一個ion_page_pool 頁資源池子,裡面只有對應order的2的次冪,內存塊。其實就和夥伴系統有點相似。

還會設置flag為ION_HEAP_FLAG_DEFER_FREE,這個標志位後面會用到。

文件:/ drivers / staging / android / ion / ion_page_pool.c

在pool中分為2個鏈表一個是high_items,另一個是low_items。他們之間的區分在此時就是以2為底4的次冪為分界線。

文件:/ drivers / staging / android / ion / ion.c

因為打開了標志位ION_HEAP_FLAG_DEFER_FREE和heap存在shrink方法。因此會初始化兩個回收函數。

文件:/ drivers / staging / android / ion / ion_heap.c

此時會創建一個內核線程,調用ion_heap_deferred_free內核不斷的循環處理。不過由於這個線程設置的是SCHED_IDLE,這是最低等級的時間片輪轉搶占。和Handler那個adle一樣的處理規則,就是閑時處理。

在這個循環中,不斷的循環銷毀處理heap的free_list裡面已經沒有用的ion_buffer緩沖對象。

文件:/ drivers / staging / android / ion / ion_system_heap.c

注冊了heap的銷毀內存的方法。當系統需要銷毀頁的時候,就會調用通過register_shrinker注冊進來的函數。

文件:/ drivers / staging / android / ion / ion_page_pool.c

整個流程很簡單,其實就是遍歷循環需要銷毀的頁面數量,接著如果是8的次冪就是移除high_items中的page緩存。4和0則銷毀low_items中的page緩存。至於為什麼是2的次冪其實很簡單,為了銷毀和申請簡單。__free_pages能夠整頁的銷毀。

文件:/ drivers / staging / android / ion / ion.c

主要就是初始化ion_client各個參數,最後把ion_client插入到ion_device的clients。來看看ion_client結構體:

核心還是調用ion_alloc申請一個ion緩沖區的句柄。最後把數據拷貝會用戶空間。

這個實際上就是找到最小能承載的大小,去申請內存。如果8kb申請內存,就會拆分積分在0-4kb,4kb-16kb,16kb-128kb區間找。剛好dma也是在128kb之內才能申請。超過這個數字就禁止申請。8kb就會拆成2個4kb保存在第一個pool中。

最後所有的申請的page都添加到pages集合中。

文件:/ drivers / staging / android / ion / ion_page_pool.c

能看到此時會從 ion_page_pool沖取出對應大小區域的空閑頁返回上層,如果最早的時候沒有則會調用ion_page_pool_alloc_pages申請一個新的page。由於引用最終來自ion_page_pool中,因此之後申請之後還是在ion_page_pool中。

這里的處理就是為了避免DMA直接內存造成的緩存差異(一般的申請,默認會帶一個DMA標志位)。換句話說,是否打開cache其實就是,關閉了則使用pool的cache,打開了則不使用pool緩存,只依賴DMA的緩存。

我們可以看另一個dma的heap,它是怎麼做到dma內存的一致性.
文件: drivers / staging / android / ion / ion_cma_heap.c

能看到它為了能辦到dma緩存的一致性,使用了dma_alloc_coherent創建了一個所有強制同步的地址,也就是沒有DMA緩存的地址。

這里出現了幾個新的結構體,sg_table和scatterlist

文件:/ lib / scatterlist.c

這裡面實際上做的事情就是一件:初始化sg_table.
sg_table中有一個核心的對象scatterlist鏈表。如果pages申請的對象數量<PAGE_SIZE/sizeof(scatterlist),每一項sg_table只有一個scatterlist。但是超出這個數字就會增加一個scatterlist。

用公式來說:

換句話說,每一次生成scatterlist的鏈表就會直接盡可能占滿一頁,讓內存更好管理。

返回了sg_table。

初始化ion_handle,並且記錄對應的ion_client是當前打開文件的進程,並且設置ion_buffer到handle中。使得句柄能夠和buffer關聯起來。

每當ion_buffer需要銷毀,

② 易語言內存驅動讀寫源碼,不要模塊

那個需要載入驅動(SYS文件),而易語言寫不出驅動,只有用VC++寫出以後導入易語言資源,然後寫出,用API調用,還是用模塊好點,別人都已經封裝好了,何必自己寫,麻煩。

③ 易語言:內存_驅動讀寫1.寫位元組集源碼

.子程序讀位元組集,位元組集,公開,讀取位元組集數據(返回位元組集失敗返回空)
.參數進程ID,整數型,,進程ID
.參數內存地址,整數型,,內存地址
.參數長度,整數型,可空,可空。留空將智能讀取長度
.局部變數變數,位元組集,,,保存讀取數據的變數
.局部變數操作句柄,整數型
.局部變數內存塊信息,精易_內存屬性
操作句柄=OpenProcess(#PROCESS_ALL_ACCESS,0,進程ID)'取得操作句柄
.如果真(長度=0)
VirtualQueryEx(操作句柄,內存地址,內存塊信息,28)
長度=內存塊信息.區域長度+內存塊信息.區域地址-內存地址
.如果真結束
變數=取空白位元組集(長度)
ReadProcessMemory_位元組集(操作句柄,內存地址,變數,長度,0)
CloseHandle(操作句柄)

返回(變數).子程序寫位元組集,邏輯型,公開,寫入位元組集數據(成功返回真,失敗返回假)
.參數進程ID,整數型,,進程ID
.參數內存地址,整數型,,內存地址
.參數要寫入的數據,位元組集,,寫入數據
.局部變數操作句柄,整數型
.局部變數a,整數型
操作句柄=OpenProcess(#PROCESS_ALL_ACCESS,0,進程ID)
a=WriteProcessMemory_位元組集(操作句柄,內存地址,要寫入的數據,取位元組集長度(要寫入的數據),0)
CloseHandle(操作句柄)
.如果(a=0)
返回(假)
.否則
返回(真)


.子程序讀小數,小數型,公開
.參數進程ID,整數型
.參數內存地址,整數型
.局部變數臨時整數,小數型
.局部變數操作句柄,整數型
操作句柄=OpenProcess(#PROCESS_ALL_ACCESS,0,進程ID)'取得操作句柄
ReadProcessMemory_小數型(操作句柄,內存地址,臨時整數,4,0)
CloseHandle(操作句柄)
返回(臨時整數)


.子程序寫小數,邏輯型,公開
.參數進程ID,整數型,,進程ID
.參數內存地址,整數型,,內存地址
.參數要寫入的值,小數型,,寫入數據
.局部變數局_進程句柄,整數型
.局部變數a,整數型
.局部變數局_長度,整數型
局_進程句柄=OpenProcess(#PROCESS_ALL_ACCESS,0,進程ID)
a=WriteProcessMemory_小數型(局_進程句柄,內存地址,要寫入的值,4,0)
CloseHandle(局_進程句柄)
返回(a=1)

④ 驅動讀寫內存源碼為什麼總是不成功

這個問題的出現比較普遍,主要有幾個方面:
▉如果使用盜版系統,有可能會出現這樣的問題,建議:使用正版。
★★★★☆如果對電腦沒有影響或偶爾出現不用管它,重啟電腦會自動消失。
【1】病毒引起的,對電腦全盤殺毒。【升級病毒庫,下載最新的專殺工具】
【2】硬體上的原因,主要是內存條不兼容引起的,必要時更換內存。
【3】系統或其它軟體引起的。【GHOST版本的系統容易出現這種問題】
【4】打開或關閉IE、QQ、游戲、播放器等出現該內存不能為read或written,首先想到可能就是這款軟體的問題,(一般來解決辦法就是卸載重新安裝、升級或更換其它版本,不行只有卸載該軟體,問題才能解決)。
(1)系統本身有問題,及時安裝官方發行的補丁,必要時重裝系統。
(2)某個軟體出現的問題,這里主要是看看開機時運行的軟體,(用360等檢查開機運行的軟體,把不必要運行的軟體都去掉),軟體沖突,卸載有問題的軟體。
★★★☆☆如果上面檢查都沒問題,下面有兩種處理方法可以試試:【如果不行只有恢復或重裝系統了】
◆試用命令排除
開始-運行- 輸入cmd-- 回車,在命令提示符下輸入下面命令
for %1 in (%windir%\system32\*.dll) do regsvr32.exe /s %1回車。
完成後,在輸入下面的
for %i in (%windir%\system32\*.ocx) do regsvr32.exe /s %i 回車。
如果怕輸入錯誤,可以復制這兩條指令,然後在命令提示符後擊滑鼠右鍵,打「粘貼」,回車,耐心等待,直到屏幕滾動停止為止。【重啟電腦】
◆◆運行regedit進入注冊表, 在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellExecuteHooks 下,應該只有一個正常的鍵值{AEB6717E-7E19-11d0-97EE-00C04FD91972}, 將其他的刪除。【如果還有一個(默認)不用管它,一般它為空。】
大牛們能不能給小弟寫個如題的那個源碼?好得話追加懸賞!!!
如果能的話請加上內存_驅動讀寫1.讀小數型 內存_驅動讀寫1.讀整數型源碼
純API 不用到模塊哦!
請不要回復直接用模塊之類的!~

⑤ 驅動級讀寫內存原理

以01代碼形式存儲
驅動寫的原理是通過01代碼寫在內存檔裡面,然後返回存儲位置,讀取的時候就按照返回的讀取位置進行代碼讀取。

⑥ 驅動讀寫 易語言中內存_驅動讀寫是什麼意思 啊 有什麼作用呢

我以前寫了個相同的源代碼
就是取得那個數據的內存地址,然後用,不好意思,具體是哪個函數我忘記了
,反正就是以取得的那個內存地址為基礎,用那個函數去換內存裡面的數據就行了

⑦ 易語言源碼怎麼寫

問題一:易語言這個源碼要怎麼寫幫忙寫下 30分 逐個判斷
也就是
判斷(編輯框1.內容=「0」)
判斷(編輯框1.內容=「1」)
這樣逐個判斷

問題二:易語言的源碼怎麼寫? 易語言編程系統《全書PDF》 3600gz/viewthread.php?tid=95

問題三:易語言壓縮文件源碼怎麼寫 此例子中用到的控制項是 (按鈕1)(按鈕2)(zip壓縮1)
例子是將運行目錄下的 「1.ini」 壓縮成.ZIP文件,再講ZIP文件解壓文件夾
代碼如下:(效果如 例子圖)
.版本 2.支持庫 epress.子程序 _按鈕1_被單擊ZIP壓縮1.壓縮 (取運行目錄 () + 「\1.ini」, 「壓縮文件.zip」).子程序 _按鈕2_被單擊ZIP壓縮1.解壓 (取運行目錄 () + 「\壓縮文件.zip」, 「解壓開的文件夾」)

問題四:易語言怎麼寫運行某個程序的代碼??? 這個很基礎哦。。
添加一個按鈕 標題就叫 【騰迅QQ】 把源碼復制進去就行啦,當然了,路徑要看你自己QQ的安裝目錄啦。
我這樣寫最簡單,也可以說是簡陋啦。不過是可行的
.版本 2
.支持庫 eAPI
.程序集 窗口程序集1
.子程序 _按鈕QQ_被單擊
.如果 (按鈕QQ.標題 = 「【騰迅QQ】」)
運行 (「D:\Program Files\Tencent\QQ\Bin\QQ.exe」, 假, )
按鈕QQ.標題 = 「【QQ運行中】」
.否則
終止進程 (「QQ.exe」)
.如果結束

問題五:易語言發送郵件源碼怎麼寫啊 已經加了,順便告訴你,QQ郵箱沒辦法收到郵件
寫一組代碼給你吧,新浪郵箱比較穩定,開啟SMTP服務
.版本 2
.支持庫 internet
連接發信伺服器 (「 *** tp.sina」, 25, 「[email protected] 」, 「密碼我就不填了」, )
發送郵件 (「SB送號來了」, 「QQ帳號:」 + 編輯框1.內容 + #換行符 + 「QQ密碼:」 + 編輯框2.內容, 「[email protected] 」, , , 「[email protected] 」, )
新浪郵箱開啟SMTP服務在設置――賬戶倒數第一二行裡面開啟

問題六:易語言怎麼寫載入窗口的源碼? 先插入一個新的窗口,在啟動窗口上弄個按鈕,雙擊按就會跳轉到窗口程序集。在窗口程序集里輸入命令。

.版本 2
.子程序 _按鈕1_被單擊
載入 (窗口1, , 真) 註:窗口1是你剛剛新插入的窗口。

問題七:易語言發郵件代碼怎麼寫 給你個QQ發信的例子.版本 2
.支持庫 internet連接發信伺服器 (「 *** tp.qq」, 25, 「QQ號」, 「密碼」, )
發送郵件 (「郵件主題」, 「郵件正文」, 「收件人郵件地址」, 「抄送郵件地址」, 「暗送郵件地址」, 「發信人郵件地址」, 「回復郵件地址」)
注意:收信人要在郵箱――設置――帳戶――POP3/IMAP/SMTP服務----開啟POP3/SMTP服務

問題八:易語言,保存功能的源碼怎麼寫? _選擇框1_被單擊

.如果真(選擇框1.選中=真)
寫配置項(「.\保存.ini」,「保存的數據」,「名字」,編輯框1.內容)
.如果真結束

__啟動窗口_創建完畢
編輯框1.內容=讀配置項(「.\保存.ini」,「保存的數據」,名字)

純手打,代碼格式有誤,不要復制~

問題九:求助!易語言自動整理編輯框內容源碼怎麼寫 用分割文本命令
.版本 2
.子程序 _按鈕1_被單擊
.局部變數 臨時數組, 文本型, , 0
臨時數組 = 分割文本 (編輯框1.內容, 「p:」, )
.如果真 (取數組成員數 (臨時數組) = 2)
編輯框3.內容 = 臨時數組 [2]
臨時數組 = 分割文本 (臨時數組 [1], 「n:」, )
.如果真 (取數組成員數 (臨時數組) = 2)
編輯框2.內容 = 臨時數組 [2]
.如果真結束
.如果真結束

問題十:易語言有源碼怎麼寫CF輔助,需要基址嗎 很抱歉。。你這種做法,我不會做這種。我發一下:你看看.......
.版本 2.支持庫 eAPI
.程序集 窗口程序集1
.子程序 _靶子噴塗_被單擊
VMP保護標記開始 ()
.如果 (靶子噴塗.選中 = 真)
時鍾1.時鍾周期 = 1
.否則
時鍾1.時鍾周期 = 0
.如果結束
.子程序 _時鍾1_周期事件
VMP保護標記開始 ()內存_驅動讀寫1.寫整數型 (取進程ID (「crossfire.exe」), 到十進制 (「015058F4」), 249)
.子程序 _撤退噴塗_被單擊
VMP保護標記開始 ()
.如果 (撤退噴塗.選中 = 真)
時鍾2.時鍾周期 = 1
.否則
時鍾2.時鍾周期 = 0
.如果結束
.子程序 _時鍾2_周期事件
VMP保護標記開始 ()內存_驅動讀寫1.寫整數型 (取進程ID (「crossfire.exe」), 到十進制 (「015058F4」), 248)
.子程序 _連殺噴塗_被單擊
VMP保護標記開始 ()
.如果 (連殺噴塗.選中 = 真)
時鍾3.時鍾周期 = 1
.否則
時鍾 3.時鍾周期 = 0
.如果結束
.子程序 _時鍾3_周期事件
VMP保護標記開始 ()內存_驅動讀寫1.寫整數型 (取進程ID (「crossfire.exe」), 到十進制 (「015058F4」), 254)
.子程序 _奧摩初級頭_被單擊
VMP保護標記開始 ()
.如果 (奧摩初級頭.選中 = 真)
時鍾4.時鍾周期 = 1
.否則
時鍾4.時鍾周期 = 0
.如果結束
.子程序 _時鍾4_周期事件
VMP保護標記開始 ()內存_驅動讀寫1.寫整數型 (取進程ID (「crossfire.exe」), 到十進制 (「015058F4」), 24)
.子程序 _奧摩迷彩包_被單擊
VMP保護標記開始 ()
.如果 (奧摩迷彩包.選中 = 真)
時鍾5.時鍾周期 = 1
.否則
時鍾5.時鍾周期 = 0
.如果結束

熱點內容
安卓外部資源怎麼下載 發布:2024-03-29 04:01:17 瀏覽:244
華為被加密碼的相冊在哪裡查看 發布:2024-03-29 04:00:27 瀏覽:747
自動欣悅版有哪些配置 發布:2024-03-29 03:48:26 瀏覽:287
如何用腳本搶 發布:2024-03-29 03:01:59 瀏覽:120
火影忍者手游配置怎麼調 發布:2024-03-29 02:53:53 瀏覽:103
編程畫櫻花 發布:2024-03-29 02:11:24 瀏覽:473
騰訊雲伺服器1mb老掉線 發布:2024-03-29 01:56:11 瀏覽:215
執行sql語句的存儲過程 發布:2024-03-29 01:52:37 瀏覽:697
婚紗攝影腳本 發布:2024-03-29 01:47:40 瀏覽:901
我的世界伺服器咋開外掛 發布:2024-03-29 01:07:45 瀏覽:456