Thread overview
Linux Kernel Yapısı ve Sayılar
May 27, 2012
Salih Dinçer
May 27, 2012
Salih Dinçer
May 28, 2012
zafer
May 27, 2012

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...:)

Alıntı (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...

-- 
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]
May 27, 2012

Yeter mi, yetmez...:)
Alıntı (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ş...

-- 
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]
May 28, 2012

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; }
		}
	}
}

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]