C专家编程-Chapter6 运行时数据结构(转)
生活随笔
收集整理的這篇文章主要介紹了
C专家编程-Chapter6 运行时数据结构(转)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
a.out是鏈接器的輸出。
a.out is a file format used in older versions of Unix-like computer operating systems for executables, object code, and, in later systems, shared libraries. The name stands for assembler output.
a.out remains the default output file name for executables created by certain compilers/linkers when no output name is specified, even though these executables are no longer in the a.out format.
———————————————————————————————————————————————
目標(biāo)文件和可執(zhí)行文件有若干種不同的格式。絕大多數(shù)SVR4實現(xiàn)中都采用了一種稱作ELF(Executable and linking Format)的格式。其它BSD UNIX等還有別的格式。但所有這些不同格式具有一個共同的概念,段(segment)。
段是二進制文件中簡單的區(qū)域,里面保存了和某種特定類型(如符號表條目)相關(guān)的所有信息。一個段一般包含幾個section。
不要把Unix中的段的概念跟Intel x86架構(gòu)中段的概念混淆。
在Unix中,段表示一個二進制文件相關(guān)的內(nèi)容塊。
在Intel x86的內(nèi)存模型中,段表示一種設(shè)計的結(jié)果。在這種設(shè)計中,地址空間并非一個整體,而是分成一些64K大小的區(qū)域,稱之為段。
檢查可執(zhí)行文件的內(nèi)容的另一種方法是使用nm或dump實用工具。在a.out上運行nm工具。nm -sx a.out。在一個可執(zhí)行文件上執(zhí)行size命令時,他會告訴你這個文件中的三個段text,data,bss的大小,如size a.out。各個段的意義參見。
如以下程序運行nm命令:
#include <stdlib.h>
char pear[40];
static double peach;
int mango = 13;
static long melon = 2001;
int
main(void){
int i = 3, j, *ip;
ip = malloc(sizeof(i));
pear[5] = i;
peach = 2.0 * mango;
return 1;
}
結(jié)果是:
Type??? Bind??? Segment??? Name
OBJT??? LOCL??? .bss??? peach
OBJT??? GLOB??? .bss??? pear
OBJT??? GLOB??? .data??? mango
OBJT??? LOCL??? .data??? melon
FUNC??? GLOB??? .text??? main
FUNC??? GLOB??? UNDEF??? malloc
……
數(shù)據(jù)段保存在目標(biāo)文件中。
BSS段不保存在目標(biāo)文件中。(除了記錄BSS段在運行時所需要的大小)
文本段是最容易受優(yōu)化措施影響的段。
a.out文件的大小受調(diào)試狀態(tài)下編譯的影響,但段不受影響。
———————————————————————————————————————————————
C語言自動提供的服務(wù)之一是跟蹤調(diào)用鏈,那些函數(shù)調(diào)用了那些函數(shù),當(dāng)下一個return語句執(zhí)行后,控制將返回何處等。解決這個問題的經(jīng)典機制是堆棧中的過程活動記錄。過程活動記錄是一種數(shù)據(jù)結(jié)構(gòu),如下:
局部變量,參數(shù),靜態(tài)鏈接(C語言中不使用),指向先前結(jié)構(gòu)的指針,返回地址。
系統(tǒng)盡可能的把過程活動記錄的內(nèi)容放到寄存器中,是函數(shù)調(diào)用的速度更快。擔(dān)當(dāng)函數(shù)調(diào)用鏈非常深,寄存器窗口不夠用時,寄存器的內(nèi)容就會被保存到堆棧中保留的活動記錄空間中,以便重新利用這些寄存器。
———————————————————————————————————————————————
控制線程
setjmp()和longjmp()是通過上述過程活動記錄實現(xiàn)的。goto只能在函數(shù)內(nèi)跳動,而它們可以到函數(shù)外。
setjmp保存了程序的計數(shù)器和當(dāng)前的棧頂指針,可能還有一些初始值。longjmp恢復(fù)這些值,有效地轉(zhuǎn)移控制并把狀態(tài)重置回保存狀態(tài)的時候。
這對函數(shù)最大的用途是錯誤恢復(fù)。只要還沒有從函數(shù)中返回,一旦發(fā)現(xiàn)一個不可恢復(fù)的錯誤,可以把控制轉(zhuǎn)移到主輸入循環(huán),并從那里重新開始。相當(dāng)于C++中的catch和throw。
使用例子:
#include <stdlib.h>
#include <stdio.h>
#include <setjmp.h>
jmp_buf buf;
void banana(){
printf("in banana()\n");
longjmp(buf, 1);
printf("you'll never see this");
return;
}
int
main(void){
if(setjmp(buf))
printf("back in main\n");
else{
printf("first time through\n");
banana();
}
return 0;
}
輸出:
debian:/home/banyan# ./jmp
first time through
in banana()
back in main
———————————————————————————————————————————————
一些有用的C語言工具:
indent???????? 美化格式,縮進等。
cflow????????? 打印程序中調(diào)用者/被調(diào)用者關(guān)系
dump -Lv??? 打印動態(tài)鏈接的信息
ldd???????????? 打印文件所需的動態(tài)庫
file???????????? 告訴你一個文件包含的內(nèi)容(如可執(zhí)行文件、數(shù)據(jù)、ASCII,shell,script,archive等)
time?????????? 顯示程序所使用的實際時間和CPU時間。
———————————————————————————————————————————————
附:什么是SVR4?我們?yōu)槭裁匆x擇SVR4?zz
SVR4是UNIX操作系統(tǒng)的一種新的內(nèi)核標(biāo)準(zhǔn),是迄今為止內(nèi)核版本最新的UNIX
SVR4并不代表一個具體的UNIX變體,而只是一個內(nèi)核的標(biāo)準(zhǔn)。SVR4有極高的標(biāo)準(zhǔn)性,那意味著你學(xué)好了SVR4可以在所有SVR4內(nèi)核的操作系統(tǒng)上進行統(tǒng)一的操作(不會產(chǎn)生學(xué)習(xí)了一個UNIX系統(tǒng)還要學(xué)習(xí)另外的困惑)
SVR4(UNIX System V Release4)是AT&T在1989年首次發(fā)行的;SVR4集成SVR3,4BSD,SunOS,以及XENIX的一些特性,還添加了一些新 功能,如實時調(diào)度,Korn shell,以及對STREAMS子系統(tǒng)的改進;SVR4是迄今為止最新的UNIX
SVR4的優(yōu)點如下
1、標(biāo)準(zhǔn)性
符合SVID(AT&T的System V接口定義)、IEEE POSIX規(guī)范,以及X/OPEN財團的X/OPEN可移植導(dǎo)引。應(yīng)該說AT&T公司出品的SVR4是UNIX味兒最濃的UNIX。現(xiàn)在流行的現(xiàn) 代UNIX大多都是基于SVR4的。
2、先進性
AT&T UNIX System V Release4 是迄今為止內(nèi)核版本最新的UNIX。在這之后USL發(fā)行了UNIX SVR4.2,此后又有新的SVR4的發(fā)行,其中最新的是SVR4.2/ES/MP。它在SVR4.2的基礎(chǔ)上加入了安全性和多處理器的支持,并支持輕量 級進程。(這就是unixware2.1采用的內(nèi)核)
SVR4.2支持內(nèi)模塊的動態(tài)加載(在系統(tǒng)運行中,內(nèi)核是可以動態(tài)變化的)這意味著改變內(nèi)核而不需要重新啟動計算機。
另外,SVR4提供了新的圖形用戶界面(GUI) -- Motif和sun的openlook(openwindow)。
SVR4.2還增加了對PC新硬件的支持。
3、友好的用戶界面
廣大的操作系統(tǒng)愛好者往往喜歡從界面的友好性來評價操作系統(tǒng)。
對于字符終端用戶SVR4提供的是face界面(OAM)。它將常用的系統(tǒng)管理(如添加新用戶、備份…)圖形化了。還提供了在線幫助(類似于ScoAdmin)
對于圖形終端用戶,SVR4提供了openlook標(biāo)準(zhǔn)圖形界面。
4、改進的VM(虛擬內(nèi)存)結(jié)構(gòu)
SVR4的內(nèi)存管理不再基于原SVR3中“區(qū)”的結(jié)構(gòu),而采用請求分頁技術(shù)。SVR4采用雙表針時鐘的頁面置換策略,這樣的改進降低了頁面失效率。
5、改進的進程管理
SVR4支持內(nèi)核線程、用戶線程和輕量級進程。SVR4提供了一組系統(tǒng)調(diào)用,它是SVR3和BSD信號功能的超集。同時也支持老的不可靠的信號。
SVR4在進程調(diào)度方面做了很多改進,包括:
1)支持要求實時響應(yīng)的多種應(yīng)用程序。
2)把調(diào)度策略同實現(xiàn)它的機制相分離。
3)應(yīng)用程序能夠控制它的優(yōu)先級和調(diào)度。
4)定義了一個對內(nèi)核有良好定義接口的調(diào)度框架。
5)允許新的調(diào)度策略以模塊方式加入,包括調(diào)度器動態(tài)加載的實現(xiàn)。
6)限制臨界時間性應(yīng)用程序的調(diào)度延遲。
在進程通信方面SVR4使用流(STREAMS)作為它的基本框架來實現(xiàn)管道(pipes)和有名管道(FIFO)。SVR4的管道是雙向的,可同時進行讀寫操作。
在同步方面,加入了多處理機支持。并用自旋鎖代替了信號燈。
6、高級文件系統(tǒng)支持
SVR4除了支持SystemV傳統(tǒng)的文件系統(tǒng)s5fs之外,還加入了ufs和vxfs。
Ufs是伯克利快速文件系統(tǒng),建立在s5fs的基礎(chǔ)之上,增加了硬盤的訪問速度,并節(jié)省了硬盤空間。這種文件系統(tǒng)支持長文件名(大于14個字符)、符號連 接和原子命名。并支持片段(slice)就是對磁盤塊的進一步劃分,用mkfs命令創(chuàng)建文件系統(tǒng)時可以指定slice的大小。一般為1,2,4或8。
Vxfs是Veritas高級文件系統(tǒng)。它是一種日志文件系統(tǒng),同時提供了許多先進的功能。如系統(tǒng)崩潰的快速恢復(fù)、磁盤配額等等
7、設(shè)備管理的改進
SVR4支持內(nèi)核模塊的動態(tài)加載,具有新的設(shè)備驅(qū)動程序。內(nèi)核對驅(qū)動程序是透明的,大大簡化了驅(qū)動程序編寫的復(fù)雜性。
如果您是一位SVR4的愛好者與支持者,您就應(yīng)該選擇SVR4的UNIX操作系統(tǒng),如SUN 的 Solaris,IBM的AIX,SCO 的 Unixware等等。
a.out is a file format used in older versions of Unix-like computer operating systems for executables, object code, and, in later systems, shared libraries. The name stands for assembler output.
a.out remains the default output file name for executables created by certain compilers/linkers when no output name is specified, even though these executables are no longer in the a.out format.
———————————————————————————————————————————————
目標(biāo)文件和可執(zhí)行文件有若干種不同的格式。絕大多數(shù)SVR4實現(xiàn)中都采用了一種稱作ELF(Executable and linking Format)的格式。其它BSD UNIX等還有別的格式。但所有這些不同格式具有一個共同的概念,段(segment)。
段是二進制文件中簡單的區(qū)域,里面保存了和某種特定類型(如符號表條目)相關(guān)的所有信息。一個段一般包含幾個section。
不要把Unix中的段的概念跟Intel x86架構(gòu)中段的概念混淆。
在Unix中,段表示一個二進制文件相關(guān)的內(nèi)容塊。
在Intel x86的內(nèi)存模型中,段表示一種設(shè)計的結(jié)果。在這種設(shè)計中,地址空間并非一個整體,而是分成一些64K大小的區(qū)域,稱之為段。
檢查可執(zhí)行文件的內(nèi)容的另一種方法是使用nm或dump實用工具。在a.out上運行nm工具。nm -sx a.out。在一個可執(zhí)行文件上執(zhí)行size命令時,他會告訴你這個文件中的三個段text,data,bss的大小,如size a.out。各個段的意義參見。
如以下程序運行nm命令:
#include <stdlib.h>
char pear[40];
static double peach;
int mango = 13;
static long melon = 2001;
int
main(void){
int i = 3, j, *ip;
ip = malloc(sizeof(i));
pear[5] = i;
peach = 2.0 * mango;
return 1;
}
結(jié)果是:
Type??? Bind??? Segment??? Name
OBJT??? LOCL??? .bss??? peach
OBJT??? GLOB??? .bss??? pear
OBJT??? GLOB??? .data??? mango
OBJT??? LOCL??? .data??? melon
FUNC??? GLOB??? .text??? main
FUNC??? GLOB??? UNDEF??? malloc
……
數(shù)據(jù)段保存在目標(biāo)文件中。
BSS段不保存在目標(biāo)文件中。(除了記錄BSS段在運行時所需要的大小)
文本段是最容易受優(yōu)化措施影響的段。
a.out文件的大小受調(diào)試狀態(tài)下編譯的影響,但段不受影響。
———————————————————————————————————————————————
C語言自動提供的服務(wù)之一是跟蹤調(diào)用鏈,那些函數(shù)調(diào)用了那些函數(shù),當(dāng)下一個return語句執(zhí)行后,控制將返回何處等。解決這個問題的經(jīng)典機制是堆棧中的過程活動記錄。過程活動記錄是一種數(shù)據(jù)結(jié)構(gòu),如下:
局部變量,參數(shù),靜態(tài)鏈接(C語言中不使用),指向先前結(jié)構(gòu)的指針,返回地址。
系統(tǒng)盡可能的把過程活動記錄的內(nèi)容放到寄存器中,是函數(shù)調(diào)用的速度更快。擔(dān)當(dāng)函數(shù)調(diào)用鏈非常深,寄存器窗口不夠用時,寄存器的內(nèi)容就會被保存到堆棧中保留的活動記錄空間中,以便重新利用這些寄存器。
———————————————————————————————————————————————
控制線程
setjmp()和longjmp()是通過上述過程活動記錄實現(xiàn)的。goto只能在函數(shù)內(nèi)跳動,而它們可以到函數(shù)外。
setjmp保存了程序的計數(shù)器和當(dāng)前的棧頂指針,可能還有一些初始值。longjmp恢復(fù)這些值,有效地轉(zhuǎn)移控制并把狀態(tài)重置回保存狀態(tài)的時候。
這對函數(shù)最大的用途是錯誤恢復(fù)。只要還沒有從函數(shù)中返回,一旦發(fā)現(xiàn)一個不可恢復(fù)的錯誤,可以把控制轉(zhuǎn)移到主輸入循環(huán),并從那里重新開始。相當(dāng)于C++中的catch和throw。
使用例子:
#include <stdlib.h>
#include <stdio.h>
#include <setjmp.h>
jmp_buf buf;
void banana(){
printf("in banana()\n");
longjmp(buf, 1);
printf("you'll never see this");
return;
}
int
main(void){
if(setjmp(buf))
printf("back in main\n");
else{
printf("first time through\n");
banana();
}
return 0;
}
輸出:
debian:/home/banyan# ./jmp
first time through
in banana()
back in main
———————————————————————————————————————————————
一些有用的C語言工具:
indent???????? 美化格式,縮進等。
cflow????????? 打印程序中調(diào)用者/被調(diào)用者關(guān)系
dump -Lv??? 打印動態(tài)鏈接的信息
ldd???????????? 打印文件所需的動態(tài)庫
file???????????? 告訴你一個文件包含的內(nèi)容(如可執(zhí)行文件、數(shù)據(jù)、ASCII,shell,script,archive等)
time?????????? 顯示程序所使用的實際時間和CPU時間。
———————————————————————————————————————————————
附:什么是SVR4?我們?yōu)槭裁匆x擇SVR4?zz
SVR4是UNIX操作系統(tǒng)的一種新的內(nèi)核標(biāo)準(zhǔn),是迄今為止內(nèi)核版本最新的UNIX
SVR4并不代表一個具體的UNIX變體,而只是一個內(nèi)核的標(biāo)準(zhǔn)。SVR4有極高的標(biāo)準(zhǔn)性,那意味著你學(xué)好了SVR4可以在所有SVR4內(nèi)核的操作系統(tǒng)上進行統(tǒng)一的操作(不會產(chǎn)生學(xué)習(xí)了一個UNIX系統(tǒng)還要學(xué)習(xí)另外的困惑)
SVR4(UNIX System V Release4)是AT&T在1989年首次發(fā)行的;SVR4集成SVR3,4BSD,SunOS,以及XENIX的一些特性,還添加了一些新 功能,如實時調(diào)度,Korn shell,以及對STREAMS子系統(tǒng)的改進;SVR4是迄今為止最新的UNIX
SVR4的優(yōu)點如下
1、標(biāo)準(zhǔn)性
符合SVID(AT&T的System V接口定義)、IEEE POSIX規(guī)范,以及X/OPEN財團的X/OPEN可移植導(dǎo)引。應(yīng)該說AT&T公司出品的SVR4是UNIX味兒最濃的UNIX。現(xiàn)在流行的現(xiàn) 代UNIX大多都是基于SVR4的。
2、先進性
AT&T UNIX System V Release4 是迄今為止內(nèi)核版本最新的UNIX。在這之后USL發(fā)行了UNIX SVR4.2,此后又有新的SVR4的發(fā)行,其中最新的是SVR4.2/ES/MP。它在SVR4.2的基礎(chǔ)上加入了安全性和多處理器的支持,并支持輕量 級進程。(這就是unixware2.1采用的內(nèi)核)
SVR4.2支持內(nèi)模塊的動態(tài)加載(在系統(tǒng)運行中,內(nèi)核是可以動態(tài)變化的)這意味著改變內(nèi)核而不需要重新啟動計算機。
另外,SVR4提供了新的圖形用戶界面(GUI) -- Motif和sun的openlook(openwindow)。
SVR4.2還增加了對PC新硬件的支持。
3、友好的用戶界面
廣大的操作系統(tǒng)愛好者往往喜歡從界面的友好性來評價操作系統(tǒng)。
對于字符終端用戶SVR4提供的是face界面(OAM)。它將常用的系統(tǒng)管理(如添加新用戶、備份…)圖形化了。還提供了在線幫助(類似于ScoAdmin)
對于圖形終端用戶,SVR4提供了openlook標(biāo)準(zhǔn)圖形界面。
4、改進的VM(虛擬內(nèi)存)結(jié)構(gòu)
SVR4的內(nèi)存管理不再基于原SVR3中“區(qū)”的結(jié)構(gòu),而采用請求分頁技術(shù)。SVR4采用雙表針時鐘的頁面置換策略,這樣的改進降低了頁面失效率。
5、改進的進程管理
SVR4支持內(nèi)核線程、用戶線程和輕量級進程。SVR4提供了一組系統(tǒng)調(diào)用,它是SVR3和BSD信號功能的超集。同時也支持老的不可靠的信號。
SVR4在進程調(diào)度方面做了很多改進,包括:
1)支持要求實時響應(yīng)的多種應(yīng)用程序。
2)把調(diào)度策略同實現(xiàn)它的機制相分離。
3)應(yīng)用程序能夠控制它的優(yōu)先級和調(diào)度。
4)定義了一個對內(nèi)核有良好定義接口的調(diào)度框架。
5)允許新的調(diào)度策略以模塊方式加入,包括調(diào)度器動態(tài)加載的實現(xiàn)。
6)限制臨界時間性應(yīng)用程序的調(diào)度延遲。
在進程通信方面SVR4使用流(STREAMS)作為它的基本框架來實現(xiàn)管道(pipes)和有名管道(FIFO)。SVR4的管道是雙向的,可同時進行讀寫操作。
在同步方面,加入了多處理機支持。并用自旋鎖代替了信號燈。
6、高級文件系統(tǒng)支持
SVR4除了支持SystemV傳統(tǒng)的文件系統(tǒng)s5fs之外,還加入了ufs和vxfs。
Ufs是伯克利快速文件系統(tǒng),建立在s5fs的基礎(chǔ)之上,增加了硬盤的訪問速度,并節(jié)省了硬盤空間。這種文件系統(tǒng)支持長文件名(大于14個字符)、符號連 接和原子命名。并支持片段(slice)就是對磁盤塊的進一步劃分,用mkfs命令創(chuàng)建文件系統(tǒng)時可以指定slice的大小。一般為1,2,4或8。
Vxfs是Veritas高級文件系統(tǒng)。它是一種日志文件系統(tǒng),同時提供了許多先進的功能。如系統(tǒng)崩潰的快速恢復(fù)、磁盤配額等等
7、設(shè)備管理的改進
SVR4支持內(nèi)核模塊的動態(tài)加載,具有新的設(shè)備驅(qū)動程序。內(nèi)核對驅(qū)動程序是透明的,大大簡化了驅(qū)動程序編寫的復(fù)雜性。
如果您是一位SVR4的愛好者與支持者,您就應(yīng)該選擇SVR4的UNIX操作系統(tǒng),如SUN 的 Solaris,IBM的AIX,SCO 的 Unixware等等。
轉(zhuǎn)載于:https://www.cnblogs.com/aquar/archive/2010/03/29/3451461.html
總結(jié)
以上是生活随笔為你收集整理的C专家编程-Chapter6 运行时数据结构(转)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不知是哪个家伙写的,相当的有才啊!
- 下一篇: 实现 设置text控件的标题根据维度成员