توجه: لطفا توجه داشته باشید که برنامه نویسی سطح پایین در حال حاضر متقاضیان زیادی نداشته و کمپانی های زیادی اقدام به استخدام برنامه نویس سطح پایین نمی کنند. برای من هم پیدا کردن شغلی در این رابطه همواره سخت تر میشود. به همین دلیل توصیه میکنم اگر هنوز فعالیت حرفهای خود را شروع نکردهاید، سایر زمینهها را نیز در نظر بگیرید.
در نگارش این مقاله از google-interview-university الهام گرفته شده است. مایل هستم تجارب خود در این زمینه را به اشتراک بگذارم و راه تبدیل شدن به یک برنامهنویس سطح پایین را نشان دهم، زیرا حس میکنم این مهارتها بهاندازه گذشته متداول نیستند. بعلاوه بسیاری از دانشجویان سوالاتی درباره اینکه چگونه برنامهنویس سطح پایین یا مهندس هسته لینوکس شوند میپرسند.
این صفحه نمیتواند تمامی دورههای آموزشی، لینکها و کتابها را در بر بگیرد. بعنوان مثال این صفحه آردوئینو را معرفی میکند ولی به بررسی جزئیات آردوئینو و سیستمهای نهفته نمیپردازد و خودتان باید اطلاعات بیشتری در این مورد بدست بیاورید. برای این کار، کلیدواژه "آردوئینو" را در اختیار دارید و بهکمک آن میتوانید شروع کنید. بنابراین گامهای بعدی احتمالا جستجوی واژه "آردوئینو" در گوگل، خرید یک کیت و انجام دادن کاری از سوی خودتان میباشند نه جمعآوری لینک و کتب رایگان. لطفا بخاطر داشته باشید که این صفحه تنها راهنمایی برای مبتدیان است.
برنامهنویسی سطح پایین بخشی از علوم کامپیوتر است.مطمئنا بهتر است در ابتدا تحصیلاتی در زمینه علوم کامپیوتر انجام شود.
-
سطح پایین به چه معناست؟
من برنامهنویسی سطح پایین را برنامهنویسی که به ماشین خیلی نزدیک است و از زبانهای سطح پایین همچون سی و اسمبلی استفاده میکند تعریف میکنم. این با برنامهنویسی سطح بالا- که در اپلیکیشنهای فضای کاربر متداول است و از زبانهایی چون پایتون و جاوا استفاده میکند- متفاوت است.
بلی برنامهنویسی سیستم مفهومی است مشابه برنامهنویسی سطح پایین. این صفحه طراحی سختافزار و توسعه ثابتافزار را در بر میگیرد، مفاهیمی که جزو مباحث برنامهنویسی سیستم نیستند.
- ویکیپدیا-برنامهنویسی سیستم سرانجام، این صفحه موضوعاتی همچون اجزای سختافزاری و هسته لینوکس را شامل میشود. این گستره وسیعی از لایههاست و یک مطلب یک صفحهای نمیتواند جزئیات تمام این لایهها را پوشش دهد بنابراین این مطلب میکوشد تا نقطه شروعی برای یادگیری برنامهنویسی سطح پایین باشد.
دو تئوری زمینهای در مورد برنامهنویسی سطح پایین وجود دارند:
- معماری کامپیوتر
- سیستمهای عامل
فکر میکنم بهترین راه برای یادگیری تئوری شرکت در دورههای آموزشی است. خواندن کتاب راه بدی نیست ولی نیازمند زمان و تلاش زیادی است. شما میتوانید کلاسهای خوب زیادی در دانشگاههای آنلاین پیدا کنید. بعنوان مثال Coursera.org و edx.org. فکر نمیکنم نیازی به گرفتن نمره الف داشته باشید، فقط تصویر کلی را متوجه شوید. با کسب تجربه بهتر و بهتر خواهید شد.
اجازه بدهید چند کتاب را که خواندهام به شما معرفی کنم. این کتابها معمولا در دانشگاهها بعنوان کتاب تکست استفاده میشوند. اگر این کتابها در کلاسهای دانشگاهتان تدریس نمیشوند، خواندن آنها خالی از لطف نخواهد بود.
-
معماری کامپیوتر
- معماری کامپیوتر، چاپ پنجم: دیدگاه کمی
- سیستمهای کامپیوتری: از دید یک برنامهنویس
- سازماندهی و طراحی کامپیوتر، جلد چهارم: رابط سختافزار-نرمافزار
-
سیستمهای عامل
- توضیح باغ جادویی: درون یونیکس، سیستم ۵، چاپ۴، طراحی یک سیستم باز
- طراحی سیستم عامل یونیکس
- سیستمهای عامل: اصول طراحی و اجزاء درونی توسط ویلیام استالینگ
-
دورههای آموزشی:
لیست نامحدودی از کتابهای خوب وجود دارد. قصد ندارم بگوییم که باید کتابهای زیادی بخوانید . فقط یک کتاب را به دقت بخوانید. وقتی که یک تئوری را یاد گرفتید، کد مربوط به آن را اجرا کنید. اجرای یک چیز بهتر از یاد گرفتن صدها تئوریست.
**اسمبلی:**یک اسمبلی از میان x86 یا ARM انتخاب کنید. نیازی به دانستن هر دو نیست، در مجموع نیازی به دانستن زبان اسمبلی نیست بلکه هدف درک ساختار درونی پردازشگر و کامپیوتر است. بنابراین نیازی نیست که اسمبلی جدیدترین پردازشگر را یاد بگیرید.از بین ۸۰۸۶ و Corex-M یکی را انتخاب کنید.
-
- مفاهیم پایهای پردازشگر و معماری کامپیوتر
- مفاهیم پایهای زبان سی
-
- مفاهیم پایهای پردازشگر مدرن و معماری کامپیوتر
- مفاهیم پایهای پیاده کردن و رفع اشکال کد سی
- نیاز به کمک برای ترجمه
-
یادگیری اسمبلی برای لینوکس-x64
- اسمبلی ۶۴ بیت با NASM و اسمبلی روی خط با GCC
- راهنمای معماری ARM ، چاپ دوم
- منبع کامل برنامهنویسی ARM
-
سازماندهی و طراحی کامپیوتر
-
کتابهای آکادمیکی که درباره نحوه کارکرد تمام اجزای کامپیوتر توضیح میدهند.
-
با طرح جزئیات درباره مفاهیم مختلف تشکیل دهنده معماری کامپیوتر توضیح میدهند.
-
این منابع برای کسانی که قصد دارند با جزئیات یک زبان اسمبلی خاص آشنا شوند مناسب نیستند.
-
ورژنهای MIPS و ARM موضوعات مشابه را در قالب دو معماری مختلف پوشش میدهند.
-
هر دو ورژن شامل مثالهایی در مورد x86 هستند.
زبان سی: میانبری وجود ندارد. کل کتاب را خوانده و تمام تمرینات را حل کنید.
-
- برای استاندارد جدید سی
-
آیا برنامهنویسی موازی سخت است؟ اگر بلی چه میتوان کرد؟
- پیادهسازی همزمانسازی با سی
- ضروری برای سی در سطح کلان(خصوصا برای برنامهنویسی هسته)
-
- اگر یک یا دو کتاب درباره سی خواندید، باید کار عملی انجام دهید .
- چیزی را که دوست دارید انتخاب کنید.
-ابتدا کد خود را بنویسید و آنرا با کد کس دیگری مقایسه کنید. تنها زمانی میتوانید مهارتتان را بهبود ببخشید که کد سایرین را بخوانید و روشهای بهتری یاد بگیرید. کتابها ایستا هستند ولی کد همواره در حال تغییر است.
-
پروژههای مرتبط با سی و سایر زبانها
-
پروژههای جذاب دیگری پیدا کنید. -کتاب سیاه برنامهنویسی گرافیکی میشل ابرش، چاپ ویژه
-
منبعی درباره بهینهسازی با استفاده از سی و مقداری اسمبلی.
-
از اسمبلی ۸۰۸۸ تا کنون را در بر میگیرد.
-
با تمرکز ویژه بر روی بهینهسازی گرافیکی سطح پایین.
-
-
- چگونه چارچوب و افزایه را با سی و در سطح وسیع گسترش دهیم؟
- نکاتی بسیار ابتدایی برای خواندن منبع هسته لینوکس.
اگر قصد دارید در سی تبحر پیدا کنید به سایت https://leetcode.com/مراجعه کنید.
سختافزار و ثابتافزار: اگر میخواهید مهندس سیستمهای نهفته شوید شروع با یک کیت سختافزاری ساده گزینه بهتری از جدیدترین تراشه ARM است.
- کیت آغازین آردوئینو
- سریهای بسیاری از آردوئینو وجود دارند ولی کیت آغازین آردوئینو سادهترین پردازشگر(Atmega328P) را داشته و کتاب راهنما هم دارد.
- پردازشگر Atmega328P یک هسته هشت بیتی دارد که بستر مناسبی برای طراحی مدارهای دیجیتال و توسعه ثابتافزار فراهم میکند.
- نیازی به دانستن طراحی شماتیک و اسمبل کردن تراشه نیست.
- ولی باید بتوانید شماتیکها را خوانده و متوجه شوید تراشهها چگونه متصل میشوند.
- توسعهدهندگان ثابتافزار باید بتوانند شماتیکها را خوانده و بدانند چطور داده را به درایور مقصد بفرستند.
- کتب راهنما را دنبال کنید.
- راهنمای ۸۰۸۶
- اگر در معماری 86× مبتدی هستید، ۸۰۸۶ نیز راهنمای خوبی برای معماری پردازشگر و اسمبلی ۸۶×۸۰ خواهد بود.
- راهنمای ۸۰۳۸۶
- بهترین راهنما برای مدل محافظت شده و مکانیسم پردازشگر ۸۶×۸۰.
- ورژن وب:https://pdos.csail.mit.edu/6.828/2011/readings/i386/toc.htm
در این مرحله باید بقدری پیشرفت کرده باشید که بتوانید پردازشگرهای ARM یا 86× را شروع کنید.
- https://www.raspberrypi.org/
- https://beagleboard.org/
- https://www.arduino.cc/en/ArduinoCertified/IntelEdison
برای مثال بورد رسپبری پای پردازشگری با کورتکس-a53 دارد که مجموعه دستورات ۶۴ بیت را ساپورت میکند. این به شما امکان آشنا شدن با پردازشگر مدرن RPi را میدهد. شما میتوانید آنرا بخرید ولی میخواهید چه کاری با آن انجام دهید؟ اگر برنامه خاصی ندارید احتمالا آنرا همانند سایر وسایلی که احتمالا قبلا خریدهاید در کشو انداخته و فراموش خواهید کرد. بنابراین من یک پروژه به شما پیشنهاد میکنم:
-
- چند منبع خوب: https://www.reddit.com/r/osdev/
-
یادگیری گسترش سیستم عامل با استفاده از هسته لینوکس و رسپبری پای
- (توصیف پروژه): این منبع حاوی یک راهنمای گام به گام است که نحوه ساختن هسته یک سیستم عامل ساده را از ابتدا نشان میدهد. هر مبحث طوری طراحی شده است که نشان میدهد که یک کارکرد هسته در سیستم عامل RPi چطور پیاده میشود و سپس نحوه عمل همان کارکرد در هسته لینوکس را نشان میدهد.
من یک شبه هسته ساختهام که مدل ۶۴ بیت، پیجینگ و جابجایی ساده موضوع را ساپورت میکند. ساختن چنین هستهای کمک میکند تا با معماری کامپیوترهای نوین و کنترل سختافزار آشنا شوید.
در واقع شما تا به اینجا جدیدترین پردازشگرها و سختافزار را بواسطه لپتاپ و دسکتاپتان در اختیار دارید. در حقیقت تمام چیزهای مورد نیاز برای شروع در دسترستان هستند و نیاز به خرید چیزی ندارید. برابرساز کمو میتواند برای پردازشگر ARM و اینتل برابرسازی کند. بنابراین تمام چیزهای مورد نیاز در اختیارتان هستند. هستهها و مطالب زیادی وجود دارند که شما میتوانید از آنها استفاده کنید. برابرساز کمو را نصب کرده و یک هسته کوچک که بوت میشود، صفحهبندی را فعال میکند و چند پیام را چاپ میکند بسازید.
سایر هستهها:
هسته لینوکس و درایور نیازی به ساختن یک سیستم عامل کامل ندارید.به انجمن لینوکس پیوسته و در توسعه آن شرکت کنید.
منابعی برای هسته لینوکس و درایور از مبتدی تا پیشرفته،
- کتابها: این کتابها را بهترتیب بخوانید:
-
- مفاهیم پایهای لینوکس در تمامی سیستمهای عامل استفاده میشوند.
- این کتاب منبع مناسبی برای درک مفاهیم بنیادی سیستمهای عامل است.
-
- تمام مثالها را برای خودتان بسازید.
-
- طراحی هسته لینوکس را درک کنید.
-
- این کتاب و منبع هسته V2.6 را بطور همزمان بخوانید.
- هیچگاه با آخرین ورژن شروع نکنید، V2.6 کافی است.
- برای اجرای خط به خط منبع هسته از کمو و جی دی بی استفاده کنید.
http://stackoverflow.com/questions/11408041/how-to-debug-the-linux-kernel-with-gdb-and-qemu
https://github.com/gurugio/linuxdeveloptip/blob/master/qemu-gdb-kdump.md -از بیزیباکس برای ساختن سادهترین سیستم فایلبندی استفاده کنید که در مدت یک ثانیه بالا میآید. - https://github.com/gurugio/linuxdeveloptip/blob/master/minikernelwithbusybox.md
-
- سایر منابع:منابع رایگانی که توصیه میکنم:
-
آزمایشگاه درایورهای لینوکس.
- راهنمای عملی و تمرینات عالی برای ساختن درایورهای لینوکس بههمراه ایپیآیهای ضروری هسته.
-
-
متاسفانه این چالش اعضای جدیدی نمیپذیرد، چون چالش جدیدی وجود ندارد. نگهدارنده سایت گفته است که در حال کار بر روی یک فرمت جدید است. امیدوارم که شاهد بازگشت این چالش باشیم.
- شما میتوانید سوالات مربوطه را در گوگل سرچ کنید. سعی کنید سوالات را حل کنید و پاسخ را با جوابهای موجود مقایسه کنید.
- این مشابه یک معلم خصوصی است که شما را راهنمایی میکند.
- اگر نمیدانید چه کنید این را شروع کنید.
-
یادگیری توسعه سیستم عامل با استفاده از هسته لینوکس و رسپبری پای
- این پروژه هنوز کامل نشده است.
- همواره بر این عقیده هستم که ساختن هستهای مشابه هسته لینوکس بهترین راه برای یادگیری هسته لینوکس است.
-
لایه بلاک و درایور دستگاه:
- از یک بلاک ساده درایور(مثلا رامدیسک) با مدل چند صفی شروع کنید.
- جلوتر رفته و به لایه بلاک بروید.
- ترجمه انگلیسی را تمام کردم، لطفا نظر خود را برایم بفرستید.
-
درایور امدی برای لینوکس(کرهای)
- ابزار mdadm چطور کار میکند و چطور درایورmd را فرامیخواند؟
- درایور md چطور کار میکند؟
-
-
منابع
وقتی به چیزی نیاز دارید آنرا چک کنید.
-
- فایلهای اسلاید متعددی که موضوعات خوبی همچون لینوکس ARM را معرفی میکنند.
-پست جولیا ایوان: شما میتوانید یک هکر هسته باشید
- راهنمایی برای برنامهنویسی هسته.
سایر اپلیکیشنها شاید شما به لینوکس و ثابتافزار علاقه نداشته باشید. در اینصورت میتوانید اپلیکیشنهای دیگری پیدا کنید:
- برنامهنویسی سیستمی و درایور لینوکس.
- ایمنی.
- مهندسی معکوس. من درباره این اپلیکیشنها اطلاعی ندارم. لطفا هر نوع اطلاعات مبتدی در این زمینه دارید برایم بفرستید.
- فایلهای اسلاید متعددی که موضوعات خوبی همچون لینوکس ARM را معرفی میکنند.
-پست جولیا ایوان: شما میتوانید یک هکر هسته باشید
برنامهنویسی سطح پایین به هسته و درایورها محدود نمیشود. یکی دیگر از کاربردهای این نوع برنامهنویسی ذخیره نرمافزاری یا سیستم فایلبندی توزیع شده است.
- دوره آموزشی: https://pdos.csail.mit.edu/archive/6.824-2012/
- منبع: https://github.com/srned/yfs
درباره آینده چیزی نمیدانم ولی نگاهم را به راست(Rust) دوختهام.
اگر یک هفته آزاد و تنها بودم، راست را یاد میگرفتم چون این تنها زبان جدیدیست که میتوانم با آن درایور لینوکس بسازم.
یوت(IoT) شیوه جدیدی است, بنابراین میتوانید بررسی کنید که چه سیستمهای عاملی برای آن مناسب هستند.ARM، سامسونگ و برخی از کمپانیهای دیگر سیستمهای عامل بیدرنگ خود را دارند ولی متاسفانه بسیاری از آنها منبع بسته هستند. ولی بنیاد لینوکس یک راه حل دارد: زفیر.
سرورهای ابری متداوال لایههای گوناگونی دارند؛ مثلا سیستم عامل میزبان، درایور KVM، پروسه کمو، سیستم عامل میهمان و سرویسهای اپلیکیشن. یک مخزن هم برای فراهم کردن مجازیسازی سبک ایجاد شده است. در آینده نزدیک مفهومی جدید از سیستم عامل، یک به اصطلاح سیستم عامل کتابخانهای یا تک هستهای جایگزین منبع نرمافزار برای مجازیسازی خواهد شد.
- http://unikernel.org/ دادههای بزرگ و رایانش ابری پیوسته نیاز به فضای ذخیرهسازی بزرگتری دارند. برخی از دیسکهایی که مستقیما به سرورها وصل هستند نمیتوانند پاسخگوی ظرفیت، ثبات و عملکرد مورد نیاز باشند. بنابراین تحقیقاتی برای ایجاد سیستمهای ذخیرهسازی بسیار بزرگ انجام شدهاند که ماشینهای ذخیرهسازی متعددی را توسط شبکه پرسرعت متصل میکنند. اینها در گذشته بر ساخت یک حجم ذخیره بسیار بزرگ متمرکز بودند ولی در حال حاضر حجمهای متعددی که به ماشینهای مجازی مختلفی اختصاص داده شدهاند فراهم شدهاند.
- https://en.wikipedia.org/wiki/Software-defined_storage
- https://en.wikipedia.org/wiki/Clustered_file_system
- https://en.wikipedia.org/wiki/Ceph_(software)
ایمیلی دریافت کردم که پرسیده بود چگونه شروع کنیم. در این صفحه اطلاعات زیادی درباره درباره کتابها، دورههای آموزشی و پروژهها وجود دارند. اشتباه من بود که توضیح درباره چگونه شروع کردن را فراموش کردم.متاسفانه هیچ راه آسانی برای رسیدن به کینگلندینگ وجود ندارد و من به توضیح اینکه خودم چگونه شروع کردم میپردازم. اگر تا کنون کاری انجام دادهاید لطفا از این بخش عبور کنید. این تنها مثالی است که به شما میآموزد که برای شروع چکار کنید.
-
خواندن کتابهای سیستم عامل: حداقل کتاب طراحی سیستم عامل لینوکس نوشته موریس جی باخ را بخوانید.
-
اسمبلی و سی را یاد بگیرید.
- اسمبلی ۸۰۸۶ با امو ۸۰۸۶
- یادگیری مفاهیم اسمبلی کافیست و نیازی به انجام کار عملی ندارید.
- زبان برنامهنویسی سی، چاپ دوم
- سعی کنید که تمام تمرینات این کتاب را حل کنید.
- برنامهنویسی سی، نگرشی نوین،چاپ دوم
- کاری عملی با سی انجام دهید. -خودآموزهای پروژهمحور سی
- یک یا دو پروژه جذاب انتخاب کنید و پروژه خودتان را بسازید. -سایتleetcode.com: اگر نمیتوانید پروژه مناسبی انتخاب کنید، ساختمان داده و الگوریتم میتوانند گزینههای مناسبی باشند.
- اسمبلی ۸۰۸۶ با امو ۸۰۸۶
-
پروژهای در زمینه سختافزار انجام دهید.
- رسپبری پای و آردوئینو اهمیت چندانی ندارند. باید تجربه کنترل سختافزار با سی را داشته باشید، فقط با سی!
- توصیه میکنم یک کیتAtmega128 خریده و ثابتافزاری بسازید که السیدی ها را خاموش و روشن میکند. ورودی سوئچ و پیام نشان داده شده روی السیدی را ردیابی کنید. برنامه کنترل حرکت هم پروژه خوبی خواهد بود. بعنوان مثال ردیاب خط.
- از کتابخانه استفاده نکنید. باید همه چیز غیر از دانلود کننده برنامه را خودتان بسازید.
-
مبانی هسته لینوکس.
- برنامهنویسی سطح پایین بسیار به سیستم عامل نزدیک است. باید با درون سیستم عامل آشنایی داشته باشید.
- با درایورها شروع کنید.
- کتاب توسعه هسته لینوکس را بخوانید.
-
وارد زمینه حرفهای شوید.
- اگر میخواهید توسعه دهنده حرفهای هسته لینوکس شوید.
- باید کتابدرک هسته لینوکس را بخوانید.
- سپس تلاش کنید یک شبه هسته بسازید.
- یادگیری توسعه سیستم عامل با استفاده از هسته لینوکس و رسپبریپای
- هسته خودتان را بسازید
- به https://lwn.net/بپیوندید و آخرین مسائل را دنبال کنید.
- اگر میخواهید توسعه دهنده حرفهای هسته لینوکس شوید.
-
یا موضوع دیگری پیدا کنید.
-
اگر قصد ترجمه این صفحه را دارید، لطفا برایم تقاضا بفرستید. آن را به این لیست اضافه خواهم کرد.
از مطلب google-interview-university الهام گرفتهام. تمایل دارم تجاربم را به اشتراک بگذارم و راه تبدیل شدن به یک برنامهنویس سطح پایین را نشان دهم زیرا دریافتهام که این مهارتها باندازه سابق محبوبیت ندارند. بعلاوه بسیاری از دانشجویان درباره اینکه چطور میتوان یک مهندس هسته لینوکس شد میپرسند.
من بیش از ده سال تجربه در زمینه برنامهنویسی سطح پایین دارم:
- اسمبلی ۸۶×۸۰
- سختافزار با تراشه و ثابتافزار Atmel
- برنامهنویسی سیستمی سی برای لینوکس
- درایور لینوکس
- هسته لینوکس: تخصیص صفحه
- هسته لینوکس: درایور بلاک و مودول امدی