Sunday, December 12, 2021

സെക്യൂർ ബൂട്ട്: MOK - മെഷീൻ ഓണർ കീ

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

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

ഇതെല്ലാം പരിഗണിച്ച് രണ്ട് ദിവസം കുത്തിയിരുന്ന് ഉബുണ്ടു ഇതെങ്ങനെ ആണ് ചെയ്യുന്നത് എന്ന് മനസ്സിലാക്കി അതേ രീതിയിൽ കീ സെറ്റപ്പ് ചെയ്തു. എന്നാപ്പിനെൻ അതൊന്ന് ഡോക്യുമെൻ്റ് ചെയ്തേക്കാമെന്നും കരുതി. ഇത് ഡെബിയനിൽ മാത്രമല്ല, യു ഇ എഫ് ഐ സെക്യൂർ ബൂട്ട് എനേബിൾ ചെയ്തിരിക്കുന്ന ഏത് സിസ്റ്റത്തിലും പറ്റും.

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

ഇതുവരെ എല്ലാം ഓകെ, പക്ഷേ ഡെബിയനും ഫെഡോറയും ഒക്കെ കെർണൽ സൈൻ ചെയ്യാൻ ഉപയോഗിച്ച കീ അവരുടെ കയ്യിലല്ലേ ഉള്ളു. അത് ഡപ്പിയിൽ ഇരിക്കുന്നു. എനിക്ക് കിട്ടില്ല. അപ്പോ ഞാനൊരു കെർണൽ കമ്പൈൽ ചെയ്താൽ, അല്ലെങ്കിൽ ഒരു മൊഡ്യൂൾ ലോക്കലായി ബിൽഡ് ചെയ്താൽ എന്ത് ചെയ്യും? അത് ഓടില്ല. പക്ഷേ ഞാൻ കാശുകൊടുത്ത് വാങ്ങിയ കമ്പ്യൂട്ടറല്ലേ, എനിക്കൊരു വെലയുമില്ലേ! വെൽ, യു ഇ എഫ് ഐ സ്പെസിഫിക്കേഷനിൽ അതിനുള്ള വഴിയുണ്ട്. 

മൊതലാളി ഓവർ റൈഡ് അഥവാ മെഷീൻ ഓണർ കീ. (എം ഓ കെ).

ഞാൻ ഒരു കീ ക്രിയേറ്റ് ചെയ്യുന്നു. അനന്തരം ഞാൻ യു ഇ എഫ് ഐ ഫേംവെയറിനോട് പറയുന്നു,

“ഇത് എൻ്റെ കീ ആകുന്നു. ഇതിനെ നീ നിൻ്റെ മാറിലേയ്ക്ക് സ്വീകരിയ്ക്കുക, ഇനിവരുന്ന മൊഡ്യൂളുകൾ ഈ കീ കൊണ്ട് ഒപ്പിട്ടവയാണെങ്കിൽ അവയെ ഓടാൻ വിടുക”,

അപ്പോ ഫേംവെയർ ചോദിക്കും, “മൊതലാളീ, ഈ കീ മൊതളാളി ഉണ്ടാക്കിയ കീ തന്നെയാണോന്ന് ഞാനെങ്ങനെ ഉറപ്പിക്കും?”

അതിനിപ്പോ എന്ത് ചെയ്യും? കീ എൻറോൾ ചെയ്യുമ്പോ ഞാനൊരു പാസ്സ്‌വേർഡ് സെറ്റ് ചെയ്യും. അടുത്ത തവണ മെഷീൻ ഓണാക്കുമ്പോ ഫേം വെയർ ചോദിക്കും, “മൊതലാളീ, കീയൊരെണ്ണം വന്നിട്ടൊണ്ട്. ഞാൻ എടുക്കണോന്ന്”

അപ്പ ഞാൻ എടുക്കണന്ന് പറയും. അപ്പോ ഫേംവെയർ എന്നോട് എന്നാപ്പിന്നെ ആ പാസ്സ്‌വേർഡ് ഒന്ന് പറഞ്ഞേന്ന് പറയും. ഞാൻ പറയും. അതോടെ മോക് കീ എൻറോൾ ചെയ്യപ്പെടും. ഇനി എനിക്ക് മോക് കീ കൊണ്ട് എന്തും ഒപ്പിടാം. ആരും പരാതി പറയില്ല. എൻ്റെ കീ, എൻ്റെ മെഷീൻ.

മെഷീൻ ഓണർ കീയും ഡി കെ എം എസ് വഴിയുള്ള ഓട്ടോമാറ്റിക്ക് സൈനിങ്ങും എങ്ങനെ ക്രമീകരിക്കാം എന്നതിനെ പറ്റി:

ഉബുണ്ടുവിലെ shim-signed പാക്കേജിൽ update-secureboot-policy എന്നൊരു സ്ക്രിപ്റ്റ് ഉണ്ട്. ഡെബിയനിലെയും മറ്റും update-secureboot-policy യിൽ പുതിയ കീ തുടങ്ങിയ ഓപ്ഷനുകൾ ഇല്ല. ആകെ സെക്യൂർ ബൂട്ട് എനേബിൾ അല്ലെങ്കിൽ ഡിസേബിൾ ചെയ്യാനുള്ള ഓപ്ഷനുകളേ ഉള്ളു. എളുപ്പത്തിൽ ചെയ്യാവുന്ന കാര്യം, packages.ubuntu.com ഇൽ പോയി shim-signed പിന്നെ dkms എന്നിവയുടെ സോഴ്സ് ഡൗൺലോഡ് ചെയ്യുക. ഈ കമാൻ്റുകൾ ഒക്കെ ബാഷ് സ്ക്രിപ്റ്റുകൾ ആണ്. അവ വച്ച് നിങ്ങളുടെ സിറ്റത്തിൽ നിലവിലുള്ള അതേ ഫയലുകൾ റീപ്ലേസ് ചെയ്യുക, അല്ലെങ്കിൽ ചില്ലറ പണികൾ മാനുവലായി ചെയ്യുക.

ആദ്യമായി റൂട്ട് ആവുക

sudo -i
സിസ്റ്റത്തിലെ dkms കമാൻ്റ് ഏതാണെന്ന് ‘command -v dkms’ ഉപയോഗിച്ച് കണ്ടെത്തുക. മിക്കവാറും /usr/sbin/dkms എന്നായിരിക്കും കിട്ടുന്നത്. കിട്ടിയത് തുറന്ന് നോക്കുക. അതിൽ sign_build എന്ന ഫങ്ങ്ഷൻ കണ്ടെത്തുക. ഈ പാർട്ട് നിങ്ങളുടെ ഡി കെ എം എസിൽ ഇല്ലെങ്കിൽ ഉബുണ്ടുവിൻ്റെ ഡി കെ എം എസ് പാക്കേജിലെ ഡി കെ എം എസ് സ്ക്രിപ്റ്റ് വച്ച് ഇതിനെ റീപ്ലേസ് ചെയ്യുക. ഉണ്ടെങ്കിൽ ഏതാണ്ടിങ്ങനെ ആയിരിക്കും
[[ -x $(command -v kmodsign) && -d "/var/lib/shim-signed/mok/" ]] || return


ഇതിൽ kmodsign നിങ്ങളുടെ സിസ്റ്റത്തിൽ ഉണ്ടോന്ന് command -v kmodsign ഉപയോഗിച്ച് നോക്കുക. ഇല്ലെങ്കിൽ പേടിക്കണ്ട, അത് കെർണൽ സോഴ്സിലെ സൈൻ ഫയൽ കമാൻ്റ് തന്നെ ആണ്. കെർണൽ ബിൽഡിനാവശ്യമായ ഹെഡ്ഡറുകളും മറ്റും ഇൻസ്റ്റാൾ ചെയ്തിട്ടുണ്ടങ്കിൽ ആ ഫയൽ ഈ ലൊക്കേഷനിൽ കാണും.

/lib/modules/`uname -r`/build/scripts/sign-file


ഇനി ഡി കെ എം എസ്സിലെ സൈൻ ബിൽഡ് താഴെക്കാണുന്ന പോലെ ആക്കുക. മേലെ kmodsign ഒരു വേരിയബിൾ ആയി ഒന്ന് സെറ്റ് ചെയ്തേക്കുക.

kmodsign=/lib/modules/`uname -r`/build/scripts/sign-file

sign_build()
{
[[ -x $kmodsign && -d "/var/lib/shim-signed/mok/" ]] || return
local base_dir="$dkms_tree/$module/$module_version/$kernelver/$arch"
if type update-secureboot-policy >/dev/null 2>&1; then
echo $"Signing module:"
SHIM_NOTRIGGER=y update-secureboot-policy --new-key
for ko in `find "$base_dir/module/" -name "*.ko" -print`;
do
echo " - $ko"
$kmodsign sha512 \
/var/lib/shim-signed/mok/MOK.priv \
/var/lib/shim-signed/mok/MOK.der "$ko"
done
update-secureboot-policy --enroll-key
fi
}


അപ്പോ ഡി കെ എം എസ്സിൻ്റെ കാര്യം സെറ്റായി. ഇനി വേണ്ടത് സൈൻ ചെയ്യാനുള്ള കീയും അതിനെ ബയോസിൽ എൻറോൾ ചെയ്യലും ആണ്.

command -v update-secureboot-policy ഉപയോഗിച്ച് update-secureboot-policy എവിടെയാണെന്ന് കണ്ടെത്തുക. മിക്കവാറും /usr/sbin/update-secureboot-policy ആയിരിക്കും. തുറന്ന് നോക്കുക, അതിൽ താഴെപ്പറയുന്ന ഭാഗങ്ങൾ ഉണ്ടോ എന്ന്.

'--new-key')
create_mok
exit 0
;;


ഉണ്ടെങ്കിലും ഇല്ലെങ്കിലും ഈ സെറ്റപ്പ് ചെയ്യണം. ആദ്യം /usr/lib/shim/mok/openssl.cnf എന്ന ഫയൽ ഉണ്ടാക്കി അതിൽ താഴെയുള്ള സാധനങ്ങൾ ഇടണം.

HOME = /var/lib/shim-signed/mok
RANDFILE = /var/lib/shim-signed/mok/.rnd

[ req ]
distinguished_name = req_distinguished_name

x509_extensions = v3_ca
string_mask = utf8only

[ req_distinguished_name 

[ v3_ca ]
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical,CA:FALSE

# We use extended key usage information to limit what this auto-generated
# key can be used for.
#
# codeSigning: specifies that this key is used to sign code.
#
# 1.3.6.1.4.1.2312.16.1.2: defines this key as used for module signing
# only. See https://lkml.org/lkml/2015/8/26/741.
#
extendedKeyUsage = codeSigning,1.3.6.1.4.1.2312.16.1.2
nsComment = "OpenSSL Generated Certificate"



പിന്നെ
mkdir -p /var/lib/shim-signed/mok/

ഇനി,

Update-secureboot-policy യിൽ നേരത്തെ പറഞ്ഞ സാധനങ്ങൾ ഉണ്ടായിരുന്നെങ്കിൽ,

# update-secureboot-policy --new-key
# update-secureboot-policy --enroll-key

ഒരു പാസ്സ്‌വേർഡ് ചോദിക്കും. ഒരെണ്ണം സെറ്റ് ചെയ്യുക, ഓർത്ത് വയ്ക്കുക. ഇല്ലായിരുന്നെങ്കിൽ, ഒരു എം ഓ കെ ഉണ്ടാക്കുക,

# export SB_KEY="/var/lib/shim-signed/mok/MOK.der"
# export SB_PRIV="/var/lib/shim-signed/mok/MOK.priv"
# openssl req -config /usr/lib/shim/mok/openssl.cnf \
-subj "/CN=`hostname -s | cut -b1-31` Secure Boot Module Signature key" \
-new -x509 -newkey rsa:2048 \
-nodes -days 36500 -outform DER \
-keyout "$SB_PRIV" \
-out "$SB_KEY"

ഉണ്ടാക്കിയ കീ എൻറോൾ ചെയ്യുക,

# mokutil --import "$SB_KEY"

ഒരു പാസ്സ്‌വേർഡ് ചോദിക്കും. ഒരെണ്ണം സെറ്റ് ചെയ്യുക, ഓർത്ത് വയ്ക്കുക. സിസ്റ്റം റീസ്റ്റാർട്ട് ചെയ്യുക. ഇപ്പോൾ എംഓകെ എൻറോൾ ചെയ്യാനുള്ള ഓപ്ഷൻ കാണിക്കും. അത് സെലക്റ്റ് ചെയ്യുക, ചോദിക്കുമ്പോ നേരത്തേ സെറ്റ് ചെയ്ത പാസ്സ്‌വേർഡ് കൊടുക്കുക. അത്രേയുള്ളു.

ഇനി ഡി കെ എം എസ് ഉപയോഗിച്ച് വേണ്ട മൊഡ്യൂളുകളൊക്കെ ബിൽഡ് ചെയ്ത് ഉപയോഗിക്കാം.

അനുബന്ധ വായന:

  1. https://edk2-docs.gitbook.io/understanding-the-uefi-secure-boot-chain/additional_secure_boot_chain_implementations/machine_owner_key_mok
  2. https://en.wikipedia.org/wiki/Dynamic_Kernel_Module_Support
  3. https://edk2-docs.gitbook.io/understanding-the-uefi-secure-boot-chain/secure_boot_chain_in_uefi/uefi_secure_boot
  4. https://github.com/rhboot/shim

Thursday, August 19, 2021

പെർസിസ്റ്റൻ്റ് മെമ്മറി - pmem


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

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

കമ്പ്യൂട്ടറുകളിൽ നാല് തരം മെമ്മറി സംവിധാനങ്ങൾ ആണുള്ളത്.

1. സിപിയു രെജിസ്റ്ററുകൾ

2. സിപിയു കാഷ് മെമ്മറി

3. പ്രധാന മെമ്മറി - റാം

4. സെക്കൻ്ററി മെമ്മറി - ഹാർഡ് ഡിസ്ക്

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

 ഏറ്റവും വേഗത്തിൽ സിപിയുവിന് ലഭ്യമാകുന്ന വിവരങ്ങൾ സിപിയു രെജിസ്റ്ററുകളിൽ ഉള്ള വിവരങ്ങൾ ആണ്. ഒരു കമ്പ്യൂട്ടറിൽ ഏതാനും ബൈറ്റുകൾ മാത്രമായിരിക്കും ഇത്തരത്തിൽ ഉള്ള മെമ്മറി. ഒരു ബൈറ്റ് രേഖപ്പെടുത്താനുള്ള ചെലവ് ഏറ്റവും കൂടുതലും ഇതിൽ തന്നെ ആണ്.

സിപിയു രെജിസ്റ്ററുകൾ കഴിഞ്ഞാൽ ഏറ്റവും വേഗതയുള്ളത് സിപിയു കാഷ് മെമ്മറിയ്ക്കാണ്. ഓരോ സിപിയുവിനും ആധുനിക കമ്പ്യൂട്ടർ സിസ്റ്റങ്ങളിൽ ഒരു കാഷ് മെമ്മറി കൂടി കാണും. റാമിൽ നിന്ന് വിവരങ്ങൾ സിപിയുവിന് കിട്ടാനുള്ള താമസം സിപിയുവിനെ അതിൻ്റെ പ്രവർത്തനം തുടർച്ചയായി ചെയ്യുന്നതിൽ നിന്നും തടയാറുണ്ട്. അതുകൊണ്ട് സിപിയുവിന് കൂടെക്കൂടെ ആവശ്യം വരുന്ന വിവരങ്ങൾ കാഷ് മെമ്മറിയിൽ സൂക്ഷിക്കുകയും അത് സിപിയുവിന് വേഗത്തിൽ ലഭ്യമാക്കുകയും ചെയ്യുന്നു. കാഷ് മെമ്മറിയുടെ ഉപയോഗം മറ്റ് പല പ്രശ്നങ്ങളും ഉണ്ടാക്കാറുണ്ട്. ഒന്നിലധികം പ്രോസസ്സറുകൾ ഉള്ള സിസ്റ്റങ്ങൾ കാഷ് കൊഹറൻ്റ് അല്ലെങ്കിൽ (cache coherent) അതിനെ കൈകാര്യം ചെയ്യാൻ സോഫ്റ്റ് വെയറിന് കൂടുതൽ അധ്വാനിക്കേണ്ടിവരും.

കാഷ് മെമ്മറിയെക്കാൾ വേഗത കുറവായിരിക്കും റാമിന്. ഓരോ ബൈറ്റ് സ്റ്റോറേജിനും ഉള്ള വിലയും താരതമ്യേന കുറവായിരിക്കും. 4, 8, 16, 32, 64, 128, 256 ജിബി വലിപ്പത്തിൽ ഉള്ള റാം മെമ്മറി മൊഡ്യൂളുകൾ (DRAM DIMM) ലഭ്യമാണ്. വലിപ്പം കൂടുന്തോറും വിലയും കൂടും. റാമിൽ നിന്ന് സിപിയുവിന് വിവരങ്ങൾ ലഭ്യമാകാൻ എടുക്കുന്ന താമസം (latency) ശരാശരി 14 നാനോ സെക്കൻ്റുകൾ ആണ്. 

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

ബാക്കിയുള്ള മെമ്മറി സെക്കൻ്ററി സ്റ്റോറേജ് അധവാ ഹാർഡ് ഡിസ്ക് ആണ്. ടേപ്പ്, ഫ്ളോപ്പി, സിഡി, എസ് എസ് ഡി ഒക്കെ ഈ വിഭാഗത്തിൽ പെടും. ഇവ ATA, SATA, PCIe, USB, M2 തുടങ്ങി വിവിധതരം സംവിധാനങ്ങൾ വഴിയാണ് സിപിയുവുമായി ആശയവിനിമയം നടത്തുന്നത്. അതിനാൽ തന്നെ മറ്റ് മെമ്മറികളെ അപേക്ഷിച്ച് ഇവ ഒച്ചുകളായിരിക്കും. ടേപ്പുമായി താരതമ്യം ചെയ്താൽ എസ് എസ് ഡി കൾ വളരെ വേഗതയുള്ളവയാണ്. മില്ലി സെക്കൻ്റുകളിൽ ആയിരിക്കും ഇവയുടെ ലേറ്റൻസി. ഇത് നാനോസെക്കൻ്റ് ലേറ്റൻസി ഉള്ള റാമിനെക്കാൾ എത്ര വേഗത കുറഞ്ഞതാണ് എൻ ഊഹിക്കാമല്ലോ. പക്ഷേ ഇവയുടെ വില വളരെ കുറവാണ്. 1 ടിബി കപ്പാസിറ്റിയുള്ള ഡിസ്കിൻ്റെ വില മിക്കവാറും 8 ജിബി കപ്പാസിറ്റി ഉള്ള റാമിൻ്റെ വിലയെക്കാൾ കുറവാണല്ലോ. സെക്കൻ്ററി സ്റ്റോറേജ് ഡിവൈസുകൾ നോൺവോളറ്റൈൽ അഥവാ പെർസിസ്റ്റൻ്റ് ആണ്. വൈദ്യുതി നിലച്ചാലും ഇതിലെ വിവരങ്ങൾ നഷ്ടമാകുന്നില്ല.

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

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

SNIA (Storage Networking Industry Association) ആണ് പെർസിസ്റ്റൻ്റ് മെമ്മറി അഥവാ പി-മെം ഉമായി ബന്ധപ്പെട്ട സ്റ്റാൻഡേർഡുകൾ കൈകാര്യം ചെയ്യുന്നത്. പി-മെം റാമിനെക്കാൾ വേഗത അല്പം കുറഞ്ഞ (100 കണക്കിന് നാനോ സെക്കൻ്റുകൾ ലേറ്റൻസി), എന്നാൽ ചെലവ് വളരെ കുറഞ്ഞ മെമ്മറി മൊഡ്യൂളുകൾ ആണ്. ഇവ സാധാരണ 128, 256, 512 ജിബി വലിപ്പങ്ങളിൽ ആണ് വരുന്നത്. ഇവയെ പെർസിസ്റ്റൻ്റ് മെമ്മറി എന്ന് പറയാൻ കാരണം കരണ്ട് പോയാൽ ഇതിലെ ഉള്ളടക്കം നഷ്ടപ്പെടില്ല എന്നതുകൊണ്ടാണ്. ഒരു ഹാർഡ് ഡിസ്കിൽ എന്നപോലെ. ഇവയെ എൻവിഡിം (NVDIMM ) എന്നും പറയാറുണ്ട്. DIMM മൊഡ്യൂളുകൾ വോളറ്റൈൽ ആണല്ലോ.

പി-മെം മൊഡ്യൂളുകൾ സിപിയുവിൻ്റെ അഡ്രസ്സ് ബസ്സിൽ ആണ് ഘടിപ്പിക്കുന്നത്. അതിനാൽ തന്നെ വളരെയധികം വേഗത്തിൽ അവയ്ക്ക് സിപിയുവുമായി ആശയവിനിമയം നടത്താൻ സാധിക്കുന്നു. അഡ്രസ്സ് ബസ്സിൽ ആയതിനാൽ സിപിയു ഇവയുമായി ലോഡ് - സ്റ്റോർ രീതിയിൽ ആണ് ആശയവിനിമയം നടത്തുന്നത്. ഇടയിൽ സിസ്റ്റം ഏജൻ്റ് അല്ലാതെ മറ്റ് ഉപകരണങ്ങളുടെ ആവശ്യമില്ല. മെമ്മറി മാപ്പ്ഡ് രീതിയിൽ ആണെങ്കിൽ മെമ്മറി മാനേജ്മെൻ്റ് യൂണിറ്റ് കൂടി ഇതിൽ കക്ഷിചേരും. 

എൻവി - ഡിം മൊഡ്യൂളുകൾ സാധാരണ താഴെക്കൊടുത്ത രീതിയിൽ ആയിരിക്കും സിപിയുവുമായി ഘടിപ്പിക്കുന്നത്



ഒരു ഡ്യുവൽ ചാനൽ അഡ്രസ്സ് ബസ്സിൽ റാമിനൊപ്പം തന്നെ ഇവ ഘടിപ്പിക്കപ്പെട്ടിരിക്കുന്നു. മൊഡ്യൂളുകൾ രണ്ടിലധികം ഉണ്ടാവാം. 

2 വ്യത്യസ്ത രീതികളിൽ എൻവി - ഡിം മൊഡ്യൂളുകൾ പ്രവർത്തിക്കുന്നു. ഈ സംവിധാനം ഉള്ള കമ്പ്യൂട്ടറുകളിലെ ബയോസിൽ ഏത് രീതിയിലാണ് ഇവ പ്രവർത്തിക്കുന്നത് എന്ന് തെരഞ്ഞെടുക്കാനുള്ള സംവിധാനം ഉണ്ടായിരിക്കും.

1. മെമ്മറി മോഡ്

2. ആപ്പ് ഡയറക്റ്റ് മോഡ്

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

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

ഇൻ്റലിൻ്റെ 3ഡിഎക്സ് പോയിൻ്റ് ടെക്നോളജി ഉപയോഗിക്കുന്ന ഓപ്റ്റേൻ മെമ്മറി മൊഡ്യൂളുകളെക്കാൾ വേഗത കൂടുതലാണ് എൻവി - ഡിം മൊഡ്യൂളുകൾക്ക്. ഒപ്റ്റേൻ മെമ്മറി മൊഡ്യൂളുകൾ ഇൻ്റൽ പ്രോസസ്സറുകൾക്കൊപ്പമേ പ്രവർത്തിക്കുകയുള്ളു. പക്ഷേ എൻവി - ഡിം മൊഡ്യൂളുകൾക്ക് ഇത്തരം പരിധികൾ ഒന്നും ഇല്ല.

ആപ്പ് ഡയറക്റ്റ് മോഡിൽ പി-മെം മൊഡ്യൂളുകൾ കാര്യക്ഷമമായി ഉപയോഗിക്കാനുള്ള ലൈബ്രറികൾ ഓപ്പൺ സോഴ്സ് ആയി ലഭ്യമാണ്. https://pmem.io/pmdk/libpmem/ ഇൽ കൂടുതൽ വിവരങ്ങൾ കാണാം. കൂടുതൽ വായനയ്ക്ക് https://en.wikipedia.org/wiki/NVDIMM