Windows不能刪的原因是:Windows把每一個可執行檔案都對映成一段虛擬記憶體(類似pagefile),沒執行到的部分可能並不實際在記憶體裡存在,因此要對可執行檔案加鎖,否則,出了pagefault以後就找不到實際對應的檔案了,因此Windows不讓刪除。
如果有能力控制核心裡的那個鎖,刪掉一個開啟的可執行檔案完全沒問題,很多工具(比如360)都能刪。
注:Linux也有類似機制,但Linux檔案系統跟cache管理基本上是分離的,Windows檔案系統和cache管理綁的太緊,Windows檔案系統和核心都沒有提供一種機制能把開啟(對映)的檔案與cache管理剝離(清空SECTION_OBJECT_POINTERS的DataSectionObject、 ImageSectionObject兩個指標)。
如果一個可執行檔案沒透過Windows檔案系統驅動載入,那麼就沒有鎖的問題,就可以刪,比如Windows的核心映象:NTOSKRNL.EXE,是透過bootloader之類的載入器載入的,雖然也實際在記憶體裡,但可以刪,刪掉以後系統再啟動就起不來了。
Windows不能刪的原因是:Windows把每一個可執行檔案都對映成一段虛擬記憶體(類似pagefile),沒執行到的部分可能並不實際在記憶體裡存在,因此要對可執行檔案加鎖,否則,出了pagefault以後就找不到實際對應的檔案了,因此Windows不讓刪除。
如果有能力控制核心裡的那個鎖,刪掉一個開啟的可執行檔案完全沒問題,很多工具(比如360)都能刪。
注:Linux也有類似機制,但Linux檔案系統跟cache管理基本上是分離的,Windows檔案系統和cache管理綁的太緊,Windows檔案系統和核心都沒有提供一種機制能把開啟(對映)的檔案與cache管理剝離(清空SECTION_OBJECT_POINTERS的DataSectionObject、 ImageSectionObject兩個指標)。
如果一個可執行檔案沒透過Windows檔案系統驅動載入,那麼就沒有鎖的問題,就可以刪,比如Windows的核心映象:NTOSKRNL.EXE,是透過bootloader之類的載入器載入的,雖然也實際在記憶體裡,但可以刪,刪掉以後系統再啟動就起不來了。