Bir işletim sistemi, doğrudan işlemci ile çalışıyorsa, bir programın yeteneklerini nasıl sınırlar?

Aug 19 2020

Bir program belleğe yüklendiğinde ve çalışmaya başladığında, cpu her komutu koddan yükler ve komutu işlem kodu ve argümanlara dayalı olarak yürütür, böylece program doğrudan cpu'ya karşı konuşmak için etkileşime girer.

Bununla birlikte, işletim sistemi (linux / win) her şeyi yapmanıza izin vermez ve bu nedenle bazı şeyler için ondan izin istemeniz gerekir - sistem çağrılarıyla. Ancak bir kullanıcı kodunun, işletim sisteminin yapabileceği bazı şeyleri nasıl yapamayacağını merak ediyorum - işletim sistemi çekirdek kodunun bir komut çalıştırması veya bir kullanıcının çalıştırması Cpu için ne fark eder?

İşletim sistemi yüklemeden önce koduma bakıyor mu ve kullanmama izin verilmeyen belirli talimatları kullanıp kullanmadığımı görüyor mu ve eğer öyleyse onu çalıştırmıyor mu?

Nasıl yönetiliyor?

Btw, Assembly'yi programlama dili olarak kabul eder, böylece programcı kodda kullanılacak herhangi bir talimatı seçebilir.

Yanıtlar

8 ErikEidt Aug 19 2020 at 19:22

Modern CPU'lar, işletim sistemi tarafından kullanılan ayrıcalık modlarına sahiptir ve belirli talimatları kilitler. Örneğin, usermodda, ayrıcalık modunu değiştiren (yükselten) veya mevcut yapılandırılmış sayfa tabloları gibi sistem kaynaklarına erişen talimatlar istisnalara neden olur. Bu, işletim sisteminin kullanıcı işleminizi durdurup durdurmayacağına veya işlemi taklit edip etmeyeceğine karar vermesine olanak tanır.


İşletim sistemi yüklemeden önce koduma bakıyor mu ve kullanmama izin verilmeyen belirli talimatları kullanıp kullanmadığımı görüyor mu ve eğer öyleyse onu çalıştırmıyor mu?

Hayır, buna gerek yoktur - işletim sistemi, kullanıcı kodunu çalıştırdığında işlemciyi "kullanıcı" moduna geçirir. Bu, ayrıcalıklı bir talimatla karşılaşıldığında donanımın istisna mekanizmasını etkinleştirecektir - kullanıcı modunda istisna, ayrıcalıklı talimatı yürütmek yerine gerçekleşir (bir istisnayı tetiklemek, herhangi bir ayrıcalıklı işlemden ziyade bu talimatın yürütülmesidir).

Btw, kullanıcı modu kodunun işletim sisteminden servis talep etmek için kullandığı sistem çağrısı talimat türleri, donanım istisna mekanizmasını da etkinleştirir.

Nasıl yönetiliyor?

İşletim sistemi her zaman kullanıcı kodunu kullanıcı modunda, yani kullanıcı düzeyinde ayrıcalıkta çalıştırır ve genellikle kendi kodunu daha yüksek ayrıcalıkta çalıştırır. Bu modlar, işlemciye ayrıcalıklı talimatların nasıl işleneceğini bildirir. Çoğu kullanıcı modu kodu, işe yaramaz oldukları için ayrıcalıklı komutları çalıştırmayı denemekten bile çekinmez, ancak bunu yaparsa, donanım istisna mekanizması devreye girer ve bunun olduğunu işletim sistemine etkili bir şekilde söyler ve durumu ele almasına izin verir.

Kullanıcı modu kodunu çalıştırmak için, işletim sistemi, kullanıcı kodunu yeniden başlatmak için bir "kesmeden dönüş" talimatını kullanabilir (teknik olarak önceden başlatılmış veya başlatılmamış olması önemli değildir). Kesmeden dönüş, ayrıcalık düzeyini değiştirirken aynı zamanda komut akışını değiştirmenin (diğer bir deyişle dallanma) bir yolu olan bir talimat türüdür; böyle bir talimatın kendisi ayrıcalıklıdır, yani işlemcinin kullanıcı modunda buna izin vermeyeceği anlamına gelir.

İşlemci bir kesinti aldığında, kritik CPU durumunun bir kısmını not eder - kritik CPU durumu, bir kesintiye hizmet etmek için mutlaka değiştirilmesi gerektiği durumudur. Bir kesintiye hizmet vermek, program sayacını yani komut işaretçisini değiştirerek komut akışı beslemesinin kontrolünü CPU'ya aktarır; kesmede işlemci etkili bir şekilde kesinti hizmeti rutinine ani bir dallanma yapar. Ayrıca, ISR'nin daha fazla talimata erişmesine izin veren daha yüksek ayrıcalığa ani bir mod değişikliği yapar. ISR'yi etkinleştirmek için bu iki ani değişikliğe ihtiyaç duyulduğundan, donanım, kesintiye uğramış kullanıcı modu kodunu devam ettirirken daha sonra kullanmak üzere yazılım için önceki değerleri kaydedecektir. Bu nedenle, donanım ve işletim sistemi, işletim sistemini yüksek ayrıcalıkta çalıştırmak ve kullanıcı kodunu düşük bir ayrıcalıkta çalıştırmak için birlikte çalışır.

Kullanıcı modu programı sistem çağrı tipi bir talimat kullandığında (G / Ç gibi işletim sistemi hizmetlerini talep ederek), aynı donanım istisna mekanizması kontrolü ISR'ye aktarır. İşletim sistemi, donanıma bağlı olarak, kullanıcı modu sürecini devam ettirmek istediğinde, devam etmeden önce sistem çağrısı talimatı boyunca kullanıcı modu işleminin program sayacını manuel olarak ilerletmek zorunda kalabilir - sanki kullanıcı modu işlemine, işletim sistemi, sistem çağrısını simüle etti / taklit etti.

1 Aganju Aug 20 2020 at 13:21

Ek olarak, programınızın tüm CPU talimatları kendi sanal bellek alanında yürütülür. Bu, temel olarak sistem verilerine, diğer işlem verilerine veya çekirdek verilerine erişmek veya bunları değiştirmek için kodladığınız tüm talimatları devre dışı bırakır.
Temelde evinizi istediğiniz gibi alt üst edebilirsiniz ama başkasının evine bakamazsınız.

Adres alanınızın dışında bir şey yürütmek istiyorsanız, bunu sizin için yapan sistem rutinlerini / hizmetlerini ve işleminizin yetkilerini / ayrıcalıklarını kontrol edenleri aramaktan başka seçeneğiniz yoktur.
Yukarıdaki resimde kaldığınız sürece, başkalarının evlerinde (işletim sistemi çekirdek rutinleri) herhangi bir şey istiyorsanız, güvenilir bir hizmet kullanmanız gerekir.

SimonB Aug 20 2020 at 16:44

Bu yanıt, kendisi için özel donanım desteğine sahip (ARM, x86, PowerPC, vb.) Bir işlemci üzerinde modern bir çok görevli işletim sistemi (Windows, MacOS, Linux, vb.) Çalıştırdığınızı varsayar. Erik Eidt ve Aganju'nun önceki cevaplarına dayanıyor.

Bu sistemler, sıradan kullanıcı programları için giderek daha kısıtlayıcı hale gelmek üzere yıllar içinde gelişmiştir.

Böyle bir makinede, programınızın fiziksel belleğe doğrudan erişimi yoktur. Tüm bellek adresleri bir sanal bellek yöneticisinden geçer. Adres alanınızda belirli bir adres tahsis edilmişse, adres fiziksel bir bellek adresine eşlenir. Değilse, erişim başarısız olur ve bir tuzak oluşturur. İşletim sistemi muhtemelen programınızı sonlandıracaktır. Bellek yöneticisi hiçbir işlemin başka bir işlemin belleğini bozmamasını sağlar.

Donanım aygıtları genellikle bellek eşlemelidir. Yine, bellek yöneticisi bunlara herhangi bir doğrudan erişimi engeller. Bunu sizin için yapması için bir şoför aramanız gerekiyor.

Her şeyi ayarlamak ve ayrıca aygıt sürücülerini uygulamak için işletim sistemi tarafından kullanılan özel makine kodu talimatları vardır. Bu talimatlar, onları çalıştırmak için gereken farklı ayrıcalık seviyelerine sahiptir. Programınız başlatıldığında, işletim sistemi tarafından en düşük ayrıcalığa sahip bir kullanıcı programı olarak işaretlenecektir. Dolayısıyla, bellek yönetimini değiştirmek veya atlamak için bu talimatları kullanma girişimleri yakalanacaktır. Yine, programınız muhtemelen sonlandırılacaktır.