關於windows中進程地址空間問題

關於windows中進程地址空間問題

樓主csusuntao(孫濤)2005-10-18 20:07:58 在 VC/MFC / 進程/線程/DLL 提問

就32位x86而言,進程的地址空間共有4g。      
  0X00000000-7FFFFFFF是用戶地址空間:這個地址空間中的放的東西具體地址是什麼(儘量詳細點),比如代碼段,數據段,堆段,棧段還有bss段?進程的默認堆有多大,地址是多少,如果再申請的話地址怎麼分配?主線程的兩個堆棧地址分別是什麼,其他線程的堆棧地址怎麼分配?線程的兩個堆棧是用來給函用的還是什麼作用,線程切換的時候寄存器的信息要保存,它保存在什麼地址了?      
  0X80000000-FFFFFFFF是內核地址空間:這個地址空間中的放的東西具體地址是什麼(儘量詳細點),比如驅動放在什麼地址,頁表怎麼放的,分頁和不分頁怎麼放?      
  線程本地存儲器的地址在什麼地方?      
  另外關於c語言的:除各種運行時間庫外一門編程語言到底是怎麼出來的,它到底包括什麼東西?(比如c語言),難道僅僅是規定語法,然後由其他人去寫編譯器把你的語法翻譯成彙編語言(估計不會是這樣的),這樣一來不是說語言怎麼樣,而是誰的編譯器做得好。      
  腦子有點大,請高手指教。提的問題本身肯定就有不少錯誤,望指教。請不要介紹去看書,頭大的。 問題點數:100、回覆次數:28Top

src="/Include/Board.htm?Tags=" frameborder="0" scrolling="no">

1 樓doway(john)回覆於 2005-10-18 20:22:09 得分 0

不會看書,死路一條,樓主可以改行了。:)Top

2 樓csusuntao(孫濤)回覆於 2005-10-18 20:27:37 得分 0

多謝,領教了!Top

3 樓K()回覆於 2005-10-18 22:09:56 得分 0

去看windows程序設計和編譯原理-   -;Top

4 樓csusuntao(孫濤)回覆於 2005-10-18 22:24:47 得分 0

暈,不是說了不要介紹書的嗎?Top

5 樓csusuntao(孫濤)回覆於 2005-10-18 22:25:59 得分 0

看過書的來說一下吧,就當複習一下吧Top

6 樓power77()回覆於 2005-10-18 23:17:48 得分 0

語言是給人用的,又不是給機器用的,呵呵Top

7 樓qhfu(改個名字)回覆於 2005-10-18 23:25:02 得分 0

《windows   核心編程》內存管理部分,,Top

8 樓doway(john)回覆於 2005-10-18 23:41:14 得分 1

哈,再詳細點   :)  
   
  第三部分       內   存   管   理  
  第13章       Windows的內存結構 299  
  13.1       進程的虛擬地址空間 299  
  13.2       虛擬地址空間如何分區 300  
  13.2.1       NuLL   指針分配的分區—適用於  
                            Windows   2000和Windows   98 300  
  13.2.2       MS-DOS/16位Windows   應用程序兼容  
                            分區—僅適用於Windows   98 301  
  13.2.3       用戶方式分區—適用於Windows   2000  
                            和Windows   98 301  
  13.2.4       64   KB禁止進入的分區—僅適用  
                            於Windows   2000 302  
  13.2.5       共享的MMF分區—僅適用於  
                            Windows   98 303  
  13.2.6       內核方式分區—適用於Windows    
                            2000和Windows   98 303  
  13.3       地址空間中的區域 303  
  13.4         提交地址空間區域中的物理存儲器 304  
  13.5       物理存儲器與頁文件 304  
  13.6       保護屬性 307  
  13.6.1       Copy-On-Write   訪問 308  
  13.6.2       特殊的訪問保護屬性的標誌 309  
  13.7       綜合使用所有的元素 309  
  13.7.1       區域的內部情況 312  
  13.7.2       與Windows   98地址空間的差別 315  
  13.8       數據對齊的重要性 319  
  Top

9 樓qhfu(改個名字)回覆於 2005-10-19 00:20:06 得分 0

這幾天正在研讀中,,這本書寫得很好,,不過覺得翻譯一般   ,,   不知道哪裏有原版,看不懂可以對照一下。Top

10 樓conglingkaishi(請不要給我分)回覆於 2005-10-19 08:00:23 得分 0

呵呵,樓主問的問題我也想知道,受益了。Top

11 樓csusuntao(孫濤)回覆於 2005-10-19 10:57:22 得分 0

實話跟大家說吧,核心編程我看過了,我覺得他講的不夠詳細,或者是我看得不懂所以纔來這問的,就怕大家給我說讓我看了,結果沒一個真正幫我的,暈死!  
  它有講代碼段具體地址是什麼嗎?  
  它有講線程的兩個堆棧地址什麼嗎?他講的線程堆棧那一章舉的例子地址是“保留的起始地址是0   x   0   8   0   0   0   0   0   0   ”,我就是看不懂纔來問的。  
  大家的回帖讓我很興奮,但是也請大家說點實際的,根據我的要求回帖,這樣才能達到這個帖子的效果,才能讓我覺得散分散的值得。  
  還是請熱心的高手詳細指教!多謝了!Top

12 樓qhfu(改個名字)回覆於 2005-10-19 12:12:57 得分 10

0X00000000-7FFFFFFF是用戶地址空間:這個地址空間中的放的東西具體地址是什麼(儘量詳細點),  
   
  ======================================================================================  
   
  這是一個邏輯地址空間,32位的windows程序都有4G的邏輯地址空間,在2000中,後面一半是用於操作系統的。進城申請空間是,操作系統首先分配的是64k的邏輯空間,然後再把物理空間映射到邏輯空間。具體的方法和內容,上面都有寫吧!    
   
  一般從下到上,是放EXE文件,交換文件,用戶DLL,運行庫。  
   
  0X80000000-FFFFFFFF  
  這部分放的系統內核的部分,最上面一般放系統代碼,接着是DLLs(內核),再是內存映射文件。  
   
  上面都是邏輯空間,   實際用到時纔會系統纔會裝入物理內存。  
   
  主線程的兩個堆棧地址分別是什麼,其他線程的堆棧地址怎麼分配?線程的兩個堆棧是用來給函用的還是什麼作用,線程切換的時候寄存器的信息要保存,它保存在什麼地址了?      
  可參考6.6,結合16章看應該能看懂。。  
   
  比如驅動放在什麼地址,頁表怎麼放的,分頁和不分頁怎麼放?  
  這個應該是操作系統的問題,  
   
  另外關於c語言的:除各種運行時間庫外一門編程語言到底是怎麼出來的,它到底包括什麼東西?(比如c語言),  
  應該是用匯編  
   
  ps:上面只是個人一些理解,不一定是對的,樓主可作參考。Top

13 樓csusuntao(孫濤)回覆於 2005-10-19 19:40:54 得分 0

先說一下我以前知道的答案吧:  
  0X00000000-7FFFFFFF:應用程序代碼,全局變量,線程堆棧,dll代碼;我想知道他們的具體地址是什麼?哪個佔用多大?-----------個地址空間中的放的東西具體地址是什麼(儘量詳細點),比如代碼段,數據段,堆段,棧段還有bss段?  
   
   
  0x80000000-0xc0000000:內核執行體,HAL,驅動程序  
  0xc0000000-0xc0800000:進程頁表和超空間,超空間是什麼?我不知道。  
  0xc0800000-0xffffffff:系統高速緩存,分頁緩衝池,非分頁緩衝池  
  樓上說的內存映射文件不知道在什麼地址?  
   
  希望高手把這4g地址中的每個位都講清楚(最好是這樣了)--不好意思,誰讓你是高手呢!  
   
  主線程的兩個堆棧地址分別是什麼,其他線程的堆棧地址怎麼分配?線程的兩個堆棧是用來給函用的還是什麼作用,線程切換的時候寄存器的信息要保存,它保存在什麼地址了?    
  看了也沒找到具體的地址在哪?  
   
  樓上關於語言的回答沒看懂得。  
  Top

14 樓csusuntao(孫濤)回覆於 2005-10-19 19:44:10 得分 0

還有請不要再介紹看書了,還指明是哪本書的哪個章節,有的還把目錄給粘過來了,看得出來真夠費心的。在這多謝了。Top

15 樓conglingkaishi(請不要給我分)回覆於 2005-10-21 08:54:11 得分 0

呵呵,兄弟,你要太多會看怕人的。Top

16 樓csusuntao(孫濤)回覆於 2005-10-21 14:23:31 得分 0

再等一天就結帖,鬱悶!Top

17 樓csusuntao(孫濤)回覆於 2005-10-27 15:51:01 得分 0

是我的問題不值得回答還是給分太少?這些問題我真的想搞明白,跪求高手回答,或留下聯繫方式。Top

18 樓qhfu(改個名字)回覆於 2005-10-27 16:48:38 得分 9

樓主到windows地方去問問吧!   那邊高手比較多。Top

19 樓csusuntao(孫濤)回覆於 2005-10-27 19:49:37 得分 0

多謝樓上的好意見Top

20 樓windcsn(向所有的朋友學習!)回覆於 2005-10-28 13:32:33 得分 0

WINDOWS核心編程Top

21 樓teli_eurydice(哭泣的仙人掌。。。。)回覆於 2005-10-28 13:50:54 得分 0

upTop

22 樓bownk(光光)回覆於 2005-10-28 15:39:34 得分 80

0X00000000-7FFFFFFF是用戶地址空間:這個地址空間中的放的東西具體地址是什麼(儘量詳細點),比如代碼段,數據段,堆段,棧段還有bss段?進程的默認堆有多大,地址是多少,如果再申請的話地址怎麼分配?主線程的兩個堆棧地址分別是什麼,其他線程的堆棧地址怎麼分配?線程的兩個堆棧是用來給函用的還是什麼作用,線程切換的時候寄存器的信息要保存,它保存在什麼地址了?      
  -------------------------  
  就我理解:  
  1、代碼段、數據段這些都是因編器譯而異的。沒有固定的地址。  
  2、默認堆和棧的大小是可以自己設定的(在鏈接選項中),至於默認大小和位置還是由編譯器說了算。  
  3、如果進程中再申請一個堆的話,按你申請的大小找到一塊地址保留,至於在哪,運行時刻申請的地址,沒有固定地址。  
  (總的來說,Windows是32位平坦式內存,其什麼什麼段不重要了!)  
  4,兩個堆棧的作用:一個堆棧是用來存儲局部變量的,一個是TLS  
  5、線程的堆棧也是任意的,tls也不例外,都在用戶模式分區中,因爲每個線程(同進程一樣)都有一個環境塊——TEB(進程的叫PEB),在TEB中記錄有tls,當c函數要用到tls時,查一下teb就知道了!  
  6、程線切換是內核的功能,信息是保存到內核模式的堆棧中,不在用戶模式中。  
  =================================  
  0X80000000-FFFFFFFF是內核地址空間:這個地址空間中的放的東西具體地址是什麼(儘量詳細點),比如驅動放在什麼地址,頁表怎麼放的,分頁和不分頁怎麼放?      
  -----------------  
  可以說這個地方放的是整個windows,因爲windows不是微內核的,也就是說它的進程管理、I/0控制等等都是內核模式的,不是單獨的進程,都放在這個共享映射的分區中!至於要有多具體,要看微軟的大度了!  
  =================================  
  另外關於c語言的:除各種運行時間庫外一門編程語言到底是怎麼出來的,它到底包括什麼東西?(比如c語言),難道僅僅是規定語法,然後由其他人去寫編譯器把你的語法翻譯成彙編語言(估計不會是這樣的),這樣一來不是說語言怎麼樣,而是誰的編譯器做得好。      
  --------------------------  
  不懂你問的什麼意思!CRT是基於操作系統的,在不同的操作系統上有不同的實現。語言其實就是用來翻譯算法的,至於哪種語言(語法,結構)好用就是各顯神通了!以前覺得面向過程不錯,所以有了C,現在面向對象,所以火了C++,然後有人覺得C++用起來困難,所以又有了Java、C#,也許以後面向問題了,又會有新的語言出來!  
  Top

23 樓csusuntao(孫濤)回覆於 2005-10-29 18:37:21 得分 0

TO:光光  
  終於有肯解答問題的高手了!  
  -----------------------  
  1、代碼段、數據段這些都是因編器譯而異的。沒有固定的地址。  
  2、默認堆和棧的大小是可以自己設定的(在鏈接選項中),至於默認大小和位置還是由編譯器說了算。  
  3、如果進程中再申請一個堆的話,按你申請的大小找到一塊地址保留,至於在哪,運行時刻申請的地址,沒有固定地址。  
  (總的來說,Windows是32位平坦式內存,其什麼什麼段不重要了!)  
  -------------------------------------------------------  
  你說的這些結論是不是對其他操作系統平臺的編譯器也適用?是不是因爲Windows是32位平坦式內存,所以這些都交給編譯器了?與平坦式內存相對應的內存方式是什麼?  
   
  =================================  
   
  4,兩個堆棧的作用:一個堆棧是用來存儲局部變量的,一個是TLS  
  5、線程的堆棧也是任意的,tls也不例外,都在用戶模式分區中,因爲每個線程(同進程一樣)都有一個環境塊——TEB(進程的叫PEB),在TEB中記錄有tls,當c函數要用到tls時,查一下teb就知道了!  
  6、程線切換是內核的功能,信息是保存到內核模式的堆棧中,不在用戶模式中。  
  -------------------------------------------  
  我記得兩個堆棧是用戶模式下的堆棧和核心模式下的堆棧。不知道對不對?核心模式下的堆棧的主要作用是用來保存進程切換時候的信息的嗎?tls你確定是在用戶模式下嗎?  
   
  =================================  
   
  可以說這個地方放的是整個windows,因爲windows不是微內核的,也就是說它的進程管理、I/0控制等等都是內核模式的,不是單獨的進程,都放在這個共享映射的分區中!至於要有多具體,要看微軟的大度了!  
  -------------------------------  
  windows是不是微內核不能亂下定論吧,至少有點“微內核”的意思。它的進程管理、I/0控制等等都是內核模式的,都放在這個共享映射的分區中,但這些都是以服務的方式提供的是不是單獨的進程我不知道。我記得win2000是客戶/服務器模式,頭大了,我都不知道自己要問什麼。  
  =================================  
   
  CRT是基於操作系統的,在不同的操作系統上有不同的實現。語言其實就是用來翻譯算法的,至於哪種語言(語法,結構)好用就是各顯神通了!  
  ------------------------------------------------  
  可能我沒有說清楚,我想知道怎麼從頭開發一種語言?假設我現在想開發一門語言,我該怎麼做?c語言是由bell實驗室“發明”的,這個bell實驗室是不是朗訊的貝爾實驗室,不好意思,跑題了。c語言作爲一門語言,它包括什麼(到底需要發明什麼),語法,關鍵字這些是規定不需要發明吧?  
   
   
  Top

24 樓csusuntao(孫濤)回覆於 2005-10-29 18:38:49 得分 0

忘了,我問的問題太多,可是帖子最高加分是100,我也沒辦法,又不想開新帖,怎麼辦?Top

25 樓bownk(光光)回覆於 2005-10-30 13:03:20 得分 0

1.其它操作系統不熟,補充一下,前面說的可能讓你有誤解,我說的編譯器還包括鏈接器,當系統創建一個進程時,會相應的創建一個進程塊(內核中)和進程環境塊(PEB,用戶模式中,固定在緊靠64KB不可訪問區旁邊),加載exe時,會查看裏面的鏈接信息,如果沒有打開/heap指定大小,系統默認1MB大小隨機算法分配空間,然後把分配到的指針保存到PEB中(不是都交給編譯器了)。保護模式下的平坦式內存(flat)是說訪問內存不用段:偏移地址了,跑題了,不說這個了!再說詳細點,win2k用戶模式分區佈局分別是:  
  NULL區  
  用戶模式區  
                |(code、data、heap、stack)  
                |第n個TEB  
                |第n-1個TEB  
                |……  
                |第0個TEB  
                |PEB  
  不可訪問區(這個裏面有一個系統變量標明瞭第n個TEB的前一個地址,也就是用戶實際可用的最大地址)  
   
  2.每個線程至少有一個存取局時變量的棧吧,要不int   a;往哪放?TLS,Thread   Location   Stack,嘿嘿,顧名思義,本地的棧,不是放用戶模式放哪?再確切點,(我說過了)TLS是存儲在TEB中的,而TEB是在用戶模式中的。  
  3.Windows不是微內核的,不是我說的,是根據定義來的,至於說有點“微內核”,大概就是指Win2000下應用程序不可以直接訪問內核模式空間,就像不可以訪問微內核的系統組件進程的私有地址空間吧。你說“是不是單獨的進程我不知道”,但你已經知道了0x80000000-0xc0000000:內核執行體,HAL,驅動程序……,如果是微內核,硬件抽像、驅動程序等這些如果是單獨進程,不應該有自己的進程的空間嗎?2GB的內核空間啊!!!再怎麼微,也有2GB啊,還能叫微內核啊?!!!(確實,有些人說Windows是微內核的,如果樓主要討論這個問題,可以去驅動開發組)  
  4.內核模式的棧主要是供系統組件如進程調度,中斷,I/O等用的。  
  5.最後一個問題,要創新的是一種編程思想,C是面向過程的思想,C++開創的面向對象,Java是C++的基礎上,又開創了可移植、垃圾回收等思想。Top

26 樓csusuntao(孫濤)回覆於 2005-10-30 14:40:18 得分 0

TO:光光  
  再問一次吧,要不我不甘心....  
  1.進程的環境變量和命令行參數是不是都在進程控制塊中?  
  2.保護模式下的平坦式內存使用虛擬地址(線性地址)而不使用邏輯地址(段:偏移地址)?  
  3.暈阿,tls就是線程在用戶模式下的那個堆棧?我原來以爲tls和那兩個堆棧是分開的。  
  4.語言是編程思想。假如我有一種新的思想,然後我把實現這種思想所需要的關鍵字和語法規定一下,這就形成了一門語言?編譯器的廠商負責翻譯這些語法和關鍵?  
  多謝了!  
  Top

27 樓bownk(光光)回覆於 2005-10-30 15:44:46 得分 0

1.進程的環境變量指什麼?進程ID,句柄,創建時間等內核要用來管理進程的就放在EProcess塊(內核中),進程的入口函數地址,堆指針,棧指針……這些就放在PEB中(用戶模式中)。命令行參數我記得是壓入主線程棧的,不在EProcess和PEB中。  
  2.Win32下不用段:偏移地址。  
  3.tls和線程用戶模式下的普通棧是不同的。兩個棧都在teb中保存有信息,普通棧是保存的是一個指針,tls是以數組形式完全含在teb中,tls本來容量就不大,並且大小固定的。  
  4.差不多是這樣的。Top

28 樓bownk(光光)回覆於 2005-10-30 15:53:59 得分 0

說錯了,PEB中的沒有棧指針,棧指針是TEB中的。

發佈了23 篇原創文章 · 獲贊 4 · 訪問量 28萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章