NoName Team 電腦資訊討論區

 找回密碼
 我要註冊
搜索
樓主: huhiha

[討論] 關於ramdisk的閒聊——利用記憶體優化運行速度、保護硬盤

[複製鏈接]
發表於 2016-8-8 00:11:33 | 顯示全部樓層
本帖最後由 阿達金田一 於 2016-8-8 01:41 編輯
huhiha 發表於 2016-8-7 18:48
小結:
現在還不能確定能不能查到內存映射的情況。我前面雖然看到了0x94000000-0x940FFFFF這樣的地址,但並 ...

我覺的我前面打的差不多夠詳細了

PAE 就是 x86 可以用 4G 以上...沒什麼好說的...當然以不同的 CPU 或 系統 PAE 可能有差異
這個 維基 都有寫
x86架構只使用該52位中的36位元。對於在長模式(long mode)中的x86-64處理器,PAE是必須的;其中AMD64使用了52位中的40位或48位[1],而Intel64將最多使用46位[2]。

MMIO 也沒什麼好說...前面貼的 連結文章 都有提到
簡單就是把 硬體 I/O 所需的 I/O port 或 memory ... 映射到 記憶體
存取 記憶體 相對應映射位址 時... 等於在對該 硬體 做 I/O

要舉例的話...
假定 PAE 可以使用到 64G ...
win 系統 memory 定址(映射) 就是可以 0 - 64G
但 win x86 系統 實際正常使用(未修改)... 只能用 0 - 4G 定址 的 RAM
假定 ram 有 8G
映射情況如下
系統 memory 定址(映射) 0 - 3.5 G 映射到 RAM 的 0 - 3.5 G
系統 memory 定址(映射) 3.5 - 4 G 被 MMIO 給其它硬體
系統 memory 定址(映射) 4G - 8.5G 映射到 RAM 的 3.5 - 8 G
由於 win x86 只能用 0 - 4G , 但 3.5 - 4G 是 MMIO 不是 RAM
那實際 RAM 就只能用 0 - 3.5 G , 共 3.5G
如果是
系統 memory 定址(映射) 0 - 4 G 映射到 RAM 的 0 - 4 G
系統 memory 定址(映射) 4 - 4.5 G 被 MMIO 給其它硬體
系統 memory 定址(映射) 4.5G - 8.5G 映射到 RAM 的 4 - 8 G
那 RAM 可用的是 0 - 4G , 共 4G

MMIO 並不是直接去佔用 RAM ... 而是去佔用 記憶體 的 定址(映射) ... ( 就是 硬體I/O 當成了 記憶體 來存取 ,  存取記憶體時相當於 硬體I/O )
若不考量 Win x86  ... 4G 定止... 像是用 x64 ... 除非插滿到 PAE 上限 ... 例如
PAE 64G ... RAM 也 64G ... 因為部份 硬體 要 MMIO 所以... RAM 會有一部份不能用... 因為無法定址或映射到
但基本上...這種情況比較少 ...
因為能插到 64G ... 主板 它媽的也大多是用 x86-64 CPU  ...  PAE 最少也可以 40bit
當然 win 比較 GY ... win 系統只用到 37bit (128G) ... (這主要看系統版本...)
至於早期 36bit  PAE 64G ... 是 x86 CPU ... 除了 Server 級主板 ... 一般主板大多只能插到 16G 吧

至於 RAM 插糟 ...
主板設計不良...是可能會有些 ... 有的沒有的小問題
像是...
不排除在 定址(映射) 時... 因為 定址(映射) 順序  不同... 導致不同的 定址(映射) 情況 , 外加 bug 導致沒 定址(映射) 到的可能
又例如 RAM 多通道... 亂插 插槽 可能就沒有了...

任務管理器(工作管理員 ?) 和 資源監視器 顯示是只是大概...狀況
主要顯示的 只是 程式 使用的 記憶體
而這個 程式 並不包含 Driver 和 一些Win核心程式

如果你想要知道 RAM 實際的使用...可以用 M$ 的 rammap 查看一下
https://technet.microsoft.com/en-us/sysinternals/rammap.aspx

另外 工作管理員 "預設顯示的" 只是 資源監視器 中 程式 的 專用 記憶體

至於 顯卡 ... 如果只是桌面...又沒跑繪圖...
除非是 內顯(硬體獨佔部份RAM) 或是 獨顥 但 RAM 大小
不然不會用到 "共用"系統記憶體 ... "共用" 就是指 顯卡 和 系統 都可以用
而 共用系統記憶體 "上限" 大多是看 RAM 大小...
像我 RAM 2G ... 獨顯 nVidia GT610 2G ... 共用才 767M (因為我 RAM 小才 2G)
像 RAM 8G ... 共用 上限大約 3G

另外... 資源監視器
5種情況...你把 滑鼠 移到其上方...等一下會顯示說明

至於 ramdisk ... 放 page file ... 通常都是用 實體記憶體 ( physical memory )

所建立的 RamDisk (應該是 Virtual Disk), 其實並不能拿來放 pagefile. 原因是這個命令是由 System Virtual memory 來配置記憶體, 而這些 virtual memory 本身是可能被 swap out to pagefile 的. 這樣造成衝突, 結果就是當機.

這是指當 ramdisk 用 virtual memory 時
ramdisk 使用的 ram 可能要會丟到 分頁 page file ... 但 page file 又是設到 ramdisk 又要寫入 ramdisk
即 ramdisk -> page file -> ramdisk -> page file  ....
例如
假設 8G RAM ... 一開始沒 page file
建立一個 4G virtual memory 的 ramdisk ... 這個會給一個 virtual address 的 4G 大小的記憶空間
設定 page file 到這個 4G virtual memory 的 ramdisk
注意... RAM 還是 8G...只是使用了 4G ... 假設加上一些有的沒有的 1G ... 就是用了 5G / 8G
然後又假設...現在要玩一個 Game ... 要用到 4G
5G + 4G / 8G ... 這是不夠的...好了...把 5G 中一部份丟到 page file
如果剛好吧 ramdisk 的部份 丟到 page file....
ramdisk 要丟到 page file ... page file 是要寫入 ramdisk  ...
ramdisk ->  page file -> ramdisk  -> page file - > ramdisk ..... 這是要自己吃自己 ?
就算寫入的部份...沒造成循環... 但 page file 也可能損壞
除非能保証 ramdisk 佔用的記憶體 不會丟到 page file

所以一般都是用 實體記憶體 physical memory (先不管是用什麼方式... 是 MMIO 還是其它方式... 主要就是不被 分頁 )
如果你是從這裡看的
http://www.mobile01.com/topicdetail.php?f=300&t=2200352
裡面其實已經有提到 physical memory

註:
virtual memory 是指 系統 使用 virtual address 管理的記憶體 ... 即包含 實體記憶體 和 分頁
可參考 http://systw.net/note/af/sblog/more.php?id=253

發表於 2016-8-8 17:32:38 | 顯示全部樓層
ms x86 非 伺服系統只能吃到 3251mb 記憶體,一般的說法就是 3.25GB

至於 PAE 基本上要用 RAM DISK 一定要開,開了之後可以偵測到超過 3.25GB 以上的記憶體
但是,還是無法使用,至於 內顯他會使用 3.25GB 以內的記憶體,所以根本沒有所謂的定位問題
這各是 OS 本身就已經預訂好的事情

基本上用 RAMDISK 來加速硬碟,那麼你的系統必須要用 WIN 7 以上才行,只有 WIN 7 以上才知援用額外的快速磁碟來加速硬碟
XP 目前沒聽過可以這麼做,或是用某些特定品牌的SSD ,他有用 RAMDISK 加速的能力,可以讓 SSD 速度從 500拉到 1~2GB 得讀寫速度
那 XP 的 RAMDISK 可以做啥,我之前的用法是把系統暫存放到 RAMDISK,包括分頁檔案
系統暫存根分頁檔案放到 RAMDISK 確實可以有效提升系統速度,這是有感的

不過樓主說重灌很麻煩,個人不認為如此,只要用適當的工具,重灌的時間可以縮到半個小時內
如果你有 SSD 那會更快,我SSD 裝機,很少超過 15分鐘的,15分鐘內可以把OS + 系統更新 + 常用軟體全部裝完

HDD 大多會拉到 半小時頂多一小時,看機主打算裝什麼軟體而已,以上個人經驗分享,希望有幫助到樓主
 樓主| 發表於 2016-8-10 15:13:16 | 顯示全部樓層
阿達金田一 發表於 2016-8-8 00:11
我覺的我前面打的差不多夠詳細了

PAE 就是 x86 可以用 4G 以上...沒什麼好說的...當然以不同的 CPU 或 系 ...

非常感謝您耐心的講解。
PAE我也稍微了解了一下,我用我的語言再描述一下吧。我查到的是,PAE的尋址範圍受限于CPU總線(匯流排)的位數。好像從奔騰CPU開始,32位CPU的總線就是36位了,所以我的i3應該也是。對於32位應用程序來說,程序內的指針是32位,因此對於 單個進程,它的 尋址範圍 不會超過4GB。而PAE就是將這4GB 映射到 正確的 真實物理地址 中去。

那麼,驅動會映射到什麼地方呢?目前有兩個事實:
1.有一部分物理內存被分配給驅動。這就是“資源監視器”中的“為硬件保留的內存”。用RAMMAP也可以查到,在Physical Pages一頁的Use那一欄,顯示為“Driver Locked”。
這部分內存其實是在 系統可識別範圍 之外的。雖然我的“為硬件保留的內存”只有75MB,不明顯,但有看到網上有人說,他的“為硬件保留的內存”有1GB(好像是給了顯卡),影響到了系統可識別內存。
2.網上有很多說,32位系統使用未識別內存分配給ramdisk時,與硬件衝突(體現為藍屏、花屏、或硬件無法正常使用等)。

好吧,這兩條其實是一個意思,就是驅動佔用的是系統未識別內存。(當然,個別顯卡可以使這部分內存顯示為已佔用內存)。

從目前搜集到的情報來看,關於ramdisk的使用,基本上可以得出以下的結論:
1.不管是32位還是64位系統,如果ramdisk軟件支持系統未識別內存,而又不能自動檢測硬件內存的話,這樣使用ramdisk一定會發生問題。(64位系統應該也是有未識別內存,就是給硬件保留的那部分,一般100MB左右吧。如果我講得不對,請指正)
2.如果是32位系統,使用未識別內存作ramdisk的時候,只要避開了所有顯示為“Driver Locked”的內存,就可以正常使用。(從目前搜集到的情報來看,剩下的其他內存就真正是沒人在用了。)


至於硬件驅動的內存映射,現在只知道哪些 物理內存地址 被分配給了硬件,但不知道是具體分給哪個硬件(RAMMAP里看不出來)。而我之前在 系統信息(即%windir%\system32\msinfo32.exe) 里看到的地址,應該是驅動程序 進程內 的地址。然而驅動程序的進程怎樣查看呢?好像可以用windbg。
https://developer.microsoft.com/ ... /windows-driver-kit
在上面這個頁面中的“Get Debugging Tools for Windows (WinDbg) (from the SDK)”是下載鏈接,附近是安裝方法。
但是我安裝時它要求我有win7 SP1,於是我去安裝SP1補丁,但是很奇怪的沒有安裝成功。
這是查看驅動程序的方法:
http://bbs.csdn.net/topics/390273756?page=1
附帶windbg使用方法:
http://www.yiiyee.cn/Blog/windbg/

我想,至此應該已經可以說明,ramdisk軟件技術上是可以避免內存衝突的了。


關於那個pagefile的問題,我弄錯了,我當時想的是,如果用32位系統,吧ramdisk設在未識別內存,然後裡面放上pagefile,這樣就剛好能利用上所有內存。即便已識別內存不夠用了,系統把它轉移到未識別內存中,也是比硬盤讀寫pagefile的效率要高得多的。

之所以會遇到文中說的“不能拿來放 pagefile”的問題,應該算是 個別ramdisk軟件 的 個別命令 的問題。不太清楚imdisk的virtual disk,不多評價。但就primo ramdisk來說,從網上搜集到的情況來看,是可以把pagefile放進去的。而且,ramdisk在內存不足的情況下,能保持在物理內存中,不被轉移到pagefile中。(雖然暫時不清楚什麼原理)
 樓主| 發表於 2016-8-10 15:20:24 | 顯示全部樓層
JonesLee 發表於 2016-8-8 17:32
ms x86 非 伺服系統只能吃到 3251mb 記憶體,一般的說法就是 3.25GB

至於 PAE 基本上要用 RAM DISK 一定要 ...

其實是因為缺乏裝機經驗啦,又要備份,又要格式化,一大堆事情。只要能夠把硬件內存地址搞清楚,能夠安心用ramdisk,那我暫且還是繼續用這個32位系統。我都不需要破解 讓系统識別4GB或以上的內存,我只要把pagefile放在未識別內存里,就相當於利用了這部分內存了。
發表於 2016-8-10 21:44:42 | 顯示全部樓層
本帖最後由 阿達金田一 於 2016-8-10 21:49 編輯
huhiha 發表於 2016-8-10 15:13
非常感謝您耐心的講解。
PAE我也稍微了解了一下,我用我的語言再描述一下吧。我查到的是,PAE的尋址範圍 ...

感覺你 Driver Locked 搞錯了 ... 這個應該單純只是 RAM 中 驅動程式 使用了
應該不是 MMIO 也不是 硬體保留

像我的 硬體保留 就只有 1M
Driver Locked 是 2724K

所以 RAMDISK PAE 是要避開 MMIO ... 不是 Driver Locked
 樓主| 發表於 2016-8-11 22:35:38 | 顯示全部樓層
阿達金田一 發表於 2016-8-10 21:44
感覺你 Driver Locked 搞錯了 ... 這個應該單純只是 RAM 中 驅動程式 使用了
應該不是 MMIO 也不是 硬體保 ...

對的,我弄錯了。Driver Locked是已識別的內存,而且rammap當中顯示Driver Locked全部是Activate(即已佔用內存)。
我嘗試分配一個200MB的ramdisk,看到Driver Locked就增加了200MB。所以ramdisk實際上用的就是Driver Locked這部分。再結合“Driver Locked”這個名字,就能理解,為什麼ramdisk軟件在內存不夠用的情況下,不被轉移到pagefile中了(仍然有待考證)。
既然Driver Locked是已佔用內存,那麼就是已識別內存。那么,在使用未識別內存作ramdisk的時候,當然就不會衝突到啊。

至於在“資源監視器”中的“硬體保留”,暫時也不知道是什麼。

再回到一開始的問題。如果說32位系統只能識別3.2GB左右的ram,是因為MMIO佔據了3.2GB-4GB這一段的地址。那麼,只要是經過MMIO機制,任何程序也都訪問不到這部分物理內存。所以說,跟ramdisk起衝突的驅動也好、其他品牌的ramdisk也好,一定也是繞過了MMIO這個機制的。
MMIO是怎麼回事,暫時還不清楚。但是用windbg應該是可行的。最後就剩這條路了。
發表於 2016-8-11 23:41:17 | 顯示全部樓層
本帖最後由 阿達金田一 於 2016-8-11 23:59 編輯
huhiha 發表於 2016-8-11 22:35
對的,我弄錯了。Driver Locked是已識別的內存,而且rammap當中顯示Driver Locked全部是Activate(即已佔 ...

並不是訪問不到 MMIO
都說了...MMIO 就是用 記憶體 的 定(位)址
也就是 Physical Memory Address

而 Win 整體管理上 是用 Viatual Memory Address
如果 程式 是直接存取 Physical Memory Address ... 就會影 MMIO
這也是用 RAMDISK 可能會出問題的原因...
但個人覺的 Legacy Bios 開機...遇到機率應該不大... UEFI 就不清楚了...這和 MMIO 用的 Physical Address 有關

而一般程式...透過 Win 存取 記憶體 是用 Viatual Memory Address
而 Viatual Memory 就是 Win 中 可用的 Ram 和 分頁 ... 所以當然不包含 MMIO

硬體保留 基本上大多 MMIO ...
像我的 硬體保留 只有 1M (應該是不到)

Legacy Bios 開機...
基本上 640K - 1024K 的 384K 會 MMIO ( 0xA0000 - 0xFFFFF )
這是 x86 架構 Legacy Bios 開機時的問題
http://billor.chsh.chc.edu.tw/computer/Hard1/memdoc.htm
在 RAMMAP 中 ... 看不到 0xA0000 - 0xFFFFF

UEFI 開機則不太清楚 , MMIO 的情況... 推測可能和 Legacy Bios 不一樣

由於我是理論派...沒硬體測試環境... 本身又只有  Legacy Bios + 2G RAM 也沒 MMIO 問題
所以 4G RAM , MMIO , RAMDISK ... 等...以下說一下推測可能的情況

以下 Physical Address 簡稱 PA

通常 RAM 都會從 PA 0x0000 開始 ...
2G ... 0x0000 - 0x7FFF FFFF
4G ... 0x0000 - 0xFFFF FFFF
8G ... 0x0000 - 0x0001 FFFF FFFF

簡單說...你把 RAM 也看成 硬體 (其實 RAM 本身就是硬體之一)
然後...部份硬體會做 MMIO ...
簡單說就是 RAM 顯卡 音卡 等(通常這些會 MMIO)... 會去分配 PA
而依照 主機板 ... 分配的情況可能不通
而其中.... PA 中...為 RAM 使用的... Win 才會拿來做 RAM 使用

例如 ... Leagcy Bios 開機 , RAM 4G

情況1. 沒有 Memroy ReMap
RAM ... PA 0x0000 - 0xFFFF FFFF
384K ... PA 0x000A 0000 - 0x000F FFFF
顯卡 ... PA 0xE600 0000 - 0xE7FF FFFF , 0xE800 0000 - 0xEFFF FFFF , 0xFD00 0000 - 0xFDFF FFFF
假設 除了 RAM 其它的 硬體都 MMIO 到 0xE600 0000 - 0xFFFF FFFF 之間
因為 RAM 和 MMIO 重覆/衝突...
Win 會把 MMIO 的部份...不會拿來做 RAM 用
那 RAM 大概就只有 3680M 可用

情況2. 有 Memory ReMap
RAM ... PA 0x0000 - 0x7FFF FFFF , 0x0001 0000 0000 - 0x0001 7FFF FFFF
384K ... PA 0x000A 0000 - 0x000F FFFF
顯卡 ... PA 0xE600 0000 - 0xE7FF FFFF , 0xE800 0000 - 0xEFFF FFFF , 0xFD00 0000 - 0xFDFF FFFF
假設 除了 RAM 其它的 硬體都 MMIO 到 0xE600 0000 - 0xFFFF FFFF 之間
正常 4G RAM 應該是 ... PA 0x0000 - 0xFFFF FFFF
但若有 ReMap 可能就會重新把部份 RAM 的 PA 重新定址
如此例...是把 RAM 後 2G 定義到 PA 4G 後
也就是
PA 0 - 2G ... 是 RAM 0 - 2G
PA 2 - 4G ... 留給 MMIO
PA 4 - 6G ... 是 RAM 2 - 4G

因此 RAM 4G 除了 384K 外... 都可以用
(當然還要扣一小部份 Win系統自行保留了...例如 PA 0x0000 - 0x1000 )
這個可以看一下 RAMMP 的 Physical Ranges



其實正常來說 ... Win x86
只要 MMIO 沒用到 4G 後(通常 MMIO 也是 4G 前) , RAMDISK 是用 PAE 4G 後...2 者是不會有衝突問題
RAMDISK PAE 就是用 PAE ... 直接存取 4G 後的 PA ...

所以其實不用想太多... 除了你用 UEFI ... MMIO 有部份不在前 4G

但是就像我說的....基本上 MMIO 的位址應該都查的到...所以頂多是 RAMDISK 寫的好不好而以

另外依 RAMDISK 的方法來分
1. 用 Physical Memory (Address) ... 記憶體 佔用 實體 的 記憶體 (RAM) ...  所以不會 被分頁(page file)
2. 用 Virtual Memory ... 就是向 Win 要記憶體來做 RAMDISK ... 有可能會 被分頁掉 ... 可能會照成問題 ... 所以最好別放 分頁

 樓主| 發表於 2016-8-12 21:13:49 | 顯示全部樓層
阿達金田一 發表於 2016-8-11 23:41
並不是訪問不到 MMIO
都說了...MMIO 就是用 記憶體 的 定(位)址
也就是 Physical Memory Address

網上關於mmio的資料好像比較少啊,講得都比較模糊。可能是因為它不能被打開/關閉?像關於mmio的歷史(從什麼時候開始有這個技術),都沒找到。
還是有一些不懂的地方。比方說,一個進程先經過PAE(這個我是確定的),之後要不要經過mmio?應該是要的。那麼我暫時理解為:PAE->mmio->PA(物理內存地址)。

還有,mmio是通過什麼實現的?主板嗎?網上資料也有說,mmio使得cpu能像訪問內存一樣訪問一般io,使得操作io的命令變得簡單。但是,明明有的驅動和ramdisk軟件能夠訪問 被佔用其內存地址(before mmio)的那部分物理內存。這是怎麼做到的呢?難道說又有一種什麼映射,使得cpu可以像訪問xxx一樣訪問內存(是不是DMA(Direct Memory Access)啊?(我瞎猜的,剛好看到,還沒確認))?或者說,在這些軟件訪問系統未識別內存的時候,臨時 修改 或 關閉 了mmio?


最後關於ramdisk的問題。會不會被分頁,你說的兩種方式,我這邊沒有碰到。對於我32位系統,我主要關心的是 (1.分配系統已識別內存) 和 (2.分配未識別內存) 這兩種情況,不太清楚你說的Physical 和 Virtual 這兩種情況。你說Virtual 就是“向 Win 要記憶體”,那麼請問,我那200MB的“Driver Locked”部分是不是“向 Win 要的記憶體”?從各方面的信息來看,我都認為這種內存是 不會 被寫入分頁文件的,因此應該是對應了你所說的“1. 用 Physical Memory (Address) ”這個情況。但是我同時注意到了這一個情況,就是,這部分內存是佔用Task Manager中的“已佔用”內存的。那麼是不是應該說,也是“向 Win 要的記憶體”呢?

我們在rammap中看得到的各種信息,從各種Usage(包括左邊那一列的Process Private、Page Table、Driver Locked等)到各種List(上面那一行的Active、Standby、Free、Bad等),都應該算作是windows系統控制之下的吧?
發表於 2016-8-13 07:49:14 | 顯示全部樓層
本帖最後由 阿達金田一 於 2016-8-13 10:30 編輯
huhiha 發表於 2016-8-12 21:13
網上關於mmio的資料好像比較少啊,講得都比較模糊。可能是因為它不能被打開/關閉?像關於mmio的歷史(從 ...

覺的你把問題複雜化...而且還搞混了
維基 MMIO

有些太深入的細節其實不用懂... 只要知道 MMIO 大概作用
例如 ... ( 下面打很長... 或者你可以先看最後... 在回頭來看 )

1. MMIO 就只是 硬體IO 的一方式...
MMIO 只是利用 Physical Memory Address (PMA) 來做 IO 而以 所以當存取 PMA 時...就是做 硬體IO
即然只是 IO 的一種方式... 可想而知...很早就有 MMIO 了
至少 Dos 時... 1M 傳統記憶體中 640K 主記憶體 給程式用
384K 是給硬體用的...而這應該就是 MMIO
https://www.equestionanswers.com ... getvect-setvect.php

所以大概 有 8086 和 Dos 時...就有 MMIO... 所以 MMIO 的歷史大多沒人提




2. 可能是因為現在都用 Win ... 所以你對 Win 和 整體 的 記憶體管理  .... 概念可能有點不清楚或是混亂
早期用 Dos ... 記憶體 就是直接用... 沒什麼 虛擬 或 分頁
可以試想一下... Bios 開機...就是直接用 記憶體 ... 在進入 OS(Win) 前就都算是 Bios 真實模式 (直接使用 Bios)
只是進入 OS 後... 使用者用的是 OS ... OS 在去用 Bios
也就是 進入 OS 前 ... 使用者(程式) -> Bios
也就是 進入 OS 後 ... 使用者(程式) -> OS -> Bios

所以...對 Win 要求 配置記憶體 時 ... (這和寫程式有關...如果你對這部份不瞭解... 就Pass 不用太深入)

如果一般是用 Win 自本身的 記憶體管理 去處理...
由於 Win 的 記憶體管理 是用 Virtual Memory Address(VMA) 或簡稱 Virtual Address(VA) + 分頁(PF) ...  來管理
如果要直觀一點就叫 "Win記憶體" ( VA + PF )
所以使用 Win記憶體 時 資料 未必 是存在 VA ... 也可能是在 PageFile (PF)

反之... 就是不透過 Win記憶體 來管理 記憶體 ... 而是 程式 自行管理 或 直接存取 PA
或者
Win 記憶體管理 本身應該也支援 配置 Physical Memroy 來用的方式... ( 就是 程式 在和 Win 要 記憶體 時...限定 VA 直接使用 Physical Memroy )
這是程式比較深入的部份...我也不是很懂... 因為一般寫程式是不用做 記憶體管理 都丟給 Win 來處理
https://msdn.microsoft.com/zh-tw/library/windows/desktop/aa366781(v=vs.85).aspx




3. Physical Memory Address 簡稱 Physical Address ... 就是 Physical Memory 實體(真實 or 物理)記憶體 的 位址空間
簡單說...就是 Physical Memory 的定址
x86 的 PA ... 因為 32bit ...所以只到 4G
而 PAE ... Physical Address Extension 就是 PA 的擴展版本 ... PAE 資料我就不在貼一次了 ... (所以 PAE 就當成 PA 吧)
簡單說 一般 x86 PA 是 32bit ... PAE 就是 大於 32bit 的 PA  ...(但它還是 PA...只是 bit 比較長)




4. 在 x86 架構中...可能考量到 整體情況...
例如
不能保證  CPU 有 PAE 功能
OS 或 Driver 也用 PAE
x86 Leagcy Bios 開機也未必會去用到 PAE
...等等
因此 MMIO 大多也是用 32bit PA 來做 MMIO ... 通常 MMIO 是在 PA 3G - 4G 之間
MMIO 怎麼要 PA ..這其實不用懂...(有資料也未必看的懂...其實前面貼 維基MMIO 就有簡單的說明)
每個IO設備監測CPU的地址匯流排,並且在發現CPU訪問被分配到本設備的地址區域的時候做出響應,建立數據匯流排和相應設備暫存器之間的連接。為了實現CPU對MMIO設備的訪問,相應的地址空間必須給這些設備保留, 並且不能再分配給系統物理內存。這可以是永久保留,也可以是暫時性的保留。通常來說X86架構都是永久保留的,而在Commodore 64中,由於採用了IO設備和普通內存之間的堆交換技術(bank switching),可以做到暫時性保留。



5. PA(PAE) 和 VA
PA/PAE 可以看成 硬體(CPU) 的 定址 方式 ... 就是給硬體用
VA 則是 Win 本身 記憶體 管理方式 的 定址  ... 就是系統自己用
PAE 大小看 CPU , VA 大小看系統
PA <-> VA 之間有 位址 的 映射 ... 不過 PA 不一定會映射到 VA  ... 也可能是 MMIO 用... 或是其它情況

PA/PAE 資料貼過就不貼

VA ...  Win x86 大多是 4G , Win 7 後的 x64 大多是 128G ... ( Win7 之前的 x64 好像大多是 64G )
其它版本要上網查才知道 ... 例如
https://support.microsoft.com/zh-tw/kb/2160852

如果有看懂...就可以猜出... VA 其實就是 Win x86  為啥只能用 4G 的原因... 就是因為 VA 的限制
同理... 如果 PAE 可以用 1024G (40bit) ... 插了 RAM 512G ...
就算用 win7 x64... Win7 的 VA 也只到 128G ... 128G 後面也會和 x86 4G 情況一樣 ... Win記憶體管理 不會去用
但不是不能用...透過 PAE 應該還是可以用 ... 就像 x86 用 PAE 一樣可以用 4G 後

簡單說 PAE 看 CPU PAE bit
VA 看 Win 的 版本 ...




6. DMA 維基
這的確和 MMIO 有關 ... ( 英文版的 維基 MMIO 有提到 DMA )
DMA 只是一種硬體技術...照維基的說明...簡單說就是
可以獨立地直接讀寫系統記憶體,而不需中央處理器(CPU)介入處理

所以如果用 DMA 做 MMIO 的存取... 就比較不會增加 CPU 的負擔...




7. 這個我看不懂你要表達的意思
一個進程先經過PAE(這個我是確定的),之後要不要經過mmio?應該是要的。那麼我暫時理解為:PAE->mmio->A(物理內存地址)。

Win程式 用的 記憶體 要嘛就丟給 Win記憶體管理 來管理 ( VA )
要嘛向 Win記憶體管理 要 Physical Memory  來用 ...
要嘛...不透過 Win記憶體管理 ... 直接存取 PA
所以... Win程式 要看怎麼寫

注意 Physical Memory 是用 PA ... 但在 Win記憶體管理 是用 VA ...只是 VA 會映射到 PA  ... Win VA > Physical Memory Address

以下 WinAPI 的部份 是個人推測

A. 一般的程式 ... 和 Win 要 VA 來用
程式 -> Win 記憶體(WinAPI) -> VA - > PA/PAE 或 PF
程式 用的是 VA ... 無法控制用的 PA/PAE

B. 和 Win 要 記憶體時...限定 VA 用 Physcial Memory
程式 -> Win 記憶體(WinAPI) -> VA -> PA/PAE

C. 直接存取 PA/PAE
程式 -> WinAPI(直接存取PA/PAE API) -> PA/PAE

其中... A 和 B ... 基本上是透過 Win 的 記憶體管理 ... 所以不會去用到 MMIO
C 的話...因為不是透過 Win 記憶體管理 ... 就有可能存取到 MMIO




8. Driver 最終還是用 硬體 IO ... IO Port 和 MMIO
IO Port 和 MMIO 只是一種方式 ... Driver 是這個方式的 運作流程(方法)

Driver 和 Ramdisk 也一樣 程式
所以記憶體使用...一樣要看程式怎麼寫
例如 你查到的
1.ramdisk4g。网友gavotte开发的Ramdisk,是从微软的Ramdisk改写的,完全免费。但是由於我看過這篇文章:
终于知道ramdisk 4g是如何使用4G以上内存了,慎用!-远景论坛-微软极客社区
http://bbs.pcbeta.com/viewthread-413990-1-1.html
所以它不安全。
據該文章,randisk4g的原理是ddk api: MmMapIoSpace。

是用 MMIO 來達成的...  但不能保證每一個 Ramdisk 程式都用一樣的方法
另外...用 MMIO 來達成...也要看 Ramdisk 使用 MMIO 時...用的 PA 範圍... 如果和別的 硬體 MMIO 有 重覆 或是 該位址無用... 可能就會造成問題
該文章寫的還滿清楚的
好吧,那么如果ramdisk强行去读写错误的地址空间会如何呢? 简单地说: cpu不会报错, 但是结果是不可预料的, 比如如果这段地址空间根本是一个memory hole,那么往里面写东西就是白写,读操作返回的有可能都是0xFFFFFFFF, 这样地话,作为一个虚拟磁盘而言,其结果就是数据损坏.

更为严重的是:如果有一块特殊的硬件的io空间映射在4g以上的一段地址,而ramdisk强行去写入数据,就会直接对那块硬件进行io操作,有可能会损坏硬件或者发生更奇怪的事情,比如该设备莫名其妙开始工作了等等.

不過...我個人覺的...Driver 未必不能查知...其它 MMIO 或 PA 的情況
不然 裝置管理員 或 msinfo32(MMIO)  和 RAMMAP(RAM PA) 是假的嗎
第一: 作为驱动程序,你是无法确切地知道究竟哪段物理地址空间里面是映射的你的多余的内存,目前的bios架构中,只有通过中断int 25, function 0xE820才能获知, 而这个bios中断只能在实模式下调用,也就是说windows启动之后,驱动程序是无法调用这个中断去获知的. 那么,ramdisk驱动就只能靠猜, 比如说他可以知道你装了4gb内存,而目前只认了3.5gb, 那么多出来的512m应该在4g-4.5g这个物理地址段.

當然我不會寫 Driver ... 也許 Driver 編寫時...有所限制也有可能




9.
最後關於ramdisk的問題。會不會被分頁,你說的兩種方式,我這邊沒有碰到。對於我32位系統,我主要關心的是 (1.分配系統已識別內存) 和 (2.分配未識別內存) 這兩種情況,不太清楚你說的Physical 和 Virtual 這兩種情況。你說Virtual 就是“向 Win 要記憶體”,那麼請問,我那200MB的“Driver Locked”部分是不是“向 Win 要的記憶體”?從各方面的信息來看,我都認為這種內存是 不會 被寫入分頁文件的,因此應該是對應了你所說的“1. 用 Physical Memory (Address) ”這個情況。但是我同時注意到了這一個情況,就是,這部分內存是佔用Task Manager中的“已佔用”內存的。那麼是不是應該說,也是“向 Win 要的記憶體”呢?

我們在rammap中看得到的各種信息,從各種Usage(包括左邊那一列的Process Private、Page Table、Driver Locked等)到各種List(上面那一行的Active、Standby、Free、Bad等),都應該算作是windows系統控制之下的吧?

一般來說 RAMDISK 都用 RAM PA ...
只差在用什麼方法去使用 RAM PA ... (是用 VA 中的 RAM PA 還是 非VA 的部份 ... 這個後面會補充)

而你說的 1.分配系統已識別內存 和 2.分配未識別內存 ...
我個人覺的你要表達的其實是 VA 和 非 VA 部份
也就是假定
CPU PAE 64G (36bit) , RAM 8G , Win x86 ... VA 4G
實際上 Win ... PA 最多還是可以用到 64G ... 只是被 VA 限制了
所以你覺的 1.分配系統已識別內存 ... 是 4G ... 這其實是 VA

也就是 PA(PAE) > VA , 且 RAM > VA
VA 只會使用 RAM PA 中的一部份...所以你會覺的是 1.分配系統已識別內存 和 2.分配未識別內存
VA/PA ... 4G/64G ... 非VA ... 58G/64G
VA/RAM ... 4G/8G ... 非VA ... 4G/8G
實際上 RAM 系統還是有識別到 8G ... 只是 Win 有沒有拿來用而以...有沒有配置 到 VA ... 而不是 4G 未識別

而 x64 只是 VA 比較大 ... 例如 Win7 VA 到 128G
那情況就變成
VA/PA 128G/64G ... 非 VA 0G
VA/RAM 128G/8G ... 非 VA 0G
所以會感覺 沒有 未識別

而 x86 RAMDISK PAE
只是把 非VA 部份... 也就是 Win 沒用到的 RAM ... 拿來用而以

至於向 Win 要 記憶體 ... 我前面說了可以 VA 也可以 PA (RAM PA) ...
或者可以說...2者都是 VA ...只是 VA 限定使用 RAM PA ... 這裡或者說成 Physical Memory 比較好解理

其中要注意的是
向 Win 要 記憶體 ... 就算指定用 Physical Memory ... 用的應該是也 VA 中的 Physical Memory
也就是
VA/RAM ... 4G/8G ... 非VA 4G/8G  ...
如果是向 Win 要PA 記憶體(RAM PA) ...用的也是 前面 VA 4G 的部份... 而不是 非VA 4G 的部份

所以如果用 非VA 部份...一般是直接存取 PA (RAM PA)

VA , RAM , PA(PAE) 的關係 ... ( 以下 G 大小以上面假設為例 )
VA  -> RAM -> PA/PAE

VA ... 使用 RAM (VA 4G/8G) 或 Page File (PF)
RAM ... 使用 PA/PAE 來定址 8G
PA/PAE... CPU 最大定址 64G
非VA RAM ... Win VA 沒用的 RAM (非VA 4G/8G)


Driver 因為一直都要用... 一般應該都是用 Physical Memory (RAM) ... 所以應該不會被 分頁
也許 Win 記憶體 管理上 當載入 Driver 時... 配置的都是 Physical Memory

不過 這也只是指 Driver 程式本身 ... 程式調用的 記憶體 另外算 ... 這部份就看程式怎麼寫
就像 一般程式... 程式本身 也是要放到記憶體... 但 程式 會去調用記憶體
例如
ramdisk 可能才 幾百K 或 幾M ... ramdisk 程式本身 ... 如果是 Driver 方式載入... 可能 ramdisk 程式本身 的 幾M 會放到 Physical Memory
但 ramdisk程式 調用來做 ramdisk ... 的 記憶體...就看使用的方法...未必會是 Physical Memory
但是...通常 Ramdisk 都是用 Physical Memory ...
而用 Physical Memory 時...看方式是調用 VA 中的 Physical Memory ... 或是
直接存取 PA (RAM PA) ... 即可以使用 非VA 的部份




最後以上只是個人的依資料的推測判斷...另外文章打太長也可能有些 筆誤 或 詞不達意 (前後修改了好幾次)

說一堆...覺的你可能只會越搞越混... 來點實際的可能你反而好理解
例如... 你的 筆電 RAM 2G ... 想插到 6G

先假設你 CPU 有 PAE ... 那情況就是
PAE ... 最小 64G ( PA 36bit )
RAM ... 6G
Win x86 ... VA 4G

A. 在 MMIO 和 RAM 衝突...沒用 ReMap 情況下
RAM PA ...  PA 0 - 6G
VA PA ... PA 0 - 4G
MMIO PA ... PA 3.5G - 4G

那情況就是
VA ... 只能用 PA 0 - 3.5G ... 3.5G (RAM)
MMIO ... 用了 PA 3.5G - 4G  ... 0.5G (RAM 但被 MMIO 佔用)
非VA ... PA 4G - 6G ... 2G (RAM)

若用 RAMDISK PAE ... 用 非VA 的話...可以開 2G RAMDISK ... PA 4G - 6G
所以...沒 ReMap ...  RAM  會浪費掉 0.5 G 被 MMIO 佔用

若 RAMDISK 是向 Win 要 記憶體 , 並限定要 Physical Memroy ...
那用的是 VA 中的 Physical Memroy ... 也就是 VA 3.5G 的部份... 而非 非VA ... PA 4G - 6G 的 2G

B. 在 MMIO 和 RAM 衝突...用 ReMap 情況下
RAM PA ...  ReMap ... PA 0 - 2G , PA 4G - 8G
VA PA ... PA 0 - 4G
MMIO PA ... PA 3.5G - 4G

那情況就是
VA ... 只能用 PA 0 - 2G ... 2G (RAM)
MMIO ... 用了 PA 3.5G - 4G ... 0.5G (MMIO)
非VA ... PA 4G - 8G ... 4G (RAM)

Win(VA) 只有 2G 可用

若用 RAMDISK PAE ... 用 非VA 的部份話...可以開 4G RAMDISK ... PA 4G - 8G
因為 ReMap ... 所以 RAM  不會 被 MMIO 佔用  0.5 G... (因為佔用的 PA  ... ReMap 錯開了)

若 RAMDISK 是向 Win 要 記憶體 , 並限定要 Physical Memroy ...
那用的是 VA 中的 Physical Memroy ... 也就是 VA 2G 的部份... 而非 非VA ... PA 4G - 8G 的 4G


所以基本上...除非你遇到 硬體 比較 怪異... MMIO 在 PA 4G 以後...
然後 RAMDISK 又沒避開 MMIO 的部份... 才會造成問題
不然 RAMDISK 請安心使用...

至於 Win x64 要用 RAMDISK
因為通常沒用 非VA 的部份 ... 因為 VA 最大 128G
無 ReMap
RAM PA ...  PA 0 - 6G
VA PA ... PA 0 - 6G ...
MMIO PA ... PA 3.5G - 4G

Ram 可用 5.5G .... 沒有 非VA

有 ReMap
RAM PA ...  ReMap ... PA 0 - 2G , PA 4G - 8G
VA PA ... PA 0 - 2G , PA 4G - 8G
MMIO PA ... PA 3.5G - 4G

Ram 可用 6G .... 沒有 非VA

所以在 x64 上...用 VA 限定 Physical Memory 方式的 RAMDISK 就可以
要用 非VA RAMDISK ... 也沒有 非VA 的可用...

補個 PA 示意圖

上圖的 VA & RAM ... 還要減去 MMIO ... Win 記憶體管理 不會去用 MMIO 的部份

RAMDISK 若是 透過 Win記憶體管理...是用 VA 部份 ...
反之 若是直接存取 PA(PAE)... 可以去用 非VA 部份( 其實應該說...整個PA 都可以...包含VA部份 )
直接存取 PA ... 除非保證 PA 位址是 RAM ... 而且 沒有其它用途 (簡單說就是 非VA + RAM 部份...而且沒在用...)
否則可能會造成問題
不過前面也說了...除非  硬體 比較 怪異... MMIO 在 PA 4G 以後... 不然通常沒問題
因為 若是有 非VA ... RAMDISK 可以用 直接存取PA(PAE)  去用 ... 非VA 部份
若沒有 非VA (即 VA 夠大...包含所有 RAM 的部份) ...
則 RAMDISK 只要能向 Win記憶體管理 要求 配置固定使用 Physical Memory ... 而不會被分頁... 就好了
因為 Win記憶體管理 本身就不會去用 MMIO 的部份

簡單說就是 RAMDISK 可以用什麼方式 或 可以怎麼設定
x86 中... VA < RAM ... 可以用 RAMDISK PAE (直接存取 PA/PAE) ... 使用 非VA (Win 未管理) 部份 的 RAM 來建立 RAMDISK
x64 中... VA > RAM ... 用一般的 RAMDISK 方式就好 ... (通常應該是 向Win 要求 配置固定使用 Physical Memory ... 而不會被分頁)
如果向 Win 要求 記憶體時 不是 配置固定的 Physical Memory ... 也就是可能會 被分頁 ... 就不適合放 Page File

總結一句話...全看 RAMDISK 怎麼搞 RAM 而以...

本帖子中包含更多資源

您需要 登錄 才可以下載或查看,沒有帳號?我要註冊

x
 樓主| 發表於 2016-8-14 11:28:07 | 顯示全部樓層
大大每次都回那麼多,我都不好意思了
您需要登錄後才可以回帖 登錄 | 我要註冊

本版積分規則

小黑屋|手機版|NoName Team 電腦資訊討論區 |網站地圖

GMT+8, 2025-8-19 02:38 , Processed in 0.096804 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回復 返回頂部 返回列表