<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Çağdaş&#039;ın Günlüğü &#187; source</title>
	<atom:link href="http://www.cagdastopcu.com/tag/source/feed" rel="self" type="application/rss+xml" />
	<link>http://www.cagdastopcu.com</link>
	<description>THE GNU HARDWARE DEVELOPER</description>
	<lastBuildDate>Tue, 04 Oct 2011 14:50:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Kernel Modül Programlama &#8211; Giriş</title>
		<link>http://www.cagdastopcu.com/kernel-modul-programlama-giris.html</link>
		<comments>http://www.cagdastopcu.com/kernel-modul-programlama-giris.html#comments</comments>
		<pubDate>Mon, 04 Jan 2010 02:22:05 +0000</pubDate>
		<dc:creator>cagdas</dc:creator>
				<category><![CDATA[GNU]]></category>
		<category><![CDATA[pragramlama]]></category>
		<category><![CDATA[compile]]></category>
		<category><![CDATA[derleme]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[makefile]]></category>
		<category><![CDATA[modül]]></category>
		<category><![CDATA[module]]></category>
		<category><![CDATA[programlama]]></category>
		<category><![CDATA[source]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.cagdastopcu.com/?p=197</guid>
		<description><![CDATA[Kernel modülü programlamak sürekli korktuğum ancak merak ettiğim bir konuydu. Eğer mobile programlama yaparak yaşamımı devam ettireceksem bunu da öğrenmem gerekiyordu Java ME&#8217; nin yanında. Kernel işletim sisteminin çekirdeğidir ve Ubuntu dağıtımının (distro) kerneli Linux&#8217;tur. Kernel bütün programların trafiğini sağlar ve donanımla yazılım arasında bağ kurar. Basit bir kernel modülünü ekleyip çıkarmayı anlatıyorum bu yazımda. &#8230; </p><p><a class="more-link block-button" href="http://www.cagdastopcu.com/kernel-modul-programlama-giris.html">Continue reading &#187;</a>]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop --><!-- End Shareaholic LikeButtonSetTop --><div id="attachment_198" class="wp-caption aligncenter" style="width: 577px"><a href="http://www.cagdastopcu.com/wp-content/uploads/2010/01/kernelhello1.png"><img class="size-full wp-image-198" title="kernel, hack, linux, ubuntu, modül, module, programlama" src="http://www.cagdastopcu.com/wp-content/uploads/2010/01/kernelhello1.png" alt="kernel ilk modülü programlama" width="567" height="348" /></a><p class="wp-caption-text">ilk kernel modülü programlama</p></div>
<p>Kernel modülü programlamak sürekli korktuğum ancak merak ettiğim bir konuydu. Eğer mobile programlama yaparak yaşamımı devam ettireceksem bunu da öğrenmem gerekiyordu Java ME&#8217; nin yanında. Kernel işletim sisteminin çekirdeğidir ve Ubuntu dağıtımının (distro) kerneli Linux&#8217;tur. Kernel bütün programların trafiğini sağlar ve donanımla yazılım arasında bağ kurar. Basit bir kernel modülünü ekleyip çıkarmayı anlatıyorum bu yazımda.</p>
<h3><strong>Kernel Modülü Nedir?</strong></h3>
<p>Kernel (isteyen çekirdek diyebilir ancak uzayın kernelından aklımda hep kernel olarak kalacaktır <img src='http://www.cagdastopcu.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ) modülleri kernele ekleyip çıkarabildiğimiz kod parçalarıdır. Kernelin fonksiyonelliğini sistemi reboot etmeden, yani yeniden başlatmamıza gerek kalmadan modüller sayesinde geliştirebiliriz. Örnek olarak bir donanımın driverını gösterebiliriz, bu driverle kernelimiz sistem ve donanımımızın arasındaki bağlantıyı gerçekleştirebilecektir. Modülleri kullanmıyor olsaydık her fonksiyonelliği geliştirişimizde kernele eklenti yapmamız gerekecekti. Bu ise büyük kernele sahip sistemlerde her yeni geliştirmede kernelin yeniden derlenmesi ve sistemin reboot edilmesi gerçekten de kötü bir durumdur.</p>
<p><span id="more-197"></span></p>
<p>Kernelimizde kurulu olan modülleri <span style="color: #3366ff;">lsmod</span> komutuyla görebiliriz.</p>
<p><span style="color: #3366ff;">cagdas@cagdas:~$ lsmod<br />
Module                  Size  Used by<br />
msdos                  15744  0<br />
fat                    58272  1 msdos<br />
isofs                  39844  1<br />
udf                    87716  0 </span></p>
<p>gibi bir sürü kernel modülümüz görünecektir.</p>
<p>Eğer buradaki örnekler çalışmazsa büyük bir ihtimalle kernelinizin <span style="color: #3366ff;">CONFIG_MODVERSIONS</span> u aktif hale getirilmiştir. Eğer versiyon hataları alıyorsanız kernelinizdeki modversioning özelliğini off hale getirerek derlemeniz gerekmektedir.</p>
<p>Gelelim ilk kernel modülümüze. Elebette ki <span style="color: #3366ff;">&#8220;Hello World!&#8221;</span> uygulaması olucak. Başka türlü olsaydı şaşardım <img src='http://www.cagdastopcu.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><span style="color: #3366ff;">/*<br />
*  hello-1.c &#8211; The simplest kernel module.<br />
*/<br />
#include &lt;linux/module.h&gt;    /* Needed by all modules */<br />
#include &lt;linux/kernel.h&gt;    /* Needed for KERN_INFO */</span></p>
<p><span style="color: #3366ff;">int init_module(void)<br />
{<br />
printk(KERN_INFO &#8220;Hello world 1.\n&#8221;);</span></p>
<p><span style="color: #3366ff;">/*<br />
* A non 0 return means init_module failed; module can&#8217;t be loaded.<br />
*/<br />
return 0;<br />
}</span></p>
<p><span style="color: #3366ff;">void cleanup_module(void)<br />
{<br />
printk(KERN_INFO &#8220;Goodbye world 1.\n&#8221;);<br />
}</span></p>
<p>Kernel modülleri en az iki fonksiyondan oluşmaktadır. Bunlar başla ve bitir fonksiyonlarıdır. Genellikle <span style="color: #3366ff;">init_module()</span> başla ve <span style="color: #3366ff;">cleanup_module()</span> bitir (temizle) isimlendirmeleriyle kullanılırlar ancak kafamıza göre de isimler verebilirdik.</p>
<p>init_module() yapacağımız işi veya asıl fonksiyonu kernelin içine koyarak çağırmamızı veya kerneli denetlemizi sağlar. cleanup_module() kısmı ise init_module() ün yaptıklarını geri alarak modülümüzün güvenli bir şekilde kaldırılmasını sağlar.</p>
<p>linux/module.h kütüphanesi bütün kernel modüllerde kullanılır.</p>
<p>linux/kernel.h kütüphanesini ise printk() uyarısını kullanabilmek için çağırdık. Bu uyarı syslogd ve klogd programları çalışıyorsa /var/log/messages dosyasına çıktımızı loglamaya yarar.</p>
<p>Ardından Makefile&#8217;ımızı kodu koyduğumuz dizinin içine koyalım. Dosyanın adı <span style="color: #3366ff;">Makefile</span> olacak.</p>
<p><span style="color: #3366ff;">obj-m += hello-1.o</span></p>
<p>all:<br />
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules</p>
<p>clean:<br />
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean</p>
<p>make komutu ile modülümüzü derleyelim.</p>
<p><span style="color: #3366ff;">cagdas@cagdas:~/Belgeler$ make<br />
make -C /lib/modules/2.6.28-16-generic/build M=/home/cagdas/Belgeler modules<br />
make[1]:`/usr/src/linux-headers-2.6.28-16-generic&#8217; dizinine giriliyor<br />
CC [M]  /home/cagdas/Belgeler/hello-1.o<br />
Building modules, stage 2.<br />
MODPOST 1 modules<br />
CC      /home/cagdas/Belgeler/hello-1.mod.o<br />
LD [M]  /home/cagdas/Belgeler/hello-1.ko<br />
make[1]: `/usr/src/linux-headers-2.6.28-16-generic&#8217; dizininden çıkılıyor</span></p>
<p>Evet ilk kernel modülümüzü derledik. Ardından modinfo komudu ile kernel modülümüz hakkında bazı bilgilere erişebiliriz.</p>
<p><span style="color: #3366ff;">cagdas@cagdas:~/Belgeler$ modinfo hello-1.ko<br />
filename:       hello-1.ko<br />
srcversion:     140276773A3090F6F33891F<br />
depends:<br />
vermagic:       2.6.28-16-generic SMP mod_unload modversions 586 </span></p>
<p>Ve en sonunda kernelimizin içine modülümüzü koyalım. Bunun için root kullanıcı olmamız gerekiyor. <span style="color: #3366ff;">sudo -s -H</span> komutuyla bildiğiniz gibi root oluyoruz. <span style="color: #3366ff;">insmod ./hello-1.ko</span> ile kernelimize modülümüzü ekledik ve /var/log/messages logunun son satırlarına bakalım <img src='http://www.cagdastopcu.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><span style="color: #3366ff;">Jan  4 03:22:17 cagdas kernel: [37145.098506] hello_1: module license &#8216;unspecified&#8217; taints kernel.<br />
Jan  4 03:22:17 cagdas kernel: [37145.098594] Hello world 1.</span></p>
<p>Evet mutlu son <img src='http://www.cagdastopcu.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Eğer modülümüzü kernelimizden silmek istiyorsak <span style="color: #3366ff;">rmmod hello-1</span> komutunu kullanacağız.</p>
<p>Not: Bu yazı dizisi <a href="http://tldp.org/LDP/lkmpg/2.6/html/index.html">The Linux Kernel Module Programming Guide</a> belgesinin soft hali olucaktır. Kernelin 2.4 ve 2.6 sürümünlerine uygundur. Kernelinizin versiyonunu uname -a komutuyla öğrenebilirsiniz.</p>
<p>C kodu:</p>
<p><a href="http://www.cagdastopcu.com/wp-content/uploads/2010/01/hello-1.c">hello-1.c</a></p>
<div class="shr-publisher-197"></div><!-- Start Shareaholic LikeButtonSetBottom --><!-- End Shareaholic LikeButtonSetBottom --><div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://www.cagdastopcu.com/kernel-modul-programlama-giris.html&via=cagdastopcucom&text=Kernel Modül Programlama - Giriş&related=cagdastopcu.com:official twitter of cagdastopcu.com&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://www.cagdastopcu.com/kernel-modul-programlama-giris.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 0.464 seconds -->

