色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

在rt-smart操作系統中elf加載運行要經過哪些步驟

RTThread物聯網操作系統 ? 來源:RTThread物聯網操作系統 ? 作者:我夏了夏天 ? 2022-11-02 09:57 ? 次閱讀

在用戶態應用程序處理的任務中,elf 加載運行是一個比較重要的步驟,下面就分析一下在 rt-smart 操作系統中,想要將一個應用程序運行起來要經過哪些步驟。

ELF 格式介紹

ELF 代表 Executable and Linkable Format。它是一種對可執行文件、目標文件和庫使用的文件格式。它在 Linux 下成為標準格式已經很長時間,ELF 一個特別的優點在于,同一文件格式可以用于內核支持的幾乎所有體系結構上。

RT-SMART 同樣也使用 ELF 作為可執行文件的格式,下面簡單介紹一下 ELF 文件格式。

ELF 文件布局和結構

下圖為 ELF 文件的基本布局:

2d7fecde-59e4-11ed-a3b6-dac502259ad0.png

上圖展示了 elf 文件的重要組成部分:

elf 文件頭,除了用于標識ELF文件的幾個字節之外,ELF頭還包含了有關文件類型和大小的有關信息

及文件加載后程序執行的入口點信息。

程序頭表(program header table)向系統提供了可執行文件的數據在進程虛擬地址空間中組織

方式的相關信息。它還表示了文件可能包含的段數目、段的位置和用途。

各個段保存了與文件相關的各種形式的數據。例如,符號表、實際的二進制碼、固定值(如字

符串)或程序使用的數值常數。

節頭表(section header table)包含了與各段相關的附加信息。

使用 readelf 工具可以讀取該類型文件中的各種數據結構。

關鍵數據結構

想要理解應用程序的加載運行過程,就必須要先了解 ELF 文件中的關鍵數據結構,知道可以通過 ELF 文件獲取那些程序加載所必須的關鍵信息,例如文件類型、目標體系架構、版本號、程序入口點以及程序運行所需要的數據段存儲在什么位置等等信息。這些信息都存放在 ELF 的相關數據結構中,那么現在就先了解一下 ELF 文件的相關數據結構吧。

下面是在 ELF 加載過程上下文數據結構,這個結構中包括了 eheader、pheader 和 sheader 三個 elf 的關鍵數據結構。

elf 頭表

 1typedefstruct
 2{
 3unsignedchare_ident[EI_NIDENT];/*前四個字節為0x7fELF,其他的字節位置都有特定的語義*/
 4Elf64_Halfe_type;/*用于區分ELF的文件類型,例如可重定位、可執行、動態庫、coredump文件*/
 5Elf64_Halfe_machine;/*指定了文件所需的體系結構*/
 6Elf64_Worde_version;/*保存了版本信息,用于區分不同的ELF變體,目前該規范只定義了版本1*/
 7Elf64_Addre_entry;/*程序入口點*/
 8Elf64_Offe_phoff;/*程序頭表在二進制文件中的偏移量*/
 9Elf64_Offe_shoff;/*節頭表所在的偏移量*/
10Elf64_Worde_flags;/*特定于處理器的標志*/
11Elf64_Halfe_ehsize;/*指定了ELF頭的長度,單位為字節*/
12Elf64_Halfe_phentsize;/*指定了程序頭表中一項的長度,單位為字節(所有項的長度都相同)*/
13Elf64_Halfe_phnum;/*指定了程序頭表中項的數目*/
14Elf64_Halfe_shentsize;/*指定節頭表中一項的長度,單位為字節(所有項的長度都相同)*/
15Elf64_Halfe_shnum;/*指定節頭表中項的數目*/
16Elf64_Halfe_shstrndx;/*包含各節名稱的字符串表在節頭表中的索引位置*/
17}Elf64_Ehdr;

程序頭表

 1typedefstruct
 2{
 3Elf64_Wordp_type;/*當前項描述的段的種類,例如可裝載段、動態鏈接、程序解釋等段類型*/
 4Elf64_Wordp_flags;/*保存了標志信息,定義了該段的訪問權限,RWX*/
 5Elf64_Offp_offset;/*給出了所描述段在文件中的偏移量(從二進制文件起始處開始計算,單位為字節)*/
 6Elf64_Addrp_vaddr;/*給出了段的數據映射到虛擬地址空間中的位置(對于可裝載段類型)*/
 7Elf64_Addrp_paddr;/*只支持物理尋址,不支持虛擬尋址的系統,將使用p_paddr保存信息*/
 8Elf64_Xwordp_filesz;/*指定了段在二進制文件中的長度*/
 9Elf64_Xwordp_memsz;/*制定了段在虛擬地址空間中的長度(單位為字節),與文件中物理的長度差值可通過階段數據或者填充0字節來補償*/
10Elf64_Xwordp_align;/*指定了段在內存和二進制文件中對其的方式(p_vaddr和p_offset地址必須是模p_align的,也就是p_align的倍數),例如p_align的值為0x1000=4096,這意味著段必須對其到4KB頁*/
11}Elf64_Phdr;

節頭表

 1typedefstruct
 2{
 3Elf64_Wordsh_name;/*指定了節的名稱,其值不是字符串本身,而是字符串表的一個索引*/
 4Elf64_Wordsh_type;/*指定了節的類型,例如不可用、保存程序相關信息、符號表、包含字符串表的節、重定位信息、散列表、動態鏈接信息等類型*/
 5Elf64_Xwordsh_flags;/*節是否可寫(SHF_WRITE),是否將為其分配虛擬內存(SHF_ALLOC),節是否包含可執行的機器代碼(SHF_EXECINSTR)*/
 6Elf64_Addrsh_addr;/*指定節映射到虛擬地址空間中的位置*/
 7Elf64_Offsh_offset;/*指定了節在文件中的開始位置*/
 8Elf64_Xwordsh_size;/*指定了節的長度,單位為字節*/
 9Elf64_Wordsh_link;/*引用另一個節頭表項,可能根據節類型而進行不同的解釋*/
10Elf64_Wordsh_info;/*與上一項聯用*/
11Elf64_Xwordsh_addralign;/*指定了節數據在內存中對齊的方式*/
12Elf64_Xwordsh_entsize;/*指定了節中各數據項的長度,前提是這些數據項的長度都相同,例如字符串表*/
13}Elf64_Shdr;

在 rt-smart 實際編碼實現的過程中,為了方便數據傳遞,設計了一個包含上述三種數據類型的結構,利用該數據結構可以使加載過程實現更加簡潔易懂,如下所示:

 1structelf_load_context
 2{
 3intfd;/*應用程序文件fd*/
 4intlen;/*用于臨時使用的len*/
 5uint8_t*load_addr;/*用于臨時使用的加載地址*/
 6structrt_lwp*lwp;/*進程句柄*/
 7structprocess_aux*aux;/*進程輔助信息句柄*/
 8rt_mmu_info*m_info;/*進程mmu信息*/
 9Elf_Ehdreheader;/*elf頭表*/
10Elf_Phdrpheader;/*程序頭表*/
11Elf_Shdrsheader;/*節頭表*/
12structmap_rangeuser_area[2];/*在用戶空間需要映射的地址空間,0用于代碼段,1用于數據段*/
13};

ELF 標準節

ELF 標準定義了若干固定名稱的節。這些用于執行大多數目標文件所需的標準任務。所有名稱都從點開始,以便與用戶定義節或非標準節相區分,最重要的標準節如下所示:

2d99de00-59e4-11ed-a3b6-dac502259ad0.png

有了以上基礎概念,就可以來探索真正的代碼實現了。

探索程序加載代碼實現

執行一個新的應用程序功能由 lwp_execve 函數來實現,該函數會初始化好一個進程所需要的運行環境,然后在該環境中啟動第一個線程,也就是 main 線程。

暫且先不關注進程 PID 申請以及的 mmu 表初始化等準備工作,將注意力集中在 lwp_load 函數上。該函數將執行如下操作:

打開 elf 文件,返回文件 fd

調用 load_elf 函數開始執行應用程序加載

在 load_elf 函數中,將執行如下操作:

檢查 elf 頭,判斷其魔數、架構類型、版本號等是否符合要求

判斷是靜態加載還是動態加載

檢查程序入口地址是否為有效的用戶態地址

遍歷讀取程序頭表以及程序復制信息,將其加載到進程的用戶空間里

遍歷讀取節頭表,根據節頭表中的信息,計算在用戶態需要需要分配多大的地址空間用于存放 text 段以及 data 段

根據上一步驟的計算,修改進程的映射表,真正為數據段分配用戶態地址空間

遍歷節頭表,程序運行所需要數據段加載到用戶地址空間中

通過上面的操作,ELF 文件中所有關于程序啟動運行所需的數據就都準備好了,接下來就可以在此基礎上啟動第一個線程,也就是 main 線程了。相關的代碼細節在這里就不做贅述了,源代碼中都添加了詳盡的注釋,可以自行查看。

總結

用戶態進程代碼量較大,同時由于復雜度過高也不容易理解,現在代碼經過完善,復雜度降低以后,可讀性方面有了巨大提升。想要深入了解用戶態的相關實現,還需要至少了解另外三個主題:

進程切換過程中底層架構級別的匯編代碼

進程資源管理相關內容,例如 pid、tid 的分配,用戶態內存空間映射等

SMP 多核調度原理與實現






審核編輯:劉清

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

    關注

    0

    文章

    14

    瀏覽量

    7156
  • LINUX內核
    +關注

    關注

    1

    文章

    316

    瀏覽量

    21674
  • RTThread
    +關注

    關注

    8

    文章

    132

    瀏覽量

    40907

原文標題:RT-Smart ELF 應用程序加載運行過程分析

文章出處:【微信號:RTThread,微信公眾號:RTThread物聯網操作系統】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    RT-Thread Smart 入門指南

    Cortex-A 系列芯片,MIPS 芯片,帶 MMU 的 RISC-V 芯片等。rt-smart RT-Thread 操作系統的基礎上啟用獨立、完整的進程方式,同時以混合微內核
    發表于 03-29 06:40

    RT-Smart的資料合集

    可知,RT-Smart 32 位內核運行在地址空間的高地址,而用戶程序代碼運行在低地址。2、RT-Smart物理頁內存管理詳解伙伴系統
    發表于 03-22 15:06

    [IMX6ULL]RT-Smart系統下的軟件移植筆記推薦

    ,面向帶 MMU,中高端應用的芯片,例如 ARM Cortex-A 系列芯片,MIPS 芯片,帶 MMU 的 RISC-V 芯片等。rt-smart RT-Thread 操作系統
    發表于 03-25 16:25

    快速上手RT-Thread Smart入門指南

    ,帶 MMU 的 RISC-V 芯片等。rt-smart RT-Thread 操作系統的基礎上啟用獨立、完整的進程方式,同時以混合微內核模式執行。
    發表于 04-01 17:38

    分析一下rt-smart操作系統中將一個應用程序運行起來經過哪些步驟

    1、RT-Smart ELF 應用程序加載運行在用戶態應用程序處理的任務elf 加載運行是一
    發表于 04-13 17:17

    rt-smart操作系統中將ELF應用程序運行起來經過哪些步驟

    1、RT-Smart ELF應用程序加載運行在用戶態應用程序處理的任務elf 加載運行是一個
    發表于 06-13 18:18

    D1哪吒開發板rt-smart內核固件的燒寫與運行步驟

    NandFlash 加載運行,需要借助bootloader,如 U-Boot借助全志的 tina Linux,把 Linux 內核文件替換為 rt-smart內核文件,運行 rt-smart
    發表于 06-17 11:06

    基于RT-Thread操作系統衍生rt-smart實時操作系統簡介

    執行。rt-smart 是一款高性能混合微內核操作系統傳統嵌入式操作系統劃分rt-smart
    發表于 06-22 17:56

    開機體驗rt-smart:webserver網關

    ,ART-Pi Smart 開發板會通過 u-boot 自動加載 emmc rt-smart 內核固件文件(/kernel/rtthread.bin)到內存去
    發表于 06-30 11:17

    rt-smart和master分支有哪些不同呢

    還是共用一套代碼。2.rt-smart是針對帶有mmu的操作系統,采用微內核的設計思想,目前發現源碼里面大量的層次結構還是沿用之前的master分支,哪里采用了微內核呢?3.帶有mmu的ARM A系列
    發表于 10-14 10:52

    睿賽德科技微內核操作系統rt-smart已支持Arm Mali GPU

    睿賽德科技今日宣布,其微內核操作系統 RT-Thread Smart(簡稱:rt-smart)已支持Arm Mali GPU,為實時操作系統
    的頭像 發表于 09-29 10:42 ?2102次閱讀

    RT-Smart ELF應用程序加載運行過程分析

    在用戶態應用程序處理的任務elf 加載運行是一個比較重要的步驟,下面就分析一下 rt-smart
    的頭像 發表于 11-02 09:57 ?981次閱讀

    優雅的D1S上運行RT-Smart

    合并到 RT-Smart 主倉庫,于是我來展示一下 D1S 運行 RT-Smart步驟,供大家參考~ 做嵌入式開發的人對 RT-Thre
    的頭像 發表于 11-16 20:15 ?2911次閱讀

    絲滑的RT-Smart用戶態運行LVGL

    /rt-thread.git 更詳細環境配置請移步到— RT-Thread-優雅のD1S上運行RT-Smart 「Rb君」,公眾號:RTT
    的頭像 發表于 11-22 20:20 ?1279次閱讀

    零基礎上手rt-smart適配bsp

    RT-Thread Smart(簡稱rt-smart)是基于RT-Thread操作系統衍生,面向帶MMU(Memory Management
    的頭像 發表于 08-08 10:34 ?1135次閱讀
    零基礎上手<b class='flag-5'>rt-smart</b>適配bsp
    主站蜘蛛池模板: 大香网伊人久久综合观看| 黄色jjzz| 欧美高清vivoesond在线播放| 1788福利视频在视频线| 欧美高清 videos sexo| 成人小视频在线观看免费| 午夜国产大片免费观看| 娇小亚裔被两个黑人| 18禁无遮遮挡羞漫画免费阅读| 欧美伊人久久大香线蕉综合69| 国产成人AV永久免费观看| 亚洲一区免费在线观看| 尿孔 调教 扩张| 国产精品夜夜春夜夜爽久久小| 又色又爽又黄gif动态视频 | 中文字幕在线久热精品| 青青青青草| 后入式狂顶免费视频| 99久久免费视频6| 天堂so导航| 麻豆人妻无码性色AV| 国产成人免费视频| 在线色av| 天天操狠狠操夜夜操| 久久视频在线视频观看天天看视频 | 国产精品嫩草影院在线观看免费| 在线播放真实国产乱子伦| 日韩av国产av欧美天堂社区| 九九99热久久999精品| 村上里沙快播| 中文字幕亚洲欧美日韩2o19| 色欲人妻无码AV精品一区二区| 久久久擼擼擼麻豆| 国产成人在线免费| 69丰满少妇AV无码区| 亚洲国产韩国欧美在线不卡| 欧美一区二区三区激情视频| 久久免费看少妇高潮A片JA | 国家产午夜精品无人区| 拔萝卜视频免费看高清| 与子敌伦刺激对白亂輪亂性|