用戶訪問內核空間地址
㈠ 在用戶態如何訪問內核中的一塊靜態內存
在ring3下是很難訪問物理地址的,當然了,有一些特殊小竅門,但在各個版本的OS上都不通用.
一般來說,在ring3下操作物理地址需要讓你自己的sys提供一個調用介面.
還有一個不太可靠的,辦法,在有些版本OS上可能跑不起來:
去打開\\device\\physicalmemory,直接映射後操作.記得要把虛地址轉化成物理地址.
㈡ linux的內核空間和用戶空間是如何劃分的(以32位系統為例)
通常32位Linux內核地址空間劃分0~3G為用戶空間,3~4G為內核空間。地址分配如下圖所示
直接映射區:線性空間中從3G開始最大896M的區間,為直接內存映射區,該區域的線性地址和物理地址存在線性轉換關系:線性地址=3G+物理地址。
動態內存映射區:該區域由內核函數vmalloc來分配,特點是:線性空間連續,但是對應的物理空間不一定連續。vmalloc分配的線性地址所對應的物理頁可能處於低端內存,也可能處於高端內存。
永久內存映射區:該區域可訪問高端內存。訪問方法是使用alloc_page(_GFP_HIGHMEM)分配高端內存頁或者使用kmap函數將分配到的高端內存映射到該區域。
固定映射區:該區域和4G的頂端只有4k的隔離帶,其每個地址項都服務於特定的用途,如ACPI_BASE等。
㈢ 32位程序在64位系統中的內核空間地址從哪開始
64位的linux採用4級頁表,支持的最大物理內存為64T。
對於虛擬地址空間的劃分,將0x0000,0000,0000,0000 – 0x0000,7fff,ffff,f000這128T地址用於用戶空間;而0xffff,8000,0000,0000以上的128T為系統空間地址。
㈣ 用戶態如何訪問寄存器空間
一般而言,訪問寄存器需要在內核態完成。兩種方式:一種是IO埠,一種是內存映射。如果內核把寄存器空間映射的到了內核地址空間,進而又把內核地址空間映射到了進程地址空間的話,應用程序就可以在用戶態通過訪問自己進程空間的映射來訪問寄存器了。要做到這一點,一般需要驅動程序和內核的配合。
㈤ 為什麼要劃分為用戶空間和內核空間
Linux將4G的地址劃分為用戶空間和內核空間兩部分。在Linux內核的低版本中(2.0.X),通常0-3G為用戶空間,3G-4G為內核空間。這個分界點是可以可以改動的。
正是這個分界點的存在,限制了Linux可用的最大內存為2G.而且要通過重編內核,調整這個分界點才能達到。實際上還可以有更好的方法來解決這個問題。由於內核空間與用戶空間互不重合,所以可以用段機制提供的保護功能來保護內核級代碼。
2.2.X版的內核對此進行了改動。這樣內核空間擴張到了4G。從表面上看內核的基地址變為了0,但實際上,內核通常仍在虛址3G以上。
用戶空間在2.2.X中從直觀上變為0-4G,讓人迷惑,不是可以直接訪問內核了?
其實不然,同過使用頁機制提供的保護,阻止了用戶程序訪問內核空間。
㈥ Linux進程內存管理
對於包含MMU的處理器而言,Linux系統提供了復雜的存儲管理系統,使得進程所能訪問的內存達到4GB。在Linux系統中,進程的4GB內存空間被分為兩個部分——用戶空間與內核空間。用戶空間的地址一般分布為0~3GB(即PAGE_OFFSET,在Ox86中它等於OxC0000000),這樣,剩下的3~4GB為內核空間,用戶進程通常只能訪問用戶空間的虛擬地址,不能訪問內核空間的虛擬地址。用戶進程只有通過系統調用(代表用戶進程在內核態執行)等方式才可以訪問到內核空間。
每個進程的用戶空間都是完全獨立、互不相乾的,用戶進程各自有不同的頁表。而內核空間是由內核負責映射,它並不會跟著進程改變,是固定的。內核空間的虛擬地址到物理地址映射是被所有進程共享的,內核的虛擬空間獨立於其他程序。
Linux中1GB的內核地址空間又被劃分為物理內存映射區、虛擬內存分配區、高端頁面映射區、專用頁面映射區和系統保留映射區這幾個區域。
對於x86系統而言,一般情況下,物理內存映射區最大長度為896MB,系統的物理內存被順序映射在內核空間的這個區域中。當系統物理內存大於896MB時,超過物理內存映射區的那部分內存稱為高端內存(而未超過物理內存映射區的內存通常被稱為常規內存),內核在存取高端內存時必須將它們映射到高端頁面映射區。Linux保留內核空間最頂部FIXADDR_TOP~4GB的區域作為保留區。
當系統物理內存超過4GB時,必須使用CPU的擴展分頁(PAE)模式所提供的64位頁目錄項才能存取到4GB以上的物理內存,這需要CPU的支持。加入了PAE功能的Intel Pentium Pro及以後的CPU允許內存最大可配置到64GB,它們具備36位物理地址空間定址能力。
由此可見,對於32位的x86而言,在3~4GB之間的內核空間中,從低地址到高地址依次為:物理內存映射區→隔離帶→vmalloc虛擬內存分配器區→隔離帶→高端內存映射區→專用頁面映射區→保留區。
㈦ 求教64位Linux的內核和用戶地址空間
我們都知道,32位的Linux中,0x00000000-0xBFFFFFFFFF 這3GB是分配給用戶空間的
0xC00000000-0xFFFFFFFFFF 這1GB是分配給內核空間的。對於64位的Linux,用戶空間和內核空間的分界線在:0xffffffff80000000。前面的(小的)是用戶空間,後面(大的)的是內核空間。
㈧ linux內核空間能正常顯示mac地址,到了用戶空間就顯示有問題
在內核態能夠直接操作的地址一定必須是0xc0000000-0xffffffff之間的,這個范圍之外的地址都會發生缺頁異常,要訪問用戶態的地址空間的話,只能先將用戶地址空間轉換到內核地址空間;
用戶空間地址-》物理地址-》內核空間地址-》操作
比如在內核態要將0x08048100處的賦值10;
先通過0x08048100查頁表得到其物理地址A,
如果A<896M,那麼就
*(0xc000_0000+A)=10;
如果A>896M(高端內存),就需要通過內核動態映射區將物理地址A映射到內核地址空間B,然後*B=10;
B的值在范圍(0xc0000000+896M,0xffffffff)之間;
㈨ 用戶態怎麼訪問嵌入式的地址空間
一般而言,訪問寄存器需要在內核態完成。兩種方式:一種是
IO埠
,一種是
內存映射
。如果內核把寄存器空間映射的到了內核
地址空間
,進而又把內核地址空間映射到了進程地址空間的話,應用程序就可以在
用戶態
通過訪問自己進程空間的映射來訪問寄存器了。要做到這一點,一般需要驅動程序和內核的配合。