Görev durumu segmenti - Task state segment

Görevin durumu segmenti ( TSS ) hakkında bir yapıdır x86 bir hakkında bilgi tutar tabanlı bilgisayarlar görev . Görev yönetimi için işletim sistemi çekirdeği tarafından kullanılır . Özellikle, aşağıdaki bilgiler TSS'de saklanır:

  • İşlemci kayıt durumu
  • G / Ç bağlantı noktası izinleri
  • İç düzey yığın işaretçileri
  • Önceki TSS bağlantısı

Tüm bu bilgiler, IA-32 kılavuzlarında belirtildiği gibi TSS içindeki belirli yerlerde saklanmalıdır .

TSS'nin yeri

TSS, hafızanın herhangi bir yerinde bulunabilir . Bir segment görev kayıt denilen register (TR) bir tutan segmenti seçici ki bulunduğu geçerli bir TSS tanımlayıcı noktaları GDT (TSS açıklayıcısı ikamet olmayabilir LDT ). Bu nedenle, bir TSS kullanmak için aşağıdakilerin işletim sistemi çekirdeği tarafından yapılması gerekir:

  1. GDT'de bir TSS tanımlayıcı girişi oluşturun
  2. TR'yi o segment için segment seçici ile yükleyin
  3. Gerektiği gibi hafızadaki TSS'ye bilgi ekleyin

Güvenlik amacıyla, TSS, yalnızca çekirdek tarafından erişilebilen belleğe yerleştirilmelidir .

Görev kaydı

TR kaydı, TSS için bir segment seçici tutan 16 bitlik bir kayıttır. LTR talimatı ile yüklenebilir . LTR , ayrıcalıklı bir talimattır ve diğer segment kayıt yüklerine benzer şekilde davranır. Görev kaydının iki bölümü vardır: programcı tarafından görülebilen ve erişilebilen bir bölüm ve TSS tanımlayıcısından otomatik olarak yüklenen görünmez bölüm.

Kayıt durumları

TSS, tüm x86 kayıtlarının kaydedilmiş değerlerini içerebilir . Bu, görev değiştirme için kullanılır . İşletim sistemi kayıt değerleri ile TSS yükleyebilir yeni görev ihtiyaçları ve (örneğin, bir gibi bir donanım görev anahtarı çalıştırdıktan sonra IRET 86 işlemci uygun yazmaca TSS'den kaydedilmiş değerleri yükleyecektir talimat). Windows ve Linux gibi bazı modern işletim sistemlerinin , yazılım görevi anahtarlamayı gerçekleştirirken TSS'deki bu alanları kullanmadığını unutmayın.

Bir donanım görev anahtarı sırasında, eski TSS'nin belirli alanlarının , yeni TSS'den gelen değerler okunmadan önce CPU'nun mevcut yazmaç içerikleri ile güncellendiğini unutmayın . Bu nedenle, bazı TSS alanları okunur / yazılırken diğerleri salt okunurdur:

  • Okuma / Yazma alanları : bir donanım görev anahtarı sırasında okuma ve yazma.
    • Tüm genel amaçlı kayıt ( EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP);
    • Bütün parça kayıtlar ( CS, DS, ES, FS, GS, SS);
    • Mevcut yürütme durumu ( EIP, EFlags);
    • LinkAlan yeni görev anahtarı bir nedeni ise TSS, CALLya INTziyade JMP.
  • Salt okunur alanlar : belirtildiği gibi yalnızca gerektiğinde okunur.
    • CR3Sayfa Dizini Temel Kaydı ( PDBR) olarak da bilinen Kontrol Kaydı 3 ( ).
      Bir donanım görev anahtarı sırasında okuyun.
    • Yerel Tanımlayıcı Tablo kaydı ( LDTR);
      Bir donanım görev anahtarı sırasında okuyun.
    • Üç ayrıcalık düzeyinde yığın çiftlerinin ( SS0:ESP0, SS1:ESP1, SS2:ESP2);
      Bir ara seviye sırasında CALLveya INTyeni bir yığın oluşturmak için okuyun .
    • IOPBG / Ç Bağlantı Noktası Bit Eşlem işaretçisi ( ) ve G / Ç Bağlantı Noktası Bit Eşleminin kendisi;
      Bir esnasında Oku IN, OUT, INSveya OUTSeğer talimat CPL > IOPLtalimat yasaldır onaylamak için (bkz G / Ç bağlantı noktası izinleri altında).

PDBRAlan aslında çok ilki yeni TAD dışında okunur: bir donanım görev geçişten sonra da bütün diğer alanlarda (özellikle, tamamen farklı bir sayfa tablosu haritalama geçebilirsiniz LDTR) yeni haritalama göredir.

G / Ç bağlantı noktası izinleri

TSS, geçerli görev için G / Ç bağlantı noktası izinleri bit eşlemine 16 bitlik bir işaretçi içerir . Genellikle bir görev başlatıldığında işletim sistemi tarafından kurulan bu bit eşlem, programın erişmesi gereken tek tek bağlantı noktalarını belirtir. G / Ç bit eşlemi, bir bit bağlantı noktası erişim izinleri dizisidir ; programın bir bağlantı noktasına erişim izni varsa, ilgili bit dizininde bir "0" depolanır ve programın izni yoksa, orada bir "1" saklanır. TSS'nin segment sınırı tam bit eşlemden azsa, tüm eksik bitlerin "1" olduğu varsayılır.

Bu özellik şu şekilde çalışır: bir program IN veya OUT gibi bir x86 I / O bağlantı noktası talimatı verdiğinde ( x86 talimat listelerine bakın - ve bayt, word ve dword uzunluklu sürümler olduğunu unutmayın), donanım bir G / Ç ayrıcalık düzeyi (IOPL), programın tüm G / Ç bağlantı noktalarına erişimi olup olmadığını kontrol edin. Eğer Akım Privilege Seviyesi (CPL) programının G / Ç ayrıcalık düzeyine (IOPL) den sayısal büyüktür, program tüm I / O portu erişimi yok (program IOPL belirtir olandan daha az ayrıcalıklı) bağlantı noktaları. Donanım daha sonra TSS'deki G / Ç izinleri bit eşlemini kontrol ederek bu programın GİRİŞ veya ÇIKIŞ komutundaki belirli bağlantı noktalarına / bağlantı noktalarına erişip erişemeyeceğini kontrol edecektir. G / Ç bağlantı noktası izinleri bit eşlemindeki (tüm) ilgili bit (ler) açıksa, programın bağlantı noktalarına erişmesine izin verilir ve komutun yürütülmesine izin verilir. İlgili bit (ler) den (herhangi biri) ayarlanmışsa - veya bit (ler) den (herhangi biri) TSS'nin segment limitini aşmışsa - programın erişimi yoktur ve işlemci genel bir koruma oluşturur hata . Bu özellik, işletim sistemlerinin kullanıcı programlarına seçici bağlantı noktası erişimi vermesine izin verir.

İç düzey yığın işaretçileri

TSS, bir ayrıcalık seviyesi değişikliği gerçekleştiğinde yeni yığın işaretçisini belirlemek için 6 alan içerir . SS0 alanı, CPL = 0 için yığın segment seçicisini içerir ve ESP0 / RSP0 alanı, CPL = 0 için yeni ESP / RSP değerini içerir. Korumalı (32 bit) modda bir kesinti meydana geldiğinde, x86 CPU, SS0 ve ESP0 için TSS'ye bakacak ve değerlerini sırasıyla SS ve ESP'ye yükleyecektir. Bu, çekirdeğin kullanıcı programından farklı bir yığın kullanmasına ve ayrıca bu yığının her kullanıcı programı için benzersiz olmasına izin verir.

AMD64 uzantılarında tanıtılan yeni bir özellik , aynı zamanda TSS'de bulunan ve mantıksal (segment + ofset) yığın işaretçileri içeren Kesme Yığın Tablosu (IST) olarak adlandırılır. Bir kesme tanımlayıcı tablosu kullanılacak bir IST girişi belirtiyorsa (8 tane var), işlemci yeni yığını IST'den yükleyecektir. Bu, bilinen iyi yığınların ciddi hatalar ( örneğin NMI veya Çift hata ) durumunda kullanılmasına izin verir . Önceden, IDT'deki istisna veya kesinti girişi, işlemcinin görev kapısı tarafından işaret edilen göreve geçmesine neden olan bir görev geçidini işaret ediyordu. Orijinal kayıt değerleri, kesinti veya istisna meydana geldiğinde TSS akımına kaydedildi. İşlemci daha sonra SS: ESP dahil olmak üzere kayıtları TSS'de belirtilen bilinen bir değere ayarladı ve seçiciyi önceki TSS'ye kaydetti. Buradaki sorun, donanım görevi değiştirmenin AMD64'te desteklenmemesidir.

Önceki TSS bağlantısı

Bu, bu TSS'yi bir öncekine bağlamayı sağlayan 16 bitlik bir seçicidir. Bu, yalnızca donanım görevi değiştirme için kullanılır. Ayrıntılar için IA-32 kılavuzlarına bakın.

Linux'ta TSS Kullanımı

Bilgisayarda çalışan her görev için bir TSS oluşturulabilse de, Linux çekirdeği her CPU için yalnızca bir TSS oluşturur ve bunları tüm görevler için kullanır. Bu yaklaşım, diğer mimarilere daha kolay taşınabilirlik (örneğin, AMD64 mimarisi donanım görev anahtarlarını desteklemez) ve gelişmiş performans ve esneklik sağladığı için seçilmiştir . Linux yalnızca G / Ç bağlantı noktası izni bit eşlemini ve TSS'nin iç yığın özelliklerini kullanır; diğer özellikler yalnızca Linux çekirdeğinin kullanmadığı donanım görev anahtarları için gereklidir.

TSS ile ilgili istisnalar

X86 istisna vektörü 10, Geçersiz TSS istisnası (#TS) olarak adlandırılır. TSS erişiminde bir sorun olduğunda işlemci tarafından verilir. Örneğin, CPL = 3'te bir kesinti meydana gelirse ve kontrolü CPL = 0'a aktarıyorsa, TSS, yığın anahtarı için SS0 ve ESP0 / RSP0'ı ayıklamak için kullanılır. Görev kaydı hatalı bir TSS seçiciye sahipse, bir #TS hatası üretilecektir. Geçersiz TSS istisnası hiçbir zaman normal işletim sistemi çalışması sırasında meydana gelmemelidir ve her zaman çekirdek hataları veya donanım arızasıyla ilgilidir.

TSS istisnaları hakkında daha fazla ayrıntı için, IA-32 kılavuzunun Cilt 3a, Bölüm 6'sına bakın .

X86-64 modunda TSS

X86-64 mimarisi donanım görev anahtarları desteklemez. Bununla birlikte TSS, 64 bit genişletilmiş modlarda çalışan bir makinede hala kullanılabilir. Bu modlarda, TSS sakladığı için hala kullanışlıdır:

  1. Yığın işaretçisi, her ayrıcalık düzeyi için adresler.
  2. Kesme Yığın Tablosu için İşaretçi Adresleri (Yukarıdaki iç düzeydeki yığın işaretçisi bölümü, bunun gerekliliğini tartışmaktadır).
  3. GÇ izin bit eşleminin Ofset Adresi.

Ayrıca, 64 bitlik bir temel adresi tutabilmek için görev kaydı bu modlarda genişletilir.

Referanslar

Dış bağlantılar