- 論壇徽章:
- 0
|
小弟寫了個測試的應用程序希望看看物理內存是如何分配的,
所以需要在應用程序中將虛擬地址轉化為物理地址,所以用到了一些內核中的方法,以下代碼是參考網(wǎng)上例子:- unsigned long vtop(unsigned long addr){
- unsigned long real_addr = 0x00;//要輸出的地址
- struct task_struct *cur_task;
- cur_task = get_current();//獲取當前進程控制塊
- if(cur_task==NULL){
- goto out;
- }
- struct mm_struct *mm = cur_task->mm;//進程虛擬空間
- pgd_t *pgd;//描述頁全局目錄項
- pmd_t *pmd;//描述頁中間項
- pte_t *pte;//頁表項
-
- pgd = pgd_offset(mm, addr);//找出所在目錄
- if (pgd_none(*pgd)){
- goto out;
- }
- pmd = pmd_offset(pgd, addr);//找出所在中間項
- if (pmd_none(*pmd)){
- goto out;
- }
- pte = pte_offset(pmd, addr);//找出所在頁面
- if (pte_none(*pte)) {
- goto out;
- }
- //假設每頁4KB
- real_addr = addr & 0x00003fff; //取出頁面偏移量
- real_addr += pte;//內核空間訪問的地址
- real_addr -= PAGE_OFFSET;//真正物理地址()
- return real_addr;
- out:
- printk("沒有內存映射",real_addr);
- }
復制代碼 但是結構task_struct和pgd_t、pmd_t、pte_t都是未定義的,這幾個結構是定義在include/linux/sched.h和include/asm/page.h兩個文件里,
而usr/include/linux下的頭文件其實和內核的頭文件有所不同。請問在應用中應該如何調用這些內核結構?
|
|