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 ടാബ്ലറ്റുകൾ, ക്യൂബി ബോർഡ് തുടങ്ങി നിരവധി മെഷീനുകൾ ഇതിന്റെ പുതിയ പതിപ്പിൽ ലഭ്യമാണ്. ഇതിലൊന്നിൽ ഒരു മുഴുവൻ ലിനക്സ് സിസ്റ്റം സജ്ജമാക്കി പ്രവർത്തിപ്പിക്കുന്നത് എങ്ങനെയെന്ന് നമുക്ക് അടുത്ത ഭാഗത്തിൽ പരിശോധിക്കാം. ക്രോസ്സ് കമ്പൈലേഷൻ, റൂട്ട് ഫയൽ സിസ്റ്റം തയ്യാറാക്കൽ, കമാന്റ് ലൈൻ പരാമീറ്ററുകൾ, ബൂട്ടിങ്ങ്, കൺസോൾ ഒക്കെ വിശദമായി മനസ്സിലാക്കാൻ ഇത് സഹായകമായിരിക്കും.