先看效果:
變成這樣只能重啟嘍!
請看實現語句:
taskkill /f /fi "pid ne 1"
沒錯,就是它,接下來讓你實現它:
首先按快捷鍵Win+r,輸入cmd打開控制臺
然后輸入taskkill /f /fi "pid ne 1"回車就好了
接著就等藍屏吧!
或者新建一文本文檔,將taskkill /f /fi "pid ne 1"復制進去保存,然后將后綴.txt改為.bat,運行它也可以
注:此應用不會對電腦造成危害,重啟一下就可以了。(taskkill是用來終止進程的,此語句只是終止了一個系統進程)
01
事件回顧
2024年7月19日,全球的Windows設備,爆發了大面積的藍屏現象!
除了大家喜提半天的額外假日外,這場藍屏事件的波及之廣,爆發之迅速,在計算機歷史上,也不多見!
但有趣的是:問題的原因并不是Windows系統本身。而是某頭部軟件公司CrowdStrike,更新的一款安全軟件,或者說是殺毒軟件所導致的。
如上期的文章“CPU眼里的:虛擬內存”所說,普通應用程序會被MMU隔離起來,如果單個進程、或應用程序崩潰,是不會禍及其他程序和操作系統的。能讓系統藍屏,往往是操作系統本身的缺陷、或是硬件設備的驅動程序。
由于處理此次藍屏問題的辦法之一,就是刪除一個驅動程序文件(C:\Windows\system32\drivers\crodstrike\csagent.sys)所以,造成藍屏的原因是CrowdStrike發布的驅動程序。
02
自制藍屏程序
那為什么殺毒軟件可以讓Windows藍屏,而我不行呢?這里就讓我們一起寫一個簡單的Windows藍屏程序吧!
打開VS code,在文件blue.c中定義一個函數blue_func,并在里面作一次除法運算,最后在main函數中作調用,我們故意把參數設置為:0,從而實現:1除以0的情況:
#include <stdio.h>
int blue_func(int input)
{
return 1/input;
}
int main()
{
return blue_func(0);
}
代碼寫完,做一下編譯,然后在運行一下。在linux環境下,我們會得到一個異常提示,程序也會被強制退出:
同樣,在Windows下,程序也會被強行退出;有時候,也可能會出現一個彈窗提醒,但并不會看到:藍屏。
這是因為如文章“CPU眼里的:進程vs線程”所說:操作系統會把每一個進程或應用程序通過MMU等手段隔離起來,甚至通過系統調用的方式,讓應用程序和操作系統內核隔離。
一旦某個進程或程序錯誤,操作系統就可以讓此應用程序強行退出,并返還系統資源。這樣某一個程序的錯誤,并不會傷及其他應用程序和整個系統。
但如果這個函數運行在驅動程序里面,會怎么樣呢?讓我們快速寫一個最簡單的驅動程序,它只有一個入口函數:DriverEntry,然后就可以調用函數blue_func來作除0運算了:
int blue_func(int input)
{
return 1/input;
}
#include <wdm.h>
#include <ntddk.h>
NTSTAUS DriverEntry(void* a, void* b)
{
blue_func(0);
return STATUS_SUCCESS;
}
通過下面的visual studio命令行,編譯這個驅動程序:
cl.exe /c blue.c /I "C:\Program FIles(x86)\Windows Kits\10\Include\10.0.22621.0\km"
cl.exe blue.obj "C:\Program FIles(x86)\Windows Kits\10\Lib\10.0.22621.0\km\x64\ntoskrnl.lib" /subsystem:native /driver:wdm -entry:DriverEntry
如果一切順利的話,我們會得到一個驅動程序:blue.sys
接著,通過Windows命令行,創建一個名字叫做:blueDriver的服務,然后,就可以start這個服務了:
sc create blueDriver binpath=D:\blue.sys type=kernel
sc start blueDriver
但系統拒絕了我們的運行請求!有時候Windows也會給我們彈出一個這樣的提示窗口:
原因是這個驅動程序沒有簽名。這是一個非常重要的安全保障。
由于Windows的生態特性,沒有對開發者進行必要的限制,2000年左右的時候,一天遭遇幾次藍屏都是非常正常的事情。
為了安撫用戶,當時的微軟CEO鮑爾默,還親自撰寫了藍屏后的提示信息。但經過分析后,發現大部分藍屏問題,并不是Windows的內核問題,而是各種驅動程序。
隨后,就加強了驅動程序的管理,任何驅動程序必須數字簽名,并經過必要的測試,這樣當驅動程序出問題后,微軟也可以定位到驅動程序的責任人或企業。
也正是因為這一通操作,才讓藍屏的情況,越來越少了。這一方面是Windows內核越來越成熟穩定;另外一方面也是Windows生態系統,越來越完善、規范。
所以,從這個角度上說,操作系統的競爭,不僅僅是性能之爭,更是生態之爭。Windows可能不是最優秀的操作系統,但一定是生態十分完善、健康的系統。
好了,為了跳過檢查,我們需要以管理員的身份,在命令行中輸入以下命令:
bcdedit /set testsigning on
并重啟計算機,如果一切順利的話,計算機的右下角會有一個:test mode的水印:
接著我們再次啟動這個服務:
sc start blueDriver
強烈建議大家在虛擬機上作這個危險動作!阿布就直接在真機上,測試這個驅動程序了。如你所見,藍屏如約而至:
03
冰山之下
那為什么操作系統不能像處理應用程序一樣,強制讓這個有問題的驅動程序退出,而非要波及整個系統呢?
這是因為驅動程序和內核之間并沒有很好的隔離,二者之間不僅相互調用,而且內存空間完全共享。這也是殺毒軟件、游戲軟件,盡管沒有提供任何硬件設備,但仍然熱衷于添加驅動程序的原因。
因為在內核態,驅動程序有很高的訪問權限,可以掃描系統整個系統內存,包括其他應用程序使用的內存,而這是普通程序無法做到的。
回到正題,正因為驅動程序和內核是你中有我,我中有你的關系;操作系統無法精準的讓有故障的驅動程序、以及正在使用驅動的應用程序強制退出。
所以,對于驅動程序的運行故障,操作系統往往沒有比較好的善后方法。Windows給個藍屏提示,已經算比較人性化了,Linux則往往招呼都不打,直接重啟。
如你所見,造成一次藍屏,不需要什么特別的技術,一個小小的低級錯誤就足夠了!此次藍屏能快速蔓延的原因,可能源于CrowdStrike巨大的用戶群里,作為一個老牌的軟件公司,有這么多航空、醫療、交通、銀行的客戶并奇怪。
而奇怪的是,這么一個很容易重現的bug,居然能夠暢通無阻的通過?:開發、review、自動測試、代碼合并、小范圍推送、大范圍推送等這一系列的流程,確實有點不可思議!讓我們靜待CrowdStrike的解釋吧?。?
04
更多知識
好了,基礎不牢,地動山搖!如果喜歡阿布這種解讀方式,希望更加系統學習這些編程知識的話,也可以考慮看看由阿布親自編寫,并由多位微軟大佬聯袂推薦的新書《CPU眼里的C/C++》
您遭遇電腦藍屏錯誤這一令人煩惱的狀況時,不必過于焦慮,以下一系列步驟或許能夠助您有效地解決問題。
首先,重啟電腦無疑是最為簡便且直接的應對策略。在很多時候,藍屏錯誤僅僅是短暫的系統異常,就如同我們偶爾會感到身體的短暫不適一樣。通過重啟,系統有機會重新初始化并自行糾正那些臨時性的錯誤,從而恢復正常運行。例如,有時電腦在長時間運行多個程序后,內存資源分配出現混亂,導致系統崩潰藍屏,而重啟就能重新梳理這些資源分配,讓電腦重新煥發活力。
接下來是硬件檢查環節。內存條作為電腦運行的關鍵組件之一,其接觸不良或損壞極有可能引發藍屏。當您關閉電腦,小心翼翼地打開機箱,輕輕拔出內存條,用橡皮擦仔細清潔金手指部分,再穩穩地重新插入時,或許就能解決問題。這就好比為一個疲憊的運動員按摩放松肌肉,使其能夠重新以最佳狀態投入比賽。此外,硬盤和顯卡的狀況也不容忽視。它們必須連接穩固且完好無損,才能保障電腦的穩定運行。想象一下,如果硬盤在讀寫數據時出現故障,或者顯卡無法正常處理圖像信息,電腦系統就會像失去了支柱的大廈一樣搖搖欲墜,藍屏錯誤也就隨之而來。如有必要,及時更換或升級硬件,為電腦注入新的活力。
更新或重裝驅動程序也是一個重要的解決途徑。倘若藍屏錯誤與驅動程序存在關聯,那么在安全模式下卸載最近安裝或更新的驅動程序,將是明智之舉。這就好像是為一輛行駛中的汽車調整不合適的零部件,使其重新恢復平穩的行駛狀態。然后重啟電腦,讓系統重新加載合適的驅動程序,從而消除藍屏錯誤。
查看錯誤代碼同樣具有關鍵意義。在藍屏出現時,通常會有特定的錯誤代碼顯示,這就像是系統向我們發出的“求救信號”。通過查詢這些錯誤代碼,我們能夠更加精準地找到具體的解決方法。您可以借助 Windows 的事件查看器,如同偵探一般在系統的日志中尋找線索,也可以利用專業的第三方工具,獲取更全面、更詳細的錯誤信息。
當上述方法都未能奏效時,系統還原或重裝系統可以作為最后的“大招”。將系統還原到之前正常的時間點,就仿佛讓時光倒流,回到系統穩定運行的時刻。而重裝操作系統,則像是為電腦進行一次徹底的“大掃除”,清除所有可能導致藍屏的潛在隱患。
然而,如果問題依舊頑固地存在,那么尋求專業支持將是您的不二之選。硬件制造商通常擁有深厚的技術底蘊和專業的知識儲備,能夠為您提供針對性的解決方案。專業維修服務人員則如同電腦的“醫生”,憑借豐富的經驗和專業的工具,為您的電腦進行精準的“診斷”和“治療”。總之,以上步驟在大多數情況下能夠幫助您化解藍屏問題。但面對復雜或難以自行處理的情況,及時向專業人士求助,無疑是明智且高效的選擇。