System Calls

Önceki derste Britney’i hatırlıyor musunuz? Diyelim ki onu görmek ve birlikte birkaç içki almak istiyoruz, kalabalığın dışında durmaktan onun en iç çemberine nasıl geçeriz? System call’ları kullanırdık. System call’lar, sizi doğrudan Britney’ye götüren gizli bir yan kapıya geçiren VIP pass’ler gibidir.

System call’lar (syscall), user space process’lerine kernel’in bizim için bir şey yapmasını istemenin bir yolunu sağlar. Kernel, system call API’si aracılığıyla belirli servisleri kullanılabilir hale getirir. Bu servisler, bir dosyayı okumamıza veya yazmamıza, bellek kullanımını değiştirmemize, ağımızı değiştirmemize vb. olanak tanır. Servislerin miktarı sabittir, yani kafanıza göre system call ekleyemezsiniz, sisteminizde hangi system call’ların var olduğunu belirten bir tablo zaten vardır ve her system call’ın benzersiz bir ID’si vardır.

System call’lar hakkında ayrıntıya girmeyeceğim, çünkü bunun için biraz C bilmeniz gerekir, ancak temeli şudur: ls gibi bir program çağırdığınızda, programın içindeki kod bir system call wrapper içerir (yani henüz gerçek system call değil). Bu wrapper’ın içinde system call’ı çağırır, bu da bir trap yürütür, bu trap daha sonra system call handler tarafından yakalanır ve system call tablosundaki system call’a referans verir. Diyelim ki stat() system call’ını çağırmaya çalışıyoruz, bu bir syscall ID ile tanımlanır ve stat() system call’ının amacı bir dosyanın durumunu sorgulamaktır. Şimdi unutmayın, ls programını non-privilege mode’da çalıştırıyordunuz. Dolayısıyla şimdi bir syscall yapmaya çalıştığınızı görünce sizi kernel mode’a geçirir, orada birçok şey yapar ama en önemlisi syscall numaranızı arar, syscall ID’sine göre tabloda bulur ve çalıştırmak istediğiniz fonksiyonu yürütür. İş tamamlandıktan sonra user mode’a geri döner ve process’iniz başarılı olup olmadığını veya bir hata olup olmadığını belirten bir return status alır. System call’ların iç işleyişi gerçekten ayrıntılıdır, daha fazla öğrenmek isterseniz internette bilgi bakmanızı öneririm.

Bir process’in yaptığı system call’ları aslında strace komutuyla görebilirsiniz. strace komutu, bir programın nasıl yürütüldüğünü debug etmek için kullanışlıdır.

$ strace ls

Last updated