国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Linux從頭學:如何告訴 CPU,代碼段、數據段、棧段在內存中什么位置?

系統 Linux
前兩篇文章,我們一起學習了 8086 處理器中關于 CPU、內存的基本使用方式,重點對段寄存器和內存的尋址方式進行了介紹。那么今天我們就繼續 8086 下的學習,來看看一個相對“完整”程序的基本結構。

[[411088]]

  • 幾個重要的段寄存器
  • Linux 2.6 中的線性地址區間
  • 一個“完整”的 8086 匯編程序

前兩篇文章,我們一起學習了 8086 處理器中關于 CPU、內存的基本使用方式,重點對段寄存器和內存的尋址方式進行了介紹。

可能有些小伙伴會對此不屑:現在都是多核的現代處理器,操作系統已經變得非常的強大,為何還去學習這些古董知識?

前幾天看到下面這段話,可以來回答這個問題:

“我們都希望學習最新的、使用的東西,但學習的過程是客觀的。”

“任何合理的學習過程(盡可能排除走彎路、盲目探索、不成系統)都是一個循序漸進的過程。”

“我們必須先通過一個易于全面把握的事物,來學習和探索一般的規律和方法。”

就拿學習 Linux 操作系統來說,作為一個長期的學習計劃,不太可能一上來就閱讀最新的 Linux 5.13 版本的代碼。

更有可能是先學習 0.11 版本,理解了其中的一些原理、思想之后,再循序漸進的向高版本進行學習、探索。

那么對于 《Linux 從頭學》這個系列的文章來說,我是希望自己能夠把學習路線再拉長一些,從更底層的硬件機制、驅動原理開始,由簡入繁,一步一步最終把 Linux 操作系統這個塊硬骨頭給啃下來。

那么今天我們就繼續 8086 下的學習,來看看一個相對“完整”程序的基本結構。

幾個重要的段寄存器

在 x86 系統中,段尋址機制以及相關的寄存器是如此的重要,以至于我忍不住在這里,把幾個段寄存器再小結一下。

圖片
  • 代碼段:用來存放代碼,段的基地址放在寄存器 CS 中,指令指針寄存器 IP 用來表示下一條指令在段中的偏移地址;
  • 數據段:用來存放程序處理的數據,段的基地址存放在寄存器 DS 中。對數據段中的某個數據進行操作時,直接在匯編代碼中通過立即數或寄存器來指定偏移地址;
  • 棧段:本質上也是用來存放數據,只不過它的操作方式比較特殊而已:通過 PUSH 和 POP 指令來進行操作。段的基地址存放在寄存器 SS 中,棧頂單元的偏移地址存放在寄存器 IP 中。

這里的段,本質上是我們把內存上的某一塊連續的存儲空間,專門存儲某一類的數據。

我們之所以能夠這么做,是因為 CPU 通過以上幾個寄存器,讓我們這樣的“安排”稱為一種可能。

一句話總結:CPU 將內存中的某個段的內容當做代碼,是因為 CS:IP 指向了那里;CPU 將某個段當做棧,是因為 CS:SP 指向了那里。

在之前的一篇文章中,演示了 ELF 格式的可執行文件中,具體包含了哪些段《Linux系統中編譯、鏈接的基石-ELF文件:扒開它的層層外衣,從字節碼的粒度來探索》:

圖片

雖然這張圖中描述的段結構更復雜,但是從本質上來說,它與 8086 中描述的段結構是一樣的!

Linux 2.6 中的線性地址區間

在一個現代操作系統中,一個進程中使用的的地址空間,一般稱作虛擬地址(也稱作邏輯地址)。

虛擬地址首先經過段轉換,得到線性地址;然后線性地址再經過分頁轉換,得到最終的物理地址。

圖片
  • 這里再啰嗦一下,很多書籍中隊內存地址的稱呼比較多,都是根據作者的習慣來稱呼。
  • 我是按照上圖的方式來理解的: 編譯器產生的地址叫做虛擬地址,也叫做邏輯地址,然后經過兩級轉換,得到最終的物理地址。

在 Linux 2.6 代碼中,由于 Linux 把整個 4 GB 的地址空間當做一個“扁平”的結果來處理(段的基地址是 0x0000_0000,偏移地址的最大值是 4GB),因此虛擬地址(邏輯地址)在數值上等于線性地址。

我們再結合上次給出的這張圖來理解:

圖片

這張圖的意思是:在 Linux 2.6 中,用戶代碼段的開始地址是 0,最大范圍是 4 GB;用戶數據段的開始地址是 0,最大范圍也是 4 GB;內核的數據段和代碼段也是如此。

圖片
  • 為什么:虛擬地址(邏輯地址)在數值上等于線性地址?
  • 線性地址 = 段基址 + 虛擬地址(偏移量),因為段基址為 0 ,所以線性地址在數值上等于虛擬地址。

Linux 之所以要這樣安排,是因為它不想過多的利用 x86 提供的段機制來進行內存地址的管理,而是想充分利用分頁機制來進行更加靈活的地址管理。

還有一點需要提醒一下:

在上述描述的文字中,我都會標明一個機制或者策略,它是由 x86 平臺提供的,還是由 Linux 操作系統提供的。

對于分頁機制也是如此,x86 硬件提供了分頁機制,但是 Linux 在 x86 提供的這個分頁機制的基礎上,進行了擴展,以達到更加靈活的內存地址管理目的。

因此,各位小伙伴在看一些書籍的時候,心中要有一個譜:當前描述內容的上下文環境是什么。

當我們創建一個進程的時候,在內核中就會記錄這個進程所擁有的所有線性地址區間。

進程所擁有的所有線性地址區間是一個動態的過程,根據程序的需求隨時進行擴展或縮小。例如:把一個文件映射到內存,動態加載/卸載一個動態庫等等。

我們知道,內核在操作物理內存的時候,是通過“頁框”這個單位來管理的。

圖片

一個頁框可以包含 1-n 個頁,每一頁的大小一般是 4 KB,這是對物理內存的管理。

一個線性地址區間可以包含多個物理頁。每一個線性地址最終通過多級的頁表轉換,來最終得到一個物理地址。

注意:上圖中,線性地址區間1,映射到物理地址空間中的 N 個 Page,這些 Page 有可能是連續的,也有可能不是連續的。

雖然在物理內存中是不連續的,但是由于被分頁轉換機制進行了屏蔽,我們在應用程序中都是按照連續的空間來使用的。

一個“完整”的 8086 匯編程序

我們再繼續回到 8086 系統中來。

這里描述的地址,經過段地址轉換之后,就是一個物理地址,沒有經過復雜的頁表轉換。

這也是我們以 8086 系統作為學習平臺的目的:拋開復雜的操作系統,直接探索底層的東西。

在這個最簡單的匯編程序中,會使用到 3 個段:代碼段,數據段和棧段。

前面已經說到:所謂的段,就是一個地址空間。既然是一個地址空間,必然包含 2 個元素:從什么地方開始,長度是多少。

還是直接上代碼:

  1. assume ds:addr1, ss:addr2, cs:addr3 
  2.  
  3. addr1 segment           ; 把數據段安排在這個位置 
  4.         db 32 dup (0)   ; 這 32 個字節,是數據段的大小 
  5. addr1 end 
  6.  
  7. addr2 segment           ; 把棧段安排在這個位置 
  8.         db 32 dup(0)    ; 這 32 個字節,是棧段的大小 
  9. addr2 end 
  10.  
  11. addr3 segment           ; 把代碼段安排在這個位置 
  12. start    
  13.         mov ax, addr1 
  14.         mov ds, ax      ; 設置數據段寄存器 
  15.          
  16.         mov ax, addr2 
  17.         mov ss, ax      ; 設置棧段寄存器 
  18.         mov sp, 20h     ; 設置棧頂指針寄存器 
  19.          
  20.         ...             ; 其他代碼 
  21. addr3 ends 
  22.  
  23. end start 

以上就是一個匯編代碼的基本程序結構,我們給它安排了 3 個段。

3 個標號:addr1、addr2 和 addr3,代表了每一個段的開始地址。在代碼段的開始部分,把數據段標號 addr1 代表的地址,賦值給 DS 寄存器;把棧段標號 addr2 代表的地址,賦值給 SS 寄存器。

  • 這里的標號,是不是與 C 語言中的 goto 標號很類似?都是表示一個地址。

注意這里賦值給棧頂指針 SP 寄存器的值是 20H。

因為棧段的使用是從高地址向低地址方向進行的,所以需要把棧頂指針設置為最大地址單元的下一個地址空間。

圖片

 假設把第一個數據入棧時(eg: 先執行 mov ax, 1234h,再執行 push ax),CPU 要做的事情是: 先執行 SP = SP - 2,此時 SS:SP 指向 1000:001E,然后再把 1234h 存儲到這個地址空間:

圖片

 另外,代碼中最后一句 end start,用來告訴編譯器:代碼段中 start 標號代表的地址,就是這個程序的入口地址,編譯之后這個入口地址信息也會被寫入可執行程序中。

當可執行文件被加載到內存中之后,加載程序會找到這個入口地址,然后把 CS:IP 設置為指向這個入口地址,從而開始執行第一條指令。

我們再來對比一下《Linux系統中編譯、鏈接的基石-ELF文件:扒開它的層層外衣,從字節碼的粒度來探索》中列出的 ELF 可執行文件中的入口地址,它與上面 8086 下的 start 標號代表的入口地址,在本質上都是一樣的道理:

圖片

本文轉載自微信公眾號「 IOT物聯網小鎮」,可以通過以下二維碼關注。轉載本文請聯系 IOT物聯網小鎮公眾號。

【編輯推薦】

 

責任編輯:姜華 來源: IOT物聯網小鎮
相關推薦

2021-07-07 11:35:17

Linux內存段尋址

2019-05-28 10:32:29

TCPUDP SYN

2020-04-03 10:14:57

內存蠕蟲代碼web安全

2021-05-07 07:50:44

Numactl內存代碼

2013-01-16 09:11:26

Wi-Fi會議話筒

2015-03-27 11:34:59

JavaJava編寫引發內存泄露

2009-11-05 09:42:42

Visual Stud

2009-05-18 16:59:42

代碼PHP編碼

2011-03-18 10:16:13

LinuxiptablesIP

2010-01-20 10:39:52

Linuxcore

2020-11-09 14:15:23

代碼菜鳥老司機

2020-01-03 10:24:06

Python 開發編程語言

2011-08-15 13:29:50

jQuery

2022-05-01 21:49:06

Python

2022-01-16 08:00:28

PythonFor循環

2021-08-23 06:59:38

Linux內核代碼

2010-10-13 16:49:56

MySql查詢時間段

2019-09-16 09:08:15

Python收藏C語言

2014-07-08 09:21:10

死代碼創意歌曲

2020-12-31 10:14:42

防注入代碼繞過
點贊
收藏

51CTO技術棧公眾號

天堂影视av| 久久福利一区| 国产亚洲美女久久| 国产黄网站在线观看| 亚洲高清免费观看| 黄网站免费入口| 欧美国产乱子伦| 人妻av中文系列| 国产成人精品亚洲777人妖| 欧美日韩精品免费观看视一区二区| 亚洲色图二区| 亚洲一区二区三区视频| 黑人操亚洲人| 国产成人精品视频| 美女一区2区| 羞羞色国产精品| 女同久久另类99精品国产| 欧美激情按摩在线| 99ri日韩精品视频| 性欧美长视频免费观看不卡 | 欧美激情在线观看视频免费| 97在线国产视频| 高清视频一区二区| 国内精品视频一区二区三区| 韩国av一区二区三区在线观看| 日韩欧美精品一区二区| 日本亚洲欧美天堂免费| 日韩av电影免费播放| 日本不卡123| av磁力番号网| 国产不卡在线一区| 国产黄页在线观看| 中文字幕免费观看一区| 国产不卡视频| 一本久久a久久免费精品不卡| 香蕉视频网站在线观看| 日韩一级精品视频在线观看| ****av在线网毛片| 色777狠狠综合秋免鲁丝| 国产一区二区| 国产精品一久久香蕉国产线看观看| 午夜影院欧美| 欧洲精品一区色| 国产精品正在播放| 婷婷免费在线观看| 色综合久久久久综合99| 成人短视频在线观看| 亚洲激情国产精品| 国产色99精品9i| 国产成人免费91av在线| 精品成人国产| 欧美与动交zoz0z| 中文字幕精品在线不卡| 男人的天堂在线视频| 亚洲第一区在线观看| 伊色综合久久之综合久久| 国产美女精品免费电影| 久久精品伊人| 亚洲综合在线网站| 欧美色窝79yyyycom| 先锋欧美三级| 成人精品一区二区三区电影黑人| 久久久亚洲人| 欧美婷婷精品激情| 欧美日韩国产天堂| 久久久91麻豆精品国产一区| 国产有码一区二区| 丁香啪啪综合成人亚洲小说 | 国产精品视频免费在线| 久久婷婷一区| 日本成人黄色网| 在线观看一区日韩| 日本欧美在线| 精品久久精品久久| 亚洲国产成人私人影院tom| 91这里只有精品| 97精品免费视频| 奇米色777欧美一区二区| 69国产精品| 亚洲欧美成人在线| 99九九热只有国产精品| 香港三级日本三级a视频| 懂色aⅴ精品一区二区三区蜜月 | 香蕉久久夜色精品国产更新时间| 欧美xxxx黑人又粗又长密月 | 性欧美lx╳lx╳| 亚洲高清视频一区二区| 夜夜亚洲天天久久| 欧美日韩国产网站| 国产精品一区二区三区观看| 26uuu久久综合| 欧美xxxbbb| 亚洲jizzjizz日本少妇| 国产成人丝袜美腿| 最新av网站在线观看| 欧美中文字幕在线播放| 国产麻豆成人精品| 国产在线观看黄| 欧美性受xxxx白人性爽| 国产一区二区成人久久免费影院 | 亚洲欧美日韩在线| 女生影院久久| 久久综合给合久久狠狠色| 亚洲高清不卡在线| 午夜视频在线观看精品中文| 手机在线视频你懂的| 欧美日韩一区三区四区| 欧美在线电影| 久久撸在线视频| 日韩在线中文字幕| 精一区二区三区| 毛片在线看片| 成人资源av| 精品国产1区2区| 伊人春色精品| 午夜免费福利在线| 在线观看中文字幕亚洲| 免费在线看一区| 天堂av最新在线| 欧洲亚洲一区二区| 欧美一级日韩一级| 国产精品免费看| av电影在线观看一区二区三区| 91久久精品国产91久久性色| 一区二区三区在线观看动漫| 欧美综合自拍| 四虎国产成人永久精品免费| 久久久久久久网站| 欧美极品美女视频| 国产suv精品一区| 杨幂毛片午夜性生毛片| 欧美成人激情图片网| jlzzjlzz亚洲日本少妇| av在线一区不卡| 欧美三级一级片| 久久精品在这里| 国内精品福利| 巨茎人妖videos另类| 1234区在线观看视频免费| 蜜桃日韩视频| 国产一区二区片| 日本一区二区三区在线视频| 导航艳情国产电影| 99久热在线精品视频观看| 不卡一区2区| 好吊一区二区三区| 国产在线观看一区二区| 激情亚洲综合在线| 蜜臀av一级做a爰片久久| 免费看成人吃奶视频在线| 99精品国产九九国产精品| 午夜激情在线观看| 91久久精品国产91久久| 亚洲欧洲免费视频| 亚洲网址你懂得| 日韩高清欧美高清| 久久久成人精品视频| 国产精品永久在线| 国产日韩欧美在线视频观看| 成人午夜影院在线观看| 天堂av在线中文| 国产羞羞视频在线播放| 在线观看高清av| 国产第一页在线视频| 欧美日韩一区二区综合| 日韩高清在线一区| 久久理论电影网| 精品99一区二区| 中文字幕自拍vr一区二区三区| 欧美丰满少妇xxxxx| 欧美麻豆久久久久久中文| 中文字幕精品一区二区精品| 91精品国产自产91精品| 久久av红桃一区二区小说| 国内成人精品视频| 国产精品mp4| 91精品美女在线| 色资源网在线观看| 精品网站aaa| 久久高清一区| 国产精品福利在线播放| 综合久久五月天| 亚洲美女又黄又爽在线观看| 国产精品第七影院| 久久九九国产视频| 91看片一区| 日韩一区二区精品| 国产校园另类小说区| 88国产精品视频一区二区三区| 日本大片在线播放| 无码人妻丰满熟妇区毛片| 91久久在线观看| 国产亚洲精品91在线| 亚洲国产日韩一级| 久久69国产一区二区蜜臀| 中国av一区| 在线天堂新版最新版在线8| jk破处视频在线| 国产欧美日韩小视频| 精品久久sese|