Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 4604|回復: 3
打印 上一主題 下一主題

在Linux user mode process取得一個pointer的 PA?

[複製鏈接]
跳轉到指定樓層
1#
發表於 2009-5-6 18:32:33 | 只看該作者 回帖獎勵 |正序瀏覽 |閱讀模式
在linux OS上/ ]# k% d5 Y4 W) n9 p! d& i
有沒有任何辦法在一個user mode process取得一個pointer的physical address?
# L4 t/ p9 W, c1 D0 G; g/ y' q* q1 O) S' f. E* H9 T! H
因為想把pointer指到的資料用另外一個hardware直接搬走,但是沒找到很好的方法。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
4#
 樓主| 發表於 2009-5-13 12:42:11 | 只看該作者
剛剛review文章' [/ E+ C4 V5 f( z( u& c
發現寫反了~5 V) k. {; w# j- G5 _! H1 D
6 W6 l3 I) K- ^7 K" w: y
4) pa = (virtual address & 0xfffff000) | (pte & 0xfff)7 s$ V0 ~7 x: _5 g% Z/ S7 G& c$ W" A
應該改成. c' T4 M6 B  R2 l$ ~
4) pa = (pte & 0xfffff000) | (virtual address & 0xfff)
( r# W$ x8 Q' y& d6 w& i3 R, h; ]' p. X) Z7 z. ?1 p7 E
另外,這個問題還會遇到4 X6 z6 R% R9 i- M0 g9 O
整塊記憶體跨太多page. c9 G% y' p( q5 C9 I! F
page可能在實體位址不連續或者被swap出去
. N" ]8 Q: O7 a- \3 C  b所以要DMA搬運資料之前1 f7 o5 l2 f  r3 d! X# L
這些因素必須要先排除~
3#
 樓主| 發表於 2009-5-8 18:09:19 | 只看該作者
剛剛似乎試出來一些成果
* M9 s  J! W. Z) b; i! i+ t方法就是在上一篇的基礎上- S, N5 ^9 E% q8 A, |3 m

+ A2 Q& d8 e3 a3 G1) 找到task_struct
7 V" J" C6 e0 \* \" J% K2) 找到所屬的 mm
( [4 n! |. j" I6 [2) 找到 mm 中的 pgd  (page descriptor)4 q6 g, r6 a% n
3) 有了pgd就可以用系統的函式,找到對應的 page table entry(pte), r& P- }+ g& X1 Y0 X
   例如: pgd_offset(), pmd_offset(), pte_offset()等等( Y8 o8 z& d: s$ L
4) pa = (virtual address & 0xfffff000) | (pte & 0xfff)7 ]$ ~- G7 `3 Z# {+ Z
, ~7 x3 T- s) l7 ?
應該就可以得到physical address。以上不知道有沒有錯誤或例外狀況。5 c- y1 J. {) u( f
目前猜想trust zone可能會造成加在 driver的這段code沒有access某些
! X; k7 a3 E) @, ]& P1 l, _資料的權利。但是對trush zone不是相當了解,不知道page table是不是8 U$ K' T  U* c
會被保護到。
2#
 樓主| 發表於 2009-5-8 10:40:17 | 只看該作者
自己做了一些小實驗,如下:+ n. y9 q6 I0 A, n  b8 v6 n
' a. y6 X) m& G/ ?
1) 掛了一個小支的kernel driver到系統上(簡稱findmapping.ko)
7 w0 U' k8 |% e/ N4 w2 V2) 把需要轉換的virtual address透過ioctl()丟到 findmmaping driver 裡頭。8 s/ _- f. V$ _/ S
3) kernel driver 收到 ioctl command 之後,找到對應 process 的 task struct2 A4 ~. H) y& m+ Y9 a1 ^* {
4) 有了 task struct 就有所有的vma struct,可以找到這個virtual address是vma是哪個 entry。" d1 q# S& k: ~. A6 M

8 j1 n  y5 f! H  L/ ]5 a. I1 k   例如: 傳進來的virtual address = 0x40800000,因為我的va剛好是mapping block的開頭。
! j7 F: ~# n* U+ y   可以找到 vma->vm_start = 0x40800000 這個 entry。3 C3 G, A) L' L  T7 J) @* _7 {

4 z& W( v8 L# E( `" \問題是剛靠vma提供的資訊還是不足夠。有些entry可以找到對應的 PA,但是有的 va 傳進  n( d" R7 I5 S/ ~1 j- K2 O) b
來之後,沒辦法直接用vma的資訊做轉換。
8 t- \  F5 l% g8 f. E2 E
0 n8 m& H& F" ^9 p) h目前打算再找到對應於這個process的page table的資訊,直接看table裡頭的mapping,不知道有沒有人
7 F' E8 j: |* u4 Y有這方面的經驗,或是推薦好的文章?
' P" b% p- {+ x  y+ A( T" T+ s0 o  c! Q& L1 T6 Z

評分

參與人數 1Chipcoin +5 收起 理由
jacky002 + 5 大大願意分享出來 真的好棒唷!!

查看全部評分

您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

首頁|手機版|Chip123 科技應用創新平台 |新契機國際商機整合股份有限公司

GMT+8, 2025-1-16 09:13 AM , Processed in 0.156000 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表