**NVFS** (ראשי תיבות של Non-Volatile File System) משמעו בתרגום ישיר הוא "מערכת קבצים בלתי נדיפה", כלומר מערכת קבצים אשר תוכנה לא נמחק גם במידה ונותק הזרם החשמלי לזיכרון. מערכת קבצים זו ממומשת במחשבי כף יד מבוססי מערכת ההפעלה של פאלם הנקראת PalmOS. מערכת קבצים זו משתמשת בזיכרון שאינו נדיף, וזאת על מנת למנוע איבוד מידע במקרה של התרוקנות הסוללה, דבר שקרה במערכות קודמות לה.

מבנה ה-NVFS
-----------

חלוקת הזכרונות
לפני הופעת NVFS, מערכת הקבצים במכשירי פאלם הייתה בנויה משני רכיבי זיכרון:

* זיכרון פלאש, בתצורת NOR, אשר כונה בשם ROM. זיכרון זה נועד לקריאה בלבד ושימש לאיחסון מערכת ההפעלה ותוכנות נוספות כמו יומן, ספר כתובות וכיוצא באלה.
* זיכרון SDRAM, שהיה נדיף, ושימש לאיחסון של שאר התוכניות והקבצים. במצב של ניתוק מתח החשמל, כל המידע שאוחסן בזיכרון זה נמחק.

במכשירי פאלם מהדור החדש (Tungsten E2, T5, Treo 650, LifeDrive) הוצגה מערכת זיכרון חדשה הנקראת NVFS. במערכת זו הזיכרון כולו מאוחסן על רכיבי פלאש בתצורת NAND ולכן אינו נמחק גם במצב של ניתוק מתח החשמל בעקבות התרוקנות הסוללה, הוצאתה או כל סיבה אחרת. ב-LifeDrive קיים דיסק קשיח במקום זיכון פלאש, אך המימוש זהה.

### זיכרון אחסון התוכניות

ההבדל העיקרי בין זיכרון בתצורת NAND לבין זיכרון בתצורת NOR הוא בכך שבזיכרון NOR ניתן לגשת לכל חלק בזיכרון באופן ישיר. ב-NAND, לעומת זאת, ניתן לגשת רק לגושים בזיכרון ולא לכל כתובת ולכן לא ניתן להריץ ממנו תוכנות באופן ישיר, אלא יש צורך בהעברת המידע שבו לזיכרון אחר אשר מאפשר זאת. לכן, הזיכרון המשמש לשמירת תוכניות במערכת NVFS (**"זיכרון התוכניות"**) לא יכול לשמש גם כזיכרון ממנו רצות התוכניות. לצורך כך קיים במכשירים עם NVFS זיכרון נוסף, מבוסס SDRAM, שאליו מועברות התוכניות. זיכרון זה הוא נדיף ובמקרה של ניתוק המתח, יימחק כל המידע שעליו.

### הזיכרון הנדיף

הזיכרון הנדיף לא מיועד כולו להרצת התוכניות והוא מחולק לשלושה חלקים. ניתן להדגים זאת על פי החלוקה במכשירים T5 או Treo 650. במכשירים אלו יש 32MB של זיכרון SDRAM, המחולקים כך:

* 16MB משמשים לאחסון קובצי מערכת ההפעלה והתוכנות המובנות (התוכן שאוחסן ב-ROM). עם הפעלת המכשיר, מועתק תוכן ה-ROM, שנמצא בצורה דחוסה בחלק ייעודי בפלאש, לתוך חלק ייעודי זה בזיכרון הנדיף. חלק זה של הזיכרון מוגדר לקריאה בלבד ואינו ניתן לשינוי על ידי התוכניות. רק לאחר שתוכן ה-ROM הועבר בשלמותו מהפלאש עולה מערכת ההפעלה וניתן להריץ תוכניות.
* 6MB משמשים כ-Dynamic Heap. זה זיכרון המשמש את התוכנית הרצה לצורך העבודה שלה. זיכרון כזה היה קיים גם במכשירי הפאלם הישנים יותר.
* 10MB המשמשים לאחסון התוכניות (שמו הרשמי הוא DBCache. אנחנו נקרא לו **"זיכרון ריצה"** או RAM). לחלק זה מועתקת התוכנית המופעלת, עם כל קובצי הנתונים שלה, וממנו רצה התוכנית, שאינה יכולה לרוץ ישירות מזיכרון הפלאש (מאחר שהוא NAND).

במקרה של Hard Reset, נמחקים לחלוטין כל הזיכרון הנדיף (על כל שלושת חלקיו) וכל זיכרון התוכניות הנמצא בפלאש. נשאר רק החלק של הפלאש המכיל עותק דחוס של ה-ROM כדי שיוכל להטען למקומו ב-RAM לאחר ה-Reset.

אופן פעולת NVFS
---------------

לרוב, כאשר תוכנית מועתקת מהפלאש לזיכרון הריצה, היא משתנה שם או שנגרמים שינויים לקובצי הנתונים שלה, הנמצאים על אותו זיכרון ריצה נדיף. מערכת ההפעלה לחלוטין "אינה מודעת" לכך שישנו עותק על הפלאש, שצריך גם הוא להתעדכן למקרה של הפסקת חשמל. על מנת לפתור בעיה זו, הקבצים שבפלאש יעודכנו באחד מארבעת המקרים הבאים:

1. המכשיר כובה, בין אם ידנית או בעקבות תיזמון.
2. התוכנה הוגדרה על ידי המתכנת באופן שהפלאש יעודכן באופן יזום על ידי פונקציה שמיועדת לכך.
3. נעשה שינוי במאפייני התוכנה, נתונים כמו CreatorID, סוג התוכנית, שם התוכנית וכו'.
4. התוכנית או אחד מהקבצים שלה נסגרו. סגירה של תוכנית משמעו מעבר מאפליקציה אחת לשנייה או יציאה מאפליקציה פעילה. סגירת קובץ יכולה להתבצע גם ללא יציאה מתוכנית. לדוגמה, כאשר עובדים בתוכנה כמו אג'נדוס ומעדכנים פרטי איש קשר ומיד אחר כך פרטי פגישה. פרטי איש הקשר נשמרים בקובץ אחד ופרטי הפגישה בקובץ אחר. המעבר זה סוגר את קובץ אנשי הקשר ולכן גורם לעדכונו.

במקרים אלה, הקובץ נסרק על מנת לוודא שהוא תקין ואז מעודכן התאום שלו בפלאש.

גודל זיכרון הריצה מוגבל (בדוגמה שלנו הוא 10MB). אם נטענת תוכנה הגדולה ממנו, היא תוציא הודעת שגיאה על כך שאין די זיכרון להפעילה. אם נטענת תוכנה המשתמשת בבסיסי נתונים, וגודלם המצטבר עולה על גודל זיכרון הריצה הפנוי, מתחיל תהליך של פינוי זיכרון הריצה. תהליך זה שקוף למשתמש, והוא מתבצע, למעשה, באמצעות ניקוי תוכניות היושבות בזיכרון הריצה ושאינן נעולות. תוכניות אלו מעודכנות לפלאש ונמחקות מזיכרון הריצה. מדובר בעיקר בתוכניות שסיימו את עבודתן או תוכניות שירות שאמורות לרוץ ברקע. במהלך התהליך, מטבע הדברים, תורגש ירידה משמעותית בביצועים עקב הקריאה והכתיבה לזיכרון הפלאש.

ניתן, באמצעות תוכנות צד ג' (כמו SharkCache ו RLock) להגדיר תוכניות שתהיינה נעולות תמיד בזיכרון הריצה. תוכניות אלו לא תפוננה ממנו במקרה של תהליך פינוי הזיכרון. הדבר יגרום לכך שהן תופעלנה מהר וישירות מזיכרון הריצה. מומלץ לנעול תוכניות כאלו פחות ככל האפשר, כדי להשאיר זיכרון ריצה פנוי וגדול לתוכניות אחרות.

במידה שישנה תוכנית, המגדילה באופן עקבי בסיס נתונים עד שהוא עובר את גודל זיכרון הריצה, וכבר נוקו ממנו כל העודפים, מערכת ההפעלה ממשיכה על ידי ניקוי חכם, המוחק רשומות של אותו בסיס נתונים מזיכרון הריצה, לאחר שמעדכן אותן בפלאש.

ישנן תוכנות צד ג' (כמו DBCacheTool) שיודעות לנהל את זיכרון הריצה ולנקות אותו לפי הגדרות המשתמש, אם לדעתו של המשתמש מערכת ההפעלה לא עשתה פעולה זו כדרוש.

במכשירים החדשים יותר, כמו TX וגם Treo650 אחרי עדכון ROM 1.20, מתבצע ניקוי של זיכרון הריצה, כמו זה שמבצעת DBCachTool על ידי מערכת ההפעלה. במכשירים אלו, עם כל כניסה לדפדפן האינטרנט, מתבצע ניקוי וסידור של הזיכרון. גם כאשר תוכנה גדולה מנסה להטען, מתבצע ניקוי יעיל של זיכרון הריצה. כך, למעשה, אין צורך בתוכנות צד ג' לביצוע פעולות אלו.

באופן כללי, במכשירים אלו מנוהל הזיכרון בצורה יעילה יותר וגם נפח זיכרון הריצה גדל קצת על חשבון ROM קטן ויעיל יותר.

מבנה הקבצים של NVFS
-------------------

מבנה קבצים ישן
מבנה קבצים חדש
בעקבות השימוש בזיכרון בלתי נדיף בתצורת NAND, השתנה כל מבנה הקבצים של התוכניות ובסיסי הנתונים בפאלם. עד כה, הכל היה מאוחסן בזיכרון בצורה רציפה, וניתן היה לגשת ישירות לכתובות בזיכרון כדי לדלות מהן נתונים. במערכת NVFS הקבצים מסודרים, כמו במחשב, בגושים.

מבנה הגושים עבר שינויים מהותיים מאז שהומצאה ה NVFS.

מבנה הקבצים הישן ( Treo 650 או T5 לפני עדכוני ה ROM האחרונים) היה בנוי כך:
כל גוש היה בגודל של 512 בתים (Bytes). אם גודלו של קובץ היה פחות מגודל הגוש, הוא אוחסן בגוש אחד. אם יותר מכך, הוא נפרס על מספר גושים בהתאם לגודלו כאשר בכל גוש אוחסן חלק מהקובץ.

לדוגמה, קובץ שגודלו 60 בתים אוחסן בתוך גוש של 512 בתים. ובעצם תפס יותר מפי 8 מגודלו האמיתי.
קובץ שגודלו 700 בתים אוחסן בחלקים: החלק הראשון תפס גוש של 512 בתים במלואו והחלק השני, של 188 בתים, תפס עוד גוש. סה"כ תפס הקובץ 1024 בתים.

כפי שניתן להבחין מיד, שיטה זו הייתה בזבזנית ביותר, ובעצם נתנה למשתמש פחות זיכרון ממה שנראה לו. אם היו במכשיר 32MB פנויים למשתמש בזיכרון התוכניות, ניתן היה בפועל לאחסן בו פחות מכך בגלל השטח הריק שנשאר בגושים. לאור תלונות רבות של משתמשי פאלם החליטה החברה לחלק כרטיסי זיכרון לכל מי שקנה מכשיר באותה תקופה, כדי לחפות על החוסר בזיכרון במכשיר. לאחר מכן שוחרר עדכון ROM המשנה את מבנה הקבצים.

מכשירים שיצאו לאחר מכן כמו LifeDrive, T|E2 ובמכשירי Treo 650 ו T5 לאחר עדכון ה-ROM, מערכת הקבצים היא שונה:

גם כאן יש שימוש בגושים בגודל 512 בתים, אלא שניצולם הוא אחר. כאן, כל גוש מחולק ל 16 תת-גושים בגודל 32 בתים, המסוגלים לשמש לשמירת חלקי קבצים. ישנן מגבלות גם להשמת תת-גושים. מספר התת-גושים הדרושים לאחסון קובץ נקבע על ידי עיגול למעלה של גודל הקובץ, לחזקה הבאה של 2. בנוסף מיקום הקובץ יהיה לפי גודלו. כלומר, קובץ של תת-גוש אחד יכול להיות ממוקם בכל מקום בגוש. קובץ של 4 תת-גושים יוכל להתחיל רק בכל 128 בתים כלומר, כל רבע גוש וכך הלאה.

לדוגמה: קובץ של 60 בתים יאוחסן בתוך גוש של 512 בתים אבל יתפוס רק 64 בתים מתוכו (שני תת-גושים).
קובץ של 700 בתים, יתפוס גוש שלם של 512 בתים והשארית, 188 בתים, תוכל להיות מאוסנת בגוש אחר. לדוגמה, יהיה לו מספיק מקום פנוי בתת-גוש עם הקובץ הקטן (60 בתים), אבל בגלל גודלו, העיגול למעלה משמעו שהוא יתפוס 256 בתים, כלומר 8 תת-גושים ולכן יוכל להיות ממוקם או בתחילת הגוש או באמצעו. למרות שיש שטח מבוזבז, זה משאיר מספיק מקום פנוי לאחסון של קובץ נוסף בגודל של עד 129 בתים.

קישורים חיצוניים
----------------

סקירת NVFS מתוך האתר PDAce (אורכב 28.03.2006 בארכיון Wayback Machine)