Kernel Init

nerdprogrammer Kernel Start-up, Linux Start-Up Sequence

به صورت کلی ۳ فرآیند هنگام بوت و initialize شدن کامل سیستم رخ می دهد تا شما وارد User space شوید.این سه فرآیند به ترتیب زیر است :

  1. Bootloader
  2. Kernel initialization
  3. Init process

ما در “مرحله بوت لودر” فرآیند اول را بررسی کردیم.حال می خواهیم در مورد Kernel initialization صحبت کنیم.

Kernel bootstraps

ابتدا ، کرنل خام لینوکس vmlinux که محتوی موارد خاصیست و تایپ آن ELF است با استفاده از objcopy تبدیل به binary object می شود.همچنین توجه داشته باشید که فرآیند stripping نیز روی این فایل صورت می گیرد زیرا کل فایل های “o.” و “a.” با یکدیگر به شکل non-stripped با استفاده از ld لینک شده اند.
در واقع وقتی از stripping صحبت می شود، منظور همان پاک کردن info های debugging می باشد.زمانی که شما یک سورس کد C را برای مثال با gcc با استفاده از سوییچ g کامپایل می نمایید این فلگ ها ایجاد می شوند.
در نهایت یک Image به ما خروجی داده می شود.با استفاده از gzip فایل vmlinux را compress کرده و به آن نام piggy می دهند و با اسمبل کردن (as) این فایل فشرده که محتوی باینری کرنل است، یک‌ object فایل دریافت می کنیم (piggy.o). این object را با یک سری فایل مهم (کد هایی مثلا برای decompress کردن یا cpu initialization و …) لینک کرده و در نهایت باز یک ELF دریافت می کنیم .این ELF را دوباره با objcopy به binary object تبدیل می کنیم که همان zImage (یا مواردی نظیر bzImage وابسته به فشرده سازی) می باشد.این فایل توانایی bootable شدن را دارد.
شماتیکی از مراحل ذکر شده:

arch/kernel/head.S (source)

این فایل اسمبلی چندین وظیفه دارد :
ابتدا معماری و اطلاعات پردازنده همراه با تایپ machine را بررسی می نماید.سپس به کانفیگ MMU می پردازد و همچنین virtual memory را فعال می سازد.در ادامه کار ، تابع start_kernel را در init/main.c فراخوانی می کند.

start_kernel (source)

این تابع در arch/kernel/setup.c تعریف شده است.اول از همه این تابع،setup_arch را صدا می زند.این تابع در اینجا تعریف شده که برای درک بیشتر کار آن می توانید کامنت های تابع را در سورس کرنل بخوانید.علاوه بر فراخوانی توابع،داخل خود نیز آرگومان هایی که بوت لودر در نقطه مشخصی از حافظه قرار داده است را کپی می کند.
همچنین start_kernel وظیفه دارد هرچه سریع تر console کرنل را initialize کند (برای دریافت error/alert ها).این console همان دیوایسی است که تحت عنوان آرگومان توسط بوت لودر به کرنل پاس داده شده است.(در مورد Argument passing در مرحله بوت لودر صحبت کردیم).علاوه بر این ها تعدادی subsystem نیز intialize می شوند.در نهایت ، start_kernel تابع rest_init را صدا می زند.

kernel_init (source)

این تابع باید ۲ کار را انجام دهد.اولین کار فراخوانی تابع do_basic_setup می باشد که هدف آن آماده سازی سرویس های کرنل برای intialize کردن device ها می باشد.

static void __init do_basic_setup(void)
{
cpuset_init_smp();
usermodehelper_init();
init_tmpfs();
driver_init();
init_irq_proc();
do_ctors();
do_initcalls();
}

در نهایت پس از فراخوانی do_basic_setup این تابع init_post را نیز فراخوانی می کند که در ادامه توضیح خواهیم داد.

Initcalls

این تابع برای ماژول هایی است که به صورت static به کرنل لینوکس link شده اند.این موارد ارتباطی با module های عادی که بعد بوت لود می شوند ندارد.البته می توانست داشته باشد اما برای افزایش سرعت بوت تمامی ماژول ها با کرنل لود نخواهند شد.تنها موارد مورد نیاز لود می شوند. وقتی شما برای مثال یک کابل سریال به سیستمتان می زنید تازه ماژول مربوطه آن لود می شود.در اینجا می توانید ماکرو های مربوطه را ببینید.

init_post (source)

این مرحله،اخرین مرحله بوت شدن لینوکس شماست.ابتدا تلاش می کند تا console را باز کند تا طبق debug level تعریف شده (که جزو آرگومان هاییست که از بوت لودر به کرنل پاس داده شده) خروجی های مربوطه را چاپ می کند.سپس برای اجرای init اقدام می کند.اتفاقی که صورت می گیرد این است که ترد فعلی کرنل را به User space یا همان init process پاس می دهد.

run_init_process("/sbin/init");
run_init_process("/etc/init");
run_init_process("/bin/init");
run_init_process("/bin/sh");

Summary

1.بوت لودر کد bootstrap را execute می نماید.
۲.کد bootstrap پردازنده و برد را initialize کرده و همچنین کرنل را uncompress می نماید و کد کرنل را در رم قرار می دهد ، سپس start_kernel فراخوانی می شود.
۳.شناسایی پردازنده و machine توسط head.S
۴.فراهم سازی Console توسط start_kernel
۵.فراهم سازی سرویس های kernel (مواردی مثل memory allocation , scheduling ,file cache )
۶.ایجاد thread جدید برای کرنل
۷.فراهم سازی device ها و اجرا کردن initcalls

شاید دوست داشته باشید:

مرحله بوت لودر

بوت لودر یک تیکه کد/نرم افزار می باشد که وظایف متعددی دارد.یکی از وظایف مهم بوت لودر ها، Initialize نمودن سخت افزار و بارگذاری کرنل می باشد.می توان برای این موضوع به مواردی نظیر کانفیگ سرعت پردازنده،Initialize نمودن Memory و پیاده سازی رجیستر ها و پاک سازی Memory اشاره کرد.

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *