㈠ Linux下怎樣在進程中獲取虛擬地址對應的物理地址
Linux文件目錄中的/proc記錄著當前進程的信息,稱其為虛擬文件系統。在/proc下有一個鏈接目錄名為self,這意味著哪一個進程打開了它,self中存儲的信息就是所鏈接進程的。self中有一個名為page_map的文件,專門用來記錄所鏈接進程的物理頁號信息。這樣通過/proc/pid/page_map文件,允許一個用戶態的進程查看到每個虛擬頁映射到的物理頁
/proc/pid/page_map中的每一項都包含了一個64位的值,這個值內容如下所示。每一項的映射方式不同於真正的虛擬地址映射,其文件中遵循獨立的對應關系,即虛擬地址相對於0x0經過的頁面數是對應項在文件中的偏移量
* /proc/pid/pagemap. This file lets a userspace process find out which
physical frame each virtual page is mapped to. It contains one 64-bit
value for each virtual page, containing the following data (from
fs/proc/task_mmu.c, above pagemap_read):
* Bits 0-54 page frame number (PFN) if present//present為1時,bit0-54表示物理頁號
* Bits 0-4 swap type if swapped
* Bits 5-54 swap offset if swapped
* Bit 55 pte is soft-dirty (see Documentation/vm/soft-dirty.txt)
* Bit 56 page exclusively mapped (since 4.2)
* Bits 57-60 zero
* Bit 61 page is file-page or shared-anon (since 3.5)
* Bit 62 page swapped
* Bit 63 page present//如果為1,表示當前物理頁在內存中;為0,表示當前物理頁不在內存中
在計算物理地址時,只需要找到虛擬地址的對應項,再通過對應項中的bit63判斷此物理頁是否在內存中,若在內存中則對應項中的物理頁號加上偏移地址,就能得到物理地址
通過程序獲取物理地址並驗證寫時拷貝技術
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdint.h>
//計算虛擬地址對應的地址,傳入虛擬地址vaddr,通過paddr傳出物理地址
void mem_addr(unsigned long vaddr, unsigned long *paddr)
{
int pageSize = getpagesize();//調用此函數獲取系統設定的頁面大小
unsigned long v_pageIndex = vaddr / pageSize;//計算此虛擬地址相對於0x0的經過的頁面數
unsigned long v_offset = v_pageIndex * sizeof(uint64_t);//計算在/proc/pid/page_map文件中的偏移量
unsigned long page_offset = vaddr % pageSize;//計算虛擬地址在頁面中的偏移量
uint64_t item = 0;//存儲對應項的值
int fd = open("/proc/self/pagemap", O_RDONLY);。。以只讀方式打開/proc/pid/page_map
if(fd == -1)//判斷是否打開失敗
{
printf("open /proc/self/pagemap error
");
return;
}
if(lseek(fd, v_offset, SEEK_SET) == -1)//將游標移動到相應位置,即對應項的起始地址且判斷是否移動失敗
{
printf("sleek error
");
return;
}
if(read(fd, &item, sizeof(uint64_t)) != sizeof(uint64_t))//讀取對應項的值,並存入item中,且判斷讀取數據位數是否正確
{
printf("read item error
");
return;
}
if((((uint64_t)1 << 63) & item) == 0)//判斷present是否為0
{
printf("page present is 0
");
return ;
}
uint64_t phy_pageIndex = (((uint64_t)1 << 55) - 1) & item;//計算物理頁號,即取item的bit0-54
*paddr = (phy_pageIndex * pageSize) + page_offset;//再加上頁內偏移量就得到了物理地址
}
const int a = 100;//全局常量
int main()
{
int b = 100;//局部變數
static c = 100;//局部靜態變數
const int d = 100;//局部常量
char *str = "Hello World!";
unsigned long phy = 0;//物理地址
char *p = (char*)malloc(100);//動態內存
int pid = fork();//創建子進程
if(pid == 0)
{
//p[0] = '1';//子進程中修改動態內存
mem_addr((unsigned long)&a, &phy);
printf("pid = %d, virtual addr = %x , physical addr = %x
", getpid(), &a, phy);
}
else
{
mem_addr((unsigned long)&a, &phy);
printf("pid = %d, virtual addr = %x , physical addr = %x
", getpid(), &a, phy);
}
sleep(100);
free(p);
waitpid();
return 0;
}
測試結果如下:
全局常量:符合寫時拷貝技術
子進程修改動態內存
*其實想要知道虛擬地址對應的物理地址,通過這樣的方式也可以得到物理地址而不用操作MMU。。。*
以上就是Linux下怎樣在進程中獲取虛擬地址對應的物理地址的全文介紹,希望對您學習和使用linux系統開發有所幫助.
㈡ linux如何查看物理網卡地址
ifconfig 或 netconfig
㈢ linux嵌入式 怎麼查看內存外設在cpu中的物理地址
查看CPU信息:cat /proc/cpuinfo
查看內存信息:cat /proc/meminfo
查看USB設備:cat /proc/bus/usb/devices
查看鍵盤和滑鼠:cat /proc/bus/input/devices
查看各分區使用情況:df
查看體系結構:busybox uname -a
查看中斷信息:cat /proc/interrupts
㈣ linux中哪個命令可以查看自己的IP地址
查看方法如下:
打開linux操作系統在進入到界面。
Linux是一套免費使用和自由傳播的類Unix操作系統,是一個基於POSIX和UNIX的多用戶、多任務、支持多線程和多CPU的操作系統。它能運行主要的UNIX工具軟體、應用程序和網路協議。它支持32位和64位硬體。Linux繼承了Unix以網路為核心的設計思想,是一個性能穩定的多用戶網路操作系統。
Linux操作系統誕生於1991 年10 月5 日(這是第一次正式向外公布時間)。Linux存在著許多不同的Linux版本,但它們都使用了Linux內核。Linux可安裝在各種計算機硬體設備中,比如手機、平板電腦、路由器、視頻游戲控制台、台式計算機、大型機和超級計算機。
㈤ 如何在LINUX中獲取進程中某個虛擬地址所在物理內
/*
*偽代碼,示例
*32位地址,三級映射(沒有pud_t),頁面大小4KB
*/
unsigned long addr = 0x12345678;//要找的虛擬地址,用戶空間所訪問的地址
unsigned long real_addr = 0x00;//要輸出的地址
struct task_struct *cur_task = get_current();//獲取當前進程式控制制塊
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;//真正物理地址()
printk("物理地址是 %x\n",real_addr);
return;
out:
printk("沒有內存映射",real_addr);
㈥ linux中虛擬地址和物理地址怎樣映射
/*
*偽代碼,示例
*32位地址,三級映射(沒有pud_t),頁面大小4KB
*/
unsigned long addr = 0x12345678;//要找的虛擬地址,用戶空間所訪問的地址
unsigned long real_addr = 0x00;//要輸出的地址
struct task_struct *cur_task = get_current();//獲取當前進程式控制制塊
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;//真正物理地址()
printk("物理地址是 %x\n",real_addr);
return;
out:
printk("沒有內存映射",real_addr);
㈦ 虛擬機Linux的IP怎麼看
1、在虛擬機中打開Linux系統,在桌面空白處右擊,點擊「打開終端」。
(7)linux怎麼查看物理地址映射擴展閱讀:
linux虛擬機
linux操作系統是一款在伺服器上廣泛應用的操作系統,雖然起初並不適合普通大眾,而且使用起來沒有Windows操作系統方便,不過如今的linux發行版已經可以和windows同樣易用,並且穩定性及安全性佔有優勢。
linux操作系統是一款在缺侍伺服器上廣泛應用的操作系統,雖然起初並不適合普通大眾,而且使用起來沒有Windows操作系統方便,不過如今的linux發行版已經可以和windows同樣易用,並且穩定性及安全性佔有優勢。
在實體計算機上,通過軟體模擬出的一台或者多台虛擬計算機叫虛擬機。虛擬機使用宿主機的硬體資源,擁有真實計算機的絕大多數功能。你可以在虛擬機中安裝虛擬機軟體所支持的操作系統,比如你可以在
vm 虛擬機中安裝 linux,也可以在 vm 虛擬機中安裝 windows,無論你的宿主機卜扮旅使用的是 類unix 系統或者 windows
系統。
㈧ 如何找網卡物理地址
如何查看網卡的物理地址
工具/原料
Win7
如何查看MAC地址
命令提示符查看
最簡單通俗的辦法就是直接,打開命令提示符(開始---運行==輸入cmd) 界面輸入,ipconfig /all 可以看到網卡的物理地址,如圖部分
常規方法
除此之外,其實很多用戶電腦命令提示符被禁用了。那麼怎麼查看網卡MAC地址呢?
打開任務欄右下角----找到 「打開網路和共享中心」(如果是XP系統直接查看最後一步) 如下圖
出現的網路和共享中心菜單中,找到「更改適配器設置」如箭頭位置
然後就能看到當前系統的網卡設備了,找到需要查看的網卡設備如「本地連接」選擇「狀態」可以查看網卡詳細信息
本地連接狀態對話框打開之後,點擊下方的「詳細信息」 隨後裡面的描述中找到「物理地址『 就是MAC地址啦
怎麼查看網卡物理地址\win7如何查看網卡MAC地址
打開命令符窗口,進入dos輸入。
點擊「開始」菜單,在「搜索程序和文件」輸入框,輸入「cmd」(會找到進入dos命令的cmd程序),然後回車。
快捷方式「WIN+R」,在輸入cmd。(WIN為鍵盤上和開始鍵一個圖標的按鍵。)
回車後,彈出命令符窗口,輸入「ipconfig/all」,然後進行回車,就會看到一連串的返回信息。
在返回信息中,找到「本地連接」其中的物理地址(Physical Address),見圖片,即為本機的mac地址。
當然也可以通過不同的網路網卡查看比如無線網卡等的mac地址。
查看無線網卡mac地址
如果連接了無線網,無線路由器本身會記錄無線網卡的mac地址,可以通過無線路由器的設置進行查看mac地址。
保證無線網處於連接中,可以從右下角的狀態中看到。
然後打開瀏覽器,輸入「192.168.1.1」(路由器的地址,根據自身路由器有可能有不同)。
進入無線路由器登錄頁面,輸入賬號密碼,正常是「admin」。
進入無線設置地方,找到「ip和mac綁定」裡面有個「APR映射」。
找到本機對應的ip ,其對應的mac地址即為本機mac地址。
如果實在不知道是哪個,就把其他設備的無線暫時斷開即可。
如何查看自己電腦無線網卡的物理地址?
在 開始 運行 里輸入CMD 會彈出一個窗口,輸入ipconfig /all 就可以看到如6C-12-25-7D-88-A5 字樣就是了。
怎樣查看網卡地址
1、單機「開始」菜單,點擊「運行」按鈕,進入DOS界面
2、在DOS界面中輸入:"ipconfig"命令
怎麼查看網卡物理地址\win7如何查看網卡MAC地址
1、在任務欄右下角單擊「網路」圖標,選擇「打開網路和共享中心」選擇「更改適配器設置」,
2、對於有線網卡的MAC地址,請右鍵點擊「本地連接」並選擇「屬性」;而查看無線網卡的MAC地址,請右鍵點擊「無線網路連接」並選擇「屬性」,
3、將滑鼠懸浮在網卡上面就會出現網卡的物理地址。
linux如何查看物理網卡地址
ifconfig 或 netconfig
請問如何查看自己的網卡地址?
開機--運行--cmd--ipconfig/all
怎麼查詢電腦物理地址
怎樣查看電腦的物理地址(用命令查看和網卡查看)
可通過這種辦法確定自己的IP設置的正確性和獲得本機網卡的物理地址(MAC地址),方法如下:
1、打開「開始」-「運行」-在彈出窗口中輸入 'cmd' -「確定」
2、在DOS窗口下輸入 ipconfig/all
顯示如圖,橢圓形區域,也就是Physical Address.......是本機的網卡的物理地址(MAC地址),矩形區域為本機的IP設置信息。
第二種方法:
用滑鼠右鍵點擊「網上鄰居」,選擇「屬性」,會出現下面的窗口。
再雙擊Internet協議(TCP/IP),在出現的對話框中就可以看到本機的IP地址。這種方法也是最常用的一個方法。
查看物理地址,把滑鼠指針放到如下圖所示位置,就會出現網卡物理地址(MAC地址)的對話框。
㈨ linux下怎麼查看程序中變數的實際物理地址
python3
>>object = 1+2
>>print(id(object))
㈩ linux查看物理地址命令
1、 ip -a 、 cat /sys/class/net/ens39/address 其中 HWaddr欄位就是MAC地址,這是最常用的方式.
2、cat /proc/net/arp 查看連接到本機的遠端IP的MAC地址