ലിനക്സ് കെർണൽ കമ്പൈലേഷൻ #2: കെർണൽ സോഴ്സ് ഡയറക്ടറികള്‍ (തുടരുന്നു)

സുബിന്‍ പി. റ്റി under പരമ്പര on 28 മാർച്ച്, 2019

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

init

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

ipc

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

kernel

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

lib

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

mm

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

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

net

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

samples

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

scripts

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

security

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

sound

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

tools

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

usr

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

virt

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

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

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