在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

程序從編譯到被執行的流程介紹

sakobpqhz6 ? 來源:平凡人筆記 ? 2023-03-15 09:11 ? 次閱讀

當掌握越來越多的基礎知識之后,你所看到的代碼視角和你之前看代碼的視角會發生一個翻天覆地的變化,就像你寫代碼看到的是一行一行代碼的邏輯,而高級程序員看到的是一行一行指令或者你寫函數調用是一個正常的函數調用,其他人看到的是調用鏈背后被調用的情況,所以學東西盡量學習一些基礎,這樣能夠帶給我們很不一樣的編程體驗,也能夠讓你了解整個程序的本質。當遇到瓶頸之后,更應該多學一些基礎知識來豐富自己的眼界。

首先看下編譯的過程,

b6346b74-c2ab-11ed-bfe3-dac502259ad0.png

源代碼會經過編譯器,首先編譯成匯編文件,匯編文件經過匯編器變成目標文件。在目標文件當中,函數調用地址是沒有被真正的鏈接起來的,鏈接的過程是需要經過鏈接器,把目標文件當中相關的地址信息給鏈接起來,最后形成可執行的文件。

c編譯舉例

b6457fcc-c2ab-11ed-bfe3-dac502259ad0.png

這是一個簡單的add函數,在main方法里面調用這個add函數,然后進行打印。

生成目標文件

gcc -c main.c

b6cfea5e-c2ab-11ed-bfe3-dac502259ad0.png

用gcc -c的命令可以生成一個目標文件,

看下生成的目標文件里的地址信息

objdump -d main.o

objdump反編譯看下目標文件存了哪些信息,

b7180f6e-c2ab-11ed-bfe3-dac502259ad0.png

b74e6424-c2ab-11ed-bfe3-dac502259ad0.png

這是一個.test段,程序最終在內存上面或磁盤上面存儲的時候,它不是無規律的存儲,最后被翻譯成機器碼之后,也是一段一段存儲的,每一段所存的內容是不一樣的,像.test段存儲的就是正常的代碼段也是函數段,而聲明的全局變量會存在.data段或.bss段。

這里只需要理解,我們寫的代碼被翻譯成機器碼大概的分段邏輯就行了。

左邊是這條指令的地址0 4 5 8 .... ,就是我們寫的程序加載到內存當中的時候是被加載成一條一條指令,然后每一個指令都會對應一個特定的地址,cpu在取的時候,就會取這個地址上面的信息,就可以知道這條指令地址所對應指令的具體內容。目標文件的這個地址是相對地址,相對于當前段的地址,當前段是.test段,所以是從0開始 按順序排下來。

callq在匯編里面是調用函數的指令,這里寫的是33 ,但其實在真正目標文件被鏈接成可執行文件之后,33會變成add函數的絕對地址。

被鏈接成可執行文件之后,看下整個代碼地址的變化,用gcc命令編譯了一個可執行文件,反匯編看下,將.test段的地址列出來了,它已經不是相對于.test段的相對地址了,而是一個絕對地址。

b7deaf70-c2ab-11ed-bfe3-dac502259ad0.pngb879aebc-c2ab-11ed-bfe3-dac502259ad0.png

然后看下調用callq add函數的時候 ,1149所對應的首地址是add函數的第一行。<>括號在真正的機器代碼中是不存在的,反匯編為了增加可讀性才顯示的。

在看了程序是怎么被編譯成可執行文件之后,我們又知道了可執行文件里面,每一條指令所對應的地址代表什么意思之后,來看下是如何被加載?

這里要明白一點,程序是在內存里面被執行的,被加載到內存之后,cpu才能從內存里面讀取并執行,所以有一個從磁盤加載到內存的過程,這個過程由加載器去完成的。

提到內存的話,就要提到cpu的實模式和保護模式。

在很早之前,cpu在實模式時期,我們的程序所使用的地址都是物理地址,就是真正的在內存芯片上所能看到的物理地址,使用物理地址之后,就會導致我們寫的程序被編譯成可執行文件之后,可執行文件是由鏈接器編譯成鏈接腳本生成的,然后在鏈接腳本里面可以指定程序的首地址,如果要指定首地址(有一個默認的首地址),在實模式下,指定了當前編譯程序的首地址之后,那它被加載到物理地址之后,這個首地址就只能是真正的被加載到物理地址的那個地方,如果它的首地址比如是0x10,那它被加載到的物理地址的首地址如果不是0x10 就會導致后面那些指令的順序出現問題,因為指令是順序排布的,就會導致后面的那些指令地址和可執行文件里面描述的這些指令地址是不吻合的。

這樣會導致callq函數會調用到錯誤的地址,所以在cpu的實模式下,調用程序,程序在執行的時候,它的首地址要固定住,這樣就會導致一個問題就是得考慮調得那個地址是不是可用的,調用期間內存是不是可用的,所以會演變成后面的cpu保護模式。

cpu保護模式能夠讓程序使用的是一個虛擬地址,現在的64位系統都是使用的頁式管理,基于這個分析一下。要明白虛擬地址,首先要明白地址空間的概念,地址空間可以理解為進程能用的一個地址范圍,比如進程能用的內存是512G,然后由于程序經過編譯之后是分段的,就認為這512G里面,0-10G是屬于.test段,10-20G是屬于.data段,20-200G屬于堆空間,其他范圍分:棧空間是哪個范圍,內核空間又是哪個范圍,只是將這段區間劃分為了具體的內容所在的這段范圍,但是不會實際的在內存上去分配這些內存,只是將范圍劃分出來,而實際保存的也是這些范圍,當需要用到這些范圍地址的時候,cpu才會去通過MMU列表里面去尋找這個虛擬地址所對應的物理地址,如果沒有這個映射關系,才會去真正的分配物理內存創建映射關系,如果可執行文件一開始沒有加載到內存,那么后續地址缺失是如何找到磁盤上面的文件位置的?所以需要看下可執行文件里面到底有哪些信息?

b8b27fa8-c2ab-11ed-bfe3-dac502259ad0.png

這里列出了可執行文件里面段的頭部信息,在段的頭部信息里面包含了虛擬地址、文件的偏移量,文件的偏移量可以理解為磁盤信息,可以通過偏移量去定位到在磁盤上的哪個位置,所以操作系統是可以這樣做的:在可執行文件里面能夠讀到段地址還有文件偏移地址,所以在進程被加載執行的時候,剛開始被加載的時候,是可以為這個進程創建頁表項,頁表項是能夠覆蓋每個段的地址還有文件偏移的地址,但是這個時候,只是標記這個頁表項所映射的這個映射關系,只是標記,并沒有真正的分配實際的物理內存,這樣等到頁缺失的時候 ,夠找到這個頁表項并并且能夠從這個頁表項的標記去發現沒有分配物理內存,這個時候再從磁盤上去讀,再建立映射關系,這樣就能夠達到在真正使用的時候再去分配物理內存的目的了。





審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    11045

    瀏覽量

    216100
  • GCC
    GCC
    +關注

    關注

    0

    文章

    109

    瀏覽量

    25251
  • 編譯器
    +關注

    關注

    1

    文章

    1657

    瀏覽量

    49918
  • 匯編器
    +關注

    關注

    0

    文章

    31

    瀏覽量

    11418

原文標題:程序從編譯到被執行的流程

文章出處:【微信號:IC學習,微信公眾號:IC學習】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    cypress3014在頭文件修改編譯后,時間不變,這樣頭文件的程序被執行嗎?

    你好,請問我在頭文件修改編譯后,時間不變,這樣頭文件的程序被執行嗎,怎么解決這個問題
    發表于 05-14 06:50

    cc2640 multirole工程代碼沒有被執行

    cc2640 multirole工程代碼沒有被執行?在使用cc2640 2.1版本的multirole工程時出現問題,當工程作為主機連接機時會出現一個問題,當機因為距離較遠等原因與工程主機斷開
    發表于 03-14 09:58

    C/C++程序編譯流程

    指令,并生成可重定位目標程序的.o文件,該文件為二進制文件,字節編碼是機器指令。匯編器是將匯編代碼轉變成機器可以執行的指令,每一個匯編語句幾乎都對應一條機器指令。所以匯編器的匯編過程相對于編譯器來講
    發表于 04-17 16:24

    異常處理程序沒有被執行

    Hy-ALL,我的問題是我的異常處理程序沒有被執行,而是Stand異常處理程序IS.我定義了我的異常處理程序:代替它,MPLAB提供的一般異常處理
    發表于 09-17 16:50

    定時器中斷實驗里的中斷服務是怎么被執行的?

    我試時,一直搞不明白,里面的中斷服務是怎樣被執行的呢?當TIM3產生中斷后,Keil 怎么會自動執行" void TIM3_IRQHandler(void)"這個服務程序的呢?是不是函數名相同就會
    發表于 09-18 23:21

    求芯片內部的程序執行流程

    想了解仿真連接仿真后,芯片內部的程序執行流程,請問有相關介紹的資料嗎?
    發表于 05-25 12:08

    mfc程序執行流程小結,MFC程序執行順序

     摘要:本文章主要以MFC程序執行流程執行順序等執行過程的剖析做出的結論,下面一起來看看原文的具體
    發表于 12-08 15:48 ?9723次閱讀
    mfc<b class='flag-5'>程序</b><b class='flag-5'>執行</b><b class='flag-5'>流程</b>小結,MFC<b class='flag-5'>程序</b>的<b class='flag-5'>執行</b>順序

    一文看懂python程序執行過程

    本文主要介紹的是python程序執行過程,首先介紹的是編譯過程,其次介紹的是過程圖解及
    發表于 04-26 18:18 ?1.8w次閱讀
    一文看懂python<b class='flag-5'>程序</b>的<b class='flag-5'>執行</b>過程

    中興通訊表示與中建五局屬于正常商業糾紛并非失信被執行

    就近日媒體報道中提到的中興通訊被中建五局申請強制執行的事宜,記者了解,此事系中興通訊與中建五局的正常商業糾紛,并非失信被執行
    發表于 12-26 09:13 ?638次閱讀

    時代芯存共有5項被執行人信息,總金額已經超過2.45億元

    目前,時代芯存共有5項被執行人信息,總金額已經超過2.45億元。知情人士指出,最新的被執行人信息或與此前拖欠的工程款有關。
    的頭像 發表于 03-05 14:10 ?5681次閱讀

    一條SQL語句是怎么被執行

    一直是想知道一條SQL語句是怎么被執行的,它執行的順序是怎樣的,然后查看總結各方資料,就有了下面這一篇博文了。 本文將從MySQL總體架構---》查詢執行流程---》語句
    的頭像 發表于 09-12 09:44 ?1687次閱讀
    一條SQL語句是怎么<b class='flag-5'>被執行</b>的

    羅永浩回應被執行信息清零

    近日,羅永浩對被執行信息清零做出了相關回應,稱被執行信息清零不等于債務已經全部償還完畢,自己還款遠超預期,目前已經在按照已達成的執行和解協議繼續履行,稱羅老師仍在努力工作。
    的頭像 發表于 01-06 11:14 ?1783次閱讀

    中斷服務子程序是如何被執行的 ?

    筆者在 《程序是如何在 CPU 中運行的(二)》中 PC 指針寄存器的角度分析了一級函數調用和二級函數調用執行的過程,那么中斷服務子程序...
    發表于 02-07 11:02 ?2次下載
    中斷服務子<b class='flag-5'>程序</b>是如何<b class='flag-5'>被執行</b>的 ?

    折疊屏手機鼻祖柔宇科技拖欠百萬合同款成失信被執行人,公司累計被執行超 1 億

    廣告公司達成和解協議,約定向后者分兩期支付合同欠款 110 余萬元,如未履行任何一期的付款義務,后者有權立即向法院申請強制執行。案件流程顯示,去年 9 月,柔宇科技公司首次被執行執行
    的頭像 發表于 03-01 22:18 ?562次閱讀

    程序編譯被執行流程

    當掌握越來越多的基礎知識之后,你所看到的代碼視角和你之前看代碼的視角會發生一個翻天覆地的變化,就像你寫代碼看到的是一行一行代碼的邏輯,而高級程序員看到的是一行一行指令或者你寫函數調用是一個正常的函數
    的頭像 發表于 03-15 09:11 ?721次閱讀
    主站蜘蛛池模板: 婷婷深爱 | 国产欧美一区二区日本加勒比 | 男女视频在线播放 | 色狠狠成人综合网 | 男女交性动态免费视频 | 天天射综合 | 刺激一区| 美国色网站 | 欧美一二| 一级特黄aaa免费 | 天天操天天艹 | 亚洲国产精品婷婷久久久久 | 天堂在线视频观看 | 亚洲插插 | 国产欧美亚洲精品第二区首页 | 男人午夜免费视频 | 国产毛片久久久久久国产毛片 | 在线观看免费av网 | 一级视频在线免费观看 | 欧美大片一区二区三区 | 手机亚洲第1页 | 黄色在线观看视频网站 | 新版天堂8在线天堂 | 美女黄色一级片 | 东方天堂网 | 伊人狼人在线 | 国产免费久久精品99久久 | 日韩欧美亚洲综合一区二区 | 最近2018年中文字幕免费图片 | 黄a级免费| 濑亚美莉vs黑人欧美视频 | 老色批在线播放视频网站免费 | 日本在线不卡一区二区 | 欧美三级黄视频 | 中文字幕一区二区视频 | 国产成人精品亚洲日本在线 | 久久sp | 日本免费人成在线网站 | 亚洲a人片在线观看网址 | 日本三级在线播放线观看2021 | 日本口工全彩无遮拦漫画大 |