অ্যান্ড্রয়েড লাইভ-লক ডেমন (llkd)

অ্যান্ড্রয়েড 10 এ অ্যান্ড্রয়েড লাইভ-লক ডেমন ( llkd ) অন্তর্ভুক্ত রয়েছে, যা কার্নেল অচলাবস্থাগুলিকে ধরতে এবং প্রশমিত করার জন্য ডিজাইন করা হয়েছে৷ llkd কম্পোনেন্ট একটি ডিফল্ট স্বতন্ত্র বাস্তবায়ন প্রদান করে, কিন্তু আপনি বিকল্পভাবে llkd কোডটিকে অন্য একটি পরিষেবাতে সংহত করতে পারেন, প্রধান লুপের অংশ হিসাবে বা একটি পৃথক থ্রেড হিসাবে।

সনাক্তকরণ দৃশ্যকল্প

llkd দুটি সনাক্তকরণ পরিস্থিতি রয়েছে: স্থায়ী D বা Z অবস্থা, এবং স্থায়ী স্ট্যাক স্বাক্ষর।

ক্রমাগত D বা Z অবস্থা

যদি একটি থ্রেড D (নিরবচ্ছিন্ন ঘুম) বা Z (জম্বি) অবস্থায় থাকে ro.llk.timeout_ms or ro.llk.[D|Z].timeout_ms llkd বেশি সময় ধরে অগ্রগতি ছাড়াই। ) যদি পরবর্তী স্ক্যান দেখায় যে একই প্রক্রিয়াটি অব্যাহত রয়েছে, llkd একটি লাইভ-লক অবস্থা নিশ্চিত করে এবং কার্নেলটিকে এমনভাবে আতঙ্কিত করে যা শর্তটির জন্য সবচেয়ে বিশদ বাগ রিপোর্ট প্রদান করে।

llkd এর মধ্যে একটি স্ব-প্রহরী রয়েছে যা llkd লক আপ হলে অ্যালার্ম দেয়; ওয়াচডগ মেইনলুপের মধ্য দিয়ে প্রবাহিত হওয়ার প্রত্যাশিত সময়ের দ্বিগুণ এবং প্রতি ro.llk_sample_ms নমুনা নেওয়া হয়।

অবিরাম স্ট্যাক স্বাক্ষর

ইউজারডিবাগ রিলিজের জন্য, llkd ক্রমাগত স্ট্যাক সিগনেচার চেকিং ব্যবহার করে কার্নেল লাইভ-লক সনাক্ত করতে পারে। যদি Z ব্যতীত অন্য কোনো অবস্থায় একটি থ্রেডের একটি স্থায়ী তালিকাভুক্ত ro.llk.stack কার্নেল চিহ্ন থাকে যা ro.llk.timeout_ms বা ro.llk.stack.timeout_ms এর চেয়ে বেশি সময়ের জন্য রিপোর্ট করা হয়, llkd প্রক্রিয়াটিকে মেরে ফেলে (এমনকি যদি ফরওয়ার্ড থাকে সময়সূচী অগ্রগতি)। যদি পরবর্তী স্ক্যান দেখায় যে একই প্রক্রিয়াটি অব্যাহত রয়েছে, llkd একটি লাইভ-লক অবস্থা নিশ্চিত করে এবং কার্নেলটিকে এমনভাবে আতঙ্কিত করে যা শর্তটির জন্য সবচেয়ে বিশদ বাগ রিপোর্ট প্রদান করে।

যখন লাইভ লক কন্ডিশন বিদ্যমান থাকে এবং লিনাক্সে /proc/pid/stack ফাইলে রচিত স্ট্রিং " symbol+0x" বা " symbol.cfi+0x" সন্ধান করে তখন lldk চেক ক্রমাগত চলতে থাকে। প্রতীকগুলির তালিকা ro.llk.stack এ রয়েছে এবং " cma_alloc,__get_user_pages,bit_wait_io,wait_on_page_bit_killable " এর কমা-বিভাজিত তালিকায় ডিফল্ট।

প্রতীকগুলি বিরল এবং স্বল্পস্থায়ী হওয়া উচিত যাতে একটি সাধারণ সিস্টেমে ফাংশনটি ro.llk.stack.timeout_ms এর সময়সীমার সময় একটি নমুনায় শুধুমাত্র একবার দেখা যায় (প্রতি ro.llk.check_ms নমুনাগুলি ঘটে)৷ ABA সুরক্ষার অভাবের কারণে, এটি একটি মিথ্যা ট্রিগার প্রতিরোধ করার একমাত্র উপায়। প্রতীক ফাংশনটি অবশ্যই লকটিকে কল করার ফাংশনের নীচে উপস্থিত হতে হবে যা বিতর্ক করতে পারে। যদি লকটি নীচে বা প্রতীক ফাংশনে থাকে, তবে প্রতীকটি সমস্ত প্রভাবিত প্রক্রিয়াগুলিতে উপস্থিত হয়, শুধুমাত্র লকআপের কারণ নয়।

কভারেজ

llkd এর ডিফল্ট বাস্তবায়ন init , [kthreadd] , বা [kthreadd] spawns নিরীক্ষণ করে না। llkd কভার করার জন্য [kthreadd] -স্পন করা থ্রেড:

  • ড্রাইভারদের অবিরাম D অবস্থায় থাকতে হবে না,

বা

  • থ্রেডটি বাহ্যিকভাবে মেরে ফেলা হলে ড্রাইভারদের অবশ্যই পুনরুদ্ধার করার ব্যবস্থা থাকতে হবে। উদাহরণস্বরূপ, wait_event() এর পরিবর্তে wait_event_interruptible() ব্যবহার করুন।

যদি উপরের শর্তগুলির মধ্যে একটি পূরণ করা হয়, তাহলে llkd ব্ল্যাকলিস্ট কার্নেলের উপাদানগুলিকে কভার করার জন্য সামঞ্জস্য করা যেতে পারে। স্ট্যাক সিম্বল চেকিং ptrace অপারেশনগুলিকে ব্লক করে এমন পরিষেবাগুলিতে সিপলিসি লঙ্ঘন প্রতিরোধ করার জন্য একটি অতিরিক্ত প্রক্রিয়া কালো তালিকা অন্তর্ভুক্ত করে।

অ্যান্ড্রয়েড বৈশিষ্ট্য

llkd বেশ কয়েকটি অ্যান্ড্রয়েড বৈশিষ্ট্যে সাড়া দেয় (নীচে তালিকাভুক্ত)।

  • prop_ms নামের বৈশিষ্ট্যগুলি মিলিসেকেন্ডে রয়েছে।
  • তালিকার জন্য কমা (,) বিভাজক ব্যবহার করে এমন বৈশিষ্ট্যগুলি ডিফল্ট এন্ট্রি সংরক্ষণ করতে একটি অগ্রণী বিভাজক ব্যবহার করে, তারপর যথাক্রমে ঐচ্ছিক প্লাস (+) এবং বিয়োগ (-) উপসর্গ সহ এন্ট্রি যোগ বা বিয়োগ করে। এই তালিকাগুলির জন্য, স্ট্রিং "false" একটি খালি তালিকার সমার্থক, এবং ফাঁকা বা অনুপস্থিত এন্ট্রি নির্দিষ্ট ডিফল্ট মান অবলম্বন করে।

ro.config.low_ram

ডিভাইসটি সীমিত মেমরির সাথে কনফিগার করা হয়েছে।

ro.debuggable

ডিভাইসটি userdebug বা eng বিল্ডের জন্য কনফিগার করা হয়েছে।

ro.llk.sysrq_t

প্রপার্টি "eng" হলে, ডিফল্ট ro.config.low_ram বা ro.debuggable হয় না। সত্য হলে, সমস্ত থ্রেড ডাম্প করুন ( sysrq t )।

ro.llk.enable

লাইভ-লক ডেমনকে সক্ষম করার অনুমতি দিন। ডিফল্ট মিথ্যা.

llk.enable

eng বিল্ডের জন্য মূল্যায়ন করা হয়েছে। ডিফল্ট হল ro.llk.enable

ro.khungtask.enable

[khungtask] ডেমনকে সক্রিয় করার অনুমতি দিন। ডিফল্ট মিথ্যা.

khungtask.enable

eng বিল্ডের জন্য মূল্যায়ন করা হয়েছে। ডিফল্ট হল ro.khungtask.enable

ro.llk.mlockall

mlockall() এ কল চালু করুন। ডিফল্ট মিথ্যা.

ro.khungtask.timeout

[khungtask] সর্বোচ্চ সময়সীমা। ডিফল্ট 12 মিনিট।

ro.llk.timeout_ms

D বা Z সর্বোচ্চ সময়সীমা। ডিফল্ট 10 মিনিট। llkd এর জন্য অ্যালার্ম ওয়াচডগ সেট করতে এই মানটিকে দ্বিগুণ করুন।

ro.llk.D.timeout_ms

ডি সর্বোচ্চ সময়সীমা। ডিফল্ট হল ro.llk.timeout_ms

ro.llk.Z.timeout_ms

Z সর্বোচ্চ সময়সীমা। ডিফল্ট হল ro.llk.timeout_ms

ro.llk.stack.timeout_ms

ক্রমাগত স্ট্যাক প্রতীক সর্বোচ্চ সময়সীমা জন্য চেক. ডিফল্ট হল ro.llk.timeout_msশুধুমাত্র userdebug বা eng বিল্ডে সক্রিয়

ro.llk.check_ms

ডি বা জেডের জন্য থ্রেডের নমুনা। ডিফল্ট দুই মিনিট।

ro.llk.stack

কার্নেল স্ট্যাক চিহ্নগুলির জন্য পরীক্ষা করে যেটি যদি ক্রমাগত উপস্থিত থাকে তবে একটি সাবসিস্টেম লক আপ করা নির্দেশ করতে পারে। ডিফল্ট হল cma_alloc,__get_user_pages,bit_wait_io,wait_on_page_bit_killable কমা দ্বারা পৃথক করা কার্নেল চিহ্নের তালিকা। ro.llk.stack.timeout_ms সময়কাল ধরে প্রতিটি ro.llk_check_ms পোলিং করা ছাড়া চেক ফরওয়ার্ড শিডিউলিং ABA করে না, তাই স্ট্যাক প্রতীকগুলি ব্যতিক্রমীভাবে বিরল এবং ক্ষণস্থায়ী হওয়া উচিত (একটি প্রতীকের জন্য সব ক্ষেত্রে অবিরামভাবে প্রদর্শিত হওয়ার সম্ভাবনা খুবই কম। স্ট্যাকের নমুনা)। স্ট্যাক সম্প্রসারণে " symbol+0x" বা " symbol.cfi+0x" এর জন্য একটি মিলের জন্য পরীক্ষা করে। শুধুমাত্র userdebug বা eng বিল্ডে উপলব্ধ ; ব্যবহারকারী বিল্ডে নিরাপত্তা উদ্বেগের ফলে সীমিত সুযোগ-সুবিধা হয় যা এই চেককে আটকায়।

ro.llk.blacklist.process

llkd নির্দিষ্ট প্রসেস দেখে না। ডিফল্ট হল 0,1,2 ( kernel , init , এবং [kthreadd] ) প্লাস প্রক্রিয়ার নাম init,[kthreadd],[khungtaskd],lmkd,llkd,watchdogd, [watchdogd],[watchdogd/0],...,[watchdogd/get_nprocs-1] । একটি প্রক্রিয়া একটি comm , cmdline , বা pid রেফারেন্স হতে পারে। একটি স্বয়ংক্রিয় ডিফল্ট বর্তমান সর্বাধিক সম্পত্তি আকার 92 এর চেয়ে বড় হতে পারে।

ro.llk.blacklist.parent

llkd নির্দিষ্ট অভিভাবক(গুলি) আছে এমন প্রসেস দেখে না। ডিফল্ট হল 0,2,adbd&[setsid] ( kernel , [kthreadd] , এবং adbd শুধুমাত্র zombie setsid এর জন্য)। একটি অ্যাম্পারস্যান্ড (&) বিভাজক নির্দিষ্ট করে যে অভিভাবককে শুধুমাত্র লক্ষ্য শিশু প্রক্রিয়ার সাথে একত্রে উপেক্ষা করা হয়। Ampersand নির্বাচন করা হয়েছিল কারণ এটি কখনই একটি প্রক্রিয়া নামের অংশ নয়; যাইহোক, শেলের একটি setprop জন্য অ্যাম্পারস্যান্ডকে এস্কেপ বা উদ্ধৃত করা প্রয়োজন, যদিও init rc ফাইল যেখানে এটি সাধারণত নির্দিষ্ট করা হয় সেখানে এই সমস্যা নেই। একটি অভিভাবক বা লক্ষ্য প্রক্রিয়া একটি comm , cmdline , বা pid রেফারেন্স হতে পারে৷

ro.llk.blacklist.uid

llkd নির্দিষ্ট uid(গুলি) এর সাথে মেলে এমন প্রক্রিয়াগুলি দেখে না। ইউআইডি নম্বর বা নামের কমা দ্বারা পৃথক করা তালিকা। ডিফল্ট খালি বা মিথ্যা।

ro.llk.blacklist.process.stack

llkd লাইভ লক স্ট্যাক স্বাক্ষরের জন্য প্রসেসের নির্দিষ্ট উপসেট নিরীক্ষণ করে না। ডিফল্ট হল প্রক্রিয়ার নাম init,lmkd.llkd,llkd,keystore,ueventd,apexd,logdptrace ব্লক করে এমন প্রসেসের সাথে যুক্ত সিপলিসি লঙ্ঘন প্রতিরোধ করে (যেহেতু এগুলো চেক করা যায় না)। শুধুমাত্র userdebug এবং eng বিল্ডে সক্রিয় । বিল্ড প্রকারের বিস্তারিত জানার জন্য, বিল্ডিং অ্যান্ড্রয়েড দেখুন।

স্থাপত্য উদ্বেগ

  • বৈশিষ্ট্যগুলি 92টি অক্ষরের মধ্যে সীমাবদ্ধ (তবে, উত্সগুলিতে include/llkd.h ফাইলে সংজ্ঞায়িত ডিফল্টগুলির জন্য এটি উপেক্ষা করা হয়)।
  • অন্তর্নির্মিত [khungtask] ডেমনটি খুব সাধারণ এবং ড্রাইভার কোডে ট্রিপ করে যা D অবস্থায় খুব বেশি বসে থাকে। S-তে স্যুইচ করা কাজ(গুলি) হত্যাযোগ্য করে তুলবে (এবং প্রয়োজনে ড্রাইভারদের দ্বারা পুনরুত্থানযোগ্য)।

লাইব্রেরি ইন্টারফেস (ঐচ্ছিক)

আপনি ঐচ্ছিকভাবে libllkd উপাদান থেকে নিম্নলিখিত C ইন্টারফেস ব্যবহার করে অন্য বিশেষ সুবিধাপ্রাপ্ত ডেমনে llkd অন্তর্ভুক্ত করতে পারেন:

#include "llkd.h"
bool llkInit(const char* threadname) /* return true if enabled */
unsigned llkCheckMillseconds(void)   /* ms to sleep for next check */

যদি একটি থ্রেডনাম প্রদান করা হয়, একটি থ্রেড স্বয়ংক্রিয়ভাবে তৈরি হয়, অন্যথায় কলকারীকে তার প্রধান লুপে llkCheckMilliseconds কল করতে হবে। এই হ্যান্ডলারের পরবর্তী প্রত্যাশিত কলের আগে ফাংশনটি সময়কাল ফেরত দেয়।