C专家编程-Chapter6 运行时数据结构(转)
生活随笔
收集整理的這篇文章主要介紹了
C专家编程-Chapter6 运行时数据结构(转)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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.
———————————————————————————————————————————————
目標文件和可執行文件有若干種不同的格式。絕大多數SVR4實現中都采用了一種稱作ELF(Executable and linking Format)的格式。其它BSD UNIX等還有別的格式。但所有這些不同格式具有一個共同的概念,段(segment)。
段是二進制文件中簡單的區域,里面保存了和某種特定類型(如符號表條目)相關的所有信息。一個段一般包含幾個section。
不要把Unix中的段的概念跟Intel x86架構中段的概念混淆。
在Unix中,段表示一個二進制文件相關的內容塊。
在Intel x86的內存模型中,段表示一種設計的結果。在這種設計中,地址空間并非一個整體,而是分成一些64K大小的區域,稱之為段。
檢查可執行文件的內容的另一種方法是使用nm或dump實用工具。在a.out上運行nm工具。nm -sx a.out。在一個可執行文件上執行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;
}
結果是:
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
……
數據段保存在目標文件中。
BSS段不保存在目標文件中。(除了記錄BSS段在運行時所需要的大小)
文本段是最容易受優化措施影響的段。
a.out文件的大小受調試狀態下編譯的影響,但段不受影響。
———————————————————————————————————————————————
C語言自動提供的服務之一是跟蹤調用鏈,那些函數調用了那些函數,當下一個return語句執行后,控制將返回何處等。解決這個問題的經典機制是堆棧中的過程活動記錄。過程活動記錄是一種數據結構,如下:
局部變量,參數,靜態鏈接(C語言中不使用),指向先前結構的指針,返回地址。
系統盡可能的把過程活動記錄的內容放到寄存器中,是函數調用的速度更快。擔當函數調用鏈非常深,寄存器窗口不夠用時,寄存器的內容就會被保存到堆棧中保留的活動記錄空間中,以便重新利用這些寄存器。
———————————————————————————————————————————————
控制線程
setjmp()和longjmp()是通過上述過程活動記錄實現的。goto只能在函數內跳動,而它們可以到函數外。
setjmp保存了程序的計數器和當前的棧頂指針,可能還有一些初始值。longjmp恢復這些值,有效地轉移控制并把狀態重置回保存狀態的時候。
這對函數最大的用途是錯誤恢復。只要還沒有從函數中返回,一旦發現一個不可恢復的錯誤,可以把控制轉移到主輸入循環,并從那里重新開始。相當于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????????? 打印程序中調用者/被調用者關系
dump -Lv??? 打印動態鏈接的信息
ldd???????????? 打印文件所需的動態庫
file???????????? 告訴你一個文件包含的內容(如可執行文件、數據、ASCII,shell,script,archive等)
time?????????? 顯示程序所使用的實際時間和CPU時間。
———————————————————————————————————————————————
附:什么是SVR4?我們為什么要選擇SVR4?zz
SVR4是UNIX操作系統的一種新的內核標準,是迄今為止內核版本最新的UNIX
SVR4并不代表一個具體的UNIX變體,而只是一個內核的標準。SVR4有極高的標準性,那意味著你學好了SVR4可以在所有SVR4內核的操作系統上進行統一的操作(不會產生學習了一個UNIX系統還要學習另外的困惑)
SVR4(UNIX System V Release4)是AT&T在1989年首次發行的;SVR4集成SVR3,4BSD,SunOS,以及XENIX的一些特性,還添加了一些新 功能,如實時調度,Korn shell,以及對STREAMS子系統的改進;SVR4是迄今為止最新的UNIX
SVR4的優點如下
1、標準性
符合SVID(AT&T的System V接口定義)、IEEE POSIX規范,以及X/OPEN財團的X/OPEN可移植導引。應該說AT&T公司出品的SVR4是UNIX味兒最濃的UNIX。現在流行的現 代UNIX大多都是基于SVR4的。
2、先進性
AT&T UNIX System V Release4 是迄今為止內核版本最新的UNIX。在這之后USL發行了UNIX SVR4.2,此后又有新的SVR4的發行,其中最新的是SVR4.2/ES/MP。它在SVR4.2的基礎上加入了安全性和多處理器的支持,并支持輕量 級進程。(這就是unixware2.1采用的內核)
SVR4.2支持內模塊的動態加載(在系統運行中,內核是可以動態變化的)這意味著改變內核而不需要重新啟動計算機。
另外,SVR4提供了新的圖形用戶界面(GUI) -- Motif和sun的openlook(openwindow)。
SVR4.2還增加了對PC新硬件的支持。
3、友好的用戶界面
廣大的操作系統愛好者往往喜歡從界面的友好性來評價操作系統。
對于字符終端用戶SVR4提供的是face界面(OAM)。它將常用的系統管理(如添加新用戶、備份…)圖形化了。還提供了在線幫助(類似于ScoAdmin)
對于圖形終端用戶,SVR4提供了openlook標準圖形界面。
4、改進的VM(虛擬內存)結構
SVR4的內存管理不再基于原SVR3中“區”的結構,而采用請求分頁技術。SVR4采用雙表針時鐘的頁面置換策略,這樣的改進降低了頁面失效率。
5、改進的進程管理
SVR4支持內核線程、用戶線程和輕量級進程。SVR4提供了一組系統調用,它是SVR3和BSD信號功能的超集。同時也支持老的不可靠的信號。
SVR4在進程調度方面做了很多改進,包括:
1)支持要求實時響應的多種應用程序。
2)把調度策略同實現它的機制相分離。
3)應用程序能夠控制它的優先級和調度。
4)定義了一個對內核有良好定義接口的調度框架。
5)允許新的調度策略以模塊方式加入,包括調度器動態加載的實現。
6)限制臨界時間性應用程序的調度延遲。
在進程通信方面SVR4使用流(STREAMS)作為它的基本框架來實現管道(pipes)和有名管道(FIFO)。SVR4的管道是雙向的,可同時進行讀寫操作。
在同步方面,加入了多處理機支持。并用自旋鎖代替了信號燈。
6、高級文件系統支持
SVR4除了支持SystemV傳統的文件系統s5fs之外,還加入了ufs和vxfs。
Ufs是伯克利快速文件系統,建立在s5fs的基礎之上,增加了硬盤的訪問速度,并節省了硬盤空間。這種文件系統支持長文件名(大于14個字符)、符號連 接和原子命名。并支持片段(slice)就是對磁盤塊的進一步劃分,用mkfs命令創建文件系統時可以指定slice的大小。一般為1,2,4或8。
Vxfs是Veritas高級文件系統。它是一種日志文件系統,同時提供了許多先進的功能。如系統崩潰的快速恢復、磁盤配額等等
7、設備管理的改進
SVR4支持內核模塊的動態加載,具有新的設備驅動程序。內核對驅動程序是透明的,大大簡化了驅動程序編寫的復雜性。
如果您是一位SVR4的愛好者與支持者,您就應該選擇SVR4的UNIX操作系統,如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.
———————————————————————————————————————————————
目標文件和可執行文件有若干種不同的格式。絕大多數SVR4實現中都采用了一種稱作ELF(Executable and linking Format)的格式。其它BSD UNIX等還有別的格式。但所有這些不同格式具有一個共同的概念,段(segment)。
段是二進制文件中簡單的區域,里面保存了和某種特定類型(如符號表條目)相關的所有信息。一個段一般包含幾個section。
不要把Unix中的段的概念跟Intel x86架構中段的概念混淆。
在Unix中,段表示一個二進制文件相關的內容塊。
在Intel x86的內存模型中,段表示一種設計的結果。在這種設計中,地址空間并非一個整體,而是分成一些64K大小的區域,稱之為段。
檢查可執行文件的內容的另一種方法是使用nm或dump實用工具。在a.out上運行nm工具。nm -sx a.out。在一個可執行文件上執行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;
}
結果是:
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
……
數據段保存在目標文件中。
BSS段不保存在目標文件中。(除了記錄BSS段在運行時所需要的大小)
文本段是最容易受優化措施影響的段。
a.out文件的大小受調試狀態下編譯的影響,但段不受影響。
———————————————————————————————————————————————
C語言自動提供的服務之一是跟蹤調用鏈,那些函數調用了那些函數,當下一個return語句執行后,控制將返回何處等。解決這個問題的經典機制是堆棧中的過程活動記錄。過程活動記錄是一種數據結構,如下:
局部變量,參數,靜態鏈接(C語言中不使用),指向先前結構的指針,返回地址。
系統盡可能的把過程活動記錄的內容放到寄存器中,是函數調用的速度更快。擔當函數調用鏈非常深,寄存器窗口不夠用時,寄存器的內容就會被保存到堆棧中保留的活動記錄空間中,以便重新利用這些寄存器。
———————————————————————————————————————————————
控制線程
setjmp()和longjmp()是通過上述過程活動記錄實現的。goto只能在函數內跳動,而它們可以到函數外。
setjmp保存了程序的計數器和當前的棧頂指針,可能還有一些初始值。longjmp恢復這些值,有效地轉移控制并把狀態重置回保存狀態的時候。
這對函數最大的用途是錯誤恢復。只要還沒有從函數中返回,一旦發現一個不可恢復的錯誤,可以把控制轉移到主輸入循環,并從那里重新開始。相當于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????????? 打印程序中調用者/被調用者關系
dump -Lv??? 打印動態鏈接的信息
ldd???????????? 打印文件所需的動態庫
file???????????? 告訴你一個文件包含的內容(如可執行文件、數據、ASCII,shell,script,archive等)
time?????????? 顯示程序所使用的實際時間和CPU時間。
———————————————————————————————————————————————
附:什么是SVR4?我們為什么要選擇SVR4?zz
SVR4是UNIX操作系統的一種新的內核標準,是迄今為止內核版本最新的UNIX
SVR4并不代表一個具體的UNIX變體,而只是一個內核的標準。SVR4有極高的標準性,那意味著你學好了SVR4可以在所有SVR4內核的操作系統上進行統一的操作(不會產生學習了一個UNIX系統還要學習另外的困惑)
SVR4(UNIX System V Release4)是AT&T在1989年首次發行的;SVR4集成SVR3,4BSD,SunOS,以及XENIX的一些特性,還添加了一些新 功能,如實時調度,Korn shell,以及對STREAMS子系統的改進;SVR4是迄今為止最新的UNIX
SVR4的優點如下
1、標準性
符合SVID(AT&T的System V接口定義)、IEEE POSIX規范,以及X/OPEN財團的X/OPEN可移植導引。應該說AT&T公司出品的SVR4是UNIX味兒最濃的UNIX。現在流行的現 代UNIX大多都是基于SVR4的。
2、先進性
AT&T UNIX System V Release4 是迄今為止內核版本最新的UNIX。在這之后USL發行了UNIX SVR4.2,此后又有新的SVR4的發行,其中最新的是SVR4.2/ES/MP。它在SVR4.2的基礎上加入了安全性和多處理器的支持,并支持輕量 級進程。(這就是unixware2.1采用的內核)
SVR4.2支持內模塊的動態加載(在系統運行中,內核是可以動態變化的)這意味著改變內核而不需要重新啟動計算機。
另外,SVR4提供了新的圖形用戶界面(GUI) -- Motif和sun的openlook(openwindow)。
SVR4.2還增加了對PC新硬件的支持。
3、友好的用戶界面
廣大的操作系統愛好者往往喜歡從界面的友好性來評價操作系統。
對于字符終端用戶SVR4提供的是face界面(OAM)。它將常用的系統管理(如添加新用戶、備份…)圖形化了。還提供了在線幫助(類似于ScoAdmin)
對于圖形終端用戶,SVR4提供了openlook標準圖形界面。
4、改進的VM(虛擬內存)結構
SVR4的內存管理不再基于原SVR3中“區”的結構,而采用請求分頁技術。SVR4采用雙表針時鐘的頁面置換策略,這樣的改進降低了頁面失效率。
5、改進的進程管理
SVR4支持內核線程、用戶線程和輕量級進程。SVR4提供了一組系統調用,它是SVR3和BSD信號功能的超集。同時也支持老的不可靠的信號。
SVR4在進程調度方面做了很多改進,包括:
1)支持要求實時響應的多種應用程序。
2)把調度策略同實現它的機制相分離。
3)應用程序能夠控制它的優先級和調度。
4)定義了一個對內核有良好定義接口的調度框架。
5)允許新的調度策略以模塊方式加入,包括調度器動態加載的實現。
6)限制臨界時間性應用程序的調度延遲。
在進程通信方面SVR4使用流(STREAMS)作為它的基本框架來實現管道(pipes)和有名管道(FIFO)。SVR4的管道是雙向的,可同時進行讀寫操作。
在同步方面,加入了多處理機支持。并用自旋鎖代替了信號燈。
6、高級文件系統支持
SVR4除了支持SystemV傳統的文件系統s5fs之外,還加入了ufs和vxfs。
Ufs是伯克利快速文件系統,建立在s5fs的基礎之上,增加了硬盤的訪問速度,并節省了硬盤空間。這種文件系統支持長文件名(大于14個字符)、符號連 接和原子命名。并支持片段(slice)就是對磁盤塊的進一步劃分,用mkfs命令創建文件系統時可以指定slice的大小。一般為1,2,4或8。
Vxfs是Veritas高級文件系統。它是一種日志文件系統,同時提供了許多先進的功能。如系統崩潰的快速恢復、磁盤配額等等
7、設備管理的改進
SVR4支持內核模塊的動態加載,具有新的設備驅動程序。內核對驅動程序是透明的,大大簡化了驅動程序編寫的復雜性。
如果您是一位SVR4的愛好者與支持者,您就應該選擇SVR4的UNIX操作系統,如SUN 的 Solaris,IBM的AIX,SCO 的 Unixware等等。
轉載于:https://www.cnblogs.com/aquar/archive/2010/03/29/3451461.html
總結
以上是生活随笔為你收集整理的C专家编程-Chapter6 运行时数据结构(转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 不知是哪个家伙写的,相当的有才啊!
- 下一篇: 问卷调查系统