Answer Linux memory management

133 views
Skip to first unread message

李順河

unread,
Jun 26, 2012, 11:42:04 PM6/26/12
to tw-linux-ke...@googlegroups.com
Hi All,

             This is my answer :
             以下是我工研院同事問的問題 :

我目前想要進行的實驗是將記憶體(RAM)中的 page 完整 copy 到另一個 page.
就我所知除了 page content copy, 還要更新 memory management 中關於 source/destination pages 的相關資料, 包括:
1. reference 到 source page 的所有 page tables 要 update 成 destination page 的 pfn
2. 兩個 page 所在的 zone 管理 page 狀態的資料更新
3. 兩個 page 的 virtual address vs. physical address 的 mapping
我的問題是:
1. 除此上述資料需要更新之外還有別的嗎?
   => 我還要 check 看看
   
2. 有無現成函式即可使用或小改
   => 我還要 check 看看
3. 如何用 pfn 或 page 反推 page table or zone
   => 1. address = pfn_to_virt();
      2. pgd = pgd_offset(mm, address);
      3. pud = pud_alloc(mm, pgd, address);
      4. pmd = pmd_alloc(mm, pud, address);
      5. pte = pte_alloc_map(mm, pmd, address);
      可參考 ./mm/memory.c 中的 handle_mm_fault()
4. kernel 在哪裡將 process or task 所用的 page 納入其 page table 中, 意即 process/task ID 如何和 page(pfn) 勾起來?
   => 1. Process 的 address space 是在 exec() 中先建立好 stack, heap, code, data and bss 的 VMA
      2. 當 process 要讀寫一個 (VA) address 時會產生一個 page fault, 此時會呼叫 do_page_fault()
      3. do_page_fault() 會在呼叫 handle_mm_fault() 去建立第一, 二層的 page table
      4. 之後在呼叫 handle_pte_fault() 判斷是 do_linear_fault(), do_anonymous_page(), do_nonlinear_fault(), 
         do_swap_page(), or do_wp_page().
      5. 如果是 do_anonymous_page(), 就會先 allocate page frame, 在把 pte 和 此 page frame link
         在一起. 

Best Regards,
        River

---------- 轉寄的郵件 ----------
寄件者: 李順河 <downri...@gmail.com>
日期: 2012年6月22日下午6:16
主旨: Fwd: Linux memory management
收件者: jay...@itri.org.tw


子傑,
          這是我們 kernel group 的成員回答的內容.
          我下星期一之前會在回答您的問題.

   Best regards,
         River

---------- 轉寄的郵件 ----------
寄件者: Spark <spark....@gmail.com>
日期: 2012年6月21日下午4:23
主旨: Re: Linux memory management
收件者: tw-linux-ke...@googlegroups.com



印象中,KERNEL 有個 pfn_to_virt( ) / virt_to_pfn( ) API
利用 PAGE_SHIFT 定義的 bit 作 shift
EX:
bit 12~31 : PFN
bit 11~0 : offset
可以參考 kernel source 

如果是arm 可以由 CP15 找出 Translation Table Base Addr
(可能會有兩級轉換表)
可以找出page對應情況





李順河 <downri...@gmail.com> 於 2012年6月21日下午2:46 寫道:

Dear All,
                   這是我工研院以前同事問我的問題.
                   大家可以幫忙想一下囉. :)
                   Thanks.

      Best Regards,
             River
    
                  

---------- 轉寄的郵件 ----------
寄件者: <jay...@itri.org.tw>
日期: 2012年6月21日下午2:34
主旨: Linux memory management
收件者: downri...@gmail.com


順河,
我目前想要進行的實驗是將記憶體(RAM)中的 page 完整 copy 到另一個 page.
就我所知除了 page content copy, 還要更新 memory management 中關於 source/destination pages 的相關資料, 包括:
1. reference 到 source page 的所有 page tables 要 update 成 destination page 的 pfn
2. 兩個 page 所在的 zone 管理 page 狀態的資料更新
3. 兩個 page 的 virtual address vs. physical address 的 mapping
我的問題是:
1. 除此上述資料需要更新之外還有別的嗎?
2. 有無現成函式即可使用或小改
3. 如何用 pfn 或 page 反推 page table or zone
4. kernel 在哪裡將 process or task 所用的 page 納入其 page table 中, 意即 process/task ID 如何和 page(pfn) 勾起來?
 
煩請不吝指教, 謝謝
 
 
沈子傑
工研院資通所(ITRI/ICL)
處理器與應用組(Embedded Software Dept.)
嵌入式系統軟體部(Processor & Application Division)
TEL: 03-5914637
E-mail: jay...@itri.org.tw
-------------------------------------------------
本信件可能包含工研院機密資訊,非指定之收件者,請勿使用或揭露本信件內容,並請銷毀此信件。
This email may contain confidential information. Please do not use or disclose it in any way and delete it if you are not the intended recipient.




Reply all
Reply to author
Forward
0 new messages