Kodun bir CPU'ya özgü olup olmadığı, neden bir işletim sistemine özgü olması gerektiğinden bahsettiniz. Bu aslında burada cevapların çoğunun varsaydığı ilginç bir soru.
CPU Güvenlik Modeli
Çoğu CPU mimarisinde çalışan ilk program , iç halka veya halka 0 olarak adlandırılanın içinde çalışır . Belirli bir CPU kemerinin halkaları nasıl uyguladığı değişebilir, ancak neredeyse her modern işlemcinin en az 2 işlem modu vardır, bunlardan biri ayrıcalıklı ve işlemcinin yapabileceği herhangi bir yasal işlemi gerçekleştirebilen 'çıplak metal' kodunu çalıştıran en az 2 işlem moduna sahiptir. güvenilmez ve yalnızca tanımlanmış güvenli bir yetenek kümesi gerçekleştirebilen korumalı kod çalıştırır. Ancak bazı CPU'lar çok daha yüksek ayrıntı derecesine sahiptir ve VM'lerin güvenli bir şekilde kullanılması için en az 1 veya 2 ekstra halka gerekir (genellikle negatif sayılarla etiketlenir), ancak bu cevabın kapsamı dışındadır.
İşletim sisteminin geldiği yer
Erken dönem tekli görevli işletim sistemleri
Çok erken DOS ve diğer ilk görev tabanlı sistemlerde tüm kodlar iç halkada çalıştırıldı, koştuğunuz her program tüm bilgisayar üzerinde tam güce sahipti ve tüm verilerinizi silmeyi veya hatta donanımın zarar görmesini de içeren bir haksızlığa uğradıysa tam anlamıyla bir şey yapabilirdi. çok eski ekranlarda geçersiz ekran modlarının ayarlanması gibi bazı aşırı durumlarda, daha da kötüsü, herhangi bir kötülük olmadan basitçe buggy kodundan kaynaklanıyor olabilir.
Aslında bu kod, büyük ölçüde işletim sistemi agnostiği idi, programı belleğe yükleyebilecek bir yükleyiciye sahip olduğunuzda (erken ikili biçimler için oldukça basit) ve kod, herhangi bir sürücüye güvenmiyordu, kod altında çalışması gereken tüm donanım erişimini uyguladı. halka 0'da çalıştığı sürece herhangi bir işletim sistemi. Not, bunun gibi çok basit bir işletim sistemine, diğer programları çalıştırmak için kullanılırsa ve ek işlevsellik sağlamazsa genellikle monitör denir .
Modern çoklu görev işletim sistemleri
Daha modern işletim sistemleri UNIX dahil , sürümleri NT ile başlayan Windows'un ve diğer çeşitli şimdi belirsiz işletim sistemleri bu durumla ilgili, kullanıcılar ek özellikler istediğini geliştirmek için karar böyle çoklu görev olarak tek seferde birden fazla uygulamayı çalıştırmak böylece ve koruma, böylece bir hata ( veya kötü amaçlı kod) bir uygulamada artık makine ve verilere sınırsız zarar veremez.
Bu, yukarıda belirtilen halkalar kullanılarak yapıldı, işletim sistemi, halka 0'da çalışan tek yeri alacak ve uygulamalar, güvenilmeyen dış halkalarda çalışacak, ancak işletim sisteminin izin verdiği sınırlı bir işlem setini gerçekleştirebilecektir.
Bununla birlikte, bu artan fayda ve koruma bir maliyet getirdi, programlar artık işletim sistemi ile kendileri yapmasına izin verilmeyen işleri yapmak için çalışmak zorunda kaldılar, örneğin artık belleğine erişerek ve isteğe bağlı olarak değiştirerek sabit disk üzerinde doğrudan kontrol sahibi olamıyorlardı. veri yerine, işletim sisteminden kendilerine bu işleri yapmalarını istemek zorunda kaldılar, böylece kendilerine ait olmayan dosyaları değiştirmeden işlemi gerçekleştirmelerine izin verilip verilmediğini kontrol edebilsinlerdi, ayrıca işlemin gerçekten geçerli olduğunu ve donanımı tanımsız bir durumda bırakmaz.
Her bir işletim sistemi, kısmen bu işletim sisteminin tasarlandığı mimariye dayanan ve kısmen de söz konusu işletim sisteminin tasarımına ve ilkelerine dayanan bu korumalar için farklı bir uygulamaya karar verdi, örneğin, UNIX çok kullanıcılı kullanım için iyi ve odaklanmış makinelere odaklandı. Windows için daha basit olacak şekilde tasarlanırken, tek bir kullanıcıyla daha yavaş donanımlarda çalışacak şekilde kullanılabilir. Kullanıcı alanı programlarının işletim sistemi ile konuşma şekli de X86'da tamamen farklıdır, örneğin ARM veya MIPS'de olduğu gibi, çoklu platform işletim sistemini hedef aldığı donanım üzerinde çalışma gereksinimi temelinde kararlar almaya zorlar.
Bu işletim sistemine özgü etkileşimler genellikle "sistem çağrıları" olarak adlandırılır ve bir kullanıcı alanı programının işletim sistemi aracılığıyla donanımla tamamen nasıl etkileşime girdiğini kapsar, işletim sisteminin işlevine bağlı olarak temelde farklılık gösterir ve bu nedenle sistem çağrıları aracılığıyla işini yapan bir program, işletim sistemine özgü olun.
Program Yükleyici
Sistem çağrılarına ek olarak, her bir işletim sistemi bir programı ikincil depolama ortamından ve belleğe yüklemek için farklı bir yöntem sunar , belirli bir işletim sistemi tarafından yüklenebilmesi için, programın işletim sistemine nasıl olabileceğini açıklayan özel bir başlık içermesi gerekir. yüklü ve çalıştırın.
Bu başlık , farklı bir format için bir yükleyici yazmanın neredeyse önemsiz olduğu kadar basitti , ancak dinamik bağlantı ve zayıf bildirimler gibi gelişmiş özellikleri destekleyen elf gibi modern biçimlerde, bir işletim sisteminin ikili yüklemeyi denemesi neredeyse imkansız bunun için tasarlanmadı, bunun anlamı, sistem çağrısı uyumsuzlukları olmasa bile, bir programın çalıştırılabileceği bir biçimde koç olarak yerleştirilmesi bile çok zor.
Kütüphaneler
Programlar nadiren doğrudan sistem çağrılarını kullanırlar, ancak neredeyse tamamen işlevselliklerini kazanırlar; ancak, sistem çağrılarını programlama dili için biraz daha dostça bir formatta saran kütüphaneler; Windows NT ve üzeri, diğer programlama dillerinin çoğunda, sistem işlevselliğini uygun bir şekilde saran benzer kütüphaneler bulunur.
Bir dereceye kadar, hatta çapraz platform sorunları üstesinden gelebilir Bu kütüphaneler içten işletim sistemleri geniş bir yelpazede çağrı yönetirken uygulamalara tek tip platform sunarak etrafında tasarlanmış kütüphanelerin bir dizi vardır, yukarıda açıklandığı gibi bu tür SDL olarak , bu durum olsa gelir programlar ikili uyumlu olamaz, bu kütüphaneleri kullanan programlar platformlar arasında ortak bir kaynağa sahip olabilir, bu da portlamayı yeniden derlemek kadar basit hale getirir.
Yukarıdaki istisnalar
Burada söylediğim her şeye rağmen, birden fazla işletim sisteminde programlar yürütememenin sınırlarını aşma girişimleri olmuştur. Bazı iyi örnekler, hem win32 program yükleyicisini, ikili formatı hem de Windows programlarının çeşitli UNIX'lerde çalışmasına izin veren sistem kitaplıklarını başarıyla taklit eden Wine projesidir . Ayrıca birçok BSD UNIX işletim sisteminin Linux yazılımı kullanmasına ve tabii ki Apple'ın MacOS X altında eski MacOS yazılımının çalıştırılmasına izin vermesine olanak tanıyan bir uyumluluk katmanı var.
Bununla birlikte, bu projeler muazzam düzeyde el geliştirme çabasıyla çalışır. İki işletim sisteminin zorluk derecesinin ne kadar farklı olduğuna bağlı olarak, genellikle işletim sisteminin tamamını kendi başına yazmaktan daha karmaşık olan diğer işletim sisteminin neredeyse tam bir emülasyonuna kadar oldukça küçük bir çerçeveden, kurallara göre istisna değildir.