Forum: Diğer Konular RSS
Linux Kernel Yapısı ve Sayılar
Sadece şöyle bir bakayım dedim...:)
Avatar
Salih Dinçer #1
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Linux Kernel Yapısı ve Sayılar
Biliyordum, haddim değildi!

Kernel.org'dan güncel sürüm numaralarına bakayım dedim. Sonra kendimi 3.4'ü ve 1994'deki ilk sürümü indirirken buldum. Son kararlı sürüm geliyorken bellek ile ilgili mm dizini ilgimi çekti. Sanırım açılımı "memory management" olmalı. Ancak yetmezdi içeriğine ve kodlarına bakmalıydım...:)

linux/kernel/3.4/mm/page_alloc.c:
static int page_outside_zone_boundaries(struct zone *zone, struct page *page)
{
    int ret = 0;
    unsigned seq;
    unsigned long pfn = page_to_pfn(page);
 
    do {
        seq = zone_span_seqbegin(zone);
        if (pfn >= zone->zone_start_pfn + zone->spanned_pages)
            ret = 1;
        else if (pfn < zone->zone_start_pfn)
            ret = 1;
    } while (zone_span_seqretry(zone, seq));
 
    return ret;
}
Şu kodun güzelliğine bakar mısınız! Öncelikle her yerde yapı (struct) dolu ve bir sürü işlev (function). Bunu yukarıda ilk dikkatimi çeken işlevden de anlayabilirsiniz. Tabi ilk sürümden bu yana assembly kodları da eksik değil hani.

Peki ya işlev isimlerinin uzunluğu dikkatinizi çekti mi? Belki de bu yüz binlerce işlevi açıklıyor olmalı! Peki son sürümdeki dosya sayını biliyor musunuz? Tam olarak 38 bin 568 dosya ve yukarıda alıntıladığım 160 KB. Ayrıca tüm kodun açılımı teorik olarak bir CD'ye sığsa da (450 MB.) dosya sayısının fazlalığından dolayı açık bir şekilde CD'ye kayıt etmek pratikte sıkıntı yapsa gerek...:)

Sevgiler, saygılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
Salih Dinçer #2
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yeter mi, yetmez...:)
linux/kernel/1.0/mm/memory.c:
static inline void get_empty_page(struct task_struct * tsk, unsigned long address)
{
    unsigned long tmp;
 
    if (!(tmp = get_free_page(GFP_KERNEL))) {
        oom(tsk);
        tmp = BAD_PAGE;
    }
    if (!put_page(tsk,tmp,address,PAGE_PRIVATE))
        free_page(tmp);
}
Bu da ilk sürümdeki bir işlev. Henüz tahammüllerin üzerinde değil ve zaten o dizinde topu topu 4-5 dosya var. Tabi 20 sene önceki teknolojiden bahsediyoruz. Yine de bir sürü assembly dosyası var; tüm Kernel'da 561 dosya, 5 MB. yer kaplar imiş...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
zafer #3
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Salih linux çekirdek kodları (kernel) ile hiç uğraşmadım. Doğrusu bu kodlarıda çok fazla anlamadım ama her zaman derim, altının deferini sarraf anlar diye :)

Güzel ve özenle yazılmış kodları tablolara benzetiyorum. İnsanlar nasıl o tabloların karşısına geçip zevkle izliyorlarsa bazen çok hoşuma giden kodları karşıma alıp izlediğimi bilirim :) Biraz abartı belki ama hoşuma gidiyor :)

Bu arada konu açılmışken bende Divid projesi için ufkumu genişletmek amacıyla monodevelop (https://github.com/mono/monodevelop) projesinin eski kodlarını inceliyorum. Onların yapısıda gayet hoş örneğin benim SayfaBaslik sınıfıma karşılık TabLabel sınıfı ile karşılaştığımda sevinmiştim.

//
// Author: John Luke <jluke@cfl.rr.com>
// License: LGPL
//
 
using System;
using System.Drawing;
using Gtk;
using Gdk;
 
namespace MonoDevelop.Gui.Widgets
{
    public class TabLabel : HBox
    {
        private Label title;
        private Gtk.Image icon;
        private Button btn;
 
        protected TabLabel (IntPtr p): base (p)
        {
        }
 
        public TabLabel (Label label, Gtk.Image icon) : base (false, 2)
        {
            this.icon = icon;
            this.PackStart (icon, false, true, 2);
 
            title = label;
            this.PackStart (title, true, true, 0);
 
            btn = new Button ();
            btn.Add (new Gtk.Image (GetType().Assembly, "MonoDevelop.Close.png"));
            btn.Relief = ReliefStyle.None;
            btn.SetSizeRequest (18, 18);
            this.PackStart (btn, false, false, 2);
            this.ClearFlag (WidgetFlags.CanFocus);
 
            this.ShowAll ();
        }
 
        public Label Label
        {
            get { return title; }
            set { title = value; }
        }
 
        public Gtk.Image Icon
        {
            get { return icon; }
            set { icon = value; }
        }
 
        public Button Button
        {
            get { return btn; }
        }
    }
}
https://github.com/zafer06 - depo
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-18, 22:40:22 (UTC -08:00)