Programlama dilinde uygulama yapılmazsa “bir sistem çağrısı” ile kastedilen nedir?


14

"Sistem çağrısı" terimini anlamak istiyorum. Bir kullanıcı alanı uygulamasından çekirdek hizmetlerini almak için sistem çağrılarının kullanıldığını biliyorum.

Açıklığa kavuşturulması gereken bölüm, bir "sistem çağrısı" ile "sistem çağrısının C uygulaması" arasındaki farktır.

İşte beni şaşırtan bir teklif:

Unix benzeri sistemlerde, bu API genellikle Clib'in (libc) glibc gibi, genellikle çağırdıkları sistem çağrılarıyla aynı şekilde adlandırılan sistem çağrıları için sarma işlevleri sağlayan bir uygulamasının bir parçasıdır.

"Aradıkları sistem çağrıları" nedir? Kaynakları nerede? Bunları doğrudan koduma ekleyebilir miyim?

"Sistem çağrısı" genel anlamda sadece POSIX tanımlı bir arabirim midir, ama aslında uygulamayı görmek için C kaynağını inceleyebilir ve bunun içinde çekirdek iletişimi için gerçek kullanıcı alanının gerçekte nasıl gittiğini görebilir mi?

Arka plan notu: Sonunda her c fonksiyonunun cihazlarla etkileşime girip girmediğini anlamaya çalışıyorum /dev.

Yanıtlar:


21

Sistem çağrıları kendi başına bir kavramdır. Süreçlerin çekirdeğin gerçekleştirmesini isteyebileceği eylemleri temsil ederler.

Bu sistem çağrıları UNIX benzeri sistemin çekirdeğinde gerçekleştirilir. Bu uygulama (C ile yazılmış ve küçük parçalar için asm olarak) aslında sistemdeki eylemi gerçekleştirir.

Daha sonra işlemler, sistemden sistem çağrılarının yürütülmesini istemek için bir arabirim kullanır. Bu arayüz POSIX tarafından belirtilmiştir. Bu, C standart kitaplığının bir dizi işlevidir. Bunlar aslında paketleyicidir, bazı kontroller yapabilir ve daha sonra çekirdekte sistem çağrısının gerektirdiği eylemleri yapmasını söyleyen sisteme özgü bir işlevi çağırabilirler. İşin püf noktası, arabirim olan işlevler, sistemin kendilerini çağırdığı gibi adlandırılır ve genellikle doğrudan "sistem çağrıları" olarak adlandırılır.

Doğrudan sisteme özgü mekanizma aracılığıyla sistem çağrısını gerçekleştiren çekirdeğin işlevini çağırabilirsiniz. Sorun, kodunuzu kesinlikle taşınabilir yapmamasıdır.

Yani, bir sistem çağrısı:

  • bir kavram, bir kullanıcı sürecine hizmet sunmak için çekirdek tarafından gerçekleştirilen bir eylem sırası
  • bu hizmeti çekirdekten almak için kodunuzda kullanmanız gereken C standart kitaplığının işlevi.

1
"Sarıcı işlevi" ve gerçek bir sistem çağrısı örneği var mı? (Linux'ta dosya yolları veya kaynaklara bağlantılar)
TheMeaningfulEngineer

3
Örneğin, bu getpidsistem çağrısının Linux çekirdeğinde uygulanmasıdır: lxr.free-electrons.com/source/kernel/timer.c?v=2.6.35#L1337 . Ve bu GNU C standart kütüphanesi glibc-2.19: fossies.org/dox/glibc-2.19/… ' daki sarmalayıcı işlevidir .
lgeorget

@Igeorget: bağlantılarınız artık çalışmıyor. Çekirdek uygulaması için güncel bağlantı: github.com/torvalds/linux/blob/… . Bu gün glibc ne yaptığını bulamadım, bu kod gezinmek imkansız.
rchard2scout

6

Bir sistem çağrısı programı kendisi tarafından yapamam, programınızın adına bazı operasyon yapmak için işletim sistemini (çekirdek) sormak için bir yoldur (veya yalnızca uygunsuz). Bazı işlemleri yapamamanın nedeni, normalde rastgele bir programın bunları yapmasına izin vermek, G / Ç (doğrudan RAM'e, herhangi bir şeyin üzerine yazmak) gibi sistemin bütünlüğünü tehlikeye atabilir.

POSIX, programlar için, programınızın çağırabileceği belirli işlevler için bir arabirim tanımlar. Bunlardan bazıları az ya da çok doğrudan sistem çağrılarına çevrilirken, diğerleri daha fazla ayrıntı gerektirir. POSIX arayüzünü sunmaktan ve argümanları paketlemekten ve sonuçları arayan kişiye geri almaktan sorumlu olan diliniz, örneğin C kütüphanesi için çalışma zamanıdır.

Unixy sistemleri, sistem çağrıları olarak az çok doğrudan POSIX arabirimleri sunar. Genellikle sistem çağrılarını doğrudan çağırmanın bir yolu vardır, syscall(2)bu tesisin Linux'ta nasıl kullanılacağına ilişkin ayrıntıları arayın .


1
Diğer cevapların karşı çıktığı önemli bir noktaya değiniyorsunuz. Makul yetenekli programcı kendisi için yazabilirsiniz Herhangi fonksiyonu (örneğin strlen, strcpy, sqrt, ve qsort) olabilir ve muhtemelen bir kütüphaneden yüklenen, kullanıcı alanı içindedir. (Çoğunlukla libc; matematik fonksiyonları sqrtve trigonometrik ve hiperbolik fonksiyonlar muhtemelen libm'de, matematik kütüphanesinde bulunur.)… (Devam)
Scott

1
(devamı) ... Ama bir kullanıcı kendi yazabilir yolu yoktur fork, killya da openbu işletim sistemi çekirdek bellek alanı (örneğin, süreç tablo) veya imtiyazlı talimatlar (örneğin G / Ç) erişim gerektirdiğinden işlevi. Bu nedenle, bu işlevleri yerine getiren kodun işletim sistemi çekirdeğinde olması gerekir; dolayısıyla, sistem işlevleri veya sistem çağrıları.
Scott

5

Elbette, bu fil-nasıl-birçok-yön-yapabiliriz-yapalım? şey.

Gerçek sistem çağrısı, yerleşik programınızda, ayrıcalık yükselmesini çekirdek moduna geçiren makine talimatıdır ve çekirdeğin kendisinde talimatın çağırdığı koddur. Libc kodu (ve her dil çalışma zamanı), makine kayıtlarını ve depolama kodu parametrelerini, çekirdek kodunun bunları bulmayı beklediği yerlerde ayarlar; bu, söz konusu makine talimatındaki kısıtlamalar nedeniyle kesin olarak garip yerler olabilir.

OS kodunun kendisine girdikten sonra, kullanıcı çalışma zamanının yaptığı makineye özgü şeylerin biraz ayna görüntüsü çözülmesi ve ardından mükemmel bir sıradan alt program çağrısı var.
Bunun tam ölçekli bir işletim sisteminde tam olarak nasıl çalıştığını görmek istiyorsanız, çekirdek kaynağını ( git clone https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/) çekin ve örn git grep -i system\ call. Glibc kaynağını çekin ve aynı şekilde yapın.


Doğru, ama Linux veya
glibc'de dolaşmak

3

Linux'ta en azından sistem çağrı mekanizması, bazı kayıtlara veya önceden tanımlanmış bellek adreslerine özel olarak biçimlendirilmiş veriler (genellikle bir tür c yapı) yerleştirerek çoğu mimaride çalışır.

Ancak sorun aslında CPU'yu çekirdek alanına geçiş yapmaya zorlayarak çağrıya hizmet vermek için ayrıcalıklı çekirdek kodunu çalıştırabiliyor. Bu, bir tür bir hatayı zorlamak suretiyle yapılır (bir hata 0'a bölünmek, tanımlanmamış bir taşma veya segfault, vb.), Çekirdeği hatayı işlemek için yürütmeyi devralmaya zorlar.

Normalde çekirdek, hataya neden olan işlemi öldürerek veya kullanıcı tarafından sağlanan bir işleyiciyi çalıştırarak hataları işler. Bununla birlikte, bir sistem çağrısı durumunda, bunun yerine önceden tanımlanmış kayıtları ve bellek konumlarını kontrol eder ve bir sistem çağrısı talebi içeriyorsa, bellek içi yapıdaki kullanıcı işlemi tarafından sağlanan verileri kullanarak bunu çalıştırır. Bu genellikle bazı özel hazırlanmış el yapımı montaj ile yapılmalıdır ve kullanıcı için sistem çağrısının kullanımını kolaylaştırmak için sistemin C kütüphanesinin bir işlev olarak sarması gerekir. Daha alt düzey bir arayüz için, sistem çağrılarının nasıl çalıştığı ve C sarıcı olmadan nasıl arayabileceğiniz hakkında bilgi için lütfen http://man7.org/linux/man-pages/man2/syscall.2.html adresine bakın .

Bu aşırı basitleştirildi, tüm mimarilerde (mips'in özel bir sistem çağrısı talimatı var) doğru değil ve tüm işletim sistemlerinde aynı şekilde çalışması gerekmez. Yine de, herhangi bir yorumunuz veya sorunuz varsa lütfen sorun.

Değiştirildi: / dev / içindeki şeyler hakkındaki yorumunuzla ilgili olarak, aslında çekirdeğe göre daha üst düzey bir arayüz, daha düşük bir arayüz değil. Bu cihazlar aslında altında (yaklaşık) 4 sistem çağrısı kullanır. Onlara yazmak bir yazma sistemiyle aynıdır, bir okuma sistemini okumak, onları açık ve kapalı sistem çağrılarına eşdeğer olarak açmak / kapatmak ve bir ioctl çalıştırmak, kendi içinde sistemin birçok ioctlinden birine erişmek için bir arayüz olan özel bir ioctl sistem çağrısına neden olur. (özel, genellikle cihaza özel bir arama yazmak için çok dar kullanıma sahip cihaza özel çağrılar).


1

Her sistem çağrısının ilişkili bir tamsayısı vardır. Bu tam sayı, sistem çağrısının dönüş değerinin, sistem çağrısına bağımsız değişkenlerin sayısının ve bağımsız değişkenlerin türünün bir işlevidir. Bu sistem çağrı numarası, global sistem çağrı vektörüne bir ofsetten başka bir şey değildir, sadece ayrıcalıklı modda erişilebilen bu vektör, uygun işleyicilere işaretçi içerir. Bir sistem çağrısının başlatılması üzerine işlem, bir yazılım kesmesi (tuzak kesmesi) üretilecek, dolayısıyla hangi sistem çağrısının çağrılması gerektiğini belirleyen bir tuzak işleyici çalıştırılacaktır. Daha sonra çekirdek, yığın üzerinde bulunan kullanıcı tarafından iletilen sistem çağrısının argümanlarını işlemci kayıtlarına kopyalar ve istenen hizmeti tamamladıktan sonra veriler işlemci kayıtlarından yığına geri kopyalanır. Sistem çağrıları için sınırlı argümanların olmasının nedenlerinden biri de budur,


Her çağrı (işlem) dahili olarak bir numara ile tanımlanır, true. Ancak sayı , dönüş değerine veya bağımsız değişken sayısına değil , işleme bağlıdır . X86 üzerinde
userland'dan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.