x86CPU中TSS

TSS爲intel爲了方便操作系統管理進程而加入的一種結構,用法也很簡單。TSS是一個段,即一塊內存,這裏保存要切換的進程的cpu信息,包括各種寄存器的值、局部描述表ldt的段選擇子等,切換時cpu會將這段內容存進各自對應的寄存器,然後就完成了切換。(任務切換或者說CPU狀態更新實質上就是改變各個寄存器的值)

//32位TSS段結構
struct TSS32
{
    int backlink, esp0, ss0, esp1, ss1, esp2, ss2, cr3;
    int eip, eflags, eax, ecx, edx, ebx, esp, ebp, esi, edi;
    int es, cs, ss, ds, fs, gs;
    int ldtr, iomap;
};

使用的話首先要在GDT表中設置一個TSS段,就是保存TSS段的位置,然後將TSS段對應的是段選擇子存入TR寄存器,告訴cpu這個TSS段在哪裏。按照intel最初的設計,每個任務或者進程都應該設置一個TSS段,任務切換時直接將對應的TSS段的內存加載到CPU就行了。但是後來發現這種設計會帶來過多的系統開銷,每次切換都要將所有的寄存器更新,需要數百個指令週期,因此主流的操作系統均不使用這種方法。linux採取的方法是繞開TSS段進行任務切換,每個CPU僅設置一個TSS段,僅使用esp0和iomap,採用軟件方法切換寄存器,節省了開銷。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章