Bildiğiniz üzere sayın okuyucular, ilk serimizi 11 yazı ve 10 videodan sonra bitirip yeni serimize bu yazı ile başlıyoruz.Başarı ancak Allah'tandır (c.c.) diyor, Kernel serimizin konuya meraklı arkadaşlarımıza fayda sağlamasını umarak başlıklarımıza geçiyoruz.
Her ne kadar başlığımız Hacker'ın Olmazsa Olmazı olsa da bu seride kernel hacking konusundan ziyade kernelin kendisini anlatacağız.Konuya vakıf olmadan, hedefi iyi tanımadan saldırmak yüzme bilmeyen birinin denize düşünce yaptığı çırpınmalardan farklı olmayacaktır.Yazıların bazı bölümlerinde çakallıklara değinecek olsak da kernelin kendisini anlamak ilk hedefimiz diyor ve bu kernel neyin fesiymiş onu anlatarak başlığımızı devam ettiriyoruz.
Kernel yani çekirdek, Assembly serisinin ilk yazısı olan Girişten Önce Son Çıkış'ta tarif ettiğimiz üzere, donanım ile yazılım arasında boru hattı görevi gören irtibat subayıdır.Bir nevi işletim sisteminin taa kendisidir.
Bu seride irtibat subayımızın kilosunu, yaşını, boyunu, posunu inceleyip bu aracılık görevini nasıl yaptığını anlatmaya çalışıcaz.Hakkında belki de 10 yazı yazacağımız birşeyi birkaç cümle ile anlatmamı ya da anlamanızı beklemeyin, beklemiyorum.Burada önemli olan SANA lazım mı değil mi onu belirlemek diyor, önce kimlere UYAR, listeliyoruz:
Bu listede niyetinizin karşılığını görebiliyorsanız, buyrun devam edin AMA alttaki listeden biriyseniz zaman kaybetmenize gerek yok diyorum.
Safları sıklaştırdığımıza göre kısaca linuxun tarihine bir göz atarak başlayalım.90lı yılların başında, yani ben kısa donu tercih ederkene, Linus Torvalds ismindeki bilgisayar programcısı ağabeyimiz üniversitede mürekkep yalarkene, UNIX temelinde portable yani taşınabilir bir işletim sistemi yazma niyetiyle bir tez hazırlar. Al unixi koy kenara, başına bir L koy, az karıştır buyur sana bugün dünyanın en çok kullanılan işletim sistemlerinden biri olan Linux.
Burada linux dediğimiz şey, yani Linus abimizin başlattığı şey, serimizin konusu olan kernel.Bu yüzden "linux biliyorum" diyen biri aslında "linux kullanmayı biliyorum" demek istiyor, yoksa linuxu bilmek için kernel nasıl çalışıyor, onu bilmek lazım.Yazının başında beri 4324 defa tekrarladığımız kernel open source yani açık kaynak kodlu olduğundan gönüllü binlerce katılımcının desteğiyle halen gelişimine devam etmekte, fakat neyin uygun neyin gereksiz olduğuna yine Linus Reis [her ne kadar tek başına olmasa da] karar vermektedir.
Herhangi bir gönüllünün, bu siz de olabilirsiniz, önerdiği yenilik, bu yetkili abiler tarafından sign off yapılmadıkça yani aldım, kabul ettim denmedikçe linuxun bir parçası olamıyor.Dünya çapında en iyi programcılar tarafından desteklenen, eleştirilen linux bazı konularda ticari yazılımların [annadınız siz onu] gerisinde kalsa da genel itibariyle bulabileceğiniz en iyi,en güvenli ve en önemlisi tamamen beleş bir işletim sistemidir.
Google emmide fazlasıyla kaynak mevcut olduğundan geyiği daha fazla uzatmıyor ve kerneli incelemeye başlıyoruz.
Kernelin bazı özelliklerini öğrenmek için diğer alternatifleri de bilmek gerekiyor.Bu başlıkta linux kernelin bilinen iki çeşit kernel türünden hangisi olduğunu, bu türlerin artı ve eksilerini anlatarak irtibat subayımız göbekli mi göbeksiz mi öğrenelim.
Bahsettiğimiz iki tür kernelin birincisi micro kernel olarak isimlendirilen, temel fonksiyonların yan fonksiyonlardan ayrı tutulduğu, birbirleriyle haberleşme için kendi aralarında da bir iletişim türünün olduğu, çokça araştırılan fakat pek tercih edilmeyen kernel türüdür.
Daha anlaşılır olması açısından şöyle örneklendirebiliriz; elimizde temel bir kernel programı var fakat hafıza yönetimi için ayrı bir programa, dosya sistemi için ayrı bir programa, bilmem ne bileyim ağ yönetimi içinse ayrı bir programa ihtiyaç duyuyor, bu programların tamamı bir araya gelince bahsettiğimiz micro kerneli oluşturmuş oluyor.[Lego oyuncaklar gibi diyebiliriz]
Bu göbeksiz arkadaşımızın en büyük avantajı temel fonksiyonların bulunduğu ana kısım çabucak yükleneceğinden başta bir hız elde etmiş oluyoruz.Amma velakin sonrasında işin içine dosya sistemi, hafıza yönetimi girince bunlar birbirleriyle iletişim türü aracılığıyla haberleşeceğinden fazlasıyla yüke sebep olup yavaşlayacaktır.
Microkernele bir örnek isterseniz; güvenlik hedefiyle İşviçreliler tarafından hazırlanan MUEN'e bu adresten bir göz atmanızı tavsiye ederim.
Diğer kernel türümüz ise, ki bizim linux de bu türden, monolithic kernel olarak isimlendirilen, ne tür fonksiyon ararsan alayının tek bir programda olduğu, ekstra bir iletişim türüne ihtiyaç duymayan, genel itibariyle tercih edilen kernel türüdür.[Lego olmayan oyuncaklar gibi :p ]
Peki bu göbekli kernelin en büyün dezavantajı nedir diye sorarsak; milyonlarca satır koddan oluşan tek bir programı _ilk başta_ yüklemek zaman kaybına sebep olduğundan bu durum başta dezavantajmış gibi gözükse de sonradan fazlasıyla hızlı çalışması sebebiyle hatasını telafi ederek tercih sebebi olmuştur.Linus ağabeyimiz, bu duruma çözüm bulmak için beyin kılcal damarlarını zorlamış ve birkaç çözüm bulmuştur.Bizi ilgilendiren kısım ise modüllerdir.
For ekzampıl paraya kıyıp USB 3.0 bir bellek aldınız, heyecanla eve geldiniz, anakart da uyumlu, taktınız fakat tık yok.Tık var da hız yok, neden? Çünkü kernel derlenirken USB 3.0 desteği ile derlenmediyse nasıl çözeriz bu sorunu? İşte burada modüller devreye girerek, modül dediğimiz aslında driver oluyor, monolithic kerneli micro kernel gibi çalıştırmamızı sağlıyor.Al sana linuxun bir artısı daha..
Seri boyunca denemelerimizi mödüller aracılığıyla yapacağımız için bir ton anlatıp durduk, şimdi gelelim bunları nasıl yaptığımıza:
ka@ka-vm ~/kernel $ man insmod <- Mödül yükle
ka@ka-vm ~/kernel $ man rmmod <- Mödül kaldır
ka@ka-vm ~/kernel $ man modprobe <- Her ikisini de yap
Madem mödül yükleyip kaldırabiliyoruz basitçe bir mödül hazırlayıp kernele kaktırıverelim diyecem AMA bu mevzu ufak bir başlıkta çözülmez, başlı başına bir yazı lazım diyor ve bir sonraki yazının konusunu belirlemenin verdiği mutlulukla başlığımızı bitiriyoruz.
Lise 1 matematik dersinin en sevilen (!) konusu olan mantık, her ne kadar hocayı dinlememek de ısrar etmiş olsanız da, yine karşımıza çıkıveriyor.Hocayı dinlediniz, dinlemediniz bilemem ama kerneli öğrenmek istiyorsak kaynak kodlarına başvurucaz demektir. Kaynak kodlarının muhtelif yerlerinde, esasında hız kazanmak niyetiyle uygulanan mantık operasyonlarını bilmemiz gerekiyor.[acı ama gerçek]
Maksat ayağınız alışsın diye, ufaktan konuya giriş yapacak olsak da herşeyi devletten beklememenizi hatırlatmak durumundayım. En basitinden başlarsak bir ve bir eşittir bir, bir ve sıfır eşittir sıfır gibi aslında bilgisayarın temelini oluşturan mantık karşılaştırmalarına geri dönüyoruz.
Bazı denemeler yapalım ve hafızalarımızı tazeliyelim:
ka@ka-vm ~ $ python
>>> 1 & 0 <- VE
0
>>> 1 | 0 <- VEYA
1
>>> 1 ^ 0 <- XOR
1
>>> 1 << 2 <- BIT KAYDIRMA (SOLA)
4
>>> 8 >> 2 <- BIT KAYDIRMA (SAĞA)
2
Bunları bilmesek olmaz mı diye mırıltılar geliyor kulağıma ??!! Olmaz kardeşim, çünkü adamlar kullanmış mecburen bilecez. Bulabildiğim en güzel Türkçe makaleyi bu adresten okuyabilirsiniz.Böyle güzel bir kaynak oluşturduğu için Ali Çehreli hocamıza teşekkür ediyorum.
Makaleyi okudunuz, anılarınız canlandı, mevzu tamamdır dediyseniz gelelim kernel içerisinde kullanılan şekliyle basit ve eğlenceli bir örnek vermeye.Aranızda Nissan GT-R nasıl bir canavardır bilmeyen varsa, hemen buraya tıklayıp geri gelsin.
Fotoğraflarda hatta youtube videolarında hayallere dalıp gitmediyseniz, (konumuza dönelim) bitwise operations denilen karın ağrısını kullanarak yani bit bazında mantıksal sorgulamalar yaparak bu asfalt canavarına ECU yani Electronic Control Unit programı hazırlayacaz.[Harbiden mi diyeni döverim]
Bu işi yapmak için, Ali hocanın yazısında okuduğunuz üzere flags yani bayraklar kullanmamız gerekiyor.Bayrak deyince aklınıza ülke bayrakları gelmesin. Yüzlerce dönüm arazi üzerine kurulu bir golf sahasındaki deliklerin yerini belirleyen bayraklar var ya, heh işte bizim bayraklar da bunlar gibin ihtiyaç duyacağımız şeylerin yerini belirlememizi sağlıyor.
Bundan yaklaşık bir sene evvel Assembly serisinin Unutulmayan İlkler yazısında binary işlemlerle işlemci uğraşıyor,bize ne demiştim ya, sözümü geri alıyorum.Mesela 146 sayısı, binary olarak 0b10010010 şeklinde yazılır. Gördüğünüz üzere (görüyorsunuz di mi?) emrimize amade 8 adet bit var.Bu bitlerin her birini bayrak misali istediğimiz gibi kullanabiliyoruz.
ka@ka-vm ~/kernel $ ./ecu_gtr
[*] --------------------------------------- [*]
[*] | Nissan GT-R Electronic Control Unit | [*]
[*] --------------------------------------- [*]
[*] Please select an option from the list [*]
[*] [*]
[!] Start&Stop; (0) [!]
[!] Activate Launch Control (1) [!]
[!] Deactivate Launch Control (2) [!]
[!] Check Engine RPM (3) [!]
[!] Go Go Go ! (4) [!]
[!] Leave ECU (5) [!]
[*] [*]
[*] Waiting for an input:
Hazırladığımız programın detaylarını videoya bırakıp ufak bir bilgi paylaşayım.Bu GT-R denilen canavar 3.8 litre çift turbo motoruyla yaklaşık 4 saniyede 100 km hıza ulaşabilirken, Launch Control denilen yazılım desteğiyle bu süreyi 2.9 saniyeye düşürebiliyorsunuz.[Ohannes totannes durumu]
Peki ECU denilen kontrol ünitesi gerekli düğmelere basılıp basılmadığını nasıl anlıyor? Yazının sonunda programın kaynak kodunu paylaştım, indirip incelemenizi, kaynak koddaki yorumlara bakmanızı tavsiye ederim.Fazla takılmayın, daha çooook detayımız var.
Linux kernel konusuna giriş yaptığımız ilk yazımızı daha fazla uzatmadan bitiriyor, bir sonraki yazının da kernel mödülleriyle alakalı olacağını hatırlatıp sizi videoyla başbaşa bırakıyorum.
Yazı için hazırlanan videoyu YouTube'dan izleyebilirsiniz.
Yazı için hazırladığımız hayali ECU programını bu adresten indirebilirsiniz.