Tüm modern CPU'lar şu anda çalışmakta olan makine talimatlarını kesme kapasitesine sahiptir . Daha sonra hiçbir şey olmamış gibi yürütmeyi devam ettirmek için yeterli durumda (genellikle, ancak her zaman değil, yığında) tasarruf ederler (kesilen komut genellikle sıfırdan yeniden başlatılır). Ardından , daha fazla makine kodu olan ancak özel bir yere yerleştirilen bir kesme eylemcisi çalıştırmaya başlarlar ; böylece CPU önceden nerede olduğunu bilir. Kesme işleyicileri her zaman işletim sisteminin çekirdeğinin bir parçasıdır : en büyük ayrıcalıkla çalışan ve diğer tüm bileşenlerin yürütülmesini denetlemekten sorumlu olan bileşen. 1,2
Kesintiler eşzamanlı olabilir ; bu, işlemcinin kendisi tarafından tetiklenen, şu anda yürütülen talimatın yaptığı bir şeye doğrudan yanıt olarak veya eşzamansız olarak, ağa gelen veriler gibi harici bir olay nedeniyle öngörülemeyen bir zamanda gerçekleştiği anlamına gelir. Liman. Bazı insanlar eşzamansız kesintiler için "kesme" terimini saklar ve bunun yerine eşzamanlı kesintileri "tuzaklar", "hatalar" veya "istisnalar" olarak adlandırır, ancak bu kelimelerin hepsinin başka anlamları vardır, bu yüzden "eşzamanlı kesintiye" bağlı kalacağım.
Şimdi, çoğu modern işletim sistemi bir süreç kavramına sahiptir . En temelde, bu, bilgisayarın aynı anda birden fazla programı çalıştırabileceği bir mekanizmadır, ancak aynı zamanda işletim sistemlerinin en çok bir özellik olan bellek korumasını nasıl yapılandırdığının da önemli bir özelliğidir (fakat, ne yazık ki, hala hepsi değil ) modern işlemciler. Sanal bellek ile birlikte gidiyorbellek adresleri ve RAM'deki gerçek konumlar arasındaki eşlemeyi değiştirme yeteneğidir. Bellek koruması, işletim sisteminin her bir işleme kendi özel RAM yığınını vermesini, yalnızca erişebilmesini sağlar. Ayrıca, işletim sisteminin (bazı işlemler adına hareket ederek) RAM bölgelerini salt okunur, çalıştırılabilir, bir grup işbirliği işlemiyle paylaşılan, vb. Olarak belirlemesine olanak tanır. çekirdek. 3
Her işlem belleğe yalnızca CPU'nun izin verecek şekilde yapılandırıldığı şekilde eriştiği sürece, bellek koruması görünmezdir. Bir işlem kuralları çiğnediğinde, CPU çekirdeği işleri çözmesini isteyen bir eşzamanlı kesmeye neden olur. Sürecin kuralları gerçekten ihlal etmediği düzenli olarak gerçekleşir, işlemin devam etmesine izin verilmeden önce sadece çekirdeğin biraz çalışması gerekir. Örneğin, bir işlem belleğinin bir sayfasının RAM'de başka bir şey için yer açmak için takas dosyasına "çıkarılması" gerekirse, çekirdek bu sayfaya erişilemez olarak işaretler. İşlem bir daha kullanmaya çalıştığında, CPU bir bellek koruma kesmesi üretecektir; çekirdek, sayfayı takastan alır, bulunduğu yere geri koyar, tekrar erişilebilir olarak işaretler ve yürütmeye devam eder.
Ancak, sürecin gerçekten kuralları ihlal ettiğini varsayalım. Daha önce hiç RAM eşleştirilmemiş bir sayfaya erişmeye çalıştı ya da makine kodu içermeyen olarak işaretlenmiş bir sayfa veya herhangi bir şekilde çalıştırmaya çalıştı. Genellikle "Unix" olarak bilinen işletim sistemleri ailesinin tümü , bu durumla başa çıkmak için sinyaller kullanır. 4 Sinyaller kesintilere benzer, ancak bunlar donanım tarafından üretilmek ve çekirdeğin alanından ziyade çekirdek tarafından üretilir ve alanlara göre alanlandırılır. İşlemler sinyal işleyicileri tanımlayabilirkendi kodlarında ve çekirdeğe nerede olduklarını söyleyin. Bu sinyal işleyicileri daha sonra gerektiğinde normal kontrol akışını keserek yürütecektir. Sinyallerin hepsinde, biri şifreli bir kısaltma ve diğeri biraz daha az şifreli bir cümle olan bir sayı ve iki isim vardır. Bir işlem bellek koruma kurallarını ihlal ettiğinde üretilen sinyal (kurallara göre) 11 numaradır ve isimleri SIGSEGV
ve "Segmentasyon hatası" dır . 5,6
Sinyaller ve kesintiler arasındaki önemli bir fark , her sinyal için varsayılan bir davranış olduğudur. İşletim sistemi tüm kesintiler için işleyiciler tanımlayamazsa, bu işletim sisteminde bir hatadır ve CPU eksik bir işleyici çağırmaya çalıştığında tüm bilgisayar çökecektir. Ancak, işlemler tüm sinyaller için sinyal işleyicileri tanımlama zorunluluğu yoktur. Eğer çekirdek bir işlem için bir sinyal üretirse ve bu sinyal varsayılan davranışında bırakılmışsa, çekirdek devam eder ve varsayılanı ne olursa olsun ve işlemi rahatsız etmez. Çoğu sinyalin varsayılan davranışları ya "hiçbir şey yapmaz" ya da "bu süreci sonlandırır ve belki de bir çekirdek dökümü üretir" dir. SIGSEGV
ikincisi biridir.
Yani, özetlemek için, hafıza koruma kurallarını ihlal eden bir süreç var. CPU süreci askıya aldı ve senkronize bir kesinti oluşturdu. Çekirdek, kesilen ve SIGSEGV
işlem için bir sinyal üreten alan oluşturdu . En vermedi sürecini varsayalım değil bir sinyal işleyici kurmak SIGSEGV
, böylece çekirdek işlemini sonlandırmak için varsayılan davranışı, gerçekleştirmektedir. Bu, _exit
sistem çağrısıyla aynı etkilere sahiptir : açık dosyalar kapalı, hafızanın silinmesi vb.
Bu noktaya kadar hiçbir şey bir insanın görebileceği herhangi bir mesaj yayınlamadı ve kabuk (ya da daha genel olarak, yeni sona eren sürecin ana süreci ) hiç yer almadı. SIGSEGV
kuralları ihlal eden sürece gider , ebeveyni değil . Ancak , dizideki bir sonraki adım, çocuğunun sonlandırıldığı ana işlemi bildirmek. Bu ebeveyn zaten birini kullanarak, bu bildirim için bekleyen olduğunda en basit olduğu birkaç farklı şekilde gerçekleşebilir wait
sistem çağrıları ( wait
, waitpid
, wait4
, vs). Bu durumda, çekirdek yalnızca bu sistem çağrısının geri dönmesine neden olur ve ana işlemi çıkış durumu adı verilen bir kod numarası ile sağlar.. 7 Çıkış durumu ebeveyne çocuk sürecinin neden sona erdirildiği bilgisini verir; Bu durumda, bir SIGSEGV
sinyalin varsayılan davranışı nedeniyle çocuğun sonlandırıldığını öğrenecektir .
Ana işlem daha sonra bir mesajı yazdırarak olayı bir insana rapor edebilir; Shell programları neredeyse her zaman bunu yapıyor. Sizin crsh
bunu kodunu içermiyorsa, ancak C kütüphanesi rutin çünkü, zaten olur system
tam özellikli kabuk çalıştırır /bin/sh
"kaputun altındaki". bu senaryoda büyükbabacrsh
veya büyükbaba ; ana-işlem bildirimi, /bin/sh
normal mesajını basan alan alanına yazılır . Daha sonra /bin/sh
, yapacak başka bir şeyi olmadığından ve C kütüphanesinin bu çıkış bildirimini system
aldığı için kendiliğinden çıkar . Bu çıkış bildirimini kodunuzun, dönüş değerini inceleyerek görebilirsiniz.system
; fakat size torun sürecinin bir sicil suçunda öldüğünü söylemez, çünkü bu ara kabuk işlemi tarafından tüketildi.
Dipnotlar
Bazı işletim sistemleri, aygıt sürücülerini çekirdeğin bir parçası olarak kullanmaz; Ancak bütün kesme işleyicileri hala çekirdeğin bir parçası olmak zorunda ve donanım şey izin vermediğinden bu yüzden, bellek koruması yapılandıran kod yapar ama bunları yapmak için çekirdekte.
Çekirdekten daha ayrıcalıklı bir "hiper yönetici" veya "sanal makine yöneticisi" olarak adlandırılan bir program olabilir, ancak bu cevabın amaçları için donanımın bir parçası olarak kabul edilebilir .
Çekirdek bir programdır , ancak bir süreç değildir ; daha çok bir kütüphane gibi. Tüm işlemler kendi kodlarına ek olarak zaman zaman çekirdek kodunun bazı bölümlerini yürütür. Yalnızca çekirdek kodunu çalıştıran bir dizi "çekirdek ipliği" olabilir , ancak burada bizi ilgilendirmez.
Artık , Unix'in bir uygulaması olarak kabul edilemeyecek olan ve artık uğraşmanız gereken tek işletim sistemi Windows'tur. Bu durumda sinyal kullanmaz. (Gerçekten de, yok olması ; Windows üzerinde sinyalleri <signal.h>
It "denen birşey kullanan arayüz tamamen C kütüphanesi tarafından sahte olduğu.) Yapılandırılmış istisna işleme yerine".
Bazı bellek koruma ihlalleri, SIGBUS
bunun yerine ("Veriyolu hatası") üretir SIGSEGV
. İkisi arasındaki çizgi belirlenir ve sistemden sisteme değişir. Bir işleyiciyi tanımlayan bir program SIGSEGV
yazdıysanız, aynı işleyiciyi tanımlamak iyi bir fikir olabilir SIGBUS
.
"Bölümlendirme hatası", orijinal Unix’i , muhtemelen de PDP-11’i çalıştıran bilgisayarlardan birinin hafıza koruması ihlalleri için oluşturduğu kesintinin adıydı . " Segmentasyon " bir tür hafıza korumasıdır, ancak günümüzde "segmentasyon hatası " terimi genel olarak herhangi bir tür hafıza koruma ihlali anlamına gelir.
Bütün diğer ebeveyn süreç bir çocuğun bildirim alabilirsiniz yolları ebeveyn çağrı ile bitirmek, sona sahip wait
ve çıkış durumları alma. Sadece ilk önce başka bir şey olur.
crsh
Bu tür deneyler için harika bir fikir. Hepimizi ve arkasındaki fikri bize bildirdiğiniz için teşekkür ederiz.