Wednesday, September 10, 2014

ക്രോസ്സ് കമ്പൈലേഷൻ - 3

ലിനക്സ് റൂട്ട് ഫയൽ സിസ്റ്റത്തിലെ വിവിധ ഡയറക്ടറികളെക്കുറിച്ചും മറ്റും ഇവിടെ പറഞ്ഞിട്ടുണ്ട്. ആ ഭാഗം ആവശ്യമെങ്കിൽ ഒന്നുകൂടി വായിച്ച് നോക്കൂ. ഇതിനു പുറമേ ലിനക്സ് സിസ്റ്റം സ്റ്റാർട്ടപ്പിനെക്കുറിച്ചും ഇനിറ്റ് പ്രോഗ്രാമുകളെക്കുറിച്ചും ഉള്ള പോസ്റ്റുകൾ (1, 2, 3) കൂടി വായിക്കുന്നത് നന്നായിരിക്കും./bin, /sbin, /usr/bin തുടങ്ങിയ ഡയറക്ടറികളിൽ കാണുന്ന പ്രോഗ്രാമുകളുടെ സോഴ്സ് കോഡ് ഗ്നു കോർയൂട്ടിൽസ്, ലിനക്സ് യൂട്ടിൽസ് തുടങ്ങിയ പാക്കേജുകളിൽ നിന്ന് ലഭിക്കും. ls, cat, cp തുടങ്ങിയ അടിസ്ഥാന യൂട്ടിലിറ്റികൾ ഒക്കെ ഗ്നു കോർയൂട്ടിൽസിലും ps, fsck തുടങ്ങി സിസ്റ്റം അഡ്മിനിസ്ട്രേഷൻ യൂട്ടിലിറ്റികൾ ഒക്കെ ലിനക്സ് യൂട്ടിൽസ് പാക്കേജിലും ആയിരിക്കും ഉണ്ടാവുന്നത്. ഒരു ഡെസ്ക്‌ടോപ്പ് ലിനക്സ് സിസ്റ്റത്തിൽ ഇവക്കു പുറമേ നിരവധി പാക്കേജുകളും ഡെസ്ക്‌ടോപ്പ് എൻവയോണ്മെന്റും ഒക്കെ ഉണ്ടാവും. ആവശ്യമായ പാക്കേജുകൾ എല്ലാം അതാത് പാക്കേജുകളുടെ പേജിൽ നിന്ന് ഡൗൺലോഡ് ചെയ്ത് കമ്പൈൽ ചെയ്യാവുന്നതാണ്. ഈ പ്രോഗ്രാമുകളെ ഒക്കെ പ്രവർത്തിപ്പിക്കാൻ ആവശ്യമായ കമാന്റുകൾ നൽകാനും മറ്റുമായി ഒരു ഷെൽ പ്രോഗ്രാമും ആവശ്യമാണ്. bash, csh, sh, msh, ash തുടങ്ങി നിരവധി ഷെൽ പ്രോഗ്രാമുകൾ ലഭ്യമാണ്. ഇവക്കു പുറമേ നിർബന്ധമായി വേണ്ട മറ്റൊന്നാണ് ഇനിറ്റ് പ്രോഗ്രാം. അപ്‌സ്റ്റാർട്ട്, സിസ്റ്റംഡി, സിസ്‌വി ഇനിറ്റ് തുടങ്ങി ഏത് ഇനിറ്റ് പ്രോഗ്രാം വേണമെങ്കിലും തെരഞ്ഞെടുക്കുകയും അവക്ക് ആവശ്യമായ ക്രമീകരണ ഫയലുകൾ റൂട്ട് ഫയൽ സിസ്റ്റത്തിൽ സജ്ജീകരിക്കുകയും ചെയ്യാം. ഒരു ഇനിറ്റ് പ്രോഗ്രാം ഇല്ലെങ്കിൽ ബൂട്ടിങ്ങ് കഴിഞ്ഞ ശേഷം എന്ത് ചെയ്യണമെന്നറിയാതെ ലിനക്സ് കെർണൽ പേടിച്ച് പോകും. :)

മേൽപ്പറഞ്ഞ യൂട്ടിലിറ്റികളും ഷെൽ പ്രോഗ്രാമും ഒരു ഇനിറ്റ് പ്രോഗ്രാമും എല്ലാം ഒരൊറ്റ ബൈനറി ഫയലിൽ തന്നെ നൽകുന്ന ഒരു പാക്കേജ് ആണ് ബിസിബോക്സ് (BusyBox). മെമ്മറിയും സ്റ്റോറേജ് സ്ഥലവും മറ്റും പരിമിതമായ സാഹചര്യങ്ങൾ ഉള്ള എംബെഡ്ഡഡ് സിസ്റ്റങ്ങളിലും മറ്റും ഉപയോഗിക്കാൻ അനുയോജ്യമാണ് ബിസിബോക്സ്. എംബെഡ്ഡഡ് സിസ്റ്റങ്ങൾക്കായുള്ള സ്വിസ്സ് ആർമി നൈഫ് എന്ന് ഇതിനെ വിശേഷിപ്പിക്കാറുണ്ട്. ലിനക്സ് അധിഷ്ഠിത സിസ്റ്റങ്ങളിലും ബി എസ് ഡി പോലുള്ള മറ്റ് യൂണിക്സ് പോലെയുള്ള സിസ്റ്റങ്ങളിലും ഇത് പ്രവർത്തിക്കും. ബിസിബോക്സ് കമ്പൈൽ ചെയ്യുമ്പോൾ ടാർഗറ്റ് ഫയൽ സിസ്റ്റത്തിൽ ഏതൊക്കെ യൂട്ടിലിറ്റികൾ ആണ് വേണ്ടത് എന്ന് നമുക്ക് തെരഞ്ഞെടുക്കാൻ സാധിക്കും. കമ്പൈൽ ചെയ്ത് ഇൻസ്റ്റാൾ ചെയ്യുമ്പോൾ ഈ യൂട്ടിലിറ്റികൾ ഒക്കെ /bin/busybox എന്ന ഒറ്റ ഫയലിലേക്കുള്ള സോഫ്റ്റ് ലിങ്കുകൾ ആയി ഇൻസ്റ്റാൾ ചെയ്യാം. അല്ലെങ്കിൽ ഓരോ പ്രോഗ്രാമും പ്രവർത്തിപ്പിക്കാൻ അതിനോടൊപ്പം busybox എന്ന് ചേർക്കേണ്ടിവരും. ഉദാഹരണത്തിന് ls പ്രോഗ്രാമിനായി busybox ls എന്ന് ഉപയോഗിക്കണം. ബിസിബോക്സ് കമ്പൈൽ ചെയ്ത് ടാർഗറ്റ് ഫയൽ സിസ്റ്റത്തിലേക്ക് എങ്ങനെ ഇൻസ്റ്റാൾ ചെയ്യാം എന്ന് നോക്കാം.

ആദ്യം ബിസിബോക്സ് സോഴ്സ് കോഡ് മേലെ ഉള്ള ലിങ്കിൽ നിന്ന് ഡൗൺലോഡ് ചെയ്യുക. പിന്നെ അതിനെ എക്സ്ട്രാക്റ്റ് ചെയ്യുക. ഇതിനോടൊപ്പം എവിടെയെങ്കിലും ടാർഗറ്റ് ഫയൽ സിസ്റ്റത്തിലേക്കാവശ്യമായ ഡയറക്ടറി സ്ട്രക്ചർ ഉണ്ടാക്കാനായി ഒരു ഡയറക്ടറിയും ഉണ്ടാക്കണം.
mkdir rootfs
tar xf busybox-1.22.1.tar.bz2
cd busybox-1.22.1/
ഇനി നമുക്ക് ബിൽഡ് ആർക്കിട്ടെക്ചറും ക്രോസ്സ് കമ്പൈലറും ഒക്കെ ക്രമീകരിക്കണം. ലിനക്സ് കെർണലിനായി ഇത് ചെയ്തത് ഓർമ്മയുണ്ടാകുമല്ലോ. 
export ARCH=arm
export CROSS_COMPILE=>/opt/arm-2011.03/bin/arm-none-linux-gnueabi- 
(ഈ പ്രിഫിക്സ് നിങ്ങളുടെ ടൂൾ ചെയി ഇൻസ്റ്റാളേഷനനുസരിച്ച് മാറും).
ബിസിബോക്സും കെർണൽ കോൺഫിഗറേഷൻ എഡിറ്റർ പോലെ ഒരു നല്ല കോൺഫിഗറേഷൻ എഡിറ്റർ അടക്കമാണ് വരുന്നത്. ഇത് തുറക്കാൻ make menuconfig എന്ന കമാന്റ് ഉപയോഗിക്കാം.

പ്രധാന പേജ്
ഇതിൽ ബിസിബോക്സ് സെറ്റിങ്ങ്സ് ഓപ്ഷൻ തെരഞ്ഞെടുത്താൽ താഴെ കാണുന്നതുപോലെ ഉള്ള മെനു ലഭിക്കും.

 ബിസിബോക്സ് സെറ്റിങ്ങ്സ് മെനു
ഇൻസ്റ്റാളേഷൻ ഓപ്ഷനുകൾ സെലക്റ്റ് ചെയ്താൽ താഴെക്കാണുന്ന മെനുവിലേക്ക് എത്തും. ഇതിലെ ബിസിബോക്സ് ഇൻസ്റ്റാളേഷൻ പ്രിഫിക്സ് എന്ന സ്ഥലത്ത് ചെന്ന് നേരത്തെ ഉണ്ടാക്കിയ ഡയറക്ടറിയുടെ മുഴുവൻ പാത്തും നൽകുക. ഈ ഡയറക്ടറിയിലേക്ക് ബിസിബോക്സ് കോപ്പി ചെയ്യപ്പെടുന്നതിനാണിത്.




ഇൻസ്റ്റാളേഷൻ ഓപ്ഷനുകൾ
ഇനി ബിസിബോക്സ് ബിൽഡ് ഓപ്ഷനിൽ ചെന്ന് ബിൽഡ് ബിസിബോക്സ് ആസ് എ സ്റ്റാറ്റിക് ബൈനറി എന്ന ഓപ്ഷൻ തെരഞ്ഞെടുക്കുക. നമ്മുടെ ടാർഗറ്റിൽ ഇത് ഉപകാരപ്രദമായിരിക്കും. റൺ‌ ടൈം ലൈബ്രറികളുടെ ഒന്നും സഹായമില്ലാതെ തന്നെ നാം ബിൽഡ് ചെയ്യുന്ന ബിസിബോക്സ് ബൈനറിക്ക് പ്രവർത്തിക്കാൻ സാധിക്കുന്നതിനു വേണ്ടിയാണിത്.

ബിൽഡ് ഓപ്ഷനുകൾ
ഇതുപോലെ തന്നെ ക്രോസ്സ് കമ്പൈലർ പ്രിഫിക്സിൽ ചെന്ന് സിസ്റ്റത്തിൽ ഇൻസ്റ്റാൾ ചെയ്തിട്ടുള്ള ക്രോസ്സ് കമ്പൈലർ പ്രിഫിക്സും ചേർക്കുക. ആവശ്യമാണെങ്കിൽ മറ്റ് ഓപ്ഷനുകൾ പരിശോധിച്ച് ആവശ്യമായ യൂട്ടിലിറ്റികൾ ചേർക്കുകയും ആവശ്യമില്ലാത്തവ ഒഴിവാക്കുകയും ചെയ്യുക. ഇനി സെറ്റിങ്ങ്സിൽ നിന്ന് പുറത്തു വന്ന് അത് സേവ് ചെയ്യുക. ബിസിബോക്സ് ബിൽഡ് ചെയ്യാനായി make കമാന്റ് ഉപയോഗിക്കുക. അത് പൂർത്തിയായാൽ make install ഉപയോഗിക്കുക. ഇനി ഇൻസ്റ്റാളേഷൻ പ്രിഫിക്സ് ആയി സെറ്റ് ചെയ്ത ഡയറക്ടറിയിൽ പോയി നോക്കിയാൽ അവിടെ bin, sbin, usr എന്നീ ഡയറക്ടറികളും linuxrc എന്ന സോഫ്റ്റ്‌ലിങ്കും കാണാം. bin ഡയറക്ടറിയിൽ busybox ബൈനറി കാണാം. ./bin/busybox എന്ന കമാന്റ് വഴി ഈ പ്രോഗ്രാം എക്സിക്യൂട്ട് ചെയ്യാൻ ശ്രമിച്ചാൽ ഒരു എറർ ആയിരിക്കും ലഭിക്കുക. -bash: ./bin/busybox: cannot execute binary file: Exec format error. എന്തുകൊണ്ടാണ് ഈ എറർ ലഭിക്കുന്നത് എന്ന് ഊഹിക്കാമോ? മറ്റൊരു സിപിയു ആർക്കിട്ടെക്ചറിൽ പ്രവർത്തിക്കാനായി തയ്യാറാക്കപ്പെട്ട ഒരു എക്സിക്യൂട്ടബിൾ ഫയൽ ആണിത്. file  കമാന്റ് ഉപയോഗിച്ച് പരിശോധിച്ചാൽ bin/busybox: ELF 32-bit LSB  executable, ARM, EABI5 version 1 (SYSV), statically linked, for GNU/Linux 2.6.16, stripped എന്ന് കാണാൻ സാധിക്കും. നമ്മുടെ സിസ്റ്റത്തിൽ /bin ഇൽ ഉള്ള ഏതെങ്കിലും ഫയലിനെ ഇങ്ങനെ പരിശോധിച്ചാൽ /bin/ls: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24 എന്നായിരിക്കും കാണുക. ഈ രണ്ട് ഫയലുകളുടെയും രീതിയിലുള്ള വ്യത്യാസങ്ങൾ മനസ്സിലായിക്കാണുമല്ലോ.

നമ്മുടെ റൂട്ട് ഫയൽ സിസ്റ്റത്തിൽ ആവശ്യമായ പ്രോഗ്രാമുകൾ ചേർത്ത് കഴിഞ്ഞു. പക്ഷേ ഇതു പോര. ഒരു ഡെസ്ക്ടോപ്പ് കമ്പ്യൂട്ടറിലെ റൂട്ട് ഫയൽ സിസ്റ്റം നോക്കിയാൽ അതിൽ നിരവധി ഡയറക്ടറികൾ കാണാൻ സാധിക്കും. അവയിൽ ചിലതൊക്കെ അത്യാവശ്യമാണ്. അതിൽ പ്രധാനപ്പെട്ട ഒന്നാണ് /lib ഡയറക്ടറി. പ്രോഗ്രാമുകൾക്ക് പ്രവർത്തിക്കാൻ ആവശ്യമായ റൺ‌ ടൈം സി ലൈബ്രറികളും കെർണൽ മൊഡ്യൂളുകളും ഒക്കെ ഈ ഡയറക്ടറിയിൽ ആണ് ഉണ്ടായിരിക്കുക. കെർണൽ കമ്പൈൽ ചെയ്യുമ്പോൾ ഏതെങ്കിലും ഓപ്ഷൻ മൊഡ്യൂൾ ആയി ക്രമീകരിച്ചിട്ടുണ്ടെങ്കിൽ കെർണൽ ബിൽഡ് കഴിയുമ്പോൾ മൊഡ്യൂളുകളും കമ്പൈൽ ചെയ്യേണ്ടതുണ്ട്. ഇതിന് make modules കമാന്റ് ഉപയോഗിക്കാം. കെർണൽ സോഴ്സ് ഡയറക്ടറിയിൽ നിന്ന് കെർണൽ കമ്പൈലേഷൻ ക്രമീകരണങ്ങൾ ഒക്കെ ചെയ്ത ശേഷമാണ് ഈ കമാന്റ് നൽകേണ്ടത്. ഇനി export INSTALL_MOD_PATH=<നേരത്തെ തയ്യാറാക്കിയ ഡയറക്ടറീ> എന്ന് കൊടുത്തതിനു ശേഷം make modules_install എന്ന കമാന്റ് നൽകിയാൽ കെർണൽ മൊഡ്യൂളുകൾ ഒക്കെ ഇതിൽ lib/modules/ എന്ന ഡയറക്ടറിയിലേക്ക് കോപ്പി ചെയ്യപ്പെടും. ഷെയേർഡ് ലൈബ്രറികൾ ഉപയോഗിക്കുന്ന പ്രോഗ്രാമുകൾക്ക് പ്രവർത്തിക്കുന്ന സമയത്ത് ഈ ലൈബ്രറികൾ ആവശ്യമാണ്. ബിസിബോക്സ് സ്റ്റാറ്റിക് ആയി ബിൽഡ് ചെയ്തതിനാൽ അതിന് റൺ ടൈം ലൈബ്രറികൾ ഒന്നും ആവശ്യമില്ല. എന്നാലും മറ്റു പ്രോഗ്രാമുകൾക്കായി ഈ ലൈബ്രറികളും ടാർഗറ്റ് ഫയൽ സിസ്റ്റത്തിൽ വേണം. ഈ ലൈബ്രറികൾ നമ്മുടെ ക്രോസ്സ് കമ്പൈലർ ടൂൾ ചെയിനിൽ നിന്ന് കോപ്പി ചെയ്താൽ മതി. ഇതിന് ടൂൾ ചെയിൻ ഇൻസ്റ്റാളേഷൻ പാത്തിൽ പോയി നോക്കുക arm-none-linux-gnueabi/ bin/ lib/ libexec/ share/ എന്നീ ഡയറക്ടറികൾ അവിടെ കാണും. അതിൽ arm-none-linux-gnueabi/libc/lib/ എന്ന ഡയറക്ടറിയിലെ ഫയലുകൾ എല്ലാം കോപ്പി ചെയ്ത് നമ്മുടെ ടാർഗറ്റ് ഡയറക്ടറിയിൽ lib/ എന്ന ഡയറക്ടറിയിൽ ഇടുക. 

ഇനി നമുക്ക് ബാക്കി ഡയറക്ടറികൾ ഉണ്ടാക്കണം. ടാർഗറ്റ് ഡയറക്ടറിയിൽ ചെന്ന് mkdir dev /dev/pts proc sys var var/log etc etc/init.d എന്ന കമാന്റ് ഉപയോഗിക്കുക. കൂടുതൽ ഡയറക്ടറികൾ ചേർക്കണമെങ്കിൽ അവയും ചേർക്കാം. ഇനി കൺസോളിനായി ഒരു ഡിവൈസ് നോഡ് ഉണ്ടാക്കണം. /dev/ ഡയറക്ടറിയിൽ ഉള്ള പ്രത്യേക തരം ഫയലുകൾ ആണ് ഡിവൈസ് നോഡുകൾ. mknod കമാന്റ് ഉപയോഗിച്ചാണ് ഇവ ഉണ്ടാക്കേണ്ടത്. ഇതിനായി mknod dev/console c 5 1 എന്ന കമാന്റ് നൽകുക. c കാരക്റ്റർ സ്പെഷ്യൽ ഫയലിനെയും 5 മേജർ നമ്പറിനെയും 1 മൈനർ നമ്പറിനെയും സൂചിപ്പിക്കുന്നു.

ഇനി വേണ്ടത് സിസ്റ്റം ബൂട്ട് ചെയ്യുമ്പോൾ എങ്ങനെ പെരുമാറണമെന്നും മറ്റും ക്രമീകരിക്കാനായുള്ള ഫയലുകൾ തയ്യാറാക്കുകയാണ്. ഈ ഫയലുകൾ etc ഡയറക്ടറീയിൽ ആണ് ഉണ്ടാവുന്നത്. ആദ്യം ബൂട്ടിങ്ങ് സമയത്ത് ഏതൊക്കെ ഫയൽ സിസ്റ്റങ്ങൾ മൗണ്ട് ചെയ്യണ്ടം എന്ന് ക്രമീകരിക്കുന്ന fstab ഫയൽ ഉണ്ടാക്കാം.  <file system> <mount point>   <type>  <options> <dump>  <pass> എന്നിങ്ങനെ ആണ് ഈ ഫയലിലെ ഓരോ വരികളിലും വിവരങ്ങൾ ക്രമീകരിക്കേണ്ടത്. ഒരു ടെക്സ്റ്റ് എഡിറ്ററിൽ etc/fstab എന്ന ഫയൽ ഉണ്ടാക്കി അതിൽ ചുവടെ ഉള്ള വരികൾ ചേർക്കുക.
proc     /proc     proc     defaults     0     0
none     /dev/pts     devpts     mode=0622     0     0
യൂസർ ലോഗിൻ യൂട്ടിലിറ്റികൾക്കായി താഴെപ്പറയുന്ന ഫയലുകൾ തയ്യാറാക്കി അതിൽ അവയോടൊപ്പം നൽകിയിരിക്കുന്ന വിവരങ്ങൾ ചേർക്കുക.
etc/group ഇൽ root:x:0:root
etc/passwd ഇൽ root::0:0:root:/root:/bin/ash 
etc/hosts ഇൽ 127.0.0.1     localhost
ഈ ഫയലുകളെപ്പറ്റി ഉള്ള വിവരങ്ങൾ മാനുവൽ പേജുകളിൽ ലഭ്യമാണ്. ഒന്നിലധികം യൂസർമാർ, ഗ്രൂപ്പുകൾ, പാസ്സ്വേർഡ് എന്നിവ വരുമ്പോൾ ഈ ഫയലുകൾ ഇനിയും സങ്കീർണ്ണമാകും. നിങ്ങളുടെ സിസ്റ്റത്തിൽ ഉള്ള ഇതേ ഫയലുകൾ തുറന്ന് നോക്കിയാൽ ഒരു ഏകദേശ രൂപം കിട്ടും. 

കെർണൽ അതിന്റെ പ്രാഥമികമായ ക്രമീകരണങ്ങൾ എല്ലാം പൂർത്തിയാക്കിയ ശേഷം ഇനിറ്റ് പ്രോഗ്രാമിനെ പ്രവർത്തിപ്പിക്കും. പിന്നെ അങ്ങോട്ടുള്ള കാര്യങ്ങളുടെ എല്ലാം നിയന്ത്രണം ഇനിറ്റ് പ്രോഗ്രാമിനായിരിക്കും. നമ്മുടെ ഫയൽ സിസ്റ്റത്തിലെ ഇനിറ്റ് പ്രോഗ്രാം /sbin/init ആണ്. ഈ ബിസിബോക്സ് ഇനിറ്റ് പ്രോഗ്രം etc/inittab എന്ന ഫയലിൽ നിന്നാണ് അതിന്റെ ക്രമീകരണങ്ങൾ വായിക്കുന്നത്. സിസ്റ്റം സ്റ്റാർട്ട് ചെയ്യുമ്പോളും ഷട്ട് ഡൗൺ ചെയ്യുമ്പോളും ഒക്കെ എന്തൊക്കെ ചെയ്യണം എന്നും ഓരോ റൺ ലെവലിലും എന്ത് കാര്യങ്ങളാണ് ചെയ്യണ്ടത് എന്നും ഒക്കെയുള്ള വിവരങ്ങൾ ഈ ഫയലിൽ കാണും. ഈ ഫയലുകൾ മിക്കവാറും വളരെ സങ്കീർണ്ണമായവ ആയിരിക്കും. ചുവടെ കൊടുത്തിരിക്കുന്ന ഫയൽ അത്യാവശ്യം വേണ്ട കാര്യങ്ങൾ മാത്രം ചെയ്യുന്നു. etc/inittab

::sysinit:/etc/init.d/rcS 
# /bin/ash
#
# സീരിയൽ കൺസോളിൽ ഒരു ഷെൽ പ്രോഗ്രാം ആരംഭിക്കുക
console::askfirst:-/bin/ash
# ഇനിറ്റ് പ്രോഗ്രാം റീസ്റ്റാർട്ട് ചെയ്യപ്പെട്ടാൽ ചെയ്യേണ്ടത്
::restart:/sbin/init
# റീബൂട്ടിങ്ങ് സമയത്തും CTRL+ALT+Delete കീ അമർത്തപ്പെടുന്ന സമയത്തും ചെയ്യേണ്ടത്
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r

ഇതിൽ ആദ്യത്തെ വരിയിൽ പറഞ്ഞിരിക്കുന്ന sysinit ഉള്ള ലൈൻ /etc/init.d/rcS എന്ന ഷെൽ സ്ക്രിപ്റ്റ് സിസ്റ്റം സ്റ്റാർട്ടപ്പിൽ റൺ ചെയ്യണം എന്നാണ് പറയുന്നത്. പ്രവർത്തനമാരംഭിക്കുമ്പോൾ ചെയ്യേണ്ട കാര്യങ്ങൾ ഒക്കെ നമുക്ക് etc/init.d/rcS എന്ന സ്ക്രിപ്റ്റ് ഫയലിൽ തന്നെ ചേർക്കാം. താഴെക്കൊടുത്തിരിക്കുന്ന കാര്യങ്ങൾ ഈ ഫയലിൽ ചേർക്കുക.

#!/bin/sh 

HOSTNAME="MyLinuxSystem"
hostname $HOSTNAME

# Prints execution status.
status ()
{
    if [ $1 -eq 0 ] ; then
        echo "[SUCCESS]"
    else
        echo "[FAILED]"
    fi
}

# Print some messages
echo ""
echo "    Kernel release : `uname -s` `uname -r`"
echo ""

# Mount /proc
echo -n " Mounting /proc             : "
mount -n -t proc /proc /proc
status $? 1

# Mount /sys
echo -n " Mounting /sys              : "
mount -n -t sysfs sysfs /sys
status $? 1

# Mount /dev
echo -n " Mounting /dev              : "
mount -n -t tmpfs mdev /dev
status $? 1

# Set /sbin/mdev as hotplug handler
echo -n " Enabling hot-plug          : "
echo "/sbin/mdev" > /proc/sys/kernel/hotplug
status $? 0

mdev -s
status $? 0

echo -n " Mounting other filesystems : "
mount -a
status $? 0

# Set PATH
export PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin

# Start programs
echo -n " Starting syslogd           : "
/sbin/syslogd
status $? 0

echo ""
echo "System initialization now complete"
echo "" 

സിസ്റ്റം പ്രവർത്തിക്കാൻ അത്യാവശ്യം വേണ്ട കാര്യങ്ങൾ മാത്രമേ ഇതിൽ ചെയ്യുന്നുള്ളു. കൂടുതൽ കാര്യങ്ങൾ ആവശ്യമാണെങ്കിൽ അവയും ചേർക്കാവുന്നതാണ്. ഇവിടെ ഹോട്ട് പ്ലഗ് മാനേജർ ആയി /sbin/mdev എന്ന പ്രോഗ്രാം സെറ്റ് ചെയ്തിട്ടുണ്ട്. /dev/ ഡയറക്ടറിയിൽ വേണ്ട മറ്റു ഫയലുകളെ കൈകാര്യം ചെയ്യാൻ ഈ പ്രോഗ്രാമിന് ആവശ്യമായ ക്രമീകരണങ്ങൾ etc/mdev.conf എന്ന ഫയലിൽ ചേർക്കണം. ഓരോ ഫയലുകളും നിർമ്മിക്കപ്പെടുമ്പോൾ അവയുടെ അനുവാദങ്ങൾ എന്തായിരിക്കണം എന്ന് ചേർത്തിരിക്കുന്നു.
console     0:5 0600
nfs         0:5 0770
null        0:0 0777
rtc         0:0 0666
tty         0:5 0660
tty0*       0:5 0660
tty1*       0:5 0660
tty2*       0:5 0660
tty3*       0:5 0660
tty4*       0:5 0660
tty5*       0:5 0660
tty6*       0:5 0660
ttyS*       0:5 0640
ttyAMA*     0:5 0640
urandom     0:0 0444
zero        0:0 0666
ഇപ്പോ അത്യാവശ്യമുള്ള ഫയലുകൾ ഒക്കെ ആയി. ഇനി ഈ ഡയറക്ടറി സ്ട്രക്ചറിനെ മൊത്തം ഒരു ഡിസ്ക് ഇമേജ് ആക്കി മാറ്റണം. എന്നിട്ട് ആ ഇമേജിനെ ഒരു റാംഡിസ്ക് ഇമേജ് ആയി കെർണലിനു നൽകാം. റാംഡിസ്ക് ഇമേജുകൾ cpio ആർക്കൈവുകൾ ആയിട്ടാണ് ഇപ്പോൾ തയ്യാറാക്കപ്പെടുന്നത്. ഈ ഇമേജുകൾ മെമ്മറിയിൽ നിന്ന് തന്നെ ഒരു ഡിസ്ക് പോലെ പ്രവർത്തിക്കും. പക്ഷേ അതിലേക്ക് എഴുതപ്പെടുന്നത് ഒന്നും സിസ്റ്റം റീസ്റ്റാർട്ട് ചെയ്തു കഴിഞ്ഞാൽ അവിടെ ഉണ്ടാകില്ല. റാംഡിസ്കിനു പകരം ഒരു ഡിസ്ക് ഇമേജ് ഉപയോഗിക്കുന്നത് എങ്ങനെ എന്നും റാം ഡിസ്കുകൾ എന്തിന് ഉപയോഗിക്കുന്നു എന്നും വിശദമായി പിന്നീട് എഴുതാം. റാംഡിസ്ക് ഇമേജ് ഉണ്ടാക്കുന്നതിനായി നമ്മൾ ഉണ്ടാക്കിയ ഡയറക്ടറിയിലെ ഫയലുകൾ ഓരോന്നും cpio കമാന്റുപയോഗിച്ച് ആർക്കൈവ് ചെയ്ത് ആ ഇമേജിനെ gzip ഉപയോഗിച്ച് കമ്പ്രസ്സ് ചെയ്യുകയാണ് വേണ്ടത്. ഇതിനായി ഡയറക്ടറിയിൽ നിന്നും ഈ കമാന്റ് ഉപയോഗിക്കാം.
find . | cpio --quiet -H newc -o | gzip -9 -n > ../ramdisk.img
ഇനി ഡയറക്ടറിയിൽ നിന്നും പുറത്ത് വന്നാൽ അവിടെ ramdisk.img എന്ന ഫയൽ കാണാൻ സാധിക്കും.
ഇപ്പോൾ ടാർഗറ്റ് ഡിവൈസിനായുള്ള കെർണൽ ഇമേജും റാംഡിസ്ക് ഇമേജും തയ്യാറായി. സാധാരണഗതിയിൽ ഇവ ടാർഗറ്റ് ഡിവൈസിൽ ഫ്ലാഷ് ചെയ്യുകയോ നെറ്റ്‌വർക്ക് ഫയൽ സിസ്റ്റം വഴി അതിൽ ലഭ്യമാക്കുകയോ ഒക്കെയാണ് ചെയ്യുന്നത്. നമുക്ക് qemu ഇമുലേറ്റർ ഉപയോഗിച്ച് ഇവയെ എങ്ങനെ പ്രവർത്തിപ്പിച്ച് നോക്കാം എന്ന് അടുത്ത ഭാഗത്തിൽ പരിശോധിക്കാം.

സ്റ്റാർട്ടപ്പ് സ്ക്രിപ്റ്റുകൾക്ക് നന്ദി: http://processors.wiki.ti.com/index.php/Creating_a_Root_File_System_for_Linux_on_OMAP35x

Monday, September 08, 2014

ക്രോസ്സ് കമ്പൈലേഷൻ - 2

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

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

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

കമ്പൈലേഷൻ ആരംഭിക്കാൻ നമുക്ക് ആദ്യം ലിനക്സ് സോഴ്സ് കോഡ് വേണം. അത് എങ്ങനെ ലഭിക്കും എന്ന കാര്യം ഇവിടെ പറഞ്ഞിരിക്കുന്നത് നോക്കൂ. ഇനി വേണ്ടത് ഒരു ആം ക്രോസ്സ് കമ്പൈലർ ആണ്. ഞാൻ സാധാരണയായി ഉപയോഗിക്കുന്നത് മെന്റർ ഗ്രാഫിക്സിന്റെ ഫ്രീ ടൂൾചെയിൻ ആണ്. ലിനാരോയുടെ ടൂൾചെയിനും ഉപയോഗിക്കാം. ടൂൾ ചെയിനിൽ എന്തൊക്കെ ഉൾപ്പെട്ടിരിക്കുന്നു എന്ന് കഴിഞ്ഞ പോസ്റ്റിൽ പറഞ്ഞിരുന്നല്ലോ. ഈ പ്രോഗ്രാമുകളുടെ പേരും കമാന്റും ചുവടെ ചേർക്കുന്നു.
  1. സി കമ്പൈലർ/കമ്പൈലർ ഡ്രൈവർ - gcc (സി കമ്പൈലർ കമാൻഡ് സാധാരണയായി cc1 എന്നായിരിക്കും. gcc കമാൻഡ് അതിന്റെ പ്രവർത്തിപ്പിച്ചുകൊള്ളും‌)
  2. പ്രീ പ്രോസസ്സർ - cpp
  3. ലിങ്കർ/ലോഡർ - ld
  4. ഒബ്ജക്റ്റ് കോപ്പി - objcopy
  5. സ്ട്രിപ് - strip
  6. അസംബ്ലർ - as
  7. ആർക്കൈവർ - ar
  8. ഡീബഗ്ഗർ - gdb
ഈ കമാൻഡുകൾ തന്നെ ടൂൾ ചെയിനിനനുസരിച്ച് വ്യത്യാസപ്പെട്ടിരിക്കും. ഹോസ്റ്റ് കമ്പൈലറും ടാർഗറ്റ് ക്രോസ്സ് കമ്പൈലറും തമ്മിൽ മാറിപ്പോകാതിരിക്കാൻ ഈ പേരുമാറ്റം സഹായിക്കുന്നു. ടൂൾ ചെയിനുകൾക്ക് പേരിടാൻ പൊതുവേ അവലംബിച്ചിരിക്കുന്ന രീതി arch-vendor-(os-)abi എന്നാണ്. arch - ആർക്കിട്ടെക്ചർ (arm, x86, ppc, sh), vendor - ടൂൾ ചെയിൽ നൽകുന്ന കമ്പനി (മിക്കവാറും ഫ്രീ ടൂൾചെയിനുകൾക്ക് ഇത് none എന്നായിരിക്കും), os - ടൂൾചെയിൻ ഏതെങ്കിലും ഓപ്പറേറ്റിങ്ങ് സിസ്റ്റത്തെ പിന്തുണക്കുന്നുണ്ടോ എന്നത്, abi - ആപ്ലിക്കേഷൻ ബൈനറി ഇന്റർഫേസ്. മെന്റർ ഗ്രാഫിക്സ് ടൂൾചെയിനിന്റെ പേര് മിക്കവാറൂം arm-none-linux-gnueabi എന്നായിരിക്കും (മറ്റ് പേരുകളിലും ഉണ്ട്). ഈ ടൂൾ ചെയിൻ ഇൻസ്റ്റാൾ ചെയ്താൽ arm-none-linux-gnueabi-gcc, arm-none-linux-gnueabi-ld, arm-none-linux-gnueabi-as, arm-none-linux-gnueabi-strip തുടങ്ങിയ പ്രോഗ്രാമുകൾ ലഭ്യമാകും. (മുകളിൽ പറഞ്ഞിരിക്കുന്ന പ്രോഗ്രാം കമാൻഡുകൾക്കൊപ്പം arm-none-linux-gnueabi- എന്ന് ചേർത്താൽ മതി. ഇതിലെ arm-none-linux-gnueabi- യെ നമുക്ക് ടൂൾ ചെയിൻ പ്രിഫിക്സ് എന്ന് വിളിക്കാം). ടൂൾ ചെയിൻ സിസ്റ്റത്തിൽ ഇൻസ്റ്റാൾ ചെയ്താൽ ആ പാത്ത് അടക്കം ടൂൾ ചെയിൻ പ്രിഫിക്സിൽ ചേർക്കാം. അല്ലെങ്കിൽ ടൂൾ ചെയിന്റെ bin ഡയറക്ടറി PATH വേരിയബിളിൽ ചേർക്കണം. മെന്റർ ഗ്രാഫിക്സ് ടൂൾ ചെയിൻ ഒരു ഇൻസ്റ്റാളർ അടക്കമാണ് വരുന്നത്. ഉബുണ്ടു പാക്കേജ് മാനേജറിൽ തന്നെ ആം ടൂൾ ചെയിൻ ലഭ്യമാണ്. പേരിൽ മാറ്റങ്ങൾ ഉണ്ടാവാം. ഞാൻ ടൂൾ ചെയിൻ ഇൻസ്റ്റാൾ ചെയ്തിരിക്കുന്നത് /opt/arm-2011.03/bin/ എന്ന ഡയറക്ടറിയിൽ ആണ്. /opt/arm-2011.03/ എന്ന ഡയറക്ടറിയിൽ arm-none-linux-gnueabi, bin, ib, libexec, share എന്നീ ഡയറക്ടറികൾ കാണാം. ഇതിൽ bin ഡയറക്ടറിയിൽ ടൂൾചെയിനിലെ വിവിധ പ്രോഗ്രാമുകൾ കാണും‌. ഇവിടെ arm-none-linux-gnueabi- എന്ന പേരിൽ തുടങ്ങുന്ന വിവിധ ഫയലുകൾ. ഇൻസ്റ്റാളേഷൻ പാത്ത് അടക്കം എന്റെ സിസ്റ്റത്തിലെ ടൂൾ ചെയിൻ പ്രിഫിക്സ് /opt/arm-2011.03/bin/arm-none-linux-gnueabi- എന്നായിരിക്കും.

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

1. ടാർഗറ്റ് ആർക്കിട്ടെക്ചർ സജ്ജീകരിക്കുക - export ARCH=arm
2. ടൂൾ ചെയിൻ പ്രിഫിക്സ് സജ്ജീകരിക്കുക - export CROSS_COMPILE=/opt/arm-2011.03/bin/arm-none-linux-gnueabi- (അവസാനത്തെ - പ്രധാനമാണ്. അതുപോലെ ഇത് ടൂൾ ചെയിൻ ഇൻസ്റ്റാളേഷനനുസരിച്ച് മാറും എന്നും ഓർക്കുക)
3. ടാർഗറ്റ് കെർണൽ കോൺഫിഗറേഷൻ തെരഞ്ഞെടുക്കുക - ആം പ്രോസസ്സറിനുള്ള കോൺഫിഗറേഷനുകൾ ഒക്കെ arch/arm/configs എന്ന ഡയറക്ടറിയിൽ ആയിരിക്കും ഉണ്ടാവുക. ARCH=arm എന്ന് സെറ്റ് ചെയ്തിരിക്കുന്നതിനാൽ ഈ പാത്ത് മുഴുവനായി പ്രതിപാദിക്കേണ്ട ആവശ്യമില്ല. നമുക്കാവശ്യമുള്ള കോൺഫിഗ് ഫയൽ vexpress_defconfig ആണ്. ഇത് സെറ്റ് ചെയ്യാൻ make vexpress_defconfig
4. ഇനി കെർണൽ ബിൽഡ് ചെയ്യാൻ make zImage, make bzImage, make all ഏതെങ്കിലും ഒരു കമാന്റ് ഉപയോഗിക്കുക. -j ഓപ്ഷനും ഉപയോഗിക്കാം.

ഈ നാലു സ്റ്റെപ്പുകൾ ആണ് ഏത് ആർക്കിട്ടെക്ചറിനുള്ള കെർണൽ കമ്പൈൽ ചെയ്യാൻ ആണെങ്കിലും ഉപയോഗിക്കേണ്ടത്. ക്രോസ്സ് കമ്പൈലേഷൻ അല്ലെങ്കിൽ ആദ്യത്തെ രണ്ട് സ്റ്റെപ്പുകളും ആവശ്യമില്ല. മൂന്നാമത്തെ സ്റ്റെപ്പ് make defconfig എന്ന് മാത്രം മതിയാവുകയും ചെയ്യും. make menuconfig ഉപയോഗിച്ച് കോൺഫിഗറേഷനിൽ മാറ്റങ്ങൾ വരുത്തുകയും ആവാം. ബിൽഡ് പൂർണ്ണമായിക്കഴിഞ്ഞാൽ കെർണൽ ഇമേജ് arch/arm/boot ഡയറക്ടറിയിൽ നിന്നും കോപ്പി ചെയ്യാം.

ലിനക്സ് കെർണൽ മറ്റ് പ്രോഗ്രാമുകളെ പ്രവർത്തിപ്പിക്കാനും അവയ്ക്ക് കമ്പ്യൂട്ടർ ഹാർഡ്‌വെയർ ഉപയോഗിക്കാനും ഉള്ള സൗകര്യങ്ങൾ നൽകുക മാത്രമേ ചെയ്യുകയുള്ളു. അതിനാൽ തന്നെ പ്രവർത്തിപ്പിക്കാൻ പ്രോഗ്രാമുകൾ ഇല്ലെങ്കിൽ കെർണൽ ഉപയോഗശൂന്യമായിരിക്കും. ഈ പ്രോഗ്രാമുകൾ സാധാരണയായി റൂട്ട് ഫയൽ സിസ്റ്റത്തിൽ ആണ് ഉണ്ടാവുക. ഇവയും ടാർഗറ്റ് ആർക്കിട്ടെക്ചറിൽ പ്രവർത്തിക്കാൻ പാകത്തിൽ ക്രോസ്സ് കമ്പൈൽ ചെയ്യപ്പെട്ടവ ആയിരിക്കണം. ഒരു റൂട്ട് ഫയൽ സിസ്റ്റം എങ്ങനെ തയ്യാറാക്കാം എന്ന് അടുത്ത ഭാഗത്തിൽ.

ക്രോസ്സ് കമ്പൈലേഷൻ, ക്രോസ്സ് ഡെവലപ്പ്‌‌മെന്റ്‌‌

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

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

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

ഉപയോഗിക്കുന്ന പ്ലാറ്റ്ഫോമിനനുസരിച്ച് ജിസിസി അധിഷ്ഠിതമായ സൗജന്യ ടൂൾ ചെയിനുകൾ വിവിധ ഇടങ്ങളിൽ നിന്നും ലഭ്യമാണ്. ലിനാരോ, മെന്റർ ഗ്രാഫിക്സ് തുടങ്ങിയവർ ARM പ്രോസസ്സറിനാവശ്യമായ ബൈനറികൾ നിർമ്മിക്കാൻ സാധിക്കുന്ന x86 അധിഷ്ഠിത കമ്പ്യൂട്ടറുകളിൽ പ്രവർത്തിക്കുന്ന ടൂൾ‌ ചെയിനുകൾ ലഭ്യമാക്കുന്നുണ്ട്. 

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

ആൻഡ്രോയിഡ് ഇമുലേറ്റർ QEMU എന്ന ഇമുലേറ്റർ അടിസ്ഥാനമാക്കി നിർമ്മിക്കപ്പെട്ടിട്ടുള്ളതാണ്. ലിനക്സ് അധിഷ്ഠിത സിസ്റ്റങ്ങളിൽ നിന്ന് x86, ARM തുടങ്ങി നിരവധി ആർക്കിട്ടെക്ചറുകളെ ഇമുലേറ്റ് ചെയ്യാൻുപയോഗിക്കാവുന്നതും വളരെ ശക്തവും പ്രവർത്തനക്ഷമവും ഉപകാരപ്രദവും ആയ ഒരു പ്രോഗ്രാമാണ് ഇത്. ഉബുണ്ടു, ഫെഡോറ തുടങ്ങി എല്ലാ പ്രധാന ലിനക്സ് ഡിസ്ട്രിബ്യൂഷനുകളിലും പാക്കേജ് മാനേജറുകൾ വഴി ഇത് ഇൻസ്റ്റാൾ ചെയ്യാൻ സാധിക്കും. 

x86 ആർക്കിട്ടെക്ചർ ഇമുലേറ്റ് ചെയ്യാൻ (പ്രധാനമായും IA32) ഉപയോഗിക്കാവുന്ന മറ്റൊരു ഇമുലേറ്ററാണ് Bochs. x86 ആർക്കിട്ടെക്ചർ അധിഷ്ഠിതമായ ഒരു കമ്പ്യൂട്ടർ മുഴുവനും ഉൾക്കൊള്ളിച്ചിരിക്കുന്ന ഒരു സോഫ്റ്റ്‌വെയർ ആണ് ഇത് എന്ന് പറയാം. ബയോസും എല്ലാം ഇതിൽ ഉൾക്കൊള്ളിച്ചിട്ടുണ്ട്. ഡോസ്, വിൻഡോസ്, ലിനക്സ് ഒക്കെ ഇതിൽ പ്രവർത്തിപ്പിക്കാം. 

VMWare, VirtualBox തുടങ്ങിയ വിർച്ച്വലൈസേഷൻ സോഫ്റ്റ്‌വെയറുകളുമായി ഇവയെ താരതമ്യം ചെയ്ത് ആശയക്കുഴപ്പമുണ്ടാവരുത്. ഇമുലേഷനിൽ പൂർണ്ണമായും എല്ലാ ഉപകരണങ്ങളും സോഫ്റ്റ്‌വെയർ ഉപയോഗിച്ച് ലഭ്യമാക്കിയിരിക്കും. അവ ശരിക്കും നിലവിലില്ലാത്തവയായിരിക്കും. എന്നാൽ ഈ സോഫ്റ്റ്‌വെയറുകളുടെ പ്രവർത്തനം മൂലം ഇമുലേറ്ററിൽ പ്രവർത്തിക്കുന്ന പ്രോഗ്രാമുകൾക്ക് അവ ഉണ്ട് എന്ന തോന്നൽ ഉണ്ടാവും. വിർച്ച്വലൈസേഷൻ പലവിധത്തിൽ ഉണ്ട്. പലപ്പോഴും ഒരു പരിധി വരെ ഇമുലേഷനും അതിൽ ഉൾപ്പെടും. എന്നാലും വിർച്ച്വലൈസർ പ്രവർത്തിക്കുന്ന കമ്പ്യൂട്ടറിലെ ഉപകരണങ്ങളെ നേരിട്ട് പ്രവർത്തിപ്പിക്കാൻ ചിലപ്പോളോക്കെ വിർച്ച്വലൈസറിൽ പ്രവർത്തിക്കുന്ന പ്രോഗ്രാമുകൾക്ക് സാധിക്കും. 

QEMU പാക്കേജിലെ qemu-system-arm കമാന്റ് ഉപയോഗിച്ച് അതിൽ നിർവ്വചിക്കപെട്ടിട്ടുള്ള നിരവധി ആം അധിഷ്ഠിത ഡെവലപ്പ്മെന്റ് പ്ലാറ്റ്ഫോമുകൾ ഹാർഡ്‌വെയർ ഇല്ലാതെ തന്നെ ഉപയോഗിക്കാൻ സാധിക്കും. വേർസാറ്റൈൽ എക്സ്പ്രസ്സ്, ബീഗിൾ ബോർഡ്, നോകിയ എൻ800, എൻ810 ടാബ്ലറ്റുകൾ, ക്യൂബി ബോർഡ് തുടങ്ങി നിരവധി മെഷീനുകൾ ഇതിന്റെ പുതിയ പതിപ്പിൽ ലഭ്യമാണ്. ഇതിലൊന്നിൽ ഒരു മുഴുവൻ ലിനക്സ് സിസ്റ്റം സജ്ജമാക്കി പ്രവർത്തിപ്പിക്കുന്നത് എങ്ങനെയെന്ന് നമുക്ക് അടുത്ത ഭാഗത്തിൽ പരിശോധിക്കാം. ക്രോസ്സ് കമ്പൈലേഷൻ, റൂട്ട് ഫയൽ സിസ്റ്റം തയ്യാറാക്കൽ, കമാന്റ് ലൈൻ പരാമീറ്ററുകൾ, ബൂട്ടിങ്ങ്, കൺസോൾ ഒക്കെ വിശദമായി മനസ്സിലാക്കാൻ ഇത് സഹായകമായിരിക്കും.

Friday, August 15, 2014

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

കെർണൽ കമ്പൈലേഷന് മുൻപേ കമ്പൈൽ ചെയ്യാനുള്ള പ്ലാറ്റ്‌‌ഫോമിനായുള്ള കോൺഫിഗ് ഫയൽ തയ്യാറാക്കേണ്ടതുണ്ട് എന്ന് കഴിഞ്ഞ ഭാഗത്തിൽ പറഞ്ഞിരുന്നല്ലോ. നിലവിലുള്ള പ്ലാറ്റ്‌‌ഫോമുകളിൽ മിക്കതിനും കെർണലിനുള്ളിൽ തന്നെ ഒരു മൂല‌‌ക്രമീകരണം ലഭ്യമായിരിക്കും. ഡെഫ്‌‌കോൺഫിഗ് ഫയലുകൾ എന്ന ചുരുക്കപ്പേരിൽ അറിയപ്പെടുന്ന ഇവ കെർണൽ സോഴ്സ് കോഡിലെ arch/<arch>/configs എന്ന ഡയറക്ടറിയിൽ ലഭ്യമായിരിക്കും. ഉദാഹരണത്തിന് നമ്മുടെ ഡെസ്ക്ടോപ്പ് കമ്പ്യൂട്ടറുകളിലും മറ്റും ഉപയോഗിച്ചിരിക്കുന്ന x86 എന്ന ആർക്കിട്ടെക്ചറിന്റെ ഡെഫ്‌‌കോൺഫിഗ് ഫയലുകൾ arch/x86/configs/ എന്ന ഡയറക്ടറിയിൽ കാണാം. ഒരു 32 ബിറ്റ് പ്രോസസ്സറിനായി കെർണൽ കമ്പൈൽ ചെയ്യുമ്പോൾ i386_defconfig എന്ന ഫയലും 64 ബിറ്റ് പ്രോസസ്സറിനായി കെർണൽ കമ്പൈൽ ചെയ്യുമ്പോൾ x86_64_defconfig എന്ന ഫയലും ആണ് ഉപയോഗിക്കേണ്ടത്. ഉപയോഗിച്ചുകൊണ്ടിരിക്കുന്ന കമ്പ്യൂട്ടറിനായി അതിൽ നിന്നു തന്നെ കെർണൽ കമ്പൈൽ ചെയ്യുന്നത് താരതമ്യേന എളുപ്പമുള്ള കാര്യമാണ്. അതിനായി ചെയ്യേണ്ട കാര്യങ്ങൾ ചുവടേ.

ഒരു ഉബുണ്ടു സിസ്റ്റത്തിൽ കെർണൽ കമ്പൈൽ ചെയ്ത് തുടങ്ങുന്നതിനു മുന്നേ ചില പാക്കേജുകൾ ഇൻസ്റ്റാൾ ചെയ്യേണ്ടതുണ്ട്. sudo apt-get install git-core libncurses5 libncurses5-dev libelf-dev build-essential എന്ന കമാന്റുപയോഗിച്ച് ആവശ്യമായ പാക്കേജുകൾ ഇൻസ്റ്റാൾ ചെയ്യാം.
1. കെർണൽ സോഴ്സ് കോഡ് ഡൗൺലോഡ് ചെയ്യുക
ഇതിനായി https://www.kernel.org/ ഇൽ ചെന്ന് എച്റ്റിറ്റിപി, എഫ്റ്റിപി, ആർസിങ്ക് പ്രോട്ടോക്കോളുകൾ ഉപയോഗിച്ചോ https://git.kernel.org/cgit/ ഇൽ നിന്ന് ഗിറ്റ് ഉപയോഗിച്ചോ കെർണൽ സോഴ്സ് ഡൗൺലോഡ് ചെയ്യാം. ആദ്യത്തെ രീതിയിൽ ഡൗൺലോഡ് ചെയ്യുമ്പോൾ കമ്പ്രസ്സ് ചെയ്ത ആർക്കൈവ് ഫയലുകൾ ആയിട്ടായിരിക്കും കെർണൽ സോഴ്സ് ലഭിക്കുന്നത്. അങ്ങനെ ആണെങ്കിൽ ടെർമിനലിൽ നിന്നും tar xf കമാന്റുപയോഗിച്ച് ആർക്കൈവിനെ വേർതിരിച്ചെടുക്കാം. ഉദാഹരണത്തിന്:‌ tar xf linux-3.16.1.tar.xz ഈ കമാന്റിനു ശേഷം linux-3.16.1 എന്ന ഡയറക്ടറി കറന്റ് ഡയറക്ടറിയിൽ കാണാം. ഈ ഡയറക്ടറിയിലേക്ക് വർക്കിങ്ങ് ഡയറക്ടറി മാറ്റുക. (cd linux-3.16.1)

2. ഒരു കോൺഫിഗ് ഫയൽ തെരഞ്ഞെടുക്കുക
ഇപ്പോൾ ഉപയോഗിക്കുന്ന സിസ്റ്റത്തിനായുള്ള ഡിഫാൾട്ട് കോൺഫിഗ് ഫയൽ തെരഞ്ഞെടുക്കാൻ എളുപ്പമാണ്. നിലവിലെ സിസ്റ്റം ടൈപ്പ് ഒക്കെ ഓട്ടോമാറ്റിക്കായി കണ്ടെത്തി ഒരു കോൺഫിഗ് ഫയൽ സെറ്റ് ചെയ്യാൻ make defconfig എന്ന കമാന്റ് ഉപയോഗിക്കാം. ചിത്രത്തിൽ കാണുന്നത് പോലെ ഒരു ഔട്ട്പുട്ട് കാണാൻ സാധിക്കും.
make defconfig
എന്റെ കമ്പ്യൂട്ടർ ഇപ്പോൾ പ്രവർത്തിക്കുന്നത് ഉബുണ്ടു 14.04 32 ബിറ്റ് വേർഷനിൽ ആണ്. അതിനാൽ i386_defconfig തെരഞ്ഞെടുക്കപ്പെട്ടതായി കാണാം. ഇനി 64 ബിറ്റ് വേർഷൻ ആണ് ഉപയോഗിക്കണ്ടതെങ്കിൽ കമാന്റ് make defconfig നു പകരം make x86_64_defconfig എന്ന കമാന്റ് ഉപയോഗിക്കാം. ഡെഫ്‌‌കോൺഫിഗ് ഫയലിന്റെ പേരാണ് make കമാന്റിനു ശേഷം ഉപയോഗിച്ചത് എന്ന് ശ്രദ്ധിക്കുമല്ലോ.

3. കെർണൽ കോൺഫിഗറേഷനിൽ മാറ്റങ്ങൾ ആവശ്യമാണെങ്കിൽ അത് ചെയ്യുക
ഇതിനായി ഒന്നിലധികം രീതികൾ ലഭ്യമാണ്. പുതിയ കെർണൽ വേർഷൻ പിന്തുണക്കുന്നവയുടെ ലിസ്റ്റ്:
  config          - Update current config utilising a line-oriented program
  nconfig         - Update current config utilising a ncurses menu based program
  menuconfig      - Update current config utilising a menu based program
  xconfig         - Update current config utilising a QT based front-end
  gconfig         - Update current config utilising a GTK based front-end
  oldconfig       - Update current config utilising a provided .config as base
  localmodconfig  - Update current config disabling modules not loaded
  localyesconfig  - Update current config converting local mods to core
  silentoldconfig - Same as oldconfig, but quietly, additionally update deps
  defconfig       - New config with default from ARCH supplied defconfig
  savedefconfig   - Save current config as ./defconfig (minimal config)
  allnoconfig     - New config where all options are answered with no
  allyesconfig    - New config where all options are accepted with yes
  allmodconfig    - New config selecting modules when possible
  alldefconfig    - New config with all symbols set to default
  randconfig      - New config with random answer to all options
  listnewconfig   - List new options
  olddefconfig    - Same as silentoldconfig but sets new symbols to their default value 


(make help എന്ന കമാന്റുപയോഗിച്ച് ഇത് കാണാൻ സാധിക്കും)

make കമാന്റിനൊപ്പം ഇതിലൊന്ന് ഉപയോഗിച്ച് കോൺഫിഗറേഷനിൽ മാറ്റങ്ങൾ വരുത്താം. xconfig, gconfig എന്നിവയിൽ മൗസും മറ്റും ഉപയോഗിച്ച് ആവശ്യമായവ തെരഞ്ഞെടുക്കാം. ഇതിനായി കൂടുതൽ പാക്കേജുകളും ഇൻസ്റ്റാൾ ചെയ്യേണ്ടതുണ്ട്. ncurses അടിസ്ഥാനമാക്കിയ മെനു അധിഷ്ഠിത menuconfig ടെർമിനലിൽ തന്നെ ഉപയോഗിക്കാവുന്ന ഒന്നാണ്. ഇതിനായി make menuconfig എന്ന കമാന്റ് ഉപയോഗിക്കുക.
പ്രധാന പേജ്
ഫയൽ സിസ്റ്റങ്ങൾ
മെനുകോ‌‌ൺഫിഗ് കമാന്റ് ഉപയോഗിക്കുമ്പോൾ ചിത്രത്തിൽ കാണുന്നത് പോലുള്ള മെനു ലഭിക്കും. ആരോ കീ ഉപയോഗിച്ച് മെനുവിലെ വ്യത്യസ്ത ഓപ്ഷനുകൾ തെരഞ്ഞെടുക്കാം. * എന്ന് അടയാളപ്പെടുത്തിയിരിക്കുന്നവ കെർണലിൽ സ്റ്റാറ്റിക്ക് ആയും M എന്ന് അടയാളപ്പെടുത്തിയവ മൊഡ്യൂൾ ആയും ആയിരിക്കും ബിൽഡ് ചെയ്യുക. അല്ലാത്തവ ഉൾപ്പെടുത്തില്ല. ---> കാണുന്നവയിൽ വച്ച് എന്റർ അമർത്തിയാൽ അതിലെ സബ് മെനു ലഭിക്കും. സ്പേസ് കീ ഉപയോഗിച്ച് M * [] ഓപ്ഷനുകൾ അടയാളപ്പെടുത്താം. അല്ലെങ്കിൽ * ലഭിക്കാൻ y, മൊഡ്യൂൾ ആയി ഉൾപ്പെടുത്താൻ M, ഒഴിവാക്കാൻ N എന്നീ ബട്ടണുകളും ഉപയോഗിക്കാം. കോൺഫിഗറേഷൻ സേവ് ചെയ്ത ശേഷം എക്സിറ്റ് ഓപ്ഷൻ തെരഞ്ഞെടുത്ത് ഈ പ്രോഗ്രാമിൽ നിന്ന് പുറത്ത് വരാം.

4. കെർണൽ ബിൽഡ് ചെയ്യുക
ഇതിനായി make കമാന്റ് ഉപയോഗിക്കാം. മേക്ക് പ്രോഗ്രാമിന് ഒന്നിലധികം ത്രെഡുകൾ ആയി പ്രവർത്തിക്കാൻ സാധിക്കും. സ്വതന്ത്രമായ ഫയലുകളെ ഒരേ സമയം വെവ്വേറെ കമ്പൈൽ ചെയ്യാൻ സാധിക്കും. ഇതുവഴി ഒരുപാട് സമയം ലാഭിക്കാൻ കഴിയും. കെർണൽ ബിൽഡ് ചെയ്യുമ്പോൾ നൂറുകണക്കിനു ഫയലുകൾ കമ്പൈൽ ചെയ്യേണ്ടതുണ്ട് എന്ന് ഓർക്കണം. എത്ര ത്രെഡുകൾ പ്രവർത്തിപ്പിക്കണം എന്നത് നിർദ്ദേശിക്കാനായി -j ഓപ്ഷൻ ഉപയോഗിക്കാം. രണ്ട് സി പി യു ഉള്ള ഒരു സിസ്റ്റത്തിൽ 2 ത്രെഡുകൾ ഉപയോഗിക്കാം. ആകെ ലഭ്യമായ സി പി യുകളുടെ എണ്ണം മനസ്സിലാക്കാൻ cat /proc/cpuinfo എന്ന കമാന്റ് ഉപയോഗിക്കാം. 4 സി പി യുകൾ ഉണ്ടെങ്കിൽ make -j4 എന്ന് ഉപയോഗിക്കാവുന്നതാണ്.

5. മൊഡ്യൂളുകൾ ബിൽഡ് ചെയ്ത് ഇൻസ്റ്റാൾ ചെയ്യുക
കെർണൽ കോൺഫിഗറേഷനിൽ ഏതെങ്കിലും ഓപ്ഷൻ മൊഡ്യൂൾ ആയി ക്രമീകരിച്ചിട്ടുണ്ടെങ്കിൽ അവയെ പ്രത്യേകമായി തന്നെ ബിൽഡ് ചെയ്യേണ്ടതുണ്ട്. ഇതിനായി make modules എന്ന കമാന്റ് ഉപയോഗിക്കാം. ഇത് പൂർത്തിയായിക്കഴിഞ്ഞാൽ make modules_install എന്ന കമാന്റ് ഉപയോഗിച്ച് ബിൽഡ് ചെയ്ത മൊഡ്യൂളുകൾ ഇൻസ്റ്റാൾ ചെയ്യാം. ഇത് സാധാരണയായി /lib/modules/<kernel_version> എന്ന ഡയറക്ടറിയിൽ ആയിരിക്കും ഇൻസ്റ്റാൾ ചെയ്യപ്പെടുക. kernel_version ബിൽഡ് ചെയ്ത കെർണൽ പതിപ്പിന്റെ നമ്പർ ആയിരിക്കും. എന്തെങ്കിലും കാരണവശാൽ ഈ പാത്ത് മാറ്റണമെങ്കിൽ export INSTALL_MOD_PATH=<പുതിയ പാത്ത്> എന്ന് നൽകിയ ശേഷം make modules_install എന്ന് നൽകിയാൽ മതി.

6. ബിൽഡ് ചെയ്ത കെർണൽ ഇമേജ് ഇൻസ്റ്റാൾ ചെയ്യുക
സൂപ്പർ യൂസർ ആയി make install കമാന്റ് ഉപയോഗിച്ച് ഇത് ചെയ്യാം. sudo make install എന്നായിരിക്കും മുഴുവൻ കമാന്റ്. അല്ലെങ്കിൽ ബിൽഡ്‌ പൂർണ്ണമായ ശേഷം arch/x86/boot/bzImage അല്ലെങ്കിൽ zImage തുടങ്ങിയ കമ്പ്രസ്സ് ചെയ്ത കെർണൽ ഇമേജുകളോ vmlinux എന്ന കമ്പ്രസ്സ് ചെയ്യാത്ത കെർണൽ ഇമേജോ /boot ഡയറക്റ്ററിയിലേക്ക് കോപ്പി ചെയ്ത ശേഷം ബൂട്ട് ലോഡറിന്റെ കോൺഫിഗറേഷൻ ഫയലിൽ ഈ ഇമേജിന്റെ പാത്ത് ചേർത്താലും മതി.

കമ്പ്യൂട്ടർ റീസ്റ്റാർട്ട് ചെയ്യുമ്പോൾ ബൂട്ട് ലോഡറിൽ നിന്ന് പുതിയ കെ‌‌ർണൽ ഇമേജ് തെരഞ്ഞെടുത്ത് അത് ബൂട്ട് ചെയ്ത് ടെസ്റ്റ് ചെയ്യാം.

ഇനി ഇപ്പോൾ ഉപയോഗിക്കുന്ന കമ്പ്യൂട്ടറിനല്ലാതെ മറ്റൊരു ആർക്കിട്ടെക്ചറിൽ ഉള്ള മറ്റൊരു ഉപകരണത്തിനായി കെർണൽ കമ്പൈൽ ചെയ്യുന്ന രീതി നോക്കാം. ക്രോസ്സ് കമ്പൈലേഷൻ എന്നാണ് ഈ രീതിയുടെ പേര്. ഫോണുകളിലും മറ്റും ഉപയോഗിക്കുന്ന കെർണലുകൾ അവയിൽ തന്നെ കമ്പൈൽ ചെയ്യാൻ സാധിക്കില്ലല്ലോ. അപ്പോൾ മറ്റൊരു കമ്പ്യൂട്ടർ തന്നെ ഉപയോഗിക്കണം. ഇതിനെപ്പറ്റി അടുത്ത ഭാഗത്തിൽ.

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

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