關於windows 函式呼叫棧kernel32 dll 與ntdll dll的疑問?

時間 2021-06-01 20:22:14

1樓:

你把符號表先載入完,然後看下最底層的函式名字,然後再去找下windows的loader機制和執行緒程序等相關實現細節,你就自己能搞懂了,還嫌麻煩就自己用神器windbg調核心吧

2樓:

一句話答案:ntdll裡儲存了kernel32中乙個函式的指標,之後通過指標呼叫的。

微軟為這些系統DLL提供了公開符號檔案,包含了函式名稱和一些全域性變數的名稱,我們可以大致了解其功能。

之後呼叫棧會變成這樣,是不是清晰了一些。

可以看出來這是負責執行緒啟動和初始化的函式。雙擊某一級可以檢視其原始碼或彙編,我們看看ntdll呼叫kernel32是怎麼做的。

這裡我們可以得出最初的答案了。ntdll中儲存了ThreadInitThunk的指標,通過這個指標呼叫的。其實這裡還判斷了它是不是空,如果是空可能kernel32還沒準備好,會從ntdll直接呼叫。

也許你會問ntdll先於kernel32載入,為什麼會有kernel32的指標呢?這似乎是個雞與蛋的問題,不過它們承載關鍵系統功能,基本上所有程序都需要,而且因為一些跨程序操作的需要其位址是共通的,這樣可以在系統啟動時就弄好了,建立程序時直接對映已有的就可以了。

另外需要提一下,系統版本不同底層實現也會不同,本題例子用的是Win7 SP1,而XP SP3的執行緒入口就在kernel32,沒有通過ntdll呼叫。當然之前有一些操作會通過ntdll,但與本題無關了。

Windows系統呼叫的A函式和W函式的關係?

回答個詳細的 與Event相關並且會造成程序控制代碼數量增加的Windows API有兩個 CreateEvent和OpenEvent。再考慮深入一點,區分一下Unicode和Ansi版本的API就得到了四個相關函式CreateEventA,CreateEventW,OpenEventA,OpenE...

為什麼無棧協程不能被非協程函式巢狀呼叫?

Ethan Lv 思考了下,發現我在幾個小時前提出這個問題的時候,對 stackful 和 stackless 的理解是不太到位的,當然現在也依然不太到位。只能簡單說下我的認知了。首先,我們給協程的簡單定義是 其區域性變數能夠保持或者說恢復。resume 時能夠跳轉回離開時的那條語句。對於 asyn...

linux為什麼需要核心棧,系統呼叫時直接使用使用者棧不行嗎?

海嶺洋脊板塊發散 來自 xv6 document When changing protection levels from user to kernel mode,the kernel shouldn t use the stack of the user process,because it ma...