2011-11-05 103 views
10

我無法在任何地方找到此信息。無論我看到什麼,我都會發現一些事情指的是一旦你點擊「主」(無論你的入口點是什麼),這將是程序參數和環境,但是我要找的是系統如何設置該堆棧與switch_to宏配合使用。任務切換到第一次時,它需要具有EFLAGS,EBP,GCC保存的寄存器以及由「tsk-> thread-> esp」指向的堆棧上schedule()函數的返回地址,但我無法弄清楚內核如何設置這個堆棧,因爲它讓GCC保存通用寄存器(使用內聯彙編的輸出參數)。進程創建時的Linux進程內核堆棧狀態是什麼?

我指的只是x86個人電腦。我正在爲我自己的小內核(我試圖)編寫Linux調度程序/進程系統進行研究,而且我無法理解我缺少的東西。我知道我失去了一些東西,因爲事實上,Slackware的我的電腦上運行的是印證了調度工作的事實:P

編輯:我似乎已經嚴重措辭這一點。我正在尋找有關如何設置任務內核堆棧而不是如何設置任務用戶任務的信息。更具體地說,tsk-> thread-> esp指向的堆棧以及「switch_to」切換到的堆棧。

+0

看起來你這裏有兩個不同的問題 - 在進程init 1)堆棧的狀況; 2)內核'日程安排()'中的IRQ。您應該將這些問題中的一個作爲新問題發佈,並將其中的一個留在這裏;這樣你就可以在每個問題上得到專注的答案。在堆棧溢出中,爲每個問題啓動一個單獨的問題是非常好的。 – 2011-11-05 18:30:03

+0

好吧,會做的!我已經閱讀了很長時間的答案/問題,但從未發佈!感謝您的提示:) 那麼,我會在大約5分鐘。我必須等待:P – Caleb1994

回答

6

爲一個新進程的初始內核棧被設置在copy_thread(),這是一個具體的拱形功能。 x86版本,例如,開始時是這樣的:

int copy_thread(unsigned long clone_flags, unsigned long sp, 
unsigned long unused, 
struct task_struct *p, struct pt_regs *regs) 
{ 
    struct pt_regs *childregs; 
    struct task_struct *tsk; 
    int err; 

    childregs = task_pt_regs(p); 
    *childregs = *regs; 
    childregs->ax = 0; 
    childregs->sp = sp; 

    p->thread.sp = (unsigned long) childregs; 
    p->thread.sp0 = (unsigned long) (childregs+1); 

    p->thread.ip = (unsigned long) ret_from_fork; 

p->thread.spp->thread.ip分別是新線程的內核堆棧指針和指令指針。

注意其地方保存%eflags%ebp等在那裏,因爲當執行一個新創建的線程先切換到,它開始了在ret_from_fork(執行這就是__switch_to()返回到一個新的線程),這意味着它不會執行switch_to()例程的後半部分。

+0

謝謝!這正是我所期待的!我永遠不會猜測看copy_thread。 – Caleb1994

+0

@ Caleb1994:當您記住所有新的執行線程都是通過克隆現有的Linux線程而創建的時候,這很有意義。我在最後添加了另一段,這可能會有所幫助。 – caf

+1

這確實有很大幫助!我的小內核現在支持fork()和yield()類型的調用:)非常感謝您的幫助! – Caleb1994

2

所述堆疊中的過程創建的狀態在X86-64 SVR4 ABI補充說明(對於AMD64,即X86-64 64位的機)。 32位英特爾處理器的等效物可能是ABI i386。我強烈推薦閱讀Assembly HOWTO。當然,你也許應該閱讀相關的Linux內核文件。

+0

這些頁面描述**執行開始後堆棧的狀態**。我的問題是**執行前的堆棧狀態**。即內核正在設置堆棧時。我唯一的問題是Linux離開編譯器保存通用寄存器(保存在堆棧中),但保存的方式可能因編譯器而異,因此我對系統如何設置感到困惑最初的堆棧。我已經查看了代碼,但我無法找到該進程被填充的位置。它隱藏在某處的機器抽象背後。 – Caleb1994

+0

執行前堆棧不存在。所以我不明白你想要什麼。內核正在構建ABI文檔中描述的初始進程棧。 –

+0

也許你忘了內核和用戶空間堆棧是不同的? –

2

Google for「linux stack layout process startup」給出this鏈接:「Linux/i386 ELF二進制文件的啓動狀態」,它描述了在將控制權轉移給libc啓動代碼之前內核執行的設置。

+0

它是'exec'後面的狀態嗎? – osgx

+0

是的,這是您的流程的第一條指令開始執行之前的狀態。 –

相關問題