Linux Kernel - İşletim Sistemlerinin Tasarımı ve Gerçekleştirilmesi
İçindekiler
1. Giriş
1.1. Gereksinimler
1.2. Çekirdek Kodları Üzerinde Gezinme
1.3. İşletim Sistemi Nedir?
1.4. İşletim Sistemlerinin Sınıflandırılması
1.4.1. Proses Yönetimine Göre
1.4.2. Kullanıcı Sayısına Göre
1.4.3. Çekirdek Yapısına Göre
1.4.4. Dışsal Olaylarla Yanıt Verebilme Özelliğine Göre
1.4.5. Dağıtıklık Durumuna Göre
1.4.6. Donanım Özelliğine Göre
1.4.7. Kaynak Kod Lisansına Göre
1.4.8. Kaynak Kodun Özgünlüğüne Göre
1.4.9. GUI Çalışma Desteğine Göre
1.4.10. Ağ Üzerinde Hizmet Alıp Verme Rollerine Göre
1.5. İşletim Sistemlerinin Tarihsel Gelişimi
1.6. UNIX Türevi Sistemlerin Tarihsel Gelişimi
1.7. Mac OS X (macOS) Türevi Sistemler
1.8. GNU Projesi ve Özgür Yazılım
1.9. Linux’un Tarihsel Gelişimi
1.10. Linux Dağıtımları
1.11. POSIX Standartları
1.12. Linux Çekirdeğinin Kaynak Kod Yapısı
1.13. İşletim Sistemlerinin Sistemlerinin Boot Edilmesi
1.13.1. Reset Vektörü ve BIOS/Firmware
1.13.2. Önyükleyici (Bootloader) Programlar
1.13.3. Genel Boot Akışı
1.13.4. Boot Aşamaları Terminolojisi
1.13.5. PC Sistemlerinde Boot Süreci (Klasik BIOS)
2. Çekirdeğin Derlenmesi
2.1. Çekirdek Davranışını Değiştirme Yöntemleri
2.2. Çekirdek Komut Satırı Parametreleri
2.3. Çekirdeği Yeniden Derlemenin Gerektiği Durumlar
2.4. Çekirdek Derlemesi Hakkında
2.4.1. Çapraz Derleme
2.4.2. Çekirdek Kaynak Kodlarının İndirilmesi ve Açılması
2.4.2.1. Sıkıştırma Formatları ve tar Komutu
2.4.3. Dağıtıma Özgü Çekirdek Kaynak Kodları
2.5. Çekirdek Versiyon Numaralandırması
2.6. Derleme Araçları
2.7. Çekirdek Derleme Adımları
2.7.1. Adım 1: Gerekli Araçların Kurulması
2.7.2. Adım 2: Kaynak Kodların İndirilmesi ve Açılması
2.7.3. Adım 3: Çekirdeğin Konfigüre Edilmesi
2.7.4. Adım 4: Konfigürasyon Değişikliklerinin Yapılması
2.7.5. Adım 5: Derleme
2.7.6. Adım 6: Modüllerin Kurulması
2.7.7. Adım 7: Aygıt Ağacı Dosyalarının Derlenmesi
2.7.8. Adım 8: Kurulum
2.7.8.1. Geçici Kök Dosya Sistemi (initrd)
2.8. make modules_install Komutu ile İlgili Ayrıntılar
2.8.1. modules.dep
2.8.2. modules.alias
2.8.3. modules.order
2.9. Manuel Kurulum
2.9.1. Çekirdek Sürüm Yazısının Belirlenmesi
2.10. GRUB Yapılandırması
2.11. Çekirdek Derleme Süreci Özeti
2.12. Çekirdeğin Sistemden Kaldırılması
2.13. Çekirdek Kodları Üzerinde Değişiklik Yapma Yöntemleri
2.14. KBuild Sistemi ve GNU Make
2.15. Makefile Dosyalarının Güncellenmesi
2.16. Kconfig Dosyaları
2.17. Konfigürasyon Seçeneklerinin Kaynak Kodlara Yansıtılması
2.18. Konfigürasyon Seçeneklerinin Makefile Dosyalarına Yansıtılması
2.19. Yeni Dizin için Makefile ve Kconfig Dosyaları
2.20. Örnek: Çekirdeğe Yeni Modül Ekleme
2.21. Yeniden Derleme Sonrası Güncellemeler
2.22. Çekirdek ve Modül İmzalama
2.23. Çekirdek İmjasının İmzalanması
2.24. Kök Dosya Sisteminin Oluşturulması
2.24.1.
debootstrap
ile Kök Dosya Sistemi Oluşturma
2.24.2. Geçici Kök Dosya Sisteminin Oluşturulması
2.25. Çekirdek Başlık Dosyalarının Kurulumu
3. Bağlı Listelerin ve Hash Tablolarının Çekirdek Gerçekleştirimleri
3.1. Bağlı Listeler
3.2. Bağlı Listelere Neden Gereksinim Duyulmaktadır?
3.3. Linux Çekirdeğindeki Bağlı Liste Gerçekleştirimi
3.3.1. Bağlı Listenin Başlatılması
3.3.2. Düğüm Ekleme
3.3.3. Bağlı Listenin Dolaşılması
3.3.4. Bağlı Listeden Düğüm Silme
3.3.5. Bağli Listede Araya Düğüm Ekleme
3.3.6. Bağli Listelerin Yok Edilmesi
3.3.7. Bağlı Listelere RCU Desteği
3.4. Çekirdek Bağlı Listelerinin Örnek Gerçekleştirimi
3.5. Eski Çekirdek Sürümlerindeki list.h Dosyası
3.6. Arama Algoritmaları ve Sözlük Tarzı Veri Yapıları
3.6.1. İndeksli Arama
3.7. Hash Tabloları
3.7.1. Çakışma Çözümleme Stratejileri
3.7.1.1. Ayrı Zincir Oluşturma (Separate Chaining)
3.7.1.2. Açık Adresleme ve Doğrusal Yoklama
3.7.1.3. Hash Fonksiyonlarının Tasarımı
3.8. Linux Çekirdeğinde Hash Tablosu Gerçekleştirimi
3.8.1. hlist_head ve hlist_node Yapıları
3.8.2. Hash Tablosunun Oluşturulması
3.8.3. Hash Tablosundan Düğüm Silme
3.8.4. Insert Fonksiyonları
3.8.5. Hash Tabloları için Döngü Makroları
3.8.6. Hash Tablosu Gerçekleştirimine Bir Örnek
3.9. RCU’lu Hash Tablosu Fonksiyonları
4. Proses Kontrol Bloğu ve task_struct Yapısı
4.1. Proses Kavramı
4.2. Proses Kontrol Bloğu
4.3. task_struct Yapısı
4.4. Proseslerin ID Değerleri (PID)
4.5. Thread Kavramı
4.6. Prosesler Arasındaki Altlık-Üstlük İlişkisi
4.7. task_struct Yapısının Dallı Budaklı Tasarımı
4.8. current Makrosu
4.9. fork ve pthread_create Çağrı Zincirleri
4.10. task_struct Nesneleri Arasındaki Bağ İlişkileri
4.10.1. Thread Listesi: thread_head ve thread_node
4.10.2. pid ve tgid Elemanları
4.10.3. group_leader Göstericisi
4.10.4.
real_parent
ve
parent
Göstericileri
4.10.5. Alt Proses Listesi: children ve sibling Elemanları
4.10.6. Tüm Proseslerin Listesi: tasks
4.10.7. Özet: task_struct İlişkileri
4.10.8. Sık Sorulan Sorular
4.11. task_struct Yapısına İlişkin Bağlı Listeler Üzerinde Gezinmelere Örnekler
4.11.1. Geliştirme Ortamının Hazırlanması
4.11.2. Derleme ve Yükleme
4.11.3. Çekirdek Modülü ve Aygıt Sürücü Kavramları
4.11.4. Aygıt Dosyaları
4.11.5. Aygıt Sürücülerin Majör ve Minör Numaraları
4.11.6. İskelet Karakter Aygıt Sürücüsü Örneği
4.11.7. RCU Mekanizması ile task_struct Listelerinin Dolaşılması
4.11.8. Tüm Prosesleri Dolaşan Çekirdek Modülü Örneği
4.11.9. Thread Listesini Dolaşan Aygıt Sürücü Örneği
4.11.10. Tüm task_struct Nesnelerinin Dolaşılması
4.11.11. Alt Proses Listesininin Dolaşılması
4.12. PID Tahsisatı
4.12.1. PID Üretim Mekanizmasının Tarihsel Gelişimi
4.12.2. Maksimum PID Değeri
4.13. PID’den task_struct Nesnesine Hızlı Erişim
4.13.1. 2.6 Versiyonu:
pid
Nesnesi ve Bağlı Listeler
4.13.2. pid_type Enum Değerleri ve Bağlı Listeler
4.13.3. 4.20 Versiyonu: Hash Tablosundan XArray’e Geçiş
4.13.4. Radix Ağaçlarının Kullanılması
4.13.5. Yapraklarda Değer Saklama Yöntemi
4.13.6. Dallanma Faktörü: n-li Ağaç
4.13.7. Güncel Çekirdeklerde pid Araması (4.20+)
4.13.8. XArray Gerçekleştirimi
5. Dosya Sistemi - I. Bölüm
5.1. Giriş
5.2. Temel Kavramlar
5.2.1. Disk Aktarımına İlişkin Temel Bilgiler
5.2.2. Sektörler ve Disk Denetleyicisi
5.2.3. DMA (Direct Memory Access)
5.2.4. Blok Kavramı
5.2.5. Sayfa Önbelleği (Page Cache)
5.3. Okuma ve Yazma İşlemleri
5.3.1. Yazma İşleminin Ayrıntıları
5.3.2. Gecikmeli Yazım ve Flush Thread’leri
5.3.3. Gecikmeli Yazımın Gerekçeleri
5.3.4. Kirlenmiş Sayfaların Erken Flush Edilmesi
5.3.5. Standart C Kütüphanesinin Süreçteki Yeri ve İşlevi
5.4. task_struct İçerisindeki Dosya Sistemine İlişkin Veri Yapıları
5.4.1. fs_struct Yapısı
5.4.2. files_struct Yapısı
5.5. Dosya Nesnesi ve Dosya Betimleyici Tablosu
5.5.1. Dosya Betimleyici Tablolarının clone ve fork İşlemleri Sırasında Kopyalanması
5.6. Dosya Sistemine İlişkin Üç Önemli Yapı: file, inode ve dentry
5.6.1. file Yapısı
5.6.1.1. file Yapısının Elemanları
5.6.2. inode Yapısı
5.6.3. dentry Yapısı
5.6.4. file, inode ve dentry Nesneleri Arasındaki İlişki
5.7. dentry ve inode Önbellekleri
5.8. Açık Dosyalara İlişkin Alıştırmalar
5.8.1. f_pos Elemanının Elde Edilmesi
5.8.2. dup Fonksiyonunun Gerçekleştirimi
5.8.3. Alıştırmalara İlişkin Aygıt Sürücünün Kaynak Kodu
5.9. Çekirdekte Dosyaların Açılması ve Kapatılması Süreci
5.9.1. sys_open Sistem Fonksiyonunun Çekirdek Gerçekleştirimi
5.9.2. Çekirdeğin 0.01 Versiyonundaki sys_open Fonksiyonu
5.9.3. sys_close Sistem Fonksiyonunun Çekirdek Gerçekleştirimi
5.10. Yol İfadelerinin Çözümlenmesi ve Dentry Önbelleğinin Organizasyonu
5.10.1. dentry Yapısının Dentry Önbelleği İle İlgili Elemanları
5.10.1.1. Dentry Nesnelerinde Dizin Girişi İsminin Saklanması
5.10.1.2. Dentry Nesnelerindeki Hiyerarşik İlişkiler: d_parent, d_sib ve d_children
5.10.1.3. Dentry Nesnelerinin Sayaçları ve Kilitlenmesi: d_lockref
5.10.1.4. Dentry Nesnelerinde Dosya Sistemi Bilgisinin Saklanması: d_sb
5.10.2. Dentry Önbelleğinin Yapısı
5.10.2.1. Dentry Hash Değerinin Hesaplanması
5.10.2.2. Dentry Hash Tablosunun Uzunluğu
5.10.2.3. Dentry Nesnelerinin Grupları
5.10.2.4. Dentry Nesnelerinin Dentry Önbelleğinden Atılması
5.10.2.5. Dentry Önbelleğinin proc ve sys Dosya Sistemleri Yoluyla İzlenmesi
5.11. Inode Kavramının ve Inode Nesnelerinin Ayrıntılı Bir Biçimde Ele Alınması
5.11.1. Inode Tabanlı Dosya Sistemlerinin Disk Organizasyonu
5.11.2. Inode Tabanlı Dosya Sistemlerinde Dizin Girişlerinin Diskteki Organizasyonu
5.11.2.1. Aynı Inode Nesnesini Gösteren Dentry Nesneleri
5.12. Inode Önbelleği
5.12.1. Inode Önbelleğinin Organizasyonu
5.12.2. Inode Önbelleğine İlişkin Hash Tablosunun Yapısı ve LRU Listeleri
5.12.3. Inode Nesnelerinin Önbellekten Atılması
5.12.4. Örnek Senaryolar
5.12.5. Inode Önbelleği İzleme Araçları
5.13. Süper Blok Nesneleri
5.14. Dosya Sisteminin Mount Edilmesi
5.15. Dosya Sistemlerinin Çekirdeğe Kaydettirilmesi
5.15.1. file_system_type Nesnesinin İçinin Doldurulması
5.15.1.1. Süper Blok Nesnesini Oluşturan Yüksek Seviyeli Fonksiyonlar: mount_nodev ve mount_bdev
5.15.1.2. Kök Dizine İlişkin inode ve dentry Nesnelerinin Yaratılması
5.15.1.3. Yeni Çekirdeklerdeki Yüksek Seviyeli Mekanizma: init_fs_context
5.15.2. Mount İşleminin Özet Akışı
5.16. Linux Çekirdeğinde Sanal Dosya Sistemi ve Sanal Fonksiyon Mekanizması
5.16.1. xxx_operations Yapıları
5.16.2. super_operations ve inode_operations Yapılarının İşletilmesi
5.17. Sıfırdan Dosya Sistemi Oluşturma Adımları
6. Dosya Sistemi - II. Bölüm
6.1. Hazırlık İşlemleri
6.1.1. Linux Çekirdeğinde Kullanılan Temel Türlere İlişkin typedef İsimleri
6.1.2. Loop Aygıtları
6.1.2.1. Loop Aygıt Dosyaları
6.1.2.2. Loop Aygıtları İçin Dosya Oluşturma
6.1.2.3. Loop Aygıtlarını Yapılandırma
6.1.2.4. Loop Aygıtına İlişkin Diskin Formatlanması ve Mount Edilmesi
6.1.2.5. Geri Alma İşlemleri
6.1.2.6. Loop Aygıtlarının Kullanım Akışı
6.2. simplefs Dosya Sisteminin Tasarımı
6.2.1. simplefs Dosya Sisteminin Disk Organizasyonu
6.2.1.1. Inode Blok Yapısı
6.2.1.2. Süper Blok Yapısı
6.2.1.3. Disk Inode Elemanının Yapısı
6.2.1.4. Dizin Girişleri
6.2.2. Formatlama Programı: mkfs.simplefs
6.3. simplefs Dosya Sistemi Aygıt Sürücüsünün Gerçekleştirimi
6.3.1. super_block Nesnesinin İçinin Doldurulması
6.3.2. Dosya Sisteminde Güncellenen Disk Bloklarının Aygıta Yazılması
6.3.3. Little-Endian/Big Endian Sorunu
6.3.4. simplefs Süper Bloğunun ve Bitmap Bloklarının Diskten Okunması
6.3.5. Kök Dizine İlişkin Inode Nesnesinin Oluşturulması
7. Kaynaklar
7.1. Kaynak Listesi
7.2. İşletim Sistemleri Teorisi
7.3. Understanding the Linux Kernel
7.4. Linux Device Drivers
7.5. Kernel Internals ve Genel Mimari
7.6. Linux Kernel Programming
7.7. Linux Kernel Debugging
7.8. Sistem Programlama ve Kullanıcı Alanı Kaynakları
7.9. Çevrimiçi Kaynaklar
Linux Kernel - İşletim Sistemlerinin Tasarımı ve Gerçekleştirilmesi
Dizin
Dizin