BPF மற்றும் eBPF பற்றிய சுருக்கமான அறிமுகம்

வணக்கம், ஹப்ர்! நாங்கள் ஒரு புத்தகத்தை வெளியிட தயாராகி வருகிறோம் என்பதை உங்களுக்குத் தெரிவித்துக் கொள்கிறோம்.BPF உடன் Linux கவனிப்பு".

BPF மற்றும் eBPF பற்றிய சுருக்கமான அறிமுகம்
BPF மெய்நிகர் இயந்திரம் தொடர்ந்து உருவாகி, நடைமுறையில் தீவிரமாகப் பயன்படுத்தப்படுவதால், அதன் முக்கிய திறன்கள் மற்றும் தற்போதைய நிலையை விவரிக்கும் கட்டுரையை உங்களுக்காக மொழிபெயர்த்துள்ளோம்.

சமீபத்திய ஆண்டுகளில், அதிக செயல்திறன் கொண்ட பாக்கெட் செயலாக்கம் தேவைப்படும் சந்தர்ப்பங்களில் லினக்ஸ் கர்னலின் வரம்புகளை ஈடுசெய்ய நிரலாக்க கருவிகள் மற்றும் நுட்பங்கள் பெருகிய முறையில் பிரபலமடைந்துள்ளன. இந்த வகையான மிகவும் பிரபலமான நுட்பங்களில் ஒன்று அழைக்கப்படுகிறது கர்னல் பைபாஸ் (கர்னல் பைபாஸ்) மற்றும் கர்னல் நெட்வொர்க் லேயரைத் தவிர்த்து, பயனர் இடத்திலிருந்து அனைத்து பாக்கெட் செயலாக்கத்தையும் செய்ய அனுமதிக்கிறது. கர்னலைப் புறக்கணிப்பதில் இருந்து பிணைய அட்டையைக் கட்டுப்படுத்துவதும் அடங்கும் பயனர் இடம். வேறு வார்த்தைகளில் கூறுவதானால், நெட்வொர்க் கார்டுடன் பணிபுரியும் போது, ​​நாங்கள் இயக்கியை நம்பியுள்ளோம் பயனர் இடம்.

நெட்வொர்க் கார்டின் முழு கட்டுப்பாட்டையும் பயனர்-வெளி நிரலுக்கு மாற்றுவதன் மூலம், கர்னல் மேல்நிலையை (சூழல் மாறுதல், பிணைய அடுக்கு செயலாக்கம், குறுக்கீடுகள் போன்றவை) குறைக்கிறோம், இது 10Gb/s அல்லது அதற்கு மேற்பட்ட வேகத்தில் இயங்கும் போது மிகவும் முக்கியமானது. கர்னல் பைபாஸ் மற்றும் பிற அம்சங்களின் கலவை (தொகுதி செயலாக்கம்) மற்றும் கவனமாக செயல்திறன் சரிப்படுத்தல் (NUMA கணக்கியல், CPU தனிமைப்படுத்தல், முதலியன) பயனர் இடத்தில் உயர் செயல்திறன் நெட்வொர்க் செயலாக்கத்தின் அடிப்படைகளுக்கு ஒத்திருக்கிறது. பாக்கெட் செயலாக்கத்திற்கான இந்த புதிய அணுகுமுறைக்கு ஒரு முன்மாதிரியான உதாரணம் டி.பி.டி.கே. இன்டெல்லிலிருந்து (டேட்டா பிளேன் டெவலப்மெண்ட் கிட்), சிஸ்கோவின் VPP (வெக்டர் பாக்கெட் செயலாக்கம்), 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க்கான ஈதர்டைப் மதிப்புடன். முடிவு உண்மையாக இருந்தால், நிரல் கவுண்டர் அறிவுறுத்தலுக்கு (002) செல்கிறது, இல்லையெனில், பின்னர் (006).
  • அறிவுறுத்தல் (006): மதிப்பை 0x800 உடன் ஒப்பிடுகிறது (IPv4 க்கான ஈதர்டைப் மதிப்பு). பதில் உண்மையாக இருந்தால், நிரல் (007), இல்லையெனில் (015) க்கு செல்கிறது.

பாக்கெட் வடிகட்டுதல் நிரல் ஒரு முடிவை வழங்கும் வரை. இது பொதுவாக ஒரு பூலியன் ஆகும். பூஜ்ஜியம் அல்லாத மதிப்பை (அறிவுறுத்தல் (014)) திரும்பப் பெறுவது என்பது பாக்கெட் ஏற்றுக்கொள்ளப்பட்டது என்றும், பூஜ்ஜிய மதிப்பை (அறிவுறுத்தல் (015)) வழங்கினால் பாக்கெட் ஏற்கப்படவில்லை என்றும் பொருள்.

BPF மெய்நிகர் இயந்திரம் மற்றும் அதன் பைட்கோடு ஸ்டீவ் மெக்கான் மற்றும் வான் ஜேக்கப்சன் ஆகியோரால் 1992 ஆம் ஆண்டின் பிற்பகுதியில் அவர்களின் கட்டுரை வெளியிடப்பட்டபோது முன்மொழியப்பட்டது. BSD பாக்கெட் வடிகட்டி: பயனர்-நிலை பாக்கெட் பிடிப்புக்கான புதிய கட்டமைப்பு, இந்த தொழில்நுட்பம் முதன்முதலில் 1993 குளிர்காலத்தில் யூசெனிக்ஸ் மாநாட்டில் வழங்கப்பட்டது.

BPF ஒரு மெய்நிகர் இயந்திரம் என்பதால், நிரல்கள் இயங்கும் சூழலை இது வரையறுக்கிறது. பைட்கோடுக்கு கூடுதலாக, இது தொகுதி நினைவக மாதிரி (சுமை அறிவுறுத்தல்கள் தொகுதிக்கு மறைமுகமாகப் பயன்படுத்தப்படும்), பதிவேடுகள் (A மற்றும் X; திரட்டி மற்றும் குறியீட்டுப் பதிவுகள்), கீறல் நினைவக சேமிப்பு மற்றும் ஒரு மறைமுக நிரல் கவுண்டர் ஆகியவற்றை வரையறுக்கிறது. சுவாரஸ்யமாக, பிபிஎஃப் பைட்கோடு மோட்டோரோலா 6502 ஐஎஸ்ஏ மாதிரியாக வடிவமைக்கப்பட்டது. ஸ்டீவ் மெக்கான் தனது நினைவு கூர்ந்தபடி முழுமையான அறிக்கை Sharkfest '11 இல், அவர் ஆப்பிள் II இல் தனது உயர்நிலைப் பள்ளி நாட்களில் நிரலாக்கத்தில் இருந்து பில்ட் 6502 பற்றி நன்கு அறிந்திருந்தார், மேலும் இந்த அறிவு BPF பைட்கோடை வடிவமைக்கும் அவரது வேலையை பாதித்தது.

BPF ஆதரவு Linux கர்னலில் v2.5 மற்றும் அதற்கு மேற்பட்ட பதிப்புகளில் செயல்படுத்தப்படுகிறது, முக்கியமாக Jay Schullist இன் முயற்சியால் சேர்க்கப்பட்டது. 2011 வரை BPF குறியீடு மாறாமல் இருந்தது, எரிக் டுமாசெட் BPF மொழிபெயர்ப்பாளரை JIT பயன்முறையில் இயக்க மறுவடிவமைப்பு செய்தார் (ஆதாரம்: பாக்கெட் வடிகட்டிகளுக்கான JIT) இதற்குப் பிறகு, கர்னல், BPF பைட்கோடை விளக்குவதற்குப் பதிலாக, BPF நிரல்களை இலக்கு கட்டமைப்பிற்கு நேரடியாக மாற்றலாம்: x86, ARM, MIPS போன்றவை.

பின்னர், 2014 இல், அலெக்ஸி ஸ்டாரோவோய்டோவ் BPF க்காக ஒரு புதிய JIT பொறிமுறையை முன்மொழிந்தார். உண்மையில், இந்த புதிய JIT ஆனது புதிய BPF-அடிப்படையிலான கட்டமைப்பாக மாறியது மற்றும் eBPF என அழைக்கப்பட்டது. இரண்டு VMகளும் சில காலம் ஒன்றாக இருந்ததாக நான் நினைக்கிறேன், ஆனால் தற்போது eBPF அடிப்படையில் பாக்கெட் வடிகட்டுதல் செயல்படுத்தப்படுகிறது. உண்மையில், நவீன ஆவணங்களின் பல எடுத்துக்காட்டுகளில், BPF என்பது eBPF என்று புரிந்து கொள்ளப்படுகிறது, மேலும் கிளாசிக்கல் BPF இன்று cBPF என அழைக்கப்படுகிறது.

eBPF கிளாசிக் BPF மெய்நிகர் இயந்திரத்தை பல வழிகளில் நீட்டிக்கிறது:

  • நவீன 64-பிட் கட்டமைப்புகளின் அடிப்படையில். eBPF 64-பிட் பதிவேடுகளைப் பயன்படுத்துகிறது மற்றும் கிடைக்கக்கூடிய பதிவேடுகளின் எண்ணிக்கையை 2 (அக்முலேட்டர் மற்றும் X) இலிருந்து 10 ஆக அதிகரிக்கிறது. eBPF கூடுதல் ஆப்கோடுகளையும் வழங்குகிறது (BPF_MOV, BPF_JNE, BPF_CALL...).
  • பிணைய அடுக்கு துணை அமைப்பிலிருந்து பிரிக்கப்பட்டது. BPF தொகுதி தரவு மாதிரியுடன் இணைக்கப்பட்டது. இது பாக்கெட் வடிகட்டலுக்குப் பயன்படுத்தப்பட்டதால், அதன் குறியீடு நெட்வொர்க் தகவல்தொடர்புகளை வழங்கும் துணை அமைப்பில் அமைந்துள்ளது. இருப்பினும், eBPF மெய்நிகர் இயந்திரம் தரவு மாதிரியுடன் இணைக்கப்படவில்லை மற்றும் எந்த நோக்கத்திற்காகவும் பயன்படுத்தப்படலாம். எனவே, இப்போது eBPF நிரலை ட்ரேஸ்பாயிண்ட் அல்லது kprobe உடன் இணைக்க முடியும். இது eBPF கருவி, செயல்திறன் பகுப்பாய்வு மற்றும் பிற கர்னல் துணை அமைப்புகளின் சூழலில் பல பயன்பாட்டு நிகழ்வுகளுக்கு வழி திறக்கிறது. இப்போது eBPF குறியீடு அதன் சொந்த பாதையில் அமைந்துள்ளது: kernel/bpf.
  • வரைபடங்கள் எனப்படும் உலகளாவிய தரவு சேமிப்புகள். வரைபடங்கள் என்பது பயனர் இடத்துக்கும் கர்னல் இடத்துக்கும் இடையில் தரவுப் பரிமாற்றத்தை செயல்படுத்தும் முக்கிய மதிப்புக் கடைகளாகும். eBPF பல வகையான வரைபடங்களை வழங்குகிறது.
  • இரண்டாம் நிலை செயல்பாடுகள். குறிப்பாக, ஒரு தொகுப்பை மீண்டும் எழுத, ஒரு செக்சம் கணக்கிட, அல்லது ஒரு தொகுப்பை குளோன் செய்யவும். இந்த செயல்பாடுகள் கர்னலில் இயங்கும் மற்றும் பயனர்-வெளி நிரல்களாக இல்லை. eBPF நிரல்களிலிருந்தும் நீங்கள் கணினி அழைப்புகளை மேற்கொள்ளலாம்.
  • அழைப்புகளை முடிக்கவும். eBPF இல் நிரல் அளவு 4096 பைட்டுகளாக வரையறுக்கப்பட்டுள்ளது. டெயில் கால் அம்சமானது ஒரு eBPF நிரலை ஒரு புதிய eBPF திட்டத்திற்கு கட்டுப்பாட்டை மாற்ற அனுமதிக்கிறது, இதனால் இந்த வரம்பைத் தவிர்க்கலாம் (32 நிரல்களை இந்த வழியில் இணைக்கலாம்).

eBPF: உதாரணம்

லினக்ஸ் கர்னல் மூலங்களில் eBPF க்கு பல எடுத்துக்காட்டுகள் உள்ளன. அவை மாதிரிகள்/bpf/ இல் கிடைக்கின்றன. இந்த எடுத்துக்காட்டுகளை தொகுக்க, உள்ளிடவும்:

$ sudo make samples/bpf/

நான் eBPF க்கு ஒரு புதிய உதாரணத்தை எழுத மாட்டேன், ஆனால் மாதிரிகள்/bpf/ இல் கிடைக்கும் மாதிரிகளில் ஒன்றைப் பயன்படுத்துவேன். குறியீட்டின் சில பகுதிகளைப் பார்த்து, அது எவ்வாறு செயல்படுகிறது என்பதை விளக்குகிறேன். உதாரணமாக, நான் நிரலைத் தேர்ந்தெடுத்தேன் tracex4.

பொதுவாக, மாதிரிகள்/bpf/ இல் உள்ள ஒவ்வொரு எடுத்துக்காட்டுகளும் இரண்டு கோப்புகளைக் கொண்டிருக்கும். இந்த வழக்கில்:

  • tracex4_kern.c, கர்னலில் eBPF பைட்கோடாக செயல்படுத்தப்படும் மூலக் குறியீடு உள்ளது.
  • tracex4_user.c, பயனர் இடத்திலிருந்து ஒரு நிரல் உள்ளது.

இந்த வழக்கில், நாம் தொகுக்க வேண்டும் tracex4_kern.c eBPF பைட்கோடுக்கு. தற்போது உள்ளே gcc eBPF க்கு பின்தளம் இல்லை. அதிர்ஷ்டவசமாக, clang eBPF பைட்கோடை வெளியிட முடியும். 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 குறியீடு செயல்படுத்தப்படும். குறியீடானது பொருளின் ஐபி பண்புக்கூறை ஒரு வரைபடத்தில் சேமிக்கிறது, பின்னர் பொருள் முக்கிய நிரல் மூலம் லூப் செய்யப்படுகிறது. உதாரணமாக:

$ 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

கருத்தைச் சேர்