日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux 可执行文件结构与进程结构

發布時間:2023/12/31 linux 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux 可执行文件结构与进程结构 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Linux可執行文件結構

在 Linux 下,程序是一個普通的可執行文件,以下列出一個二進制可執行文件的基本情況:



可以看出,此可執行文件在存儲時(沒有調入到內存前)分為代碼區(text)、數據區(data)和未初始化數據區(bss)3 個部分。各段基本內容說明如下:


代碼區

存放 CPU 執行的機器指令。通常代碼區是可共享的(即另外的執行程序可以調用它),使其可共享的目的是對于頻繁被執行的程序,只需要在內存中有一份代碼即可。代碼區通常是只讀的,使其只讀的原因是防止程序意外地修改了它的指令。另外,代碼區還規劃了局部變量的相關信息。


代碼區的指令包括操作碼和操作對象(或對象地址引用)。如果是立即數(即是具體的數值),將直接包含在代碼中,如果是局部數據,將在運行時在棧區分配空間,然后再引用該數據的地址,如果是未初始化數據區和數據區,在代碼中同樣將引用該數據的地址。


全局初始化數據區/靜態數據區(數據段)

該區包含了在程序中明確被初始化的全局變量、已經初始化的靜態變量(包括全局靜態變量和局部靜態變量)和常量數據(如字符串常量)。

例如,一個不在任何函數內聲明(全局變量),如下:

int count = 100;


使得變量 count 根據其初始值被存儲初始化數據區中。


在任意位置定義靜態變量方式如下:

static int num = 200;

這聲明了一個靜態數據并初始化,如果在任意函數體外聲明,則表示其為一個靜態全局變量,如果在函數體內(局部),則表示其為一個局部靜態變量。另外,如果在一個函數名前加上 static,則表示此函數只能再當前文件中被調用。


未初始化數據區(又叫 BSS 區)

存入的是全局未初始化變量和未初始化靜態變量。未初始化數據區的數據在程序開始執行之前被內核初始化為 0 或者空(NULL)。

例如,一個不在任何函數內聲明的未初始化變量。

long sum[1000];將 sum 存儲到未初始化數據區。


Linux進程結構

在 Linux 系統下,如果將某個可執行文件加載到內存運行,則將演變成一個或多個進程(多個進程的原因是進程在運行時可以再創建新的進程,但加載時只有一個進程)。進程是 Linux 事務管理的基本單元,所有的進程均擁有自己獨立的處理環境和系統資源。進程的環境由當前系統狀態及其父進程信息決定和組成的。


下圖為可執行文件存儲結構和 Linux 進程基本結構(部分)的對照圖。


一個進程是一個運行著的程序段,一個進程主要包括在內存中申請的空間,代碼(加載的程序,包括代碼段,數據段,BSS),堆,棧,以及內核提供的內核進程信息結構體?

task_struct (位置在 /usr/include/linux/sched.h)、打開的文件、上下文(指進程執行活動全過程的靜態描述)信息以及掛起的信號等。


(1)代碼區(text segment)。加載的是可執行文件代碼段,其加載到內存中的位置由加載器完成。
(2)全局初始化數據區/靜態數據區(Data Segment)。加載的是可執行文件數據段,存儲于數據段(全局初始化,靜態初始化數據)的數據的生存周期為整個程序運行過程。
(3)未初始化數據區(BSS)。加載的是可執行文件BSS段,位置可以分開亦可以緊靠數據段,存儲于數據段的數據(全局未初始化,靜態未初始化數據)的生存周期為整個程序運行過程。
(4)棧區(stack)。由編譯器自動分配釋放,存放函數的參數值、返回值、局部變量等。在程序運行過程中實時加載和釋放,因此,局部變量的生存周期為申請到釋放該段棧空間。
(5)堆區(heap)。用于動態內存分配。堆在內存中位于BSS區和棧區之間。一般由程序員分配和釋放,若程序員不釋放,程序結束時有可能由OS回收。


系統之所以分成這么多個區域,主要基于以下考慮

  • 代碼段和數據段分開,運行時便于分開加載,在哈佛體系結構的處理器將取得更好得流水線效率。
  • 代碼時依次執行的,是由處理器 PC 指針依次讀入,而且代碼可以被多個程序共享,數據在整個運行過程中有可能多次被調用,如果將代碼和數據混合在一起將造成空間的浪費。
  • 臨時數據以及需要再次使用的代碼在運行時放入棧中,生命周期短,便于提高資源利用率。
  • 堆區可以由程序員分配和釋放,以便用戶自由分配,提高程序的靈活性。


C 各存儲類型比較



參考資料:《Linux高級程序設計》

總結

以上是生活随笔為你收集整理的Linux 可执行文件结构与进程结构的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 中文字幕不卡在线观看 | 亚洲精品视频在线看 | 九色tv | 亚洲字幕| 国产欧美日韩成人 | 香蕉视频一区二区 | 国产三级在线看 | 黄色福利网 | 亚洲国产美女视频 | 国产真人做爰毛片视频直播 | 床戏高潮做进去大尺度视频网站 | 国产a级免费视频 | 欧美激情视频网址 | av加勒比在线 | 97成人资源 | 青青青在线观看视频 | 亚洲天堂自拍偷拍 | 天堂av手机在线 | 91caob| 亚洲av综合色区无码一区爱av | 美女又黄又免费的视频 | 午夜精品久久久久久久无码 | 久久久久久欧美精品se一二三四 | 哺乳期喷奶水丰满少妇 | 久久香蕉综合 | 欧美另类极品videosbest最新版本 | 生活片一级片 | 久久久91精品 | 欧美午夜精品一区二区三区 | 日本视频在线免费观看 | 天天舔天天爱 | 我和单位漂亮少妇激情 | 日本va欧美va国产激情 | 国产精品jizz | 夜夜躁日日躁狠狠久久av | 国产1区在线观看 | xxxx视频在线| 国产精品一区二区性色av | 午夜影院一区二区 | 性久久久久久久久久 | 影音先锋中文字幕一区二区 | 深夜在线网站 | 91丨国产丨白丝 | 国产午夜精品久久久久久久 | 欧美日韩成人免费观看 | 天堂av2020 | 国产精品免费一区二区三区在线观看 | 老司机精品在线 | 中文字幕免费在线看线人 | 亚洲第一视频 | 在线观看毛片av | 欧美大白屁股 | www.色午夜.com| 五月天激情综合网 | 免费的毛片 | 曰批又黄又爽免费视频 | 亚州春色 | 97人妻精品一区二区三区免费 | 久久九九国产精品 | 日本激情一区二区三区 | 日韩精品一区二区在线播放 | 国产精品久久久影院 | 69xxx少妇按摩视频 | 日韩乱码一区二区 | aise爱色av | 国产午夜精品久久久久久久 | 成人激情在线 | 青娱乐av | 午夜理伦三级做爰电影 | 蜜臀av粉嫩av懂色av | 国产swag在线 | 免费三级大片 | a级大片在线观看 | 国产人免费人成免费视频 | 国产高清在线不卡 | 国产一区二区三区福利 | 成人合集 | 浪浪视频在线观看 | 久久久久人妻一区精品色 | 国产 福利 在线 | 国产伦精品一区二区三区视频免费 | 特黄特色特刺激免费播放 | 一区二区男女 | jvid在线| 女女互磨互喷水高潮les呻吟 | 我们的2018中文免费看 | 伊人亚洲精品 | 一区国产视频 | 亚洲性久久 | 国产一级片 | 免费看片亚洲 | 成人在线播放网站 | 午夜簧片| 成人在线观看一区 | 欧美男同又粗又长又大 | 欧美午夜精品久久久久免费视 | 亚洲一区在线观看视频 | 椎名由奈av一区二区三区 | 天天夜夜啦啦啦 |