Wednesday, April 16, 2014

ലിനക്സ് കെർണൽ കമ്പൈലേഷൻ ഭാഗം -1

ലിനക്സ് ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റത്തിന്റെ അടിസ്ഥാന കാര്യങ്ങളും ലിനക്സ് സോഴ്സ് കോഡും ഏകദേശം പരിശോധിച്ച് കഴിഞ്ഞു. ഇനി ലിനക്സ് കെർണലിനെ എങ്ങനെ ഉപയോഗിക്കാം എന്നതിനെപ്പറ്റി വിശദീകരിക്കാം. ഏതൊരു ലിനക്സ് അധിഷ്ഠിത ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റത്തിന്റെയും അടിസ്ഥാനം ലിനക്സ് കെർണൽ ആണല്ലോ. ലിനക്സ് കെർണലിനൊപ്പം ആവശ്യമായ യൂസർസ്പേസ് പ്രോഗ്രാമുകളും കൂട്ടിച്ചേർത്ത് ഒരു ലിനക്സ് ഡിസ്ട്രിബ്യൂഷൻ തയ്യാറാക്കാം. യൂസർസ്പേസായി ആൻഡ്രോയിഡ് വേണമെങ്കിലും ഉപയോഗിക്കാം. ലിനക്സ് കെർണൽ കമ്പൈലേഷന്റെ ചില അടിസ്ഥാന വിവരങ്ങളുമായി തന്നെ ആരംഭിക്കാം.

എന്താണ് കെർണൽ കമ്പൈലേഷൻ?
കമ്പൈലേഷൻ (compilation) കമ്പ്യൂട്ടറുകളുമായി ബന്ധപ്പെടുത്തി ഉപയോഗിക്കുമ്പോൾ അത് സോഴ്സ് കോഡിൽ നിന്ന് ഒരു പ്രോഗ്രാമിനെ മെഷീനിൽ പ്രവർത്തിക്കാൻ പാകത്തിലുള്ള ഒരു പ്രോഗ്രാം ആയി മാറ്റുന്ന പ്രക്രിയ ആണ്. കമ്പൈലേഷൻ എന്ന് മാത്രം പറയുമ്പോൾ കൃത്യമായി അത് ഒരു ഹൈ ലെവൽ പ്രോഗ്രാമിങ്ങ് ഭാഷയിൽ എഴുതിയിരിക്കുന്ന പ്രോഗ്രാമിനെ തത്തുല്യമായ അസംബ്ലി ഭാഷയിലേക്ക് മാറ്റുന്ന ഒരു പ്രക്രിയയാണ്. ഓരോ സി പി യു ആർക്കിട്ടെക്ചറിനും വ്യത്യസ്തമായ അസംബ്ലി ഭാഷകൾ ആണ് ഉപയോഗിക്കുന്നത്. കമ്പൈലേഷൻ എന്ന് പൊതുവായി പറയുമ്പോൾ ആ പ്രക്രിയയിൽ കമ്പൈലിങ്ങ്, അസംബ്ലിങ്ങ്, ലിങ്കിങ്ങ് എന്നീ പ്രക്രിയകൾ അതിൽ പെടും. ഇവയെക്കുറിച്ച് വിശദമായി പിന്നീട് എഴുതാം. ചുരുക്കത്തിൽ പറഞ്ഞാൽ ലിനക്സ് കെർണലിനെ അതിന്റെ സോഴ്സ് കോഡിൽ നിന്ന് ഒരു കമ്പ്യൂട്ടറിൽ പ്രവർത്തിക്കാൻ പാകത്തിലുള്ള ഒരു പ്രോഗ്രാമാക്കി മാറ്റുന്ന പ്രക്രിയയാണ് ലിനക്സ് കെർണൽ കമ്പൈലേഷൻ.

എന്തിനാണ് ലിനക്സ് കെർണൽ കമ്പൈൽ ചെയ്യുന്നത്?
അതിനെ ഒരു കമ്പ്യൂട്ടറിൽ പ്രവർത്തിപ്പിക്കാൻ എന്നതാണ് ചുരുക്കത്തിലുള്ള ഉത്തരം. എല്ലാ ലിനക്സ് ഡിസ്ട്രിബ്യൂഷനുകളും അതിന്റെ കൂടെ ഒരു കെർണൽ പാക്ക് ചെയ്യുന്നതിനൊപ്പം തന്നെ പുതിയ വേർഷനുകളിലേക്ക് പാക്കേജ്‌‌ മാനേജറുകൾ വഴി അപ്‌‌ഡേറ്റ് ചെയ്യാനുള്ള സൗകര്യവും കൊടുക്കുന്നുണ്ട്. പക്ഷേ ഇവയൊക്കെ എപ്പോളും ഉപയോക്താക്കളുടെ ആവശ്യത്തിനുതകണമെന്നില്ല. ഡിസ്ട്രിബ്യൂഷനുകൾ പുതിയ പതിപ്പുകൾ ഇറക്കുന്നതിനിടയിൽ ലിനക്സ് കെർണലിന്റെ പല പുതിയ പതിപ്പുകളും ഇറങ്ങിയിരിക്കും. പുതിയ കെർണൽ പതിപ്പുകൾ പെട്ടന്ന് ലഭിക്കാൻ സ്വന്തമായി അവയെ കമ്പൈൽ ചെയ്യുകയാണ് ഏറ്റവും നല്ല വഴി. സ്വന്തമായി ഒരു ലിനക്സ് സിസ്റ്റം തയ്യാറാക്കാനും ലിനക്സ് ഒരു പ്രത്യേക കമ്പ്യൂട്ടർ സിസ്റ്റത്തിനായി നിർമ്മിക്കാനും ഒക്കെ ലിനക്സ് കെർണൽ സ്വന്തമായി കമ്പൈൽ ചെയ്യേണ്ടിവരും.

കെർണൽ കോൺഫിഗറേഷൻ
ലിനക്സ് കെർണലിൽ ആയിരക്കണക്കിന് ഉപകരണങ്ങൾക്കുള്ള പിന്തുണ ഉൾപ്പെടുത്തിയിരിക്കുന്നു. എന്നാൽ ഇവയെല്ലാം എല്ലാ കമ്പ്യൂട്ടർ ഉപകരണങ്ങളിലും ആവശ്യമായി വരികയില്ല. കെർണൽ ഒരു കമ്പ്യൂട്ടർ സിസ്റ്റത്തിനായി കമ്പൈൽ ചെയ്യുന്ന സമയത്ത് ആ സിസ്റ്റത്തിൽ ഉള്ള ഉപകരണങ്ങളുടെ ഡ്രൈവറുകൾ മാത്രം അതിൽ ഉൾപ്പെടുത്തിയാൽ മതിയാകും. കമ്പൈലേഷൻ സമയത്ത് കെർണലിൽ ഉൾപ്പെടുത്തേണ്ട സൗകര്യങ്ങൾ ഏതൊക്കെ ആണെന്ന് ക്രമീകരിക്കാനായി .config എന്ന ഫയൽ ഉപയോഗിക്കുന്നു. പേരിന്റെ ആദ്യം . ഉള്ളതിനാൽ ലിനക്സ് സിസ്റ്റങ്ങളിൽ ഇത് ഒരു ഹിഡൺ ഫയൽ ആയിരിക്കും. ഈ ഫയൽ കെർണൽ സോഴ്സിൽ ഉൾപ്പെടുത്തിയിരിക്കില്ല. കെർണൽ കമ്പൈലേഷനിലെ കോൺഫിഗറേഷൻ ഘട്ടത്തിൽ ഈ ഫയൽ നിർമ്മിക്കപ്പെടുകയാണ് ചെയ്യുന്നത്. ഈ ഫയൽ ഒരു ടെക്സ്റ്റ് എഡിറ്റർ ഉപയോഗിച്ച് മാറ്റങ്ങൾ വരുത്താവുന്ന ഒന്നാണെങ്കിലും അതിനായി ഉള്ള പ്രത്യേക മാർഗ്ഗങ്ങൾ ഉപയോഗിക്കാൻ ശുപാർശ ചെയ്യപ്പെട്ടിരിക്കുന്നു.

ലിനക്സ് കെർണൽ കോൺഫിഗറേഷൻ ഘട്ടത്തിൽ ആണ് ഏത് സിപിയു ആർക്കിട്ടെക്ചറിനായി ആണ് കെർണൽ കമ്പൈൽ ചെയ്യുന്നത്, എന്തൊക്കെ സൗകര്യങ്ങൾ ആണ് കെർണലിൽ വേണ്ടത് എന്നൊക്കെ ക്രമീകരിക്കപ്പെടുന്നത് എന്ന് നേരത്തേ പറഞ്ഞല്ലോ.കെർണലിലെ ചില സൗകര്യങ്ങളും ഡിവൈസ് ഡ്രൈവറുകളും ഒക്കെ മൊഡ്യൂളുകൾ ആയി കമ്പൈൽ ചെയ്യാൻ കഴിയും. എല്ലാം സ്റ്റാറ്റിക്ക് ആയും കമ്പൈൽ ചെയ്യാം. ഇവ തമ്മിലുള്ള വ്യത്യാസം എന്താണെന്നല്ലേ, ലിനക്സ് കെർണൽ ഒരു മോണോലിത്തിക് കെർണൽ ആണ്. കമ്പൈൽ ചെയ്യപ്പെട്ട് കെർണൽ ഒരൊറ്റ വലിയ ബൈനറി എക്സിക്യൂട്ടബിൾ ഫയൽ ആണ്. ഇഎൽഎഫ് ഫോർമാറ്റിലുള്ള ഈ ഫയലിനെ ഒരു ബൂട്ട് ലോഡർ പ്രോഗ്രാം കമ്പ്യൂട്ടർ ഹാർഡ് ഡിസ്കിൽ നിന്ന് പ്രധാന മെമ്മറിയിലേക്ക് പകർത്തുകയും അതിനെ പ്രവർത്തിപ്പിക്കുകയും ആണ് ലിനക്സ് സിസ്റ്റം പ്രവർത്തനമാരംഭിക്കുമ്പോൾ ചെയ്യുന്നത്. കമ്പൈൽ ചെയ്യപ്പെട്ട ലിനക്സ് കെർണൽ ഫയലിന്റെ വലിപ്പം സാധാരണഗതിയിൽ 3~4 മെഗാ ബൈറ്റുകൾ ആണ്. പക്ഷേ എല്ലാ ഡിവൈസ് ഡ്രൈവറുകളും സൗകര്യങ്ങളും സജ്ജമാക്കപ്പെട്ടാൽ വലിപ്പം ഇതിലും അധികമാകും. ഇത് പല പ്രശ്നങ്ങളും ഉണ്ടാക്കാം. ലിനക്സ് പ്രവർത്തിക്കുന്നത് പേഴ്സണൽ കമ്പ്യൂട്ടർ സിസ്റ്റങ്ങളിൽ മാത്രമല്ല എന്ന് ഓർകുക. ചില ഉപകരണങ്ങളിൽ ലിനക്സ് കെർണൽ ഇമേജ് സൂക്ഷിക്കപ്പെടുന്ന സ്ഥലത്തിന്റെ വലിപ്പത്തിനു പരിമിതികൾ ഉണ്ടായേക്കാം. ഇതിനു പുറമേ ഈ ഉപകരണങ്ങൾ എല്ലാം ഒരേ സമയത്ത് ഒരു കമ്പ്യൂട്ടറിൽ ഉണ്ടാവാൻ വഴിയില്ല. അപ്പോൾ ഈ ഉപകരണങ്ങൾക്കെല്ലാം ഉള്ള പിന്തുണ മുഴുവൻ സമയവും മെമ്മറിയിൽ സൂക്ഷിക്കേണ്ട ആവശ്യമില്ല. കെർണലിലെ ഒരു ഭാഗം സ്റ്റാറ്റിക് ആയി കമ്പൈൽ ചെയ്താൽ ആ ഭാഗം കമ്പൈൽ ചെയ്യപ്പെട്ട കെർണലിൽ ഇമേജിൽ ഉൾപ്പെടുത്തപ്പെടുകയും കെർണൽ പ്രവർത്തിച്ചുകൊണ്ടിരിക്കുന്ന മുഴുവൻ സമയവും അത് മെമ്മറിയിൽ ഉണ്ടായിരിക്കുകയും ചെയ്യും. എന്നാൽ മൊഡ്യൂൾ ആയിട്ടാണ് ആ ഭാഗം കമ്പൈൽ ചെയ്യപ്പെടുന്നതെങ്കിൽ ആ ഭാഗം കെർണൽ മൊഡ്യൂൾ ഫയൽ ആയി .ko എന്ന എക്സ്റ്റൻഷനോടു കൂടി ഹാർഡ് ഡിസ്കിൽ സൂക്ഷിക്കപ്പെടുകയും ചെയ്യും. ഇതിനെ ആവശ്യമുള്ള സമയത്ത് modprobe, insmod തുടങ്ങിയ പ്രോഗ്രാമുകൾ ഉപയോഗിച്ച് മെമ്മറിയിലേക്ക് പകർത്തുകയും ആവശ്യം കഴിയുമ്പോൾ modprobe -r, rmmod തുടങ്ങിയ കമാൻഡുകൾ വഴി മെമ്മറിയിൽ നിന്ന് നീക്കം ചെയ്യുകയും ചെയ്യാൻ സാധിക്കും.

ലിനക്സ് കെർണൽ സോഴ്സ് കോഡിലെ വിവിധ ഭാഗങ്ങളും സൗകര്യങ്ങളും CONFIG_***=y/not set/m എന്ന രീതിയിൽ ആണ് .config ഫയലിൽ പ്രതിപാദിച്ചിരിക്കുന്നത്. ഉദാഹരണത്തിന് ഒന്നിലധികം പ്രോസസ്സറുകൾ ഉള്ള സിസ്റ്റങ്ങളെ പിന്തുണക്കാനുള്ള സിമ്മട്രിക് മൾട്ടി പ്രോസസ്സർ (SMP) സൗകര്യം തെരഞ്ഞെടുക്കാനുള്ള കോൺഫിഗ് ലൈൻ CONFIG_SMP എന്നതാണ്. CONFIG_SMP=y എന്ന് .config ഫയലിൽ ഉണ്ടെങ്കിൽ അതിനർത്ഥം ഈ സൗകര്യം സ്റ്റാറ്റിക് ആയി കമ്പൈൽ ചെയ്യപ്പെടുന്നു എന്നാണ്. CONFIG_SMP=m എന്നാണെങ്കിൽ ഈ സൗകര്യം ഒരു മൊഡ്യൂൾ ആയി കമ്പൈൽ ചെയ്യപ്പെടും എന്നും #CONFIG_SMP is not set എന്നാണെങ്കിൽ ഈ സൗകര്യം ഉൾപ്പെടുത്തപ്പെടില്ല എന്നും ആണ് അതിന്റെ അർത്ഥം. എല്ലാ സൗകര്യങ്ങളും മൊഡ്യൂൾ ആയി കമ്പൈൽ ചെയ്യാൻ സാധിക്കില്ല. ചില സൗകര്യങ്ങൾ ഉൾപ്പെടുത്തപ്പെടാതിരിക്കാനും സാധിക്കുകയില്ല. എന്നാൽ എല്ലാ സൗകര്യങ്ങളും സ്റ്റാറ്റിക്ക് ആയി കമ്പൈൽ ചെയ്യാൻ സാധിക്കും.

കോൺഫിഗ് ഫയൽ എന്തിനാണ് ഉപയോഗിക്കുന്നത് എന്ന കാര്യം കൂടി പറയാം. ലിനക്സ് കെർണൽ സോഴ്സ് കോഡിൽ ആയിരക്കണക്കിനു  ഫയലുകൾ ഉണ്ട്. സി പ്രോഗ്രാമുകളും ഹെഡർ ഫയലുകളും അസംബ്ലി ഫയലുകളും മാത്രം പരിഗണിച്ചാൽ ലിനക്സ് 3.0.31 വേർഷനിൽ 32442 ഫയലുകൾ ഉണ്ട്. ഇതിൽ പകുതി ഫയലുകൾ എങ്കിലും ഒരു ബിൽഡിൽ ഉൾപ്പെടുത്തുകയാണെങ്കിൽ തന്നെ പതിനാറായിരത്തോളം ഫയലുകൾ കമ്പൈൽ ചെയ്യണം. കമ്പൈൽ ചെയ്യപ്പെട്ട ഫയലുകൾ ലിങ്ക് ചെയ്യണം. ഇതൊക്കെ ഒരാൾ ഇരുന്നു ചെയ്യുകയാണെങ്കിൽ അതിനാവശ്യമായി വരുന്ന സമയം എത്രത്തോളമായിരിക്കും എന്ന് ഊഹിക്കാമല്ലോ. കൂടാതെ ഒരു തവണ കെർണൽ കമ്പൈൽ ചെയ്ത ശേഷം ഒരു ഫയലിൽ മാത്രം മാറ്റം വരുത്തി എന്ന് കരുതുക. അപ്പോൾ എല്ലാ ഫയലുകളും വീണ്ടും കമ്പൈൽ ചെയ്യുന്നതിനു പകരം ഈ ഒരു ഫയൽ മാത്രം കമ്പൈൽ ചെയ്തിട്ട് ബാക്കിയുള്ളവയുമായി ലിങ്ക് ചെയ്താൽ മതിയാകും. ഈ കാര്യങ്ങൾ ഒക്കെ എളുപ്പത്തിൽ കൈകാര്യം ചെയ്യാനായി ഉള്ള ഒരു പ്രോഗ്രാം ആണ് make. make പ്രോഗ്രാമിന് നിരവധി ആളുകൾ എഴുതിയ നിരവധി പതിപ്പുകൾ ഉണ്ട്. ലിനക്സ് കെർണൽ കമ്പൈൽ ചെയ്യാനായി make പ്രോഗ്രാം ആവശ്യമാണ്. ഇതിനോടൊപ്പം സി കമ്പൈലർ പ്രോഗ്രാമും ആവശ്യമാണെന്നത് പറയേണ്ടതില്ലല്ലോ. ഏതൊക്കെ ഫയലുകൾ ആണ് കമ്പൈൽ ചെയ്യണ്ടത്, അവയെ ലിങ്ക് ചെയ്യാൻ എന്താണ് ചെയ്യണ്ടത് എന്നൊക്കെ ഉള്ള കാര്യങ്ങൾ മുൻകൂറായി മേക്ക് പ്രോഗ്രാമിനെ അറിയിക്കേണ്ടതുണ്ട്. ഇതിനായി Makefile എന്ന പേരിൽ ഉള്ള ക്രമീകരണ ഫയലുകൾ ഉപയോഗിക്കുന്നു. ഈ മേക്ക് ഫയലുകൾ കെർണൽ സോഴ്സ് കോഡിലെ മിക്കവാറും ഡയറക്ടറികളിൽ കാണാം. ഇവയോടൊപ്പം തന്നെ Kconfig എന്ന പേരിലുള്ള മറ്റൊരു ഫയലും. ഒരു ഡയറക്ടറിയിലെ ഫയലുകൾ കെർണലിൽ  ചേർക്കുന്ന ഭാഗങ്ങളുടെ പേരുകൾ എല്ലാം ആ ഡയറക്ടറിയിലെ  Kconfig ഫയലിൽ കാണും. അവയെക്കുറിച്ചുള്ള ചെറിയ കുറിപ്പുകളും അവയുടെ വ്യത്യസ്ത ക്രമീകരണങ്ങളും ആ ഭാഗങ്ങൾ മറ്റേതെങ്കിലും ഭാഗങ്ങളെ ഉപയോഗിക്കുന്നുണ്ടോ, ആ ഭാഗത്തെ മറ്റേതെങ്കിലും ഭാഗം ഉപയോഗിക്കുന്നുണ്ടോ തുടങ്ങിയ വിവരങ്ങളും ഈ ഫയലിൽ ഉണ്ടായിരിക്കും. Makefile ഇൽ ആ ഭാഗം CONFIG_പേര് എന്ന രീതിയിൽ ചേർത്തിരിക്കും. എന്നിട്ട് ആ ഭാഗം സ്റ്റാറ്റിക്ക് ആണെങ്കിൽ എന്ത് ചെയ്യണം, മൊഡ്യൂൾ ആണെങ്കിൽ എന്ത് ചെയ്യണം എന്നീ കാര്യങ്ങളും. Not Set ആണെങ്കിൽ അതുമായി ബന്ധപ്പെട്ട ഫയൽ കമ്പൈൽ ചെയ്യപ്പെടില്ല. എല്ലാ Kconfig ഫയലുകളിലും കൂടി ഉള്ള ഭാഗങ്ങളുടെ പേരുകളും അവ ഉൾപ്പെടുത്തണമോ വേണ്ടയോ, വേണമെങ്കിൽ എങ്ങനെ എന്ന വിവരങ്ങൾ ഉൾക്കൊള്ളുന്ന ഒരു വലിയ പട്ടിക ആണ് .config ഫയൽ‌.

കെർണൽ കോൺഫിഗ് ഫയലുകൾ തയ്യാറാക്കാനുള്ള രീതികളെയും ഡെഫ്‌കോൺഫിഗ്, കമ്പൈലേഷൻ, ഇൻസ്റ്റാളേഷൻ എന്നിവയെയും കുറിച്ച് അടുത്ത പോസ്റ്റ്.

1 comment:

  1. Real great. ഈ ഉദ്യമത്തിനു എല്ലാ ഭാവുകങ്ങളും നേരുന്നു. വളരെ ഉപകാരപ്രദമായ പോസ്റ്റ്‌.

    ReplyDelete