kbuild: Documentation - how to build external modules
From: Sam Ravnborg <sam@ravnborg.org>
To: linux-kernel@vger.kernel.org
Subject: [RFC] kbuild: Documentation - how to build external modules
Date: Tue, 20 Apr 2004 23:51:31 +0200
This is just first wrap-up of some text about building external modules.
There are a few unfinished chapters - but's too late today.
Please let me know what you expect to see in here - which is not covered
eiter direct or via an empty heading.
Sam
Building external modules
=========================
kbuild offers functionality to build external modules, with the
prerequisite that there is a pre-built kernel avialable with full source.
A subset of the targets available when building the kernel is available
when building an external module.
Building the module
-------------------
The command looks like his:
make -C <path to kernel src> M=$PWD
For the above command to succeed the kernel must have been built with
modules enabled.
To install the modules just being built:
make -C <path to kernel src> M=$PWD modules_install
More complex examples later, the above should get you going in most cases.
Available targets:
- - - - - - - - -
make -C $KDIR M=$PWD
Same as if 'modules' was specified. See description of
modules target below.
make -C $KDIR M=$PWD modules
Will build the module(s) located in current directory. All output
files will be located in the same directory as the module source.
No attemps are made to update the kernel source, and it is
expected that a successfully make has been executed
for the kernel.
make -C $KDIR M=$PWD modules_install
Install the external module(s)
make -C $KDIR M=$PWD clean
Remove all generated files in current directory
Available options:
- - - - - - - - -
make -C $KDIR
Used to specify where to find the kernel source.
'$KDIR' represent the directory where the kernel source is.
Make will actually change directory to the specified directory
when executed.
make -C $KDIR M=$PWD
M= is used to tell kbuild that an external module is being built.
The option given to M= is the directory where the external
module is located.
When an external module is being built only a subset of the
usual targets are avialable.
make -C $KDIR SUBDIRS=$PWD
Same as M=. The SUBDIRS= syntax is kept for backwards compatibility.
make -C $KDIR M=$PWD help
help will list the available target when building external
modules.
A more advanced example
- - - - - - - - - - - -
This example shows a setup where a distribution has wisely decided
to separate kernel source and output files:
Kernel src:
/usr/src/linux-<kernel-version>/
Output from a kernel compile, including .config:
/lib/modules/linux-<kernel-version>/build/
External module to be compiled:
/home/user/module/src/
To compile the module located in the directory above use the
following command:
cd /home/user/module/src
make -C /usr/src/linux-<kernel-version> \
O=/lib/modules/linux-<kernel-version>/build \
M=$PWD
Then to install the module use the following command:
make -C /usr/src/linux-<kernel-version> \
O=/lib/modules/linux-<kernel-version>/build \
M=$PWD modules_install
The above are rather long commands, and the following chapter
lists a few tricks to make it all easier.
Tricks to make it easy
---------------------
TODO: .... This need to be rewritten......
A make line with several parameters becomes tiresome and errorprone
and what follows here is a little trick to make it possible to build
a module only using a single 'make' command.
Create a makefile named 'Makefile' with the following content:
---> Makefile:
all:
$(MAKE) -C /home/sam/src/kernel/v2.6 M=$(PWD) \
$(filter-out all,$(MAKECMDGOALS))
obj-m := module.o
---> End of Makefile
When make is invoked it will see the all: rule, and simply call make again with the right parameters.
If a driver is being developed that is targeted for inclusion in the main kernel, an idea is to seperate out the all: rule to a Makefile nemed makefile (lower capital m) like this:
---> makefile
all:
$(MAKE) -f Makefile -C /home/sam/src/kernel/v2.6 \
M=$(PWD) $(MAKECMDGOALS)
---> End of makefile
The kbuild makefile will include only a single statement:
---> Makefile:
obj-m := module.o
---> End of Makefile
When executing make, it looks for a file named makefile, before a
file named Makefile. Therefor make will pick up the file named with lower capital 'm'.
Prepare the kernel for building external modules
------------------------------------------------
When building external modules the kernel is expected to be prepared.
This includes the precense of certain binaries, the kernel configuration
and the symlink to include/asm.
To do this a convinient target is made:
make modules_prepare
For a typical distribution this would look like the follwoing:
make modules_prepare O=/lib/modules/linux-<kernel version>/build
TODO: Fill out the following chapters
Module versioning
-----------------
Local include files
-------------------
CLFAGS := include ...
Binary only .o files
--------------------
Use _shipped ...
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
کلاسها و اشیا و تفاوت این دو با یکدیگر:
یکی از گیج کننده ترین مفاهیمی که در در دنیای برنامه نویسی شی گرا ممکن بسیاری از برنامه نویسان با آن مواجه می شوند این است که یک کلاس چیست و به چه چیزی اطلاق می شود؟ پاسخ این سوال در صورت آن نهفته است کلمه کلاس(Class) در زبان انگلیسی به معنای دسته است در واقع کلاس دسته ای است از ویژهگی ها و خصوصیات در باره یک موجودیت معین که می تواند در دنیای واقعی وجود داشته باشد و یا خیر. که در یک مکان گرد آوری شده اند و به صورت یک دسته در آمده اند تا از بهم ریختگی و درهم شدن در امان باشند در واقع یک کلاس یکسری اطلاعات و ویژه گی ها است درباره چیزی. به عنوان مثال اطلاعات شخصی یک فرد اعم از نام، نام خانوادگی، شماره تلفن و.... اگر در مکانی جمع شوند می توانند یک کلاس را تشکیل دهند. اما شی چیست؟ شی در واقع نمونه ای است از یک کلاس یک کلاس یکسری ویژه گی ها را در یک مکان گردآوری می نماید اما این ویژه گی ها خام یا به اصطلاح مقداردهی نشده اند یعنی به عنوان مثال اگر همان کلاس اطلاعات شخص را در نظر بگیرید اگر شئی از این کلاس تعریف نکنیم خالی است درست است که این کلاس ویژه گی هایی را گردآوری کرده اما این ویژهگی ها با هیچ مقداری پر نشده اند. نکته مهمی که در مورد اشیا وود دارد این است که اشیایی از یک کلاس می توانند از یکدیگر متمایز باشند یعنی مثلا نام یکی از افراد ممکن است علی باشد و نام دیگری حسن درست است که هر دوی این اشیا از کلاس اطلاعات شخصی هستند ولی مقادیر متفاوتی را درون خود جای داده اند.
نحوه تعریف کلاس ها در C#:
نکته ای که در اینجا لازم می بینم به شما یادآوری کنم این است که برای نوشتن یک کلاس یا هر برنامه دیگری بهتر است ابتدا تمامی جنبه های آنرا در نظر بگیرید و ابتدا آن را روی کاغذ پیاده سازی نمایید و سپس به نشتن آن بپردازید چرا که طراحی قبل از پیاده سازی به شما کمک زیادی در پیش گیری از خطاهای منطقی می کند درست است که ممکن است به نظر بیاید این کار طلف کردن وقت است اما به یاد داشته باشید برای ساخت یک خانه ابتدا باید نقشه آنرا در دست داشته وگرنه هیچ کس نمی داند چه چیزی اتفاق می افتد مثلا ممکن است لوله های آب به جای اینکه از داخل دیوار ها رد شوند از سقف سر در بیاورند!!!
البته طراحی کلاس ها مبحث بسیار گسترده ای است و شامل موارد بسیار زیادی می شود که از حوصله این مقاله خارج است اما به عنوان راهنمایی های کلی می توانم به شما بگویم که ابتدا بهتر است یک نقشه کلی از کلاستان تهیه نمایید در این مرحله احتیاجی نیست به جزئیات بپردازید در واقع شما در این مرحله نیازمندیهای مسئله خود را طرح می کنید و اعمالی را که انتظار دارید کلاستان انجام دهد بر روی کاغذ یا در هر مکان دیگری می آورید پس از این مرحله می توانید کلاس خود را جزء به جزء پیاده سازی نمایید. تنها نکته باقیمانده این است که بهتر است بخشی را نیز به خطاهایی که ممکن است در کلاس شما بیفتد اختصاص دهید و به خطاها هم فکر کنید.
اما می رسیم به نحوه تعریف کلاس ها در C# همان طور که می دانید C# بر خلاف عضو قدرتمند خانواده خود C++ یک زبان کاملا شی گرا است و برنامه نویسی ساختاریافته را پشتیبانی نمی کند و هر چیزی که شما در C# پیاده سازی می نمایید باید به صورت کلاس ها باشد بنابراین برای برنامه نویسی با C# باید کاملا با ریزه کاری های تعریف و پیاده سازی کلاس ها آشنا باشید در غیر این صورت نخواهید توانست از ویژه گی های این زبان به درستی استاده نمایید. برای تعریف یک کلاس در C# می توانید این عمل را در یک فایل کلاس یا انجام دهید این فایل ها دارا پسوند .CS هستندبرای ایجاد چنین فایل هایی می توانید پس از ایجاد پروژه جدید در Visual Studio روی نام پروژه خود راست کلیک کرده و سپس گزینه Add و سپس Class را انتخاب نمایید پس از انجام این عمل کلاس مورد نظر شما ایجاد خواهد شد. شکل کلی تعریف کلاس ها در C# به صورت زیر است:
Access Modifier class ClassName
{
//you class body
}
قسمت هایی که به صورت کج(Italic) مشخص شده اند با نام های دلخواه شما جایگزین خواهند شد بخش اول که Access Modifier است مشخص کننده این است که آیا کلاس های شما در خارج از این فایل هم می توانند مورد استفاده قرار بگیریند یا خیر این قسمت می تواند شامل دو گزینه public یا private همان طور که می دانید در C# کلاس ها در بخش هایی به نام فضای نامی (namespace) دسته بندی شده اند تا دو کلاس به یک نام باعث ایجاد اختلال در برنامه نشود تمامی کلاس هایی که شما در یک فایل کلاس تعریف می کنید هم بخشی است از یک فضای نام اگر به بالای فایل کلاس خود نگاهی بیندازید می بینید که در ابتدای کد شما خطی مانند زیر وجود دارد البته به جای name یک نام قرار دارد:
namespace name
{
Access Modifier class ClassName
{
//you class body
}
}
حال اگر کلاس شما دارای مشخصه دسترسی public باشد با اضافه کردن فضای نام خود به فایل دیگری (توسط دستور using که در ادامه توضیح داده شده) می توانید متغیری از نوع کلاس خود تعریف نموده و از آن استفاده کنید اما اگر مشخصه دسترسی کلاس شما private باشد فقط در همان فایل و فضای نام می توانید از کلاس خود استفاده نمایید به یاد داشته باشید اگر توصیف کننده دسترسی را ننویسید به طور پیش فرض private در نظر گرفته خواهد شد. پس از نوشتن نام کلاس خود و توصیف کننده دسترسی می توانید بدنه کلاس خود را بین دو علامت {} بنویسید در این قسمت می توانید متغیر ها و توابع مورد نیاز خود را در درون کلاس تعریف نمایید برای تعریف یک متغیر در کلاس باید به همان صورت عادی عمل نمایید تنها نکته ای که باید به آن توجه نماید این است که یک مشخصه دسترسی هم باید برای متغیر خود در نظر بگیرید که می تواند شامل public / private / protected باشد اگر مشخصه دسترسی متغیر یا تابعی درون کلاس شما private باشد آن متغیر و یا تابع فقط توسط اعضای داخلی کلاس در دسترس خواهد بود و یک شی از بیرون نمی تواند به آن عضو دسترسی داشته باشد مشخصه دسترسی protected در ادامه برسی می شود. پس از تعریف کلاس خود می توانید البته اگر لازم است و مایل هستید از آن در برنامه خود استفاده نمایید برای اینکه بتوانید از یک کلاس که در یک فایل (البته در همان پروژه) است استفاده نمایید باید با استفاده از دستور using نام فضای نامی خود را در بالای برنامه اضافه نمایید باید این دستور را در کنار بقیه دستورات using در بالای برنامه اضافه نمایید اگر به ابتدای فایل خود مثلا کد فرم برنامه خود نگاهی بیندازید این دستورات را پیدا خواهید کرد به عنوان مثال در بالای یک فرم عادی پس از ایجاد این دستورات using قرار دارند:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
شما هم می توانید دستورات using خود را به این قسمت اضافه نمایید دستورا using به کامپایلر می گوید که از کلاس های موجود در فضای نام ذکر شده در جلوی آن می خواهیم استفاده نماییم. پس از اضافه کردن فضای نامتان به پروژه می توانید متغیری از نوع کلاس مورد نظر تعریف نموده و از آن استفاده نمایید برای انجام این عمل باید به صورت زیر عمل نمایید:
YourClassName InstanceObject=new ClassName();
همان طور که مشاهده می نمایید برای تعریف یک کلاس ابتدا باید نام کلاس خود را ذکر نمایی و سپس نام شی مورد نظر خود از نوع کلاس را ذکر نموده و پ از آن باید بعد از علامت مساوی و با ذکر کلمه کلیدی new نام کلاس خود را به همراه دو پرانتز باز و بسته بیاورید. اما سوالی که در اینجا ممکن است برای شما مطرح شود این است که چرا کلاس ها به این گونه تعریف می شوند و کاربرد کلمه کلیدی new چیست؟ در پاسخ باید بگویم هنگامی که شما یک متغیر از نوع کلاس تعریف می کنید این متغیر یک شی نیست بلکه در واقع یک ارجاع است که می تواند به آن شی اشاره کند و شی واقعی با استفاده از کلمه کلیدی new ایجاد می گردد کاربرد کلمه کلیدی new در این است که ایم کلمه کلیدی در زمان اجرا حافظه مورد نیاز برای ایجاد شی را از سیستم می گیرد و یک ارجاع به آن را باز می گرداند که این ارجاع می تواند در متغیر تعریف شده ذخیره کردد تعریف تمامی اشیا در C# باید به این صورت انجام شود. اما پس از کلمه کلیدی new نام کلاس به همراه دو پرانتز ذکر می شود این به C# می گوید که تابع سازنده کلاس را فراخوانی کن تابع سازنده تابعی است که در ابتدای ایجاد هر شی فراخاونی می شود، این تابع هم نام با نام کلاس بوده و هیچ نوع مقدار بازگشتی هم ندارد اگر شما تابع سازنده ای برای کلاس خود تعریف ننمایید C# سازنده پیش فرض کلاس را اجرا خواهد کرد مانند مثال قبلی.
در صفحه بعد به عنوان مثال تعریف یک کلاس ساده را آورده ام این کلاس که PersonInfo نام دارد شامل اطلاعات یک انسان از قبیل قد، رنگچشم و... است:
public class PersonInfo
{
private int _Age;
private string _Name;
private string _LastName;
public void Show()
{
Console.Write("Name=" + _Name + " Last Name=" + _LastName + "Age=" + _Age.ToString());
}
}
همان طور که مشاهده می نمایید این کلاس شامل چند متغیر خصوصی و یک تابع است.
همان طوریکه در مثال بالا مشاهده نمودید تعریف یک کلاس بسیار ساده بوده و احتیاج به انجام اعمال پیچیده ای ندارد اما تنها نکته ای که در تعریف این کلاس باید به آن توجه نمایید این است که همان طور که می بینید نام متغیر های عضو کلاس که اصطلاحا به آنها فیلد می گویند با یک _ شروع شده است مثل: _Name این نوع نامگذاری در مورد متغیرهای خصوصی بسیار مرسوم است چرا که ممکن است در یک کلاس بخواهید خصوصیت هایی(که در ادامه بررسی شده اند) را تعریف کنید که همنان متغیر شما باشد در چنین مواقعی نامگذاری متغیرها به این صورت باعث جلوگیری از ایجاد تداخل خواهد شد.
Linux Shell programming
سلامي دوباره خدمت شما دوستان عزيز امروز يك مقاله تقريبا خوب درباره برنامه نويسي با پوسته لينوكس براتون گذاشتم مي تونين از اينجا دانلود كنين اميدوارم مورد استفاده قرار بگيره.
راستي در مورد برنامه نويسي با C# مرجع C# The complete reference كه مي تو نين از Flazx.com دانلود كنين روشديدا بهتون ژيشنهاد مي كنم فعلا باي بايد موفق و مويد باشين
فایل رو می تونین از اینجا بگیرین. خواستین نظر بدین نخواستین هم اشکالی نداره. فعلا.
