പ്രോഗ്രാം, പ്രോസസ്സ് #3

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

പ്രോഗ്രാം

പ്രോസസ് എന്നത് മെമ്മറിയില്‍ ലോഡ് ചെയ്യപ്പെട്ട പ്രോഗ്രാം ആണെന്ന് നേരത്തേ‌ പറഞ്ഞു. പ്രോസസ്സുകള്‍ ആയി മാറുന്ന പ്രോഗ്രാമുകളെക്കുറിച്ച് ഈ ഭാഗത്തില്‍..

ലിനക്സിലെ ഫയല്‍ അനുമതികളില്‍ എക്സിക്യൂട്ടബിള്‍ എന്ന ഒരു അനുമതി ഉണ്ട്. ഇത് ഏത് ഫയലിന് വേണമെങ്കിലും കൊടുക്കാവുന്നതാണ്. ഈ അനുവാദം ഉള്ളതുകൊണ്ട് മാത്രം ഒരു ഫയല്‍ എക്സിക്യൂട്ടബിള്‍ ഫയല്‍ ആകുന്നില്ല. ഒരോ ഫയലുകളും ഏത് തരത്തില്‍ ഉള്ളവയാണെന്ന് മനസ്സിലാക്കാന്‍ ലിനക്സില്‍ ഫയല്‍ (file) കമാന്റ് ഉപയോഗിക്കാവുന്നതാണ്. ചില ഉദാഹരണങ്ങള്‍ നോക്കൂ,

subin@subin:~/Pictures/Tux$ file 100px-NewTux.png
100px-NewTux.png: PNG image data, 100 x 120, 8-bit/color RGBA, non-interlaced
subin@subin:/bin$ file bash
bash: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, stripped
subin@subin:/lib$ file libfuse.so.2.8.6
libfuse.so.2.8.6: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, stripped

ഈ പ്രോഗ്രാം ഫയലിന്റെ പേരോ എക്സ്റ്റന്‍ഷനോ അടിസ്ഥാനമാക്കിയല്ല ഫയലിന്റെ തരം തീരുമാനിക്കുന്നത്. മിക്കവാറൂം ബൈനറി വിവരങ്ങള്‍ അടങ്ങിയിരിക്കുന്ന ഫയലുകള്‍ക്കൊക്കെ ഒരു ക്രമീകരണ രീതി ഉണ്ടാകും. ആ ഫയലിലെ ആദ്യത്തെ ഏതാനും ബൈറ്റുകളില്‍ ഒരു മാജിക് നമ്പര്‍ അടങ്ങിയിരിക്കും. ഈ മാജിക് നമ്പര്‍ ഓരോ തരത്തിലുള്ള ഫയലിനും ഓരോന്നായിരിക്കും. മുകളിലെ ഉദാഹരണത്തില്‍ രണ്ടാമതും മൂന്നാമതും ഉള്ള ഫയലുകള്‍ ELF എന്ന തരത്തില്‍ പെട്ടവയാണ്. ലിനക്സിലെ എക്സിക്യൂട്ടബിള്‍ ഫയലിന്റെ ക്രമീകരണരീതികളില്‍ ഒന്നാണ് ELF. എക്സിക്യൂട്ടബിള്‍ ആന്‍ഡ്‌ ലിങ്കബിള്‍ ഫോര്‍മാറ്റ് എന്നതിന്റെ ചുരുക്കമാണിത്. ഇത് കൂടാതെ ഷെല്‍ സ്ക്രിപ്റ്റുകള്‍, പൈത്തണ്‍, പേള്‍ പ്രോഗ്രാമുകള്‍ എന്നിവയെയൊക്കെ എക്സിക്യൂട്ടബിളുകള്‍ ആയി പരിഗണിക്കും. എന്നാല്‍ ELF ഫയലുകള്‍ പോലെയല്ല അവ കൈകാര്യം ചെയ്യപ്പെടുന്നത്. അവയെ പ്രവര്‍ത്തിപ്പിക്കാനാവശ്യമായ പ്രോഗ്രാമുകളുടെ വിവരം ആ ഫയലുകളുടെ ആദ്യം രേഖപ്പെടുത്തിയിരിക്കും. ഷെല്‍ സ്ക്രിപ്റ്റുകളുടെ ഒക്കെ ഫയലിലെ ആദ്യത്തെ വരി മിക്കവാറും #!/bin/bash എന്നായിരിക്കും. /bin/bash എന്ന പ്രോഗ്രാമുപയോഗിച്ചാണ് ആ ഫയലിനെ പ്രവര്‍ത്തിപ്പിക്കേണ്ടത് എന്നര്‍ഥം. എന്നാല്‍ ELF ഫയലുകളെ കെര്‍ണല്‍ നേരിട്ട് പ്രവര്‍ത്തിപ്പിക്കുകയാണ് ചെയ്യുന്നത്. ELF ഫയലുകളിലെ വിവരങ്ങള്‍ വിവിധ വിഭാഗങ്ങളില്‍ ആയാണ് ക്രമീകരിച്ചിരിക്കുക. മുകളിലെ ഉദാഹരണത്തില്‍ രണ്ടാമത് കാണുന്നത് ഒരു എക്സിക്യൂട്ടബിള്‍ ഫയലും മൂന്നാമത്തേത് ഒരു ഷെയേര്‍ഡ്‌ ലൈബ്രറിയും ആണ്. ഇവയെക്കുറിച്ച് പിന്നീട് പറയാം. ഈ ഫയലുകളില്‍ ഒക്കെ ഉണ്ടാകുന്ന വിവിധ ഭാഗങ്ങള്‍ (സെഗ്‌‌മെന്റ്) ചുവടെ (ഇത് ഒരു സി കമ്പൈലര്‍ ഉണ്ടാക്കുന്ന എക്സിക്യൂട്ടബിളിനെ അടിഥാനമാക്കിയാണ്),

  1. .text: പ്രോഗ്രാമിലെ നിര്‍ദ്ദേശങ്ങള്‍. ഇവക്കനുസരിച്ചാണ് പ്രോഗ്രാം പ്രവര്‍ത്തിക്കുന്നത്.
  2. .data: ഒരു സി പ്രോഗ്രാമിലെ മൂല്യം തീരുമാനിക്കപ്പെട്ട ഗ്ലോബല്‍ വേരിയബിളുകള്‍, സ്റ്റാറ്റിക് വേരിയബിളുകള്‍ എന്നിവയൊക്കെ.
  3. .bss: മൂല്യം തീരുമാനിക്കപ്പെട്ടിട്ടില്ലാത്ത ഗ്ലോബല്‍ വേരിയബിളുകള്‍.
  4. .stack: പ്രോഗ്രാമിലെ വിവിധ ഫങ്ഷനുകള്‍ക്ക് പ്രവര്‍ത്തിക്കാനാവശ്യമായ വിവരങ്ങള്‍. പ്രോഗ്രാമിന്റെ ആരംഭത്തില്‍ ഇതില്‍ മെയിന്‍ ഫങ്ങ്ഷനിലെ ലോക്കല്‍/ഓട്ടോമാറ്റിക് വേരിയബിളുകള്‍, റിട്ടേണ്‍ അഡ്രസ്സ്, കമാന്റ് ലൈന്‍ ആര്‍ഗ്യുമെന്റുകള്‍, എന്‍വയോണ്‍മെന്റ് വേരിയബിളുകള്‍ എന്നിവയായിരിക്കും ഉണ്ടാവുക. മറ്റൊരു ഫങ്ങ്ഷന്‍ വിളിക്കപ്പെടുമ്പോള്‍ ആ ഫങ്ങ്‌‌ഷന്റെ ലോക്കല്‍ വേരിയബിളുകള്‍, അതിന്റെ ആര്‍ഗ്യുമെന്റുകള്‍, അതിന്റെ റിട്ടേണ്‍ അഡ്രസ് തുടങ്ങിയ വിവരങ്ങള്‍ ഉള്‍ക്കൊള്ളിച്ച് ഒരു പുതിയ ഉപ ഭാഗം ഇതിനുള്ളില്‍ സൃഷ്ടിക്കപ്പെടുന്നു.
  5. .heap: പ്രോഗ്രാം പ്രവര്‍ത്തിക്കുന്ന സമയത്ത് അതിന് കൂടുതല്‍ മെമ്മറി ആവശ്യമായി വന്നാല്‍ അത് അനുവദിക്കാനുള്ള സ്ഥലം. (മുകളിലുള്ള സി പ്രോഗ്രാമിങ്ങുമായി ബന്ധപ്പെട്ട പദങ്ങള്‍ വിശദീകരിക്കാന്‍ കൂടുതല്‍ സ്ഥലവും സമയവും വേണ്ടിവരുമെന്നതിനാല്‍ അവയുടെ വിശദീകരണം ഒഴിവാക്കുന്നു. അവ എന്താണെന്ന് സൂചിപ്പിക്കുന്ന വിക്കി ലേഖനത്തിലേക്ക് കണ്ണികള്‍ നല്‍കിയിട്ടുണ്ട്)

ആധുനിക കമ്പൈലറുകള്‍ ഇവക്ക് പുറമേ മറ്റ് പല ഭാഗങ്ങളും എക്സിക്യൂട്ടബിള്‍ ഫയലുകളില്‍ ഉള്‍പ്പെടുത്താറുണ്ട്. ജി ഡി ബി പോലെയുള്ള ഡീബഗ്ഗര്‍ പ്രോഗ്രാമുകള്‍ക്കാവശ്യമായ വിവരങ്ങള്‍ Dwarf എന്ന ക്രമീകരണ രീതി ഉപയോഗിച്ച് ചില എക്സിക്യൂട്ടബിള്‍ ഫയലുകളില്‍ കാണും. (Elf എന്ന പേരിന്റെ കൂടെ നില്‍ക്കാന്‍ Dwarf എന്ന് പേരിട്ടതാണ്. ഇവ രണ്ടും മാന്ത്രിക ജീവികളുടെ പേരാണല്ലോ.) മറ്റുള്ള ബൈനറി എക്സിക്യൂട്ടബിള്‍ ക്രമീകരണ രീതികളിലും ഈ ഭാഗങ്ങള്‍ ഒക്കെ ഉണ്ടാകും. Elf ഒരു ഉദാഹരണമായി എടുത്തത് യൂണിക്സ്/ലിനക്സ് സിസ്റ്റങ്ങള്‍ അത് ഉപയോഗിക്കുന്നു എന്നതിനാലാണ്. എക്സിക്യൂട്ടബിള്‍ ഫയലുകളെ കുറിച്ചുള്ള വിവരങ്ങള്‍ ലഭിക്കാനും അവയെ അപഗ്രഥിക്കാനും മറ്റുമായി വിവിധ പ്രോഗ്രാമുകള്‍ ലഭ്യമാണ്. ഉദാഹരണത്തിന്, എക്സിക്യൂട്ടബിള്‍ ഫയലിലെ വിവിധ സെഗ്മന്റുകളുടെ വലിപ്പം അറിയാന്‍ size, ഫയലിലെ വിവിധ ചിഹ്നങ്ങളുടെ വിവരങ്ങള്‍ ലഭിക്കാന്‍ nm, elf ഫയലുകളിലെ വിവിധ വിവരങ്ങള്‍ക്കായി readelf എന്നിവ.

കമ്പൈലര്‍ ഒരു എക്സിക്യൂട്ടബിള്‍ ഫയല്‍ ഉണ്ടാക്കിക്കഴിഞ്ഞാല്‍ അതില്‍ പ്രവര്‍ത്തനസമയത്ത് അത്യാവശ്യമല്ലാത്ത വിവിധ വിവരങ്ങള്‍ ഉണ്ടായിരിക്കും. സാധാരണ ഉപഭോക്താക്കള്‍ക്ക് ആവശ്യമില്ലാത്ത ഈ വിവരങ്ങള്‍ ഒഴിവാക്കുന്നത് ഫയലുകളുടെ വലിപ്പം കുറക്കാന്‍ സഹായിക്കും. ഇങ്ങനെയുള്ള വിവരങ്ങള്‍ ഒഴിവാക്കുന്ന പ്രക്രിയയെ സ്ട്രിപ്പിങ്ങ് എന്ന് പറയുന്നു. strip എന്ന പ്രോഗ്രാം ഉപയോഗിച്ച് ഇത് ചെയ്യാവുന്നതാണ്. ആദ്യം നല്‍ലിയിരിക്കുന്ന ഫയല്‍ കമാന്റ് ഉദാഹരണങ്ങളില്‍ അവസാനം stripped എന്ന് പരാമര്‍ശിച്ചിട്ടുള്ളത് ശ്രദ്ധിക്കൂ.

യൂണിക്സ്/ലിനക്സ് സിസ്റ്റങ്ങളില്‍ പ്രോസസുകള്‍ തുടങ്ങുന്നത്, അവസാനിപ്പിക്കുന്നത് എന്നിവയെക്കുറിച്ച് അടുത്ത പോസ്റ്റില്‍.

ഈ ലേഖനം ശ്രീ സുബിന്‍ പി. റ്റി അദ്ദേഹത്തിന്റെ ബ്ലോഗില്‍ ക്രിയേറ്റീവ് കോമണ്‍സ് സിസി-ബൈ-എസ്.എ 3.0 ലൈസന്‍സ് പ്രകാരം പ്രസിദ്ധീകരിച്ചതാണ്.