2015-09-25 116 views
1

我想知道如何「bootstacktop」和「bootstack」的值由彙編程序,計算出當代碼設置值%ESP:理解彙編代碼

# Set the stack pointer 
movl $(bootstacktop),%esp 

在同一組件文件的末尾,是的「bootstacktop」「定義」中給出:

################################################################### 
# boot stack 
################################################################### 
    .p2align PGSHIFT  # force page alignment 
    .globl  bootstack 
bootstack: 
    .space  KSTKSIZE 
    .globl  bootstacktop 
bootstacktop: 

我找到的值,看着deassebly,爲「bootstacktop」,這裏的部分上述'mov'指令的反彙編:

# Set the stack pointer 
movl $(bootstacktop),%esp 
f0100034: bc 00 40 11 f0   mov $0xf0114000,%esp 

KSTKSIZE的值是8 * 4096,PGSHIFT是12.'bootsacktop'的值如何變爲'0xf0114000'? 'bootstack'的價值是什麼?

這裏是鏈接描述:http://pastebin.com/9DPakfgx

+0

我已經完成了項目文件的全部搜索,但沒有bootstacktop的定義。它是由...生成的。空間指令,我想,但我不能弄明白,如果是的話。 – Sush

+0

我已添加鏈接器腳本 – Sush

+0

哦,您正在使用JOS(注意到您的鏈接器文件中)。將包含那些定義的東西。可能是'inc/memlayout.h' –

回答

4

既然你發佈你的連接文件,我知道你與JOS OS工作。彙編程序文件頂部的某處顯示的代碼段將包含文件memlayout.h。該文件定義了PGSHIFT和KSTKSIZE的值。此代碼:

################################################################### 
# boot stack 
################################################################### 
    .p2align PGSHIFT  # force page alignment 
    .globl  bootstack 
bootstack: 
    .space  KSTKSIZE 
    .globl  bootstacktop 
bootstacktop: 

將調整頁面與bootstack任何值在PGSHIFT定義。 bootstack是一個標籤(內存地址),它恰好在分配空間後分配了.space KSTKSIZE(分配的空間量= KSTKSIZE)。 KSTKSIZE將在memlayout.h中定義。 .globl bootstacktop指令只是說這個標籤將變爲全局的(就像C中聲明爲extern的變量)。 bootstackstop是另一個標籤(內存地址),它將是bootstack中最後一個字節後面的地址。它也在全球範圍內用於其他對象的使用。 bootstacktop - bootstack = KSTKSIZE

圖像或可執行中的項目的佈局將由其中所述接頭在最終圖像中放置這些對象來確定。鏈接器腳本經常會驅動更復雜的圖像佈局。如果你有一個鏈接腳本,你可能希望查看它,看看最終的圖像/可執行文件是如何佈局的。

你不會說你是否在磁盤上反彙編了一個映像文件,或者這個反彙編是在程序加載到內存後完成的,但是根據值0xf0100034我猜測這是某種虛擬或物理地址這是由內核在將文件加載到內存時確定的(可能是ELF對象或類似的東西)。然後它將是由內核將映像加載到內存中的內存位置和鏈接器生成的映像文件內的對象偏移的組合。

由於我們沒有使用過的圖像(可執行文件),圖像的佈局是什麼類型(它是ELF /圖像),您的問題沒有提供足夠的信息來明確說明這個特定值是如何得出的。 PE等)以及操作系統使用什麼內存位置來加載圖像。