Chip123 科技應用創新平台
標題:
在Linux user mode process取得一個pointer的 PA?
[打印本頁]
作者:
gogojesse
時間:
2009-5-6 06:32 PM
標題:
在Linux user mode process取得一個pointer的 PA?
在linux OS上
6 q- R& W& X: U: R
有沒有任何辦法在一個user mode process取得一個pointer的physical address?
4 H: [. Q6 c( m1 t. e
$ l* h6 m5 z$ g; K
因為想把pointer指到的資料用另外一個hardware直接搬走,但是沒找到很好的方法。
作者:
gogojesse
時間:
2009-5-8 10:40 AM
自己做了一些小實驗,如下:
9 X6 T. [ X: e3 v7 ?% w/ o& y
- R( ^7 j' I& d" m v
1) 掛了一個小支的kernel driver到系統上(簡稱findmapping.ko)
( W. l4 h+ G, p4 p% a
2) 把需要轉換的virtual address透過ioctl()丟到 findmmaping driver 裡頭。
# Z. C! h+ x4 J* {
3) kernel driver 收到 ioctl command 之後,找到對應 process 的 task struct
4 H1 p" x6 _7 x. m
4) 有了 task struct 就有所有的vma struct,可以找到這個virtual address是vma是哪個 entry。
J) ?' n$ }' `% Q
2 t( |# Q6 N- G
例如: 傳進來的virtual address = 0x40800000,因為我的va剛好是mapping block的開頭。
4 U- ^1 B7 H3 Z, p" X$ I( i" d
可以找到 vma->vm_start = 0x40800000 這個 entry。
, H/ `7 k+ J" j0 [( B9 l
6 a# Z8 N7 d6 _9 R/ V8 n
問題是剛靠vma提供的資訊還是不足夠。有些entry可以找到對應的 PA,但是有的 va 傳進
, J4 d" j. v, B% [2 U. ^: e r [
來之後,沒辦法直接用vma的資訊做轉換。
h% D( b, H# j o V
% H) a2 v1 z" p
目前打算再找到對應於這個process的page table的資訊,直接看table裡頭的mapping,不知道有沒有人
6 ]1 x7 ~7 S$ x. n$ d" I( J
有這方面的經驗,或是推薦好的文章?
9 ^" v4 h$ G" x& v* E! w' p. {
5 U- v! b8 M7 A; C
作者:
gogojesse
時間:
2009-5-8 06:09 PM
剛剛似乎試出來一些成果
! y' _' d- q3 ^" _: a
方法就是在上一篇的基礎上
' B+ v- o) j. D0 v! Q9 z
9 S, O$ A L' k
1) 找到task_struct
! \7 {! e$ N5 W/ z2 ^! H" b
2) 找到所屬的 mm
$ D. }5 `/ [% p; z( O3 T# l. E/ |/ p
2) 找到 mm 中的 pgd (page descriptor)
$ B0 O1 V+ j2 F4 ~& R& p
3) 有了pgd就可以用系統的函式,找到對應的 page table entry(pte)
3 E' Z( s% F$ E8 \9 P: ?5 Y Y
例如: pgd_offset(), pmd_offset(), pte_offset()等等
, B( j% ?3 O9 a" {0 I7 s
4) pa = (virtual address & 0xfffff000) | (pte & 0xfff)
6 I" e( L+ {3 F* X f; w
3 _2 T% d! {& S
應該就可以得到physical address。以上不知道有沒有錯誤或例外狀況。
: M+ N( q, L7 T! U
目前猜想trust zone可能會造成加在 driver的這段code沒有access某些
7 J# K1 ^8 q7 S v/ H. K3 V% L
資料的權利。但是對trush zone不是相當了解,不知道page table是不是
; M2 G* G' _/ c9 T6 S5 r% J" V. |
會被保護到。
作者:
gogojesse
時間:
2009-5-13 12:42 PM
剛剛review文章
: O! s) ^& [, i! F& G3 f2 W
發現寫反了~
; v! s8 v& B* w4 k9 N* \. n9 o* \
- I l$ N$ U9 c5 f1 Q+ Z$ Q+ A& b
4) pa = (virtual address & 0xfffff000) | (pte & 0xfff)
$ K, w: O8 F# ~( h) I
應該改成
8 x! X3 F( x/ _5 z( {
4) pa = (pte & 0xfffff000) | (virtual address & 0xfff)
5 H% p; m) {, Y; p
) d: P1 O6 a' n4 ?, ^' E
另外,這個問題還會遇到
" ]$ C1 ^9 @( s! r
整塊記憶體跨太多page
' m1 u& U( X! G; E" {
page可能在實體位址不連續或者被swap出去
' ?' O$ }; K( O* n/ m
所以要DMA搬運資料之前
O E+ F. b5 O" b
這些因素必須要先排除~
歡迎光臨 Chip123 科技應用創新平台 (http://chip123.com/)
Powered by Discuz! X3.2