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 ഡയറക്ടറിയിൽ നിന്നും കോപ്പി ചെയ്യാം.

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

No comments:

Post a Comment