שימוש ב-Binder IPC

דף זה מתאר שינויים במנהל ההתקן של הקלסר ב-Android 8, מספק פרטים על השימוש ב-IPC של קלסר ומפרט את מדיניות ה-SELinux הנדרשת.

שינויים בדרייבר של קלסר

החל באנדרואיד 8, המסגרת של Android ו-HAL מתקשרים זה עם זה באמצעות קלסר. מכיוון שתקשורת זו מגדילה באופן דרמטי את תעבורת הקלסרים, אנדרואיד 8 כוללת מספר שיפורים שנועדו לשמור על IPC מהיר של קלסר. ספקי SoC ויצרני OEM צריכים להתמזג ישירות מהענפים הרלוונטיים של android-4.4, android-4.9 ומעלה של פרויקט הקרנל/המשותף .

דומיינים של קלסר מרובים (הקשרים)

Common-4.4 ומעלה, כולל במעלה הזרם

כדי לפצל בצורה נקייה את תעבורת הקלסר בין מסגרת (ללא מכשיר) וקוד ספק (ספציפי למכשיר), אנדרואיד 8 הציגה את המושג של הקשר מקשר . לכל הקשר קלסר יש צומת מכשיר משלו ומנהל הקשר (שירות) משלו. אתה יכול לגשת למנהל ההקשר רק דרך צומת ההתקן שאליו הוא שייך, וכאשר מעבירים צומת מקשר דרך הקשר מסוים, הוא נגיש מאותו הקשר רק על ידי תהליך אחר, ובכך מבודד לחלוטין את התחומים אחד מהשני. לפרטים על השימוש, ראה vndbinder ו- vndservicemanager .

פיזור-לאסוף

Common-4.4 ומעלה, כולל במעלה הזרם

במהדורות קודמות של אנדרואיד, כל פיסת נתונים ב-Binder Call הועתקה שלוש פעמים:

  • פעם אחת לסדר אותו Parcel בתהליך ההתקשרות
  • פעם אחת במנהל ההתקן של הליבה כדי להעתיק את Parcel לתהליך היעד
  • פעם אחת כדי לבטל את הסידרה של Parcel בתהליך היעד

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

נעילה עדינה

Common-4.4 ומעלה, כולל במעלה הזרם

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

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

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

ירושה עדיפות בזמן אמת

Common-4.4 ו- Common-4.9 (במעלה הזרם בקרוב)

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

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

שינויים במרחב המשתמש

אנדרואיד 8 כולל את כל השינויים במרחב המשתמש הנדרשים כדי לעבוד עם מנהל ההתקן הנוכחי של ה-binder בקרנל המשותף, למעט יוצא מן הכלל אחד: היישום המקורי להשבית תורשת עדיפות בזמן אמת עבור /dev/binder השתמש ב- ioctl . הפיתוח שלאחר מכן העביר את השליטה בירושה עדיפות לשיטה עדינה יותר שהיא לפי מצב קלסר (ולא לפי הקשר). לפיכך, ה-ioctl אינו נמצא בסניף הנפוץ של אנדרואיד והוא נשלח במקום זאת בגרעין הנפוצים שלנו .

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

SHAs עבור גרעינים נפוצים

כדי להשיג את השינויים הדרושים במנהל ההתקן של הקלסר, סנכרן ל-SHA המתאים:

  • משותף-3.18
    cc8b90c121de ANDROID: קלסר: אל תבדוק הרשאות מקדימות בשחזור.
  • משותף-4.4
    76b376eac7a2 ANDROID: קלסר: אל תבדוק הרשאות מוקדמות בשחזור.
  • משותף-4.9
    ecd972d4f9b5 ANDROID: קלסר: אל תבדוק הרשאות מוקדמות בשחזור.

באמצעות קלסר IPC

מבחינה היסטורית, תהליכי ספק השתמשו בתקשורת בין תהליכים מקשר (IPC) כדי לתקשר. באנדרואיד 8, צומת מכשיר /dev/binder הופך בלעדי לתהליכי מסגרת, כלומר לתהליכי הספק אין יותר גישה אליו. תהליכי הספק יכולים לגשת ל- /dev/hwbinder , אך חייבים להמיר את ממשקי ה-AIDL שלהם לשימוש ב-HIDL. עבור ספקים שרוצים להמשיך להשתמש בממשקי AIDL בין תהליכי הספק, אנדרואיד תומך ב-IPC של קלסר כמתואר להלן. באנדרואיד 10, Stable AIDL מאפשר לכל התהליכים להשתמש /dev/binder תוך פתרון של היציבות שמבטיחים שה-HIDL ו- /dev/hwbinder פתרו. כיצד להשתמש ב-Stable AIDL, ראה AIDL for HALs .

vndbinder

אנדרואיד 8 תומך בדומיין קלסר חדש לשימוש על ידי שירותי ספקים, אליו ניתן לגשת באמצעות /dev/vndbinder במקום /dev/binder . עם התוספת של /dev/vndbinder , לאנדרואיד יש כעת את שלושת הדומיינים הבאים של IPC:

דומיין IPC תיאור
/dev/binder IPC בין תהליכי מסגרת/אפליקציה עם ממשקי AIDL
/dev/hwbinder IPC בין תהליכי מסגרת/ספק עם ממשקי HIDL
IPC בין תהליכי ספק עם ממשקי HIDL
/dev/vndbinder IPC בין תהליכי ספק/ספק עם ממשקי AIDL

כדי ש- /dev/vndbinder יופיע, ודא שפריט תצורת הליבה CONFIG_ANDROID_BINDER_DEVICES מוגדר ל- "binder,hwbinder,vndbinder" (זוהי ברירת המחדל בעצי הליבה הנפוצים של אנדרואיד).

בדרך כלל, תהליכי הספק אינם פותחים את מנהל ההתקן של הקלסר באופן ישיר ובמקום זאת מקשרים אל ספריית מרחב המשתמש libbinder , אשר פותחת את מנהל ההתקן של הקלסר. הוספת שיטה עבור ::android::ProcessState() בוחרת את מנהל ההתקן של ה-binder עבור libbinder . תהליכי הספק צריכים לקרוא לשיטה זו לפני קריאה ל- ProcessState, IPCThreadState , או לפני ביצוע קריאות בינדר באופן כללי. כדי להשתמש, הכנס את הקריאה הבאה אחרי main() של תהליך ספק (לקוח ושרת):

ProcessState::initWithDriver("/dev/vndbinder");

vndservicemanager

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

עם זאת, שירותי ספקים יכולים כעת להשתמש vndservicemanager , מופע חדש של servicemanager המשתמש ב- /dev/vndbinder במקום /dev/binder ואשר בנוי מאותם מקורות כמו framework servicemanager . תהליכי ספק אינם צריכים לבצע שינויים כדי לדבר עם vndservicemanager ; כאשר תהליך ספק נפתח / dev/vndbinder , חיפושי שירות עוברים אוטומטית אל vndservicemanager .

הקובץ הבינארי vndservicemanager כלול בקבצי makefile ברירת המחדל של מכשיר אנדרואיד.

מדיניות SELinux

תהליכי ספק שרוצים להשתמש בפונקציונליות של קלסר כדי לתקשר זה עם זה צריכים את הדברים הבאים:

  1. גישה אל /dev/vndbinder .
  2. Binder {transfer, call} מתחבר ל- vndservicemanager .
  3. binder_call(A, B) עבור כל תחום A של ספק שרוצה להתקשר לתחום B של ספק דרך ממשק ה-Binder של הספק.
  4. הרשאה {add, find} שירותים ב- vndservicemanager .

כדי לעמוד בדרישות 1 ו-2, השתמש במאקרו vndbinder_use() :

vndbinder_use(some_vendor_process_domain);

כדי למלא את דרישה 3, ה- binder_call(A, B) עבור תהליכי ספק A ו-B שצריכים לדבר על קלסר יכול להישאר במקום, ואינו זקוק לשינוי שם.

כדי למלא את דרישה 4, עליך לבצע שינויים באופן הטיפול בשמות שירות, תוויות שירות וכללים.

לפרטים על SELinux, ראה לינוקס משופרת באבטחה באנדרואיד . לפרטים על SELinux באנדרואיד 8.0, ראה SELinux עבור אנדרואיד 8.0 .

שמות שירותים

בעבר, הספק מעבד שמות שירות רשומים בקובץ service_contexts והוסיף כללים מתאימים לגישה לקובץ זה. קובץ service_contexts לדוגמה ממכשיר device/google/marlin/sepolicy :

AtCmdFwd                              u:object_r:atfwd_service:s0
cneservice                            u:object_r:cne_service:s0
qti.ims.connectionmanagerservice      u:object_r:imscm_service:s0
rcs                                   u:object_r:radio_service:s0
uce                                   u:object_r:uce_service:s0
vendor.qcom.PeripheralManager         u:object_r:per_mgr_service:s0

באנדרואיד 8, vndservicemanager טוען במקום זאת את הקובץ vndservice_contexts . יש להוסיף שירותי ספקים שעוברים ל- vndservicemanager (וכבר נמצאים בקובץ service_contexts הישן) לקובץ vndservice_contexts החדש.

תוויות שירות

בעבר, תוויות שירות כגון u:object_r:atfwd_service:s0 הוגדרו בקובץ service.te . דוגמא:

type atfwd_service,      service_manager_type;

באנדרואיד 8, עליך לשנות את הסוג ל- vndservice_manager_type ולהעביר את הכלל לקובץ vndservice.te . דוגמא:

type atfwd_service,      vndservice_manager_type;

חוקי מנהל השירות

בעבר, כללים העניקו לדומיינים גישה להוסיף או למצוא שירותים מ- servicemanager . דוגמא:

allow atfwd atfwd_service:service_manager find;
allow some_vendor_app atfwd_service:service_manager add;

באנדרואיד 8, חוקים כאלה יכולים להישאר במקומם ולהשתמש באותה כיתה. דוגמא:

allow atfwd atfwd_service:service_manager find;
allow some_vendor_app atfwd_service:service_manager add;