BPF සහ eBPF සඳහා කෙටි හැඳින්වීමක්

හෙලෝ, හබ්ර්! අපි පොතක් එළිදැක්වීමට සූදානම් කරමින් සිටින බව ඔබට දන්වන්න කැමතියි."BPF සමඟ ලිනක්ස් නිරීක්ෂණ හැකියාව".

BPF සහ eBPF සඳහා කෙටි හැඳින්වීමක්
BPF අතථ්‍ය යන්ත්‍රය අඛණ්ඩව විකාශනය වන අතර ප්‍රායෝගිකව ක්‍රියාකාරීව භාවිතා වන බැවින්, එහි ප්‍රධාන හැකියාවන් සහ වත්මන් තත්ත්වය විස්තර කරන ලිපියක් අපි ඔබ වෙනුවෙන් පරිවර්තනය කර ඇත.

මෑත වසරවලදී, ඉහළ කාර්ය සාධනයක් සහිත පැකට් සැකසුම් අවශ්‍ය වන අවස්ථාවලදී ලිනක්ස් කර්නලයේ සීමාවන් සඳහා වන්දි ගෙවීම සඳහා ක්‍රමලේඛන මෙවලම් සහ ශිල්පීය ක්‍රම වැඩි වැඩියෙන් ජනප්‍රිය වී ඇත. මෙම ආකාරයේ වඩාත් ජනප්රිය තාක්ෂණික ක්රම වලින් එකක් ලෙස හැඳින්වේ කර්නල් බයිපාස් (කර්නල් බයිපාස්) සහ කර්නල් ජාල ස්තරය මගහැර පරිශීලක අවකාශයේ සිට සියලුම පැකට් සැකසුම් සිදු කිරීමට ඉඩ සලසයි. කර්නලය මඟ හැරීමෙන් ජාල කාඩ්පත පාලනය කිරීම ද ඇතුළත් වේ පරිශීලක අවකාශය. වෙනත් වචන වලින් කිවහොත්, ජාල කාඩ්පතක් සමඟ වැඩ කරන විට, අපි ධාවකය මත රඳා පවතී පරිශීලක අවකාශය.

ජාල කාඩ්පතෙහි සම්පූර්ණ පාලනය පරිශීලක-අවකාශ වැඩසටහනකට මාරු කිරීමෙන්, අපි කර්නලය උඩින් (සන්දර්භය මාරු කිරීම, ජාල ස්ථර සැකසීම, බාධා කිරීම් ආදිය) අඩු කරමු, එය 10Gb/s හෝ ඊට වැඩි වේගයකින් ධාවනය වන විට ඉතා වැදගත් වේ. කර්නල් බයිපාස් සහ අනෙකුත් විශේෂාංග වල එකතුවක් (කණ්ඩායම් සැකසීම) සහ ප්‍රවේශමෙන් කාර්ය සාධන සුසර කිරීම (NUMA ගිණුම්කරණය, CPU හුදකලා කිරීම, ආදිය) පරිශීලක අවකාශයේ ඉහළ කාර්ය සාධන ජාල සැකසීමේ මූලධර්මවලට අනුරූප වේ. පැකට් සැකසීම සඳහා මෙම නව ප්‍රවේශයේ ආදර්ශවත් උදාහරණයක් විය හැකිය ඩීපීඩීකේ Intel වෙතින් (දත්ත තල සංවර්ධන කට්ටලය), Cisco's VPP (Vector Packet Processing), Netmap සහ, ඇත්තෙන්ම, ඇතුළුව වෙනත් ප්‍රසිද්ධ මෙවලම් සහ ශිල්පීය ක්‍රම ඇතත්, ස්නාබ්.

පරිශීලක අවකාශයේ ජාල අන්තර්ක්‍රියා සංවිධානය කිරීම අවාසි ගණනාවක් ඇත:

  • OS කර්නලය දෘඪාංග සම්පත් සඳහා වියුක්ත ස්ථරයකි. පරිශීලක අභ්යවකාශ වැඩසටහන් ඔවුන්ගේ සම්පත් සෘජුවම කළමනාකරණය කළ යුතු නිසා, ඔවුන්ගේම දෘඩාංග කළමනාකරණය කිරීමටද සිදු වේ. මෙය බොහෝ විට අදහස් වන්නේ ඔබේම ධාවක වැඩසටහන්ගත කිරීමයි.
  • අපි කර්නල් ඉඩ සම්පූර්ණයෙන්ම අත්හරින නිසා, අපි කර්නලය මඟින් සපයන සියලුම ජාලකරණ ක්‍රියාකාරීත්වයද අත්හරිමු. පරිශීලක අභ්‍යවකාශ වැඩසටහන් දැනටමත් කර්නලය හෝ මෙහෙයුම් පද්ධතිය මඟින් ලබා දී ඇති විශේෂාංග නැවත ක්‍රියාත්මක කළ යුතුය.
  • වැඩසටහන් සෑන්ඩ්බොක්ස් මාදිලියේ ක්‍රියාත්මක වන අතර එමඟින් ඒවායේ අන්තර්ක්‍රියා බරපතල ලෙස සීමා කරන අතර මෙහෙයුම් පද්ධතියේ අනෙකුත් කොටස් සමඟ ඒකාබද්ධ වීම වළක්වයි.

සාරාංශයක් ලෙස, පරිශීලක අවකාශය තුළ ජාලගත කිරීමේදී, කර්නලයේ සිට පරිශීලක අවකාශය වෙත පැකට් සැකසුම් ගෙනයාමෙන් කාර්ය සාධන වාසි ලබා ගනී. XDP හරියටම ප්‍රතිවිරුද්ධ දේ කරයි: එය ජාලකරණ වැඩසටහන් පරිශීලක අවකාශයේ සිට (පෙරහන, විසඳුම්, මාර්ගගත කිරීම, ආදිය) කර්නල් ප්‍රදේශයට ගෙන යයි. පැකට්ටුවක් ජාල අතුරුමුහුණතකට පහර දුන් වහාම සහ එය කර්නල් ජාල උප පද්ධතියට ගමන් කිරීමට පෙර ජාල කාර්යයක් කිරීමට XDP අපට ඉඩ දෙයි. එහි ප්රතිඵලයක් වශයෙන්, පැකට් සැකසීමේ වේගය සැලකිය යුතු ලෙස වැඩි වේ. කෙසේ වෙතත්, කර්නලය පරිශීලකයාට ඔවුන්ගේ වැඩසටහන් කර්නල් අවකාශයේ ක්‍රියාත්මක කිරීමට ඉඩ දෙන්නේ කෙසේද? මෙම ප්රශ්නයට පිළිතුරු දීමට පෙර, BPF යනු කුමක්දැයි බලමු.

BPF සහ eBPF

ව්‍යාකූල නම තිබියදීත්, BPF (Berkeley Packet Filtering) යනු ඇත්ත වශයෙන්ම අතථ්‍ය යන්ත්‍ර ආකෘතියකි. මෙම අථත්‍ය යන්ත්‍රය මුලින් නිර්මාණය කර ඇත්තේ පැකට් පෙරීම හැසිරවීමටයි, එබැවින් නම.

BPF භාවිතා කරන වඩාත් ප්‍රසිද්ධ මෙවලම් වලින් එකකි tcpdump. භාවිතයෙන් පැකට් අල්ලා ගන්නා විට tcpdump පැකට් පෙරීමට පරිශීලකයාට ප්‍රකාශනයක් නියම කළ හැක. මෙම ප්‍රකාශනයට ගැළපෙන පැකට් පමණක් අල්ලා ගනු ලැබේ. උදාහරණයක් ලෙස, ප්රකාශනය "tcp dst port 80” යනු වරාය 80 වෙත පැමිණෙන සියලුම TCP පැකට් සඳහා ය. සම්පාදකයාට මෙම ප්‍රකාශනය BPF බයිට්කේතයට පරිවර්තනය කිරීමෙන් කෙටි කළ හැක.

$ sudo tcpdump -d "tcp dst port 80"
(000) ldh [12] (001) jeq #0x86dd jt 2 jf 6
(002) ldb [20] (003) jeq #0x6 jt 4 jf 15
(004) ldh [56] (005) jeq #0x50 jt 14 jf 15
(006) jeq #0x800 jt 7 jf 15
(007) ldb [23] (008) jeq #0x6 jt 9 jf 15
(009) ldh [20] (010) jset #0x1fff jt 15 jf 11
(011) ldxb 4*([14]&0xf)
(012) ldh [x + 16] (013) jeq #0x50 jt 14 jf 15
(014) ret #262144
(015) ret #0

ඉහත වැඩසටහන මූලික වශයෙන් කරන්නේ මෙයයි:

  • උපදෙස් (000): ඕෆ්සෙට් 12 හි පැකට්ටුව 16-බිට් වචනයක් ලෙස, සමුච්චකය තුළට පූරණය කරයි. ඕෆ්සෙට් 12 පැකට්ටුවේ ඊතර්ටයිප් වලට අනුරූප වේ.
  • උපදෙස් (001): ඇකියුලේටරයේ අගය 0x86dd සමඟ සංසන්දනය කරයි, එනම් IPv6 සඳහා ඊතර්ටයිප් අගය සමඟ. ප්‍රති result ලය සත්‍ය නම්, වැඩසටහන් කවුන්ටරය උපදෙස් (002) වෙත යන අතර, එසේ නොවේ නම් (006) වෙත යයි.
  • උපදෙස් (006): අගය 0x800 සමඟ සංසන්දනය කරයි (IPv4 සඳහා ඊතර්ටයිප් අගය). පිළිතුර සත්‍ය නම්, වැඩසටහන (007) වෙත, එසේ නොවේ නම් (015) වෙත යයි.

පැකට් පෙරීමේ වැඩසටහන ප්‍රති result ලයක් ලබා දෙන තෙක් එසේ ය. මෙය සාමාන්යයෙන් බූලියන් වේ. ශුන්‍ය නොවන අගයක් (උපදෙස් (014)) ලබා දීමෙන් අදහස් වන්නේ පැකට්ටුව පිළිගෙන ඇති බවත්, ශුන්‍ය අගයක් (උපදෙස් (015)) ලබා දීමෙන් පැකට්ටුව පිළි නොගත් බවත් ය.

BPF අතථ්‍ය යන්ත්‍රය සහ එහි බයිට්කේතය Steve McCann සහ Van Jacobson විසින් 1992 අගභාගයේදී ඔවුන්ගේ පත්‍රිකාව ප්‍රකාශයට පත් කරන විට යෝජනා කරන ලදී. BSD පැකට් පෙරහන: පරිශීලක මට්ටමේ පැකට් ග්‍රහණය සඳහා නව ගෘහ නිර්මාණ ශිල්පය, මෙම තාක්ෂණය මුලින්ම ඉදිරිපත් කරන ලද්දේ 1993 ශීත ඍතුවේ පැවති Usenix සමුළුවේදීය.

BPF යනු අතථ්‍ය යන්ත්‍රයක් නිසා, එය වැඩසටහන් ක්‍රියාත්මක වන පරිසරය නිර්වචනය කරයි. බයිට්කේතයට අමතරව, එය කාණ්ඩ මතක ආකෘතිය (බැච් වෙත පැටවීමේ උපදෙස් ව්‍යංගයෙන් යොදනු ලැබේ), රෙජිස්ටර් (A සහ X; සමුච්චකය සහ දර්ශක රෙජිස්ටර්), සීරීම් මතක ගබඩාව සහ ව්‍යංග වැඩසටහන් කවුන්ටරය ද නිර්වචනය කරයි. සිත්ගන්නා කරුණ නම්, BPF බයිට්කේතය Motorola 6502 ISA අනුව හැඩගස්වා ඇත. Steve McCann ඔහුගේ මතකය පරිදි පූර්ණ වාර්තාව Sharkfest '11 හිදී, Apple II හි ඔහුගේ උසස් පාසල් දින වැඩසටහන් වලින් ඔහු ගොඩනැගීම 6502 ගැන හුරුපුරුදු වූ අතර, මෙම දැනුම ඔහුගේ BPF බයිටේකෝඩ් නිර්මාණය කිරීමේ කාර්යයට බලපෑවේය.

BPF සහාය Linux කර්නලය තුළ v2.5 සහ ඊට ඉහළ අනුවාදවල ක්‍රියාත්මක වේ, ප්‍රධාන වශයෙන් Jay Schullist ගේ උත්සාහයෙන් එකතු වේ. BPF කේතය 2011 වන තෙක් නොවෙනස්ව පැවතුනි, එරික් ඩුමසෙට් විසින් BPF පරිවර්තකය JIT මාදිලියේ ධාවනය කිරීමට ප්‍රතිනිර්මාණය කරන ලදී (මූලාශ්‍රය: පැකට් පෙරහන් සඳහා JIT) මෙයින් පසු, කර්නලයට, BPF බයිට්කේත අර්ථකථනය කරනවා වෙනුවට, BPF වැඩසටහන් සෘජුවම ඉලක්කගත ගෘහ නිර්මාණ ශිල්පයට පරිවර්තනය කළ හැකිය: x86, ARM, MIPS, ආදිය.

පසුව, 2014 දී, Alexey Starovoitov BPF සඳහා නව JIT යාන්ත්රණයක් යෝජනා කළේය. ඇත්ත වශයෙන්ම, මෙම නව JIT නව BPF මත පදනම් වූ ගෘහ නිර්මාණ ශිල්පයක් බවට පත් වූ අතර එය eBPF ලෙස හැඳින්වේ. මම හිතන්නේ VM දෙකම යම් කාලයක් එකට පැවති නමුත් දැනට පැකට් පෙරීම eBPF මත පදනම්ව ක්‍රියාත්මක වේ. ඇත්ත වශයෙන්ම, නූතන ලේඛනගත කිරීමේ බොහෝ උදාහරණ වල, BPF eBPF ලෙස වටහාගෙන ඇති අතර, සම්භාව්‍ය BPF අද cBPF ලෙස හැඳින්වේ.

eBPF සම්භාව්‍ය BPF අතථ්‍ය යන්ත්‍රය ආකාර කිහිපයකින් දිගු කරයි:

  • නවීන 64-bit ගෘහ නිර්මාණ ශිල්පය මත පදනම්ව. eBPF බිට් 64 රෙජිස්ටර් භාවිතා කරන අතර පවතින රෙජිස්ටර් සංඛ්‍යාව 2 (ඇකියුමුලේටර් සහ X) සිට 10 දක්වා වැඩි කරයි. eBPF අමතර opcodes ද සපයයි (BPF_MOV, BPF_JNE, BPF_CALL...).
  • ජාල ස්ථර උප පද්ධතියෙන් වෙන් කර ඇත. BPF කාණ්ඩ දත්ත ආකෘතියට බැඳී ඇත. එය පැකට් පෙරීම සඳහා භාවිතා කරන ලද බැවින්, එහි කේතය ජාල සන්නිවේදනය සපයන උප පද්ධතිය තුළ පිහිටා ඇත. කෙසේ වෙතත්, eBPF අතථ්‍ය යන්ත්‍රය තවදුරටත් දත්ත ආකෘතියට බැඳී නොමැති අතර ඕනෑම කටයුත්තක් සඳහා භාවිතා කළ හැක. එබැවින්, දැන් eBPF වැඩසටහන ට්රේස්පොයින්ට් හෝ kprobe වෙත සම්බන්ධ කළ හැක. මෙය වෙනත් කර්නල් උපපද්ධතීන්හි සන්දර්භය තුළ eBPF උපකරණ, කාර්ය සාධන විශ්ලේෂණය සහ වෙනත් බොහෝ භාවිත අවස්ථා සඳහා මාර්ගය විවෘත කරයි. දැන් eBPF කේතය එහිම මාර්ගයෙහි පිහිටා ඇත: kernel/bpf.
  • සිතියම් ලෙස හඳුන්වන ගෝලීය දත්ත ගබඩා. සිතියම් යනු පරිශීලක අවකාශය සහ කර්නල් අවකාශය අතර දත්ත හුවමාරුව සක්‍රීය කරන ප්‍රධාන අගය ගබඩා වේ. eBPF සිතියම් වර්ග කිහිපයක් සපයයි.
  • ද්විතියික කාර්යයන්. විශේෂයෙන්, පැකේජයක් නැවත ලිවීමට, චෙක්සම් ගණනය කිරීම හෝ පැකේජයක් ක්ලෝන කිරීම. මෙම කාර්යයන් කර්නලය තුළ ක්‍රියාත්මක වන අතර පරිශීලක-අවකාශ වැඩසටහන් නොවේ. ඔබට eBPF වැඩසටහන් වලින්ද පද්ධති ඇමතුම් ලබා ගත හැක.
  • ඇමතුම් අවසන් කරන්න. eBPF හි වැඩසටහන් ප්‍රමාණය බයිට් 4096කට සීමා වේ. tail call විශේෂාංගය මඟින් eBPF වැඩසටහනකට නව eBPF වැඩසටහනකට පාලනය මාරු කිරීමට ඉඩ ලබා දෙන අතර එමඟින් මෙම සීමාව මඟ හැරිය හැක (වැඩසටහන් 32ක් දක්වා මේ ආකාරයෙන් සම්බන්ධ කළ හැක).

eBPF: උදාහරණයක්

ලිනක්ස් කර්නල් මූලාශ්‍රවල eBPF සඳහා උදාහරණ කිහිපයක් තිබේ. ඒවා සාම්පල/bpf/ හි ඇත. මෙම උදාහරණ සම්පාදනය කිරීමට, සරලව ඇතුලත් කරන්න:

$ sudo make samples/bpf/

මම eBPF සඳහා නව උදාහරණයක් ලියන්නේ නැත, නමුත් සාම්පල/bpf/ හි ඇති සාම්පල වලින් එකක් භාවිතා කරමි. මම කේතයේ සමහර කොටස් දෙස බලා එය ක්‍රියා කරන ආකාරය පැහැදිලි කරන්නම්. උදාහරණයක් ලෙස, මම වැඩසටහන තෝරා ගත්තා tracex4.

සාමාන්‍යයෙන්, සාම්පල/bpf/ හි එක් එක් උදාහරණ ගොනු දෙකකින් සමන්විත වේ. මේ අවස්ථාවේ දී:

  • tracex4_kern.c, eBPF bytecode ලෙස කර්නලය තුළ ක්‍රියාත්මක කළ යුතු මූල කේතය අඩංගු වේ.
  • tracex4_user.c, පරිශීලක අවකාශයෙන් වැඩසටහනක් අඩංගු වේ.

මෙම අවස්ථාවේදී, අපි සම්පාදනය කළ යුතුය tracex4_kern.c eBPF bytecode වෙත. දැනට ඇත gcc eBPF සඳහා පසුබිමක් නොමැත. වාසනාවකට මෙන්, clang eBPF bytecode ප්‍රතිදානය කළ හැක. Makefile භාවිතා කරයි clang සම්පාදනය සඳහා tracex4_kern.c වස්තුව ගොනුවට.

eBPF හි වඩාත් සිත්ගන්නාසුලු අංගයක් වන්නේ සිතියම් බව මම ඉහත සඳහන් කළෙමි. tracex4_kern එක් සිතියමක් අර්ථ දක්වයි:

struct pair {
    u64 val;
    u64 ip;
};  

struct bpf_map_def SEC("maps") my_map = {
    .type = BPF_MAP_TYPE_HASH,
    .key_size = sizeof(long),
    .value_size = sizeof(struct pair),
    .max_entries = 1000000,
};

BPF_MAP_TYPE_HASH eBPF විසින් පිරිනමනු ලබන බොහෝ කාඩ්පත් වලින් එකකි. මෙම අවස්ථාවේ දී, එය හෑෂ් එකක් පමණි. ඔබත් දැන්වීමක් දැකලා ඇති SEC("maps"). SEC යනු ද්විමය ගොනුවක නව කොටසක් සෑදීමට භාවිතා කරන සාර්වයකි. ඇත්ත වශයෙන්ම, උදාහරණයේ tracex4_kern තවත් කොටස් දෙකක් අර්ථ දක්වා ඇත:

SEC("kprobe/kmem_cache_free")
int bpf_prog1(struct pt_regs *ctx)
{   
    long ptr = PT_REGS_PARM2(ctx);

    bpf_map_delete_elem(&my_map, &ptr); 
    return 0;
}
    
SEC("kretprobe/kmem_cache_alloc_node") 
int bpf_prog2(struct pt_regs *ctx)
{
    long ptr = PT_REGS_RC(ctx);
    long ip = 0;

    // получаем ip-адрес вызывающей стороны kmem_cache_alloc_node() 
    BPF_KRETPROBE_READ_RET_IP(ip, ctx);

    struct pair v = {
        .val = bpf_ktime_get_ns(),
        .ip = ip,
    };
    
    bpf_map_update_elem(&my_map, &ptr, &v, BPF_ANY);
    return 0;
}   

මෙම කාර්යයන් දෙක ඔබට සිතියමෙන් ප්‍රවේශයක් මකා දැමීමට ඉඩ සලසයි (kprobe/kmem_cache_free) සහ සිතියමට නව ප්‍රවේශයක් එක් කරන්න (kretprobe/kmem_cache_alloc_node) ලොකු අකුරින් ලියා ඇති සියලුම ශ්‍රිත නාමයන් අර්ථ දක්වා ඇති මැක්‍රෝ වලට අනුරූප වේ bpf_helpers.h.

මම වස්තු ගොනුවේ කොටස් ඉවත දැමුවහොත්, මෙම නව කොටස් දැනටමත් අර්ථ දක්වා ඇති බව මට පෙනෙනු ඇත:

$ objdump -h tracex4_kern.o

tracex4_kern.o: file format elf64-little

Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00000000 0000000000000000 0000000000000000 00000040 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 kprobe/kmem_cache_free 00000048 0000000000000000 0000000000000000 00000040 2**3
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
2 kretprobe/kmem_cache_alloc_node 000000c0 0000000000000000 0000000000000000 00000088 2**3
CONTENTS, ALLOC, LOAD, RELOC, READONLY, CODE
3 maps 0000001c 0000000000000000 0000000000000000 00000148 2**2
CONTENTS, ALLOC, LOAD, DATA
4 license 00000004 0000000000000000 0000000000000000 00000164 2**0
CONTENTS, ALLOC, LOAD, DATA
5 version 00000004 0000000000000000 0000000000000000 00000168 2**2
CONTENTS, ALLOC, LOAD, DATA
6 .eh_frame 00000050 0000000000000000 0000000000000000 00000170 2**3
CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA

තවමත් තිබේ tracex4_user.c, ප්රධාන වැඩසටහන. මූලික වශයෙන්, මෙම වැඩසටහන සිදුවීම් වලට සවන් දෙයි kmem_cache_alloc_node. එවැනි සිදුවීමක් සිදු වූ විට, අදාළ eBPF කේතය ක්රියාත්මක වේ. කේතය වස්තුවේ IP ගුණාංගය සිතියමකට සුරකින අතර, වස්තුව පසුව ප්‍රධාන වැඩසටහන හරහා ලූප් වේ. උදාහරණයක්:

$ sudo ./tracex4
obj 0xffff8d6430f60a00 is 2sec old was allocated at ip ffffffff9891ad90
obj 0xffff8d6062ca5e00 is 23sec old was allocated at ip ffffffff98090e8f
obj 0xffff8d5f80161780 is 6sec old was allocated at ip ffffffff98090e8f

පරිශීලක අභ්‍යවකාශ වැඩසටහනක් සහ eBPF වැඩසටහනක් සම්බන්ධ වන්නේ කෙසේද? ආරම්භ කිරීම මත tracex4_user.c වස්තුව ගොනුවක් පූරණය කරයි tracex4_kern.o කාර්යය භාවිතා කරමින් load_bpf_file.

int main(int ac, char **argv)
{
    struct rlimit r = {RLIM_INFINITY, RLIM_INFINITY};
    char filename[256];
    int i;

    snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);

    if (setrlimit(RLIMIT_MEMLOCK, &r)) {
        perror("setrlimit(RLIMIT_MEMLOCK, RLIM_INFINITY)");
        return 1;
    }

    if (load_bpf_file(filename)) {
        printf("%s", bpf_log_buf);
        return 1;
    }

    for (i = 0; ; i++) {
        print_old_objects(map_fd[1]);
        sleep(1);
    }

    return 0;
}

කිරීමෙන් load_bpf_file eBPF ගොනුවේ අර්ථ දක්වා ඇති පරීක්ෂණ එකතු කරනු ලැබේ /sys/kernel/debug/tracing/kprobe_events. දැන් අපි මෙම සිදුවීම්වලට සවන් දෙන අතර ඒවා සිදු වූ විට අපගේ වැඩසටහනට යමක් කළ හැකිය.

$ sudo cat /sys/kernel/debug/tracing/kprobe_events
p:kprobes/kmem_cache_free kmem_cache_free
r:kprobes/kmem_cache_alloc_node kmem_cache_alloc_node

නියැදිය/bpf/ හි ඇති අනෙකුත් සියලුම වැඩසටහන් ඒ හා සමානව ව්‍යුහගත කර ඇත. ඒවායේ සෑම විටම ගොනු දෙකක් අඩංගු වේ:

  • XXX_kern.c: eBPF වැඩසටහන.
  • XXX_user.c: ප්රධාන වැඩසටහන.

eBPF වැඩසටහන මඟින් කොටසකට සම්බන්ධ සිතියම් සහ කාර්යයන් හඳුනා ගනී. කර්නලය යම් ආකාරයක සිදුවීමක් නිකුත් කරන විට (උදාහරණයක් ලෙස, tracepoint), බැඳුනු කාර්යයන් ක්රියාත්මක වේ. කාඩ්පත් කර්නල් වැඩසටහන සහ පරිශීලක අවකාශ වැඩසටහන අතර සන්නිවේදනය සපයයි.

නිගමනය

මෙම ලිපිය BPF සහ eBPF ගැන සාමාන්‍ය ලෙස සාකච්ඡා කළේය. අද eBPF පිළිබඳ බොහෝ තොරතුරු සහ සම්පත් ඇති බව මම දනිමි, එබැවින් වැඩිදුර අධ්‍යයනය සඳහා මම තවත් සම්පත් කිහිපයක් නිර්දේශ කරමි

මම කියවීමට නිර්දේශ කරමි:

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න