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 ഫയൽ‌.

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

Wednesday, April 02, 2014

ലിനക്സ് കെർണൽ: സോഴ്സ് കോഡ് - 2 ഭാഗം - 2

ലിനക്സ് കെർണൽ സോഴ്സ് കോഡിലെ ചില ഡയറക്ടറികളെക്കുറിച്ച് കഴിഞ്ഞ ഭാഗത്തിൽ പറഞ്ഞിരുന്നു. ബാക്കിയുള്ള ഡയറക്ടറികൾ കൂടി പരിശോധിക്കാം.

9. init - സി പ്രോഗ്രാമുകളെപ്പറ്റി പറയുമ്പോൾ ആദ്യം പറയുന്ന ഒരു കാര്യം എല്ലാ സി പ്രോഗ്രാമുകൾക്കും ഒരു മെയിൻ ഫങ്ഷൻ ഉണ്ടായിരിക്കണം എന്നാണ്. ഇത് മൊത്തത്തിൽ അത്ര ശരിയല്ല, എന്നാലും ഒരു പരിധി വരെ ശരിയും ആണ്. എല്ലാ പ്രോഗ്രാമുകൾക്കും ഒരു എൻട്രി പോയിന്റ് വേണം. കമ്പ്യൂട്ടർ പ്രോഗ്രാമുകൾ എല്ലാം കമ്പ്യൂട്ടറിനുള്ള നിർദ്ദേശങ്ങളുടെ കൂട്ടം ആണല്ലോ. ഒരു പ്രോഗ്രാമിൽ ഒന്നിലധികം നിർദ്ദേശങ്ങൾ ഉണ്ടായിരിക്കും. ഇവ പ്രവർത്തിക്കുന്നതിന്റെ ക്രമം എല്ലായ്പോഴും അവ എഴുതപ്പെട്ട ക്രമത്തിൽ ആയിരിക്കില്ല. സാധാരണഗതിയിൽ ഒരു സി പ്രോഗ്രാം പ്രവർത്തനം ആരംഭിക്കുന്നത് അതിന്റെ മെയിൻ ഫങ്ഷനിൽ നിന്നാണ്. ഈ ഫങ്ഷനെ ആ പ്രോഗ്രാമിന്റെ എൻട്രി പോയിന്റ് എന്ന് പറയാം. ലിനക്സ് കെർണലിലെ എൻട്രി പോയിന്റ് start_kernel() എന്ന ഫങ്ഷൻ ആണ്. ഇത് ഉൾക്കൊള്ളുന്ന ഫയൽ init/main.c യും. കെർണലിന്റെ പ്രവർത്തനം ആരംഭിക്കുന്ന സമയത്ത് ചെയ്യേണ്ട നിർദ്ദേശങ്ങൾ ഉൾക്കൊള്ളുന്ന ഫയലുകൾ ആണ് ഈ ഡയറക്ടറിയിൽ ഉള്ളത്. സാധാരണഗതിയിൽ ഒരു സി പ്രോഗ്രാമിൽ മെയിൻ എന്നൊരു ഫങ്ഷൻ ഇല്ലെങ്കിൽ ലിങ്കിങ്ങ് സമയത്ത് ലിങ്കർ പ്രോഗ്രാം എറർ കാണിക്കും. കമ്പൈലേഷൻ സമയത്ത് പ്രശ്നമൊന്നും ഉണ്ടാകില്ല. ലിങ്കർ സ്ക്രിപ്റ്റുകൾ എന്ന പേരിൽ അറിയപ്പെടുന്ന ക്രമീകരണ ഫയലുകൾ വഴി പ്രോഗ്രാമിന്റെ എൻട്രി പോയിന്റുകൾ മാറ്റാൻ സാധിക്കും.

10. ipc - ഇന്റർ പ്രോസസ്സ് കമ്യൂണിക്കേഷൻ സങ്കേതങ്ങളെക്കുറിച്ച് മുൻപ് പറഞ്ഞിട്ടുണ്ടല്ലോ. ലിനക്സ് പിന്തുണക്കുന്ന ഇന്റർപ്രോസസ്സ് കമ്യൂണിക്കേഷൻ സങ്കേതങ്ങളുടെ നിർവ്വചനങ്ങൾ ആണ് ഈ ഡയറക്ടറിയിൽ.

11. kernel - ഒരർത്ഥത്തിൽ പറഞ്ഞാൽ ഇതാണ് ശരിക്കും കെർണൽ. എല്ലാ ആർക്കിട്ടെക്ചറുകൾക്കും പൊതുവായുള്ള, കെർണലിന്റെ അടിസ്ഥാന കർമ്മങ്ങളായ പ്രോസസ്സുകളെ ഉണ്ടാക്കുകയും നിയന്ത്രിക്കുകയും ചെയ്യുന്ന, അവയ്ക്ക് പ്രോസസ്സറുകൾ അനുവദിക്കുകയും അവയെ ആ പ്രോസസ്സറുകളിൽ ഷെഡ്യൂൾ ചെയ്യുകയും ചെയ്യുക തുടങ്ങിയവയൊക്കെ ഉൾപ്പെടുന്ന നിർദ്ദേശങ്ങൾ ഈ ഡയറക്ടറിയിലെ ഫയലുകളിൽ കാണാം. ഇതിനു പുറമേ സിസ്റ്റം റീസ്റ്റാർട്ട്, ഷട്ട്ഡൗൺ, പവർ മാനേജ്‌മെന്റ്, ഇന്ററപ്റ്റുകൾ കൈകാര്യം ചെയ്യൽ എന്നിവയൊക്കെ ചെയ്യുന്ന നിർദ്ദേശങ്ങളും ഇവിടെ കാണാം. ഈ ഭാഗം എല്ലാ ആർക്കിട്ടെക്ചറുകൾക്കും പൊതുവായുള്ളതാണ്. എന്നാൽ ഇവിടെ ഉള്ള ഫങ്ഷനുകൾ ഓരോ കാര്യങ്ങളും ചെയ്യാനായി ഓരോ പ്രോസസ്സർ ആർക്കിട്ടെക്ചറുകളിലും നിർവചിക്കപ്പെട്ടിട്ടുള്ള ഫങ്ഷനുകളെ വിളിക്കുകയാണ് ചെയ്യുക. കെർണൽ കമ്പൈൽ ചെയ്യുന്നത് ഓരോ ആർക്കിട്ടെക്ചറിനും പ്രത്യേകമായിട്ടാണ് എന്ന് ഓർക്കുക. ആ സമയത്ത് തന്നെ ഈ ഫങ്ങ്ഷനുകൾ അതാത് ആർക്കിട്ടെക്ചറിലെ ഫങ്ഷനുകളുമായി ബന്ധിപ്പിക്കപ്പെടും. ശരിക്കും ലിനക്സ് കെർണലിന്റെ ഹൃദയമാണിത്.

12.  lib - ലിനക്സ് കെർണൽ സി പ്രോഗ്രാമ്മിങ്ങ് ഭാഷയിൽ ആണ് എഴുതപ്പെട്ടിരിക്കുന്നതെങ്കിലും സ്റ്റാൻഡേർഡ് സി ലൈബ്രറിയുമായി ഈ പ്രോഗ്രാം ലിങ്ക് ചെയ്യപ്പെടുന്നില്ല. അതിനാൽ സ്റ്റാൻഡേർഡ് സി ലൈബ്രറി ഫങ്ഷനുകൾ ലിനക്സ് കെർണൽ പ്രോഗ്രാമുകൾക്ക് ലഭ്യമായിരിക്കില്ല (printf, scanf, strstr, strlen പോലുള്ളവ). കെർണലിൽ പൊതുവായി ഉപയോഗിക്കപ്പെടുന്ന ഫങ്ഷനുകൾ, കമ്പ്രഷനും ഡീ കമ്പ്രഷനും ഉപയോഗിക്കപ്പെടുന്ന പ്രോഗ്രാമുകൾ തുടങ്ങിയവയൊക്കെ ആണ് ഇതിൽ ഉള്ളത്. ഇത് എല്ലാ ആർക്കിട്ടെക്ചറുകൾക്കും പൊതുവായുള്ളതാണ്. ചില ആർക്കിട്ടെക്ചറുകളിൽ ചില കാര്യങ്ങൾ ചെയ്യുന്നതിന് ഹാർഡ്‌വെയറിൽ തന്നെ പിന്തുണ ഉണ്ടായിരിക്കും. ഈ ഹാർഡ്‌വെയർ പിന്തുണ ഉപയോഗിക്കുന്നത് വഴി ഇതേ കാര്യങ്ങൾ വേഗത്തിൽ ചെയ്യാൻ സാധിക്കും. അതോടൊപ്പം പ്രധാന പ്രോസസ്സറിനു വിശ്രമവും കൊടുക്കാൻ സാധിക്കും. ഫ്ലോട്ടിങ്ങ് പോയിന്റ് സംഖ്യകൾ ഉൾക്കൊള്ളുന്ന ക്രിയകൾ ഒരു ഉദാഹരണമാണ്. ഇങ്ങനെ ഹാർഡ്‌വെയർ പിന്തുണയോടെ ചെയ്യാവുന്ന കാര്യങ്ങൾ അതാത് ആർക്കിട്ടെക്ചറുകളുടെ lib ഡയറക്ടറിയിൽ ആയിരിക്കും ഉണ്ടാവുക. (ഉദാ: arch/arm/lib).

13. mm - മെമ്മറി മാനേജ്മെന്റ് എന്നതിന്റെ ചുരുക്കമാണിത്. വിർച്ച്വൽ മെമ്മറിയെപ്പറ്റി മുൻപ് പറഞ്ഞിട്ടുണ്ടല്ലോ. ഈ വിർച്ച്വൽ മെമ്മറിയുടെയും ലഭ്യമായ മെയിൻ മെമ്മറിയുടെ ഉപയോഗവും മറ്റും നിയന്ത്രിക്കുന്ന നിർദ്ദേശങ്ങളാണ് ഇതിൽ ഉൾപ്പെടുത്തിയിരിക്കുന്നത്. വിർച്വൽ മെമ്മറിയുടെ നിർമ്മാണവും പരിപാലനവും നിയന്ത്രണവും ഒക്കെ വിവിധ പ്രോസസ്സർ ആർക്കിട്ടെക്ചറുകളിൽ വ്യത്യസ്തമായിരിക്കും. എല്ലാ ആർക്കിട്ടെക്ചറുകൾക്കും പൊതുവായിട്ടുള്ളതും മെമ്മറി മാനേജ്‌മെന്റ് പ്രവർത്തനങ്ങളിൽ ഏറ്റവും മുകളിലെ തട്ടിൽ ഉള്ളതുമായ കാര്യങ്ങളാണ് ഇവിടെ ഉള്ളത്. ഓരോ ആർക്കിട്ടെക്ചറിലെയും മെമ്മറി മാനേജ്‌മെന്റ് രീതികൾ നിർവ്വചിച്ചിരിക്കുക അവയുടെ പ്രത്യേക mm ഡയറക്ടറിയിൽ ആണ്. (ഉദാ: arch/arm/mm).

കെർണൽ ഡയറക്ടറിയുടെ കാര്യത്തിലും എംഎം‌ ഡയറക്ടറിയുടെ കാര്യത്തിലും ആർക്കിട്ടെക്ചറുമായി ബന്ധപ്പെട്ടതും അല്ലാത്തതും ആയ ഭാഗങ്ങൾ ഉണ്ടെന്ന് പറഞ്ഞല്ലോ. ഇത് മറ്റു പലയിടത്തും ഉണ്ടായിരിക്കും. ആർക്കിട്ടെക്ചറുമായി ബന്ധമില്ലാത്തതും എല്ലാ ആർക്കിട്ടെക്ചറുകൾക്കും പൊതുവായുള്ളതും ആയ ഭാഗത്തെ ഫ്രണ്ട് എൻഡ് എന്നും ഓരോ ആർക്കിട്ടെക്ചറിനും ആയി പ്രത്യേകമായുള്ള ഭാഗങ്ങളെ ബാക്ക് എൻഡ് എന്നും വിളിക്കാം. വിവിധ പാളികളായി ഇവയെ പരിഗണിച്ചാൽ ഫ്രണ്ട് എൻഡ് ആയിരിക്കും മുന്നിലുള്ള ഭാഗം. കെർണലിലെ മറ്റ് ഭാഗങ്ങളും ആപ്ലിക്കേഷൻ പ്രോസസ്സുകളും ഒക്കെ ഈ ഫ്രണ്ട് എൻഡ് മാത്രമേ കാണുകയുള്ളു. എന്നാൽ ഓരോ ആർക്കിട്ടെക്ചറുകളിലും കാര്യങ്ങൾ വ്യത്യസ്ത രീതിയിൽ ചെയ്യണം എന്നതിനാൽ ഫ്രണ്ട് എൻഡ് അത് പ്രവർത്തിക്കുന്ന ആർക്കിട്ടെക്ചർ ഏതാണോ ആ ആർക്കിട്ടെക്ചറിന് പ്രത്യേകമായുള്ള ഭാഗങ്ങൾ ഉപയോഗിച്ച് ആ കാര്യങ്ങൾ ചെയ്യുക മാത്രം ചെയ്യുന്നു. ഇതിലെ മെച്ചം അപ്ലിക്കേഷൻ സോഫ്റ്റ്‌വെയറുകൾ നിർമ്മിക്കുമ്പോൾ അവയെ ഓരോ ആർക്കിട്ടെക്ചറിനും പ്രത്യേകമായി നിർമ്മിക്കേണ്ടതില്ല എന്നതാണ്. ലിനക്സിൽ പ്രവർത്തിക്കാനുള്ള ഒരു ആപ്ലിക്കേഷൻ നിർമ്മിച്ചാൽ അത് ലിനക്സ് ഏത് പ്രോസസ്സറിൽ പ്രവർത്തിക്കുന്നു എന്നത് പരിഗണിക്കാതെ എല്ലാ ലിനക്സ് സിസ്റ്റങ്ങളിലും ഒരുപോലെ പ്രവർത്തിക്കും. ഇവിടെ ഫ്രണ്ട് എൻഡ് കൃത്യമായ ബാക്ക് എൻഡ് തെരഞ്ഞെടുത്ത് പ്രവർത്തിപ്പിക്കുകയും എന്നാൽ അക്കാര്യം ആപ്ലിക്കേഷനിൽ നിന്ന് മറച്ച് വയ്ക്കുകയും ചെയ്യും. ഈ രീതിയിൽ താഴെക്കിടയിലുള്ള ആർക്കിട്ടെക്ചറുമായി ബന്ധപ്പെട്ട കാര്യങ്ങൾ ആപ്ലിക്കേഷനുകളിൽ നിന്ന് മറച്ചു വയ്ക്കപ്പെടുന്നു. ഇതിനെ ഹാർഡ്‌വെയർ അബ്സ്ട്രാക്ഷൻ എന്ന് വിളിക്കാം. 

14. net - വിവിധ നെറ്റ്‌വർക്കിങ്ങ് പ്രോട്ടോക്കോളുകളുടെ പിന്തുണക്കാവശ്യമായ നിർദ്ദേശങ്ങൾ ഉൾക്കൊള്ളുന്നു. നെറ്റ്‌വർക്കിങ്ങ് ഉപകരണങ്ങൾക്കുള്ള ഡിവൈസ് ഡ്രൈവറുകൾ അല്ല ഇതിൽ ഉള്ളത്. 802.11, IPv4, IPv6, TCP, IP, ICMP, IGMP, CAN, LIN, Ethernet, NFC, WiMAX തുടങ്ങി ഓഎസ്ഐ മാതൃകയിലെ വിവിധ പാളികളിൽ വരുന്ന പ്രോട്ടോക്കോളുകൾക്കുള്ള പിന്തുണ ഇതിൽ കാണാൻ സാധിക്കും.

15. samples - പേരു സൂചിപ്പിക്കുന്നത് പോലെ തന്നെ റെഫറൻസിനായുള്ള സാമ്പിളുകൾ.

16. scripts - ലിനക്സ് കെർണലിന്റെ മെയിന്റനൻസും മറ്റും എളുപ്പത്തിലാക്കാൻ സഹായിക്കുന്നതും കെർണൽ കമ്പൈലേഷൻ സമയ്ത്ത് ഉപയോഗിക്കപ്പെടുന്നതും  മറ്റുമായി ഉള്ള സ്ക്രിപ്റ്റുകൾ ആണ് ഇതിൽ ഉള്ളത്. ലിനക്സ് കെർണലിലേക്ക് ഡെവലപ്പർമാർ അവരുടെ മാറ്റങ്ങളും സംഭാവനകളും മറ്റും സമർപ്പിക്കുന്നത് പാച്ചുകൾ (patch) ആയിട്ടാണ്. പാച്ച് ഫയലുകൾക്ക് വ്യക്തമായ ഒരു രീതി ഉണ്ട്. ഇവ അവക്ക് തൊട്ടു മുന്നിലെ ഫയലുകളിൽ നിന്ന് ഈ മാറ്റങ്ങൾ അടക്കമുള്ള ഫയലുകൾക്ക് എന്ത് വ്യത്യാസമാണ് ഉള്ളത് എന്ന കാര്യമാണ് ഉൾക്കൊള്ളുന്നത്. ഈ പാച്ചുകൾ സമർപ്പിക്കുന്നതിന് ചില മാനദണ്ഡങ്ങൾ പാലിക്കേണ്ടതായുണ്ട്. ഒരു ഡെവലപ്പർക്ക് തന്റെ പാച്ച് ഫയൽ തയ്യാറാക്കിയതിനു ശേഷം ഈ മാനദണ്ഡങ്ങൾ ഒക്കെ പാലിക്കപ്പെട്ടിട്ടുണ്ടോ എന്ന് ഉറപ്പാക്കുന്നതിനായി scripts/checkpatch.pl എന്ന സ്ക്രിപ്റ്റ് ഉപയോഗിക്കാം. ഇതുപോലെ ഫയലുകളിലെ ഫോർമാറ്റിങ്ങും കോഡിങ്ങ് സ്റ്റൈലും ഒക്കെ കൃത്യമാക്കാൻ cleanfile, പാച്ച് ഫയലുകൾ കൃത്യമാക്കാൻ cleanpatch തുടങ്ങിയവ ഉപയോഗിക്കാൻ സാധിക്കും.

17. security - ലിനക്സ് കെർണലിലെ സുരക്ഷാ മാനദണ്ഡങ്ങൾ പ്രസിദ്ധമാണ്. ആപ്പ്ആർമർ, സെക്യൂരിറ്റി എൻഹാൻസ്ഡ് ലിനക്സ് പോളിസികൾ, ടൊമോയോ തുടങ്ങി ആപ്ലിക്കേഷൻ പ്രോസസ്സുകളുടെ ഫയലുകളും മറ്റും എഴുതാനും വായിക്കാനും കമ്പ്യൂട്ടർ സിസ്റ്റത്തിൽ വിവിധ കാര്യങ്ങൾ ചെയ്യാനും (സിസ്റ്റം‌ റീസ്റ്റാർട്ട്, ഹാർഡ്‌വെയർ ഉപയോഗം) മറ്റുമുള്ള അനുവാദങ്ങൾ നിയന്ത്രിക്കുന്നതിനായി വിവിധ തലത്തിലുള്ള സുരക്ഷാ സംവിധാനങ്ങൾ ഉണ്ട്. ഇതിൽ തന്നെ എസ് ഇ ലിനക്സ് വികസിപ്പിച്ചത് അമേരിക്കയുടെ നാഷണൽ സെക്യൂരിറ്റി ഏജൻസി ആണ് (എൻ എസ് എ). അമേരിക്കയുടെ ഡിപ്പാർട്ട്മെന്റ് ഓഫ് ഡിഫൻസ് രീതിയിലുള്ള മാൻഡേറ്ററി ആക്സസ് കണ്ട്രോൾ ഇതിൽ ഉൾപ്പെട്ടിരിക്കുന്നു. ലിനക്സ് കെർണലിന്റെ വികസനത്തിൽ ആരൊക്കെ ഉൾപ്പെട്ടിട്ടുണ്ട് എന്നും ലിനക്സ് ആരൊക്കെ ഉപയോഗിക്കുന്നു എന്നതിനും ഒരു നല്ല ഉദാഹരണമാണിത്. ഇത്തരം സെക്യൂരിറ്റി പോളിസികളുടെ പിന്തുണയാണ് ഈ ഡയറക്ടറിയിൽ ഉള്ളത്.

18. sound - ലിനക്സ് കെർണലിലെ ശബ്ദ സംവിധാനങ്ങളുടെ പിന്തുണ ഇതിൽ പെടുന്നു. ലിനക്സിൽ വിവിധ തരത്തിലുള്ള ശബ്ദ ഉപകരണങ്ങൾക്കുള്ള (സൗണ്ട് കാർഡ്) പിന്തുണ ഉണ്ട്. പ്രധാനമായും ഈ ഉപകരണങ്ങൾ എങ്ങനെ കമ്പ്യൂട്ടറുമായി ഘടിപ്പിച്ചിരിക്കുന്നു എന്നതിന്റെ അടിസ്ഥാനത്തിലും ഓപ്പൺ സൗണ്ട് സിസ്റ്റം (OSS), അഡ്വാൻസ്ഡ് ലിനക്സ് സൗണ്ട് ആർക്കിട്ടെക്ചർ (ALSA) തുടങ്ങിയ സംവിധാനങ്ങളും ഇതിൽ കാണാം. പുതിയ  സൗണ്ട് കാർഡുകൾക്ക് ആവശ്യമായ ഡിവൈസ് ഡ്രൈവറുകൾ എഴുതാനുപയോഗിക്കേണ്ട ഫ്രെയിംവർക്കും ആപ്ലിക്കേഷനുകൾക്ക് ശബ്ദ സംവിധാനങ്ങൾ ഉപയോഗിക്കാൻ സഹായകമായ ഫ്രണ്ട് എൻഡും ഒക്കെ ഇതിൽ ഉൾപ്പെട്ടിരിക്കുന്നു.

19. tools - സിസ്റ്റം ടെസ്റ്റിങ്ങിനും കെർണലിലെ വിവിധ സംവിധാനങ്ങളുടെ സൂക്ഷ്മ പരിശോധനക്കും സഹായകമാകുന്ന നിരവധി പ്രോഗ്രാമുകളും സ്ക്രിപ്റ്റുകളും.

20. usr - കെർണലിനു ബൂട്ടിങ്ങ് സമയത്ത് ആവശ്യമായ ഡ്രൈവറുകളും പ്രോഗ്രാമുകളും ലഭ്യമാക്കാനായി ഉപയോഗിക്കുന്ന ഇനീഷ്യൽ റാം ഡിസ്ക് (inird) എന്ന കൊച്ചു റൂട്ട് ഫയൽ സിസ്റ്റത്തിന്റെ പിന്തുണക്കായുള്ളവ. ഇനിറ്റ്ആർഡിയെ പറ്റി വിശദമായി പിന്നീട് പറയാം.

21. virt - വിർച്വലൈസേഷൻ സാങ്കേതികവിദ്യകളെ പിന്തുണക്കാനായുള്ള ഫയലുകൾ.

ഈ ഡയറക്ടറികൾക്കു പുറമേ COPYING, CREDITS, MAINTAINERS, README, REPORTING-BUGS തുടങ്ങി ചില ടെക്സ്റ്റ് ഫയലുകളും കെർണൽ സോഴ്സിൽ കാണാം. അവയുടെ പേര് സൂചിപ്പിക്കുന്നത് പോലെ തന്നെ വിവിധ കാര്യങ്ങളെപ്പറ്റിയുള്ള വിവരങ്ങൾ അവയിൽ ചേർത്തിരിക്കുന്നു. അവ ഏത് ടെക്സ്റ്റ് എഡിറ്ററിലും തുറന്ന് വായിക്കാവുന്നതാണ്.

അടുത്ത ഭാഗത്തിൽ ലിനക്സ് കെർണൽ കമ്പൈലേഷൻ - നിങ്ങളുടെ കമ്പ്യൂട്ടർ സിസ്റ്റത്തിനാവശ്യമായ ഒരു ലിനക്സ് കെർണൽ കെർണൽ സോഴ്സ് കോഡിൽ നിന്ന് എങ്ങനെ കമ്പൈൽ ചെയ്ത് എടുക്കാം എന്ന കാര്യം പരിശോധിക്കുന്നു..

Tuesday, April 01, 2014

ലിനക്സ് കെർണൽ: സോഴ്സ് കോഡ് - 2 ഭാഗം - 1

ലിനക്സ് കെർണലിലെ ആർക്കിടെക്ചറുകളുമായി ബന്ധപ്പെട്ട ഭാഗങ്ങളെക്കുറിച്ചും പൊതുവായ ഭാഗങ്ങളെക്കുറിച്ചും കഴിഞ്ഞ പോസ്റ്റിൽ പറഞ്ഞു. ഇനി ലിനക്സ് കെർണൽ സോഴ്സ് കോഡിലെ വിവിധ ഡയറക്ടറികളെക്കുറിച്ച് വിശദമായി പറയാം. ലിനക്സ് കെർണൽ സോഴ്സ് കോഡ് ഓൺലൈനായി ക്രോസ്സ് റെഫറൻസോടെ ലഭിക്കാൻ ഇവിടെ പോയാൽ മതി. മുഴുവൻ ഡൗൺലോഡ് ചെയ്യണമെന്നില്ല. ലിനക്സ് കെർണൽ വേർഷൻ 3.13 അടിസ്ഥാനമാക്കി ആണ് ഞാൻ താഴെയുള്ള വിവരങ്ങൾ ചേർക്കുന്നത്. മറ്റൊരു കെർണൽ വേർഷനിൽ ഈ ഡയറക്ടറികൾ വ്യത്യസ്തമായിരിക്കാം.

1. arch - ഈ ഡയറക്ടറി ലിനക്സ് കെർണലിലെ പിന്തുണക്കപ്പെടുന്ന പ്രോസസ്സർ ആർക്കിട്ടെക്ചറുകളുമായി ബന്ധപ്പെട്ട ഭാഗങ്ങൾ ഉൾക്കൊള്ളുന്നു. ഇതിലെ ഓരോ സബ് ഡയറക്ടറികളും ഓരോ പ്രോസസ്സർ ആർക്കിട്ടെക്ചറുകൾക്കായി ഉള്ളതാണ്. ഇതിൽ arm, x86, powerpc, mips തുടങ്ങിയവ കാണാൻ സാധിക്കും. arm സബ് ഡയറക്ടറിക്കുള്ളിൽ ചെന്നാൽ mach-xxxxx plat-xxxxx രീതിയിൽ നിരവധി ഡയറക്ടറികൾ കാണാൻ സാധിക്കും. ഇത് ആം അധിഷ്ഠിതമായ വ്യത്യസ്ത ഉപകരണങ്ങളെയും പ്രോസസ്സറുകളെയും പിന്തുണക്കാൻ ഉള്ളതാണ്. എല്ലാ ആം അധിഷ്ഠിത ഉപകരണങ്ങൾക്കും പൊതുവായി ഉള്ള ഡയറക്ടറികൾ ആണ് മേൽപ്പറഞ്ഞ രീതിയിൽ അല്ലാത്ത പേരിലുള്ളവ. ഇതിൽ തന്നെ ഉള്ള config എന്ന ഡയറക്ടറി വിവിധ മെഷീനുകൾക്കായുള്ള കെർണൽ കോൺഫിഗറേഷനുകൾ ഉൾക്കൊള്ളുന്നു. ഈ കോൺഫിഗറേഷനുകൾ കെർണൽ കമ്പൈലേഷൻ സമയത്ത് ഉപയോഗിക്കാനുള്ളവയാണ്.

2. Documentation - കെർണലിലെ വിവിധ ഭാഗങ്ങളെക്കുറിച്ചും സൗകര്യങ്ങളെക്കുറിച്ചും വിവരിക്കുന്ന നിരവധി ടെക്സ്റ്റ് ഡോക്യുമെന്റുകൾ ഈ ഡയറക്ടറിയിലും അതിന്റെ സബ് ഡയറക്ടറികളിലും ആയി ലഭ്യമാണ്. കെർണലിനെപ്പറ്റി മനസ്സിലാക്കാനും റെഫറൻസുകൾക്കായും ഉപയോഗിക്കാവുന്ന ഏറ്റവും വിശ്വാസയോഗ്യവും പുതുക്കിയതുമായ സ്രോതസ്സ് ഇത് തന്നെയാണ്.

3. block - സെക്കൻഡറി സ്റ്റോറേജ് ഉപകരണങ്ങളായ (ദ്വിതീയ സംഭരണോപാധികൾ?) ഹാർഡ് ഡിസ്കുകൾ, സിഡി ഡ്രൈവുകൾ, അവയിൽ ഉപയോഗിക്കുന്ന വിവിധ തരത്തിലുള്ള പാർട്ടീഷ്യനുകൾ എന്നിവയ്ക്കുള്ള പൊതുവായ പിന്തുണ നൽകുന്ന ഫയലുകൾ ആണ് ഇതിൽ ഉള്ളത്. ലിനക്സിൽ ബ്ലോക്ക് ലെയർ എന്നറിയപ്പെടുന്ന ഈ പാളി ഓരോ കമ്പനികളുടെയും ഹാർഡ് ഡിസ്കുകൾക്കും ഡിസ്ക് കണ്ട്രോളറുകൾക്കും ആയി എഴുതപ്പെടുന്ന വ്യത്യസ്തമായ ഡ്രൈവറുകൾക്ക് കെർണലുമായി സംവദിക്കുന്നതിനും കെർണലിലെ മറ്റു പാളികൾക്ക് ഇവയുമായി സംവദിക്കുന്നതിനും ഉള്ള ഒരു പൊതു സമ്പര്‍ക്കമുഖം (interface) നൽകുന്നു. ഇതിലെ മെച്ചം എന്താണെന്നാൽ, ഓരോ കമ്പനിയുടെ ഉപകരണങ്ങളുടെയും പ്രവർത്തനം വ്യത്യസ്ത രീതിയിൽ ആയിരിക്കുമല്ലോ. എന്നാലും കെർണലിലെ മറ്റ് ഭാഗങ്ങൾക്ക് ഒന്നും ഈ വ്യത്യാസങ്ങളെ പറ്റി അറിയേണ്ട ആവശ്യമില്ല. ഡിസ്കിലേക്ക് വിവരങ്ങൾ എഴുതാൻ അവക്ക് ഈ ഇന്റർഫേസ് നൽകുന്ന ഫങ്‌ഷനുകൾ ഉപയോഗിച്ചാൽ മതി. ഈ ഇന്റർഫേസ് അതിൽ രെജിസ്റ്റർ ചെയ്യപ്പെട്ടിരിക്കുന്ന വ്യത്യസ്ത ഉപകരണങ്ങളുടെ ഫങ്‌ഷനുകളിൽ നിന്നും ആ ഉപകരണത്തിന് അനുയോജ്യമായ ഫങ്‌ഷൻ കണ്ടെത്തി പ്രവർത്തിപ്പിച്ചുകൊള്ളും. 

4. crypto - ലിനക്സ് കെർണൽ പിന്തുണക്കുന്ന വിവിധ ക്രിപ്റ്റോഗ്രാഫിക് അൽഗോരിതങ്ങളുടെയും വിവരങ്ങളുടെ സമ്പൂർണ്ണത (ഡാറ്റാ ഇന്റഗ്രിറ്റി) ഉറപ്പുവരുത്തുന്നതിനായി ഉപയോഗിക്കുന്ന ചെക്ക്‌സം പോലുള്ള മാർഗ്ഗങ്ങളുടെയും പിന്തുണക്കാവശ്യമായ ഫയലുകൾ ഇതിൽ ഉൾക്കൊള്ളിച്ചിരിക്കുന്നു. ക്രിപ്റ്റോഗ്രാഫിക് അൽഗോരിതങ്ങൾ പിന്തുണക്കുന്ന ഹാർഡ്‌വെയറിനുള്ള നിയന്ത്രണ പ്രോഗ്രാമുകൾ ഇതിൽ ഉൾപ്പെടുത്തിയിട്ടില്ല.

5. drivers -  ലിനക്സ് കെർണലിലെ ഒരു സുപ്രധാന ഡയറക്ടറി ആണിത്. കമ്പ്യൂട്ടറുമായി ബന്ധിപ്പിച്ചിരിക്കുന്ന/കമ്പ്യൂട്ടറിൽ ഉള്ള/കമ്പ്യൂട്ടറുമായി ബന്ധിപ്പിക്കാവുന്ന ആയിരക്കണക്കിന് ഹാർഡ്‌വെയർ ഉപകരണങ്ങളെ പ്രവർത്തിപ്പിക്കാൻ ആവശ്യമായ നിയന്ത്രണ പ്രോഗ്രാമുകൾ ആണ് ഇതിൽ ഉൾക്കൊള്ളിച്ചിരിക്കുന്നത്. വിൻഡോസ് ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റം ഒരിക്കലെങ്കിലും ഇൻസ്റ്റാൾ ചെയ്റ്റിട്ടുള്ളവർക്ക് ഡിവൈസ് ഡ്രൈവറുകളുടെ ആവശ്യം മനസ്സിലാക്കാൻ വിഷമമുണ്ടാവില്ല. ഇൻസ്റ്റാളേഷൻ കഴിഞ്ഞ ഉടനേ സ്ക്രീനിലെ ചിത്രങ്ങൾ വികലമായി കാണപ്പെടുന്നതും ശബ്ദം ഇല്ലാതിരിക്കുന്നതും ഇന്റർനെറ്റ് കണക്ഷൻ പ്രവർത്തിക്കാതിരിക്കുന്നതും ഒക്കെ ലാപ്‌ടോപ്പുകളിലും മറ്റും സാധാരണമാണ്. ഡിസ്പ്ലേ, സൗണ്ട്, നെറ്റ്‌വർക്ക് കാർഡ് ഡ്രൈവറുകൾ ഇൻസ്റ്റാൾ ചെയ്യുന്ന മുറക്ക് ഇവയൊക്കെ പ്രവർത്തിച്ച് തുടങ്ങുകയും ചെയ്യും. മിക്കവാറും ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റങ്ങൾ ഹാർഡ്‌വെയർ ഉപകരണങ്ങളെ അവയുണ്ടാക്കുന്ന കമ്പനികളുടെ അടിസ്ഥാനത്തിൽ അല്ല തരം തിരിക്കാറുള്ളത്, മറിച്ച് അവ ചെയ്യുന്ന കാര്യങ്ങളുടെ അടിസ്ഥാനത്തിൽ ആണ്. ഗ്രാഫിക്സ് കാർഡുകളുടെ കാര്യം തന്നെ എടുക്കാം. ഗ്രാഫിക്സ് കാർഡ് ഇന്റലിന്റെ ആയാലും എ എം ഡി യുടെ ആയാലും എൻവിഡിയയുടെ ആയാലും ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റം അതിനെ കാണുന്നത് ഒരേ രീതിയിൽ ആണ്. അവയെ പ്രവർത്തിപ്പിക്കാനായി മുൻകൂട്ടി തീരുമാനിച്ചിട്ടുള്ള വിവിധ ഫങ്‌ഷനുകൾ (ചെറു പ്രോഗ്രാമുകൾ) ആണ് ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റം ഉപയോഗിക്കുക. ഡിസ്പ്ലേ റെസല്യൂഷൻ ക്രമീകരിക്കാൻ ആവശ്യമായ ഒരു ഫങ്ഷൻ മേൽപ്പറഞ്ഞ മൂന്ന് ഗ്രാഫിക്സ് കാർഡുകളിലും വ്യത്യസ്ത രീതിയിൽ ആയിരിക്കും പ്രവർത്തിക്കുക. അതായത് ഇന്റൽ ഗ്രാഫിക്സ് കാർഡ് റെസല്യൂഷൻ ക്രമീകരിക്കാനായി ചെയ്യുന്ന കാര്യങ്ങളിൽ നിന്ന് വ്യത്യസ്തമായിരിക്കാം എൻവിഡിയ കാർഡ് ചെയ്യുന്നവ. എന്നാൽ ഇവ രണ്ടും രണ്ട് രീതിയിൽ ചെയ്യുന്നത് ഒരേ കാര്യം തന്നെ ആണ്. ഇതുപോലെയുള്ള നിരവധി കാര്യങ്ങൾ ചെയ്യാൻ ഓരോ ഉപകരണത്തിലും എന്തൊക്കെ ചെയ്യണം എന്നുള്ള കാര്യങ്ങൾ ആ ഉപകരണങ്ങൾ ഉണ്ടാക്കുന്നവർക്ക് ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റത്തെ അറിയിക്കാനുള്ള ഒരു മാർഗ്ഗമാണ് ഡിവൈസ് ഡ്രൈവർ. ഒരു ഉപകരണത്തിന്റെ ഡിവൈസ് ഡ്രൈവർ പ്രോഗ്രാം ലഭ്യമല്ലെങ്കിൽ ആ ഉപകരണത്തെ പ്രവർത്തിപ്പിക്കാൻ കമ്പ്യൂട്ടറിനു സാധാരണ ഗതിയിൽ സാധിക്കുകയില്ല. ലിനക്സിൽ ഉപകരണങ്ങളെ വിവിത്തിയിൽ തരം തിരിച്ചിരിക്കുന്നു. അവ ചെയ്യുന്ന കാര്യങ്ങളുടെ അടിസ്ഥാനത്തിലും (ഉദാ: ഗ്രാഫിക്സ്, ഓഡിയോ, നെറ്റ്‌വർക്കിങ്ങ്, ഇൻപുട്ട്) അവ കമ്പ്യൂട്ടറുമായി എങ്ങനെ ബന്ധിപ്പിക്കപ്പെടുന്നു എന്നതിന്റെ അടിസ്ഥാനത്തിലും (ഉദാ: പിസിഐ, യുഎസ്ബി, ഐഡിഇ, പിസിഎംസിഐഎ, സാറ്റ, പ്ലാറ്റ്ഫോം, ഐ2സി, എസ്പിഐ, എംഎംസി, എസ്ഡി), അവയുമായി ആശയവിനിമയം നടത്തുമ്പോൾ ഒരു തവണ കൈമാറ്റം ചെയ്യപ്പെടുന്ന വിവരങ്ങളുടെ അളവിന്റെ അടിസ്ഥാനത്തിലും (ഉദാ: കാരക്റ്റർ, ബ്ലോക്ക്) ഒക്കെയാണ് ഈ വർഗ്ഗീകരണം. ഓരോ വിഭാഗത്തിനും ഉള്ള ഡ്രൈവറുകൾ അവയുടെ ബന്ധപ്പെട്ട ഡയറക്ടറിയിൽ കാണാൻ സാധിക്കും. ഇന്ന് നിരവധി ലാപ്‌ടോപ്പുകളിൽ കണ്ടുവരുന്ന സിനാപ്റ്റിക് ടച്ച് പാഡിന്റെ ഡ്രൈവർ drivers/input/mouse/synaptics.c എന്ന ഫയലിൽ കാണാൻ സാധിക്കും. ഈ ടച്ച് പാഡ് ഇൻപുട്ട് ഉപകരണങ്ങളുടെ വിഭാഗത്തിൽ മൗസ് എന്ന ഉപ വിഭാഗത്തിൽ ആണ് വരുന്നത്. എന്ന് ഡയറക്റ്ററികളുടെ ക്രമീകരണം നോക്കിയാൽ മനസ്സിലാക്കാം. വിവിധ യു എസ് ബി സ്റ്റോറേജ് ഡിവൈസുകൾക്കുള്ള ഡ്രൈവർ drivers/usb/storage/ എന്ന ഡയറക്ടറിയിലും ഇന്റലിന്റെ i915 എന്ന പ്രസിദ്ധമായ ഗ്രാഫിക്സ് കാർഡിന്റെ ഡ്രൈവർ drivers/gpu/drm/i915/ എന്ന ഡയറക്ടറിയിലും കാണാൻ സാധിക്കും.

6. firmware - ഉപകരണങ്ങൾക്കുള്ളിൽ തന്നെ അവയെ പ്രവർത്തിപ്പിക്കാൻ ആവശ്യമായ ചെറു പ്രോഗ്രാമുകൾ ഫ്ലാഷ് മെമ്മറികളിലും ഇഇ‌പ്രോം മെമ്മറികളിലും മറ്റുമായി ചേർത്തു വയ്ക്കാറുണ്ട്. സങ്കീർണ്ണമായ പല ഉപകരണങ്ങൾക്കുള്ളിലും ആ ഉപകരണത്തെ നിയന്ത്രിക്കാൻ കമ്പ്യൂട്ടർ സിസ്റ്റത്തിലെ പ്രോസസ്സറിനു പുറമേ മറ്റൊരു പ്രോസസ്സർ കൂടി കാണും. ആ പ്രോസസ്സറിൽ പ്രവർത്തിക്കുന്ന ഒരു ചെറിയ ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റമായി ഫേംവെയറിനെ പരിഗണിക്കാവുന്നതാണ്. വയർലെസ്സ് ലാൻ കാർഡുകളും ബ്ലൂടൂത്ത് അഡാപ്റ്ററുകളും മറ്റും ഇതുപോലെ ഫേംവെയറുകളെ അടിസ്ഥാനമാക്കി പ്രവർത്തിക്കുന്നവയാണ്. വിവിധ രാജ്യങ്ങളിലെ അനുവദനീയമായ റേഡിയേഷൻ അളവുകളെ അടിസ്ഥാനമാക്കി വ്യത്യസ്ത ശക്തിയിൽ ഉള്ള റേഡിയേഷനുകൾ പുറപ്പെടുവിക്കാനും മറ്റുമായി ഒരേ ഉപകരണത്തെ തന്നെ അതിലെ ഫേംവെയർ മാത്രം മാറ്റി ക്രമീകരിക്കാൻ സാധിക്കും. ഉപകരണത്തിന് ഒരു പുതിയ പ്രവർത്തനം നടത്താനുള്ള കഴിവുകൾ ചേർക്കാനും ഉള്ള കഴിവുകൾ നീക്കം ചെയ്യാനും ഒക്കെ ഫേംവെയറുകൾ മാറ്റുന്നത് വഴി സാധിക്കും. ഇതുപോലെ നിരവധി ഉപകരണങ്ങൾക്ക് പ്രവർത്തിക്കാനാവശ്യമായ ഫേംവെയറുകൾ ഈ ഡയറക്ടറിയിൽ കാണാം.

7. fs - ഫയൽ സിസ്റ്റം എന്നതിന്റെ ചുരുക്കമാണ് എഫ് എസ് എന്നത്. ലിനക്സ് കെർണൽ വിവിധ സ്റ്റോറേജ് ഉപകരണങ്ങളിൽ ഉപയോഗിക്കാവുന്ന നിരവധി ഫയൽ സിസ്റ്റങ്ങളെ പിന്തുണക്കുന്നുണ്ട്. ഇഎക്സ്‌റ്റി 2/3/4, ബിറ്റിആർഎഫ്‌എസ്, ഫാറ്റ്, എൻറ്റിഎഫ്എസ്, ഐഎസ്ഓ തുടങ്ങി നിരാവധി ഫയൽ സിസ്റ്റങ്ങൾക്ക് പുറമേ ഡിസ്കുകളിൽ ഒന്നും ശേഖരിക്കപ്പെടാത്ത എന്നാൽ ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റത്തെയും കമ്പ്യൂട്ടറിനെയും പ്രോസസ്സുകളെയും പറ്റിയുള്ള നിരവധി വിവരങ്ങൾ തരാനും അവയെ നിയന്ത്രിക്കാനായി ഉപയോഗിക്കാവുന്നതും ആയ പ്രോക്എഫ്എസ്, സിസ്എഫ്എസ് പോലുള്ള സ്യൂഡോ ഫയൽ സിസ്റ്റങ്ങൾക്കും ആവശ്യമായ പ്രോഗ്രാമുകൾ ആണ് ഈ ഡയറക്ടറിയിൽ ചേർത്തിട്ടുള്ളത്. ലിനക്സിൽ പുതിയതായി വികസിപ്പിച്ചുകൊണ്ടിരിക്കുന്ന ബിറ്റിആർഎഫ്എസ് ഫയൽ സിസ്റ്റത്തിനുള്ള പിന്തുണ fs/btrfs/ യിൽ കാണാം. ഈ ഫയൽ സിസ്റ്റത്തിൽ ഉപയോഗിക്കുന്ന ഐനോഡുകൾ, സൂപ്പർബ്ലോക്ക് എന്നിവയെക്കുറിച്ചുള്ള വിവരങ്ങൾ അവിടെ കാണാൻ സാധിക്കും.

8.  include - ലിനക്സ് കെർണൽ പ്രധാനമായും എഴുതപ്പെട്ടിരിക്കുന്നത് സി പ്രോഗ്രാമിങ്ങ് ഭാഷയിൽ ആണ്. വിവിധ സി പ്രോഗ്രാമുകൾക്ക് മറ്റു പ്രോഗ്രാമുകളിൽ നിർവ്വചിച്ചിരിക്കുന്ന ഫങ്ഷനുകളെയും മറ്റും ഉപയോഗിക്കാനുള്ള ഉപാധിയായി ഹെഡർ ഫയലുകൾ ഉപയോഗിക്കുന്നു. ഇങ്ങനെ കെർണലിൽ ഉള്ള സി ഫയലുകളിൽ ഉപയോഗിക്കാനുള്ള ഹെഡർ ഫയലുകൾ‌ ആണ് ഈ ഡയറക്ടറിയിൽ ഉള്ളത്.

ലിനക്സ് കെർണൽ സോഴ്സ് കോഡിലെ ബാക്കി ഡയറക്ടറികളെപ്പറ്റിയുള്ള വിവരണം തുടർന്നു വരുന്ന പോസ്റ്റുകളിൽ.