1. 我問一下Windows方面的問題,安全性方面的。帳戶登錄Windows后,個人信息是怎樣被加載到進程中的,是怎么實現(xiàn)的? Windows資源分配和執(zhí)行的最小單位是什么?文件夾的權限是什么時候、怎樣被確定的,Windows是怎么實現(xiàn)這個權限的?
NT/2000中交互式的登陸支持是由WinLogon調用GINA DLL實現(xiàn)的,GINA DLL提供了一個交互式的界面為用戶登陸提供認證請求。在WinLogon初始化時,就向系統(tǒng)注冊截獲CTRL+ALT+DEL消息,所以其他程序就無法得到CTRL+ALT+DEL的消息。
看來基本就是WinLogon.exe這個進程了,而具體執(zhí)行為GINA DLL。
WinLogon會和GINA DLL進行交互,缺省是MSGINA.DLL(在System32目錄下),WlxInitialize、WlxActivateUserShell便是其中輸出,當然不止這兩個,還有別的。前者進行自身的初始化,后者激活用戶的外殼(shell)程序。Windows就是用這個DLL來實現(xiàn)用戶名+口令的身份認證的,但是開發(fā)人員可以用自己的GINA代替msgina.dll。
這個“用戶的shell程序”,我猜想就是explorer.exe,然后所有的窗口都是由它產(chǎn)生的,至于如何產(chǎn)生,不是很了解,不想丟人,不寫了,書上應該有
在NTFS中,與文件相關的每個信息單元,包括文件名、文件的擁有者、文件的時間標記、文件的內容等,都是當作文件屬性(NTFS Object Attribute, NTFS對象屬性)來實現(xiàn)的。每個文件屬性都對應著一個流(即一個簡單的字符序列)
每個流都有其各自的分配大小(已預留的磁盤空間),實際大?。▽嶋H使用了多少字節(jié)空間),以及有效的數(shù)據(jù)長度(初始化了多少數(shù)據(jù)流)等等。
NTFS文件有一個缺省數(shù)據(jù)流,該流沒有名稱。應用程序可以創(chuàng)建其他的具有名稱的數(shù)據(jù)流,且可通過指定名稱來訪問這些數(shù)據(jù)流。
第一個問題就傻眼,我只回答了,資源分配的最小單位是進程,執(zhí)行的最小單位是線程,不知道對不對(關于(1)系統(tǒng)與進程、(2)進程和線程的關系,我在想是不是可以這樣來類比:(1)的關系就像(2)的關系;一個系統(tǒng)里可以同時進行N多個進程,一個進程有N>=1個線程。)
這里我自然而來又想到另外一個問題,到底什么是進程同步,什么是線程同步,進程同步和線程同步有什么區(qū)別?
這個問題中的其它子問題我一概不知,請賜教。
2. 聽說過Kerberos嗎?是什么東西?用來干什么的?
沒有聽說過。網(wǎng)上查過之后,說是什么用來加密的,對稱加密什么的,不是很懂。
3. 什么是Fiber?
Fiber是光纖的意思(我是念物理的,我估計面試官那時已經(jīng)FT了)。
Fiber是纖程,是UNIX里的一些概念,類似于Windows里面的線程,但是要把代碼從UNIX移植到Windows里面時,需要進行ConvertThreadToFiber的轉換(這是書上看來的,我就覺得奇怪了,為什么不是ConvertFiberToThread? 因為是從UNIX移植到Windows!)
4. 怎樣在一個單向鏈表的當前指針前面插入一個結點?
我就奇了怪了,怎么可能在單向鏈表中的當前指針前面插入一個結點呢,我看的數(shù)據(jù)結構的書上,是同時記住兩個指針的,一個是currPtr(當前指針),另一個是prevPtr,所以這樣是很容易辦到的。但是面試官要求就一個當前指針,這可怎么操作啊?可能是我理解錯了,或者是他要什么答案。我當時回答時,只說了從head一個個找直到找到當前head為此(其實這樣也是要使用prevPtr的)
假設當前指向節(jié)點a,我們在它之后添加一個節(jié)點b,然后把a,b的“值”互換,目的就達到了.
5. 在User Mode時,調用Windows API, 就轉入了Kernel層面,請問有些什么變化?
什么什么變化?。渴裁唇凶鯱ser Mode,什么叫做Kernel層面?。?/p>
6. 你知道try catch這些東西的嵌套使用嗎?怎樣使用,應注意些什么?
不知道。從來沒有用try catch.可能平常寫的都是小程序,也用不著,所以當時就載了,因為不懂錯誤處理的面試者,面試官看了肯定亂搖頭。估計他又FT了。
注意外層捕獲一般異常,內部再捕獲具體異常,處理完畢及時拋出相應異常.
7. 一個已經(jīng)編譯的程序在運行時,怎樣對它進行調試?
編譯好了脫離了編譯器而運行了,還能調試嗎?我FT了。
8. 在調試一個循環(huán)時,如果設置斷點,那么每次進入循環(huán)碰到這個斷點都會停下來,當然可以在里面設置監(jiān)視變量,但是這樣做修改了源代碼,請問有什么辦法嗎?
還真沒有這么調試過,我都是直接設置監(jiān)視變量的。用assert()?
9. C/C++中有兩套動態(tài)分配:(1)malloc() free() (2)new delete 請問能交互使用嗎,要注意些什么,你能作些什么評論嗎?
FT,我的原則是用了malloc就一要用free來釋放,用了new就用delete,這個應該總歸沒有錯的吧?這兩個的唯一區(qū)別是,在使用抽象類型Class時,前者不會調用Constructor/Destructor,而后者會。我還能作些什么評論呢?
10. 用free可不可以翻譯鏈表內存?
不可以,但是我知道只是這樣回答應該是不對的。我又說,如果只是free(head)了,那么只是把頭結點給釋放了,其它后面所有的結點內存還是在的,但是它們由于頭結點的丟失而永遠不會被retrieve到了。(這個就是內存泄漏的一種吧?)
如果確實要用free來釋放鏈表內存的話,就應該遍歷鏈表,釋放每個結點。
11. 我們在定義一個函數(shù)時:
type f(arglist...)
{
/*
編譯器會在這里加些什么?
*/
int a, b;/* 程序員定義一些函數(shù)體現(xiàn)內的變量 */
char x, y;
....
return;
/*
編譯器會在這里又加些什么?
*/
}
我其實是不懂他要問些什么。我只知道,從main()過來執(zhí)行f()時,要進行f參數(shù)的初始化(副本Copy),退出時撤銷內建變量和副本Copy。編譯器還做些什么呢?
函數(shù)調用方式分為幾種cdecl stdcall等等 具體可以在網(wǎng)上艘以下
調用者在將函數(shù)參數(shù)以及調用者執(zhí)行的當前地址進行壓棧以后,然后被調用者執(zhí)行時再取出棧里的數(shù)據(jù),進行相應的操作
在被調用者退出時,彈出保存的地址,并使堆棧復原。返回到調用者里繼續(xù)執(zhí)行
12. C/C++編譯器對沒有初始化的內存區(qū)域是怎樣處理的,有哪些初始化工作?(實際上是進行了初始化,請問有哪幾種)
這個我倒真是不知道,我就隨便說了,我看到過一個沒有初始化的變量用來輸出調試時,會看到0xcccccccc。面試官說這幾是其中一種,請問還有其它的嗎?我說不知道。
13. 多個文件中的全局變量是什么時候定義、分配空間和初始化?