Linux Sistem Çağrısı Nedir?

What Is Linux System Call



Bir Linux sistem çağrısının tanımına girmeden ve yürütmesinin ayrıntılarını incelemeden önce, tipik bir Linux sisteminin çeşitli yazılım katmanlarını tanımlamakla başlamak en iyisidir.

Linux çekirdeği, donanımınızdaki mevcut en düşük düzeyde önyüklenen ve çalışan özel bir programdır. Klavye, disk ve ağ olaylarını işleme dahil olmak üzere bilgisayarda çalışan her şeyi düzenleme görevine sahiptir ve birden çok programı paralel olarak yürütmek için zaman dilimleri sağlar.







Çekirdek, kullanıcı düzeyinde bir program yürüttüğünde, bellek alanını sanallaştırır, böylece programlar bellekte çalışan tek işlem olduğuna inanır. Bu koruyucu donanım ve yazılım yalıtımı balonu, güvenliği ve güvenilirliği artırır. Ayrıcalıksız bir uygulama, diğer programlara ait belleğe erişemez ve bu program çökerse, sistemin geri kalanına zarar vermemesi için çekirdek sonlandırılır.



Bariyeri Linux Sistem Çağrılarıyla Aşmak

Ayrıcalıksız uygulamalar arasındaki bu yalıtım katmanı, sistemdeki diğer uygulamaları ve kullanıcıları korumak için mükemmel bir sınır sağlar. Bununla birlikte, bilgisayardaki ve dış dünyadaki diğer öğelerle arayüz oluşturmanın bir yolu olmadan, programlar pek bir şey başaramazlardı.



Etkileşimi kolaylaştırmak için çekirdek, çalışan programın çekirdeğin kendi adına hareket etmesini istemesine izin veren bir yazılım kapısı belirler. Bu arayüz sistem çağrısı olarak bilinir.





Linux, UNIX'in her şey bir dosyadır felsefesini takip ettiğinden, bir cihaz olabilecek bir dosyayı açıp okuyarak veya yazarak birçok işlev gerçekleştirilebilir. Örneğin Windows'ta rasgele baytlara erişmek için CryptGenRandom adlı bir işlev kullanabilirsiniz. Ancak Linux'ta bu, /dev/urandom dosyasını açıp standart dosya giriş/çıkış sistem çağrılarını kullanarak bayt okuyarak yapılabilir. Bu önemli fark, daha basit bir sistem çağrı arabirimi sağlar.

Gofret-İnce Sarıcı

Çoğu uygulamada, sistem çağrıları doğrudan çekirdeğe yapılmaz. Hemen hemen tüm programlar, Linux sistem çağrıları etrafında ince ama önemli bir sarmalayıcı sağlayan standart C kitaplığına bağlanır. Kitaplık, işlev argümanlarının doğru işlemci kayıtlarına kopyalandığından emin olur ve ardından ilgili Linux sistem çağrısını yayınlar. Çağrıdan veri alındığında, sarmalayıcı sonuçları yorumlar ve tutarlı bir şekilde programa geri döndürür.



Kamera ARKASI

Sistemle etkileşime giren bir programdaki her işlev, sonunda bir sistem çağrısına çevrilir. Bunu çalışırken görmek için temel bir örnekle başlayalım.

geçersizana() {
}

Bu muhtemelen göreceğiniz en önemsiz C programıdır. Ana giriş noktası üzerinden kontrolü ele alır ve ardından çıkar. main void olarak tanımlandığından bir değer bile döndürmez. Dosyayı ctest.c olarak kaydedin ve derleyelim:

gcc testi.C -test

Derlendikten sonra dosya boyutunu 8664 bayt olarak görebiliriz. Sisteminizde biraz değişebilir, ancak 8k civarında olmalıdır. Sadece girmek ve çıkmak için çok fazla kod var! 8k olmasının nedeni, libc çalışma zamanının dahil edilmesidir. Sembolleri çıkarsak bile, hala 6k'nın biraz üzerinde.

Daha da basit bir örnekte, bunu bizim için yapması için C çalışma zamanına bağlı kalmak yerine Linux sistem çağrısını çıkışa dönüştürebiliriz.

geçersiz_Başlat() {
asm('movl $1,%eax;'
'xorl %ebx,%ebx;'
'int $0x80');
}

Burada 1'i EAX kaydına taşırız, EBX kaydını temizleriz (aksi takdirde dönüş değerini içerecektir), sonra Linux sistem çağrı kesmesini 0x80 (veya ondalık olarak 128) çağırırız. Bu kesme, çağrımızı işlemek için çekirdeği tetikler.

Asmtest.c adlı yeni örneğimizi derler ve sembolleri çıkarır ve standart kitaplığı hariç tutarsak:

gcc-s-nostdlib asmtest.C -o test

1k'dan daha az bir ikili dosya üreteceğiz (benim sistemimde 984 bayt veriyor). Bu kodun çoğu yürütülebilir başlıklardır. Şimdi doğrudan Linux sistem çağrısını çağırıyoruz.

Tüm Pratik Amaçlar İçin

Neredeyse tüm durumlarda, C programlarınızda hiçbir zaman doğrudan sistem çağrıları yapmanız gerekmeyecek. Ancak Assembly dilini kullanırsanız ihtiyaç doğabilir. Bununla birlikte, optimizasyonda, C kitaplığı işlevlerinin sistem çağrılarını yapmasına izin vermek ve derleme yönergelerinde yalnızca performans açısından kritik kodunuzun gömülü olmasını sağlamak en iyisidir.

Sistem Çağrısı Eğitimleri Nasıl Programlanır

Tüm Sistem Çağrılarının Listesi

Linux için mevcut tüm sistem çağrılarının bir listesini görmek istiyorsanız şu referans sayfalarını kontrol edebilirsiniz: LinuxHint.com'daki Sistem Çağrılarının Tam Listesi, filippo.io/linux-syscall-table/ ve veya syscalls.kernelgrok.com