BPF ಮತ್ತು eBPF ಗೆ ಸಂಕ್ಷಿಪ್ತ ಪರಿಚಯ

ಹೇ ಹಬ್ರ್! ನಾವು ಪುಸ್ತಕವನ್ನು ಬಿಡುಗಡೆ ಮಾಡಲು ತಯಾರಿ ನಡೆಸುತ್ತಿದ್ದೇವೆ ಎಂದು ನಾವು ನಿಮಗೆ ತಿಳಿಸುತ್ತೇವೆ "BPF ಜೊತೆಗೆ Linux ವೀಕ್ಷಣೆ".

BPF ಮತ್ತು eBPF ಗೆ ಸಂಕ್ಷಿಪ್ತ ಪರಿಚಯ
BPF ವರ್ಚುವಲ್ ಯಂತ್ರವು ವಿಕಸನಗೊಳ್ಳುವುದನ್ನು ಮುಂದುವರೆಸಿದೆ ಮತ್ತು ಆಚರಣೆಯಲ್ಲಿ ಸಕ್ರಿಯವಾಗಿ ಬಳಸಲ್ಪಡುತ್ತದೆ, ಅದರ ಮುಖ್ಯ ವೈಶಿಷ್ಟ್ಯಗಳು ಮತ್ತು ಪ್ರಸ್ತುತ ಸ್ಥಿತಿಯನ್ನು ವಿವರಿಸುವ ಲೇಖನವನ್ನು ನಾವು ನಿಮಗಾಗಿ ಅನುವಾದಿಸಿದ್ದೇವೆ.

ಇತ್ತೀಚಿನ ವರ್ಷಗಳಲ್ಲಿ, ಹೆಚ್ಚಿನ ಕಾರ್ಯಕ್ಷಮತೆಯ ಪ್ಯಾಕೆಟ್ ಸಂಸ್ಕರಣೆಯ ಅಗತ್ಯವಿರುವ ಸಂದರ್ಭಗಳಲ್ಲಿ ಲಿನಕ್ಸ್ ಕರ್ನಲ್‌ನ ಮಿತಿಗಳನ್ನು ಸರಿದೂಗಿಸಲು ಪ್ರೋಗ್ರಾಮಿಂಗ್ ಪರಿಕರಗಳು ಮತ್ತು ತಂತ್ರಗಳು ಜನಪ್ರಿಯತೆಯನ್ನು ಗಳಿಸಿವೆ. ಈ ರೀತಿಯ ಅತ್ಯಂತ ಜನಪ್ರಿಯ ವಿಧಾನಗಳಲ್ಲಿ ಒಂದನ್ನು ಕರೆಯಲಾಗುತ್ತದೆ ಕೋರ್ ಬೈಪಾಸ್ (ಕರ್ನಲ್ ಬೈಪಾಸ್) ಮತ್ತು ಬಳಕೆದಾರರ ಸ್ಥಳದಿಂದ ಎಲ್ಲಾ ಪ್ಯಾಕೆಟ್ ಸಂಸ್ಕರಣೆಯನ್ನು ನಿರ್ವಹಿಸಲು ಕರ್ನಲ್‌ನ ನೆಟ್‌ವರ್ಕ್ ಪದರವನ್ನು ಬಿಟ್ಟುಬಿಡಲು ಅನುಮತಿಸುತ್ತದೆ. ಕರ್ನಲ್ ಅನ್ನು ಬೈಪಾಸ್ ಮಾಡುವುದು ನೆಟ್ವರ್ಕ್ ಕಾರ್ಡ್ ಅನ್ನು ನಿರ್ವಹಿಸುವುದನ್ನು ಒಳಗೊಂಡಿರುತ್ತದೆ ಬಳಕೆದಾರ ಸ್ಥಳ. ಬೇರೆ ರೀತಿಯಲ್ಲಿ ಹೇಳುವುದಾದರೆ, ನೆಟ್ವರ್ಕ್ ಕಾರ್ಡ್ನೊಂದಿಗೆ ಕೆಲಸ ಮಾಡುವಾಗ, ನಾವು ಚಾಲಕವನ್ನು ಅವಲಂಬಿಸಿರುತ್ತೇವೆ ಬಳಕೆದಾರ ಸ್ಥಳ.

ನೆಟ್‌ವರ್ಕ್ ಕಾರ್ಡ್‌ನ ಸಂಪೂರ್ಣ ನಿಯಂತ್ರಣವನ್ನು ಬಳಕೆದಾರ-ಸ್ಪೇಸ್ ಪ್ರೋಗ್ರಾಂಗೆ ವರ್ಗಾಯಿಸುವ ಮೂಲಕ, ನಾವು ಕರ್ನಲ್‌ನ ಓವರ್‌ಹೆಡ್ ಅನ್ನು ಕಡಿಮೆ ಮಾಡುತ್ತೇವೆ (ಸಂದರ್ಭ ಸ್ವಿಚ್‌ಗಳು, ನೆಟ್‌ವರ್ಕ್ ಲೇಯರ್ ಪ್ರಕ್ರಿಯೆ, ಅಡಚಣೆಗಳು, ಇತ್ಯಾದಿ), ಇದು 10 Gb / s ವೇಗದಲ್ಲಿ ಚಲಿಸುವಾಗ ಬಹಳ ಮುಖ್ಯವಾಗಿದೆ ಅಥವಾ ಹೆಚ್ಚಿನ. ಕರ್ನಲ್ ಮತ್ತು ಇತರ ವೈಶಿಷ್ಟ್ಯಗಳ ಸಂಯೋಜನೆಯನ್ನು ಬೈಪಾಸ್ ಮಾಡುವುದು (ಬ್ಯಾಚ್ ಸಂಸ್ಕರಣೆ) ಮತ್ತು ಎಚ್ಚರಿಕೆಯ ಕಾರ್ಯಕ್ಷಮತೆ ಶ್ರುತಿ (NUMA ಲೆಕ್ಕಪತ್ರ ನಿರ್ವಹಣೆ, CPU ಪ್ರತ್ಯೇಕತೆ, ಇತ್ಯಾದಿ) ಉನ್ನತ-ಕಾರ್ಯಕ್ಷಮತೆಯ ಬಳಕೆದಾರ-ಸ್ಪೇಸ್ ನೆಟ್‌ವರ್ಕಿಂಗ್‌ನ ಮೂಲಭೂತ ಅಂಶಗಳನ್ನು ಹೊಂದುತ್ತದೆ. ಬಹುಶಃ ಪ್ಯಾಕೆಟ್ ಪ್ರಕ್ರಿಯೆಗೆ ಈ ಹೊಸ ವಿಧಾನದ ಒಂದು ಅನುಕರಣೀಯ ಉದಾಹರಣೆಯಾಗಿದೆ ಡಿಪಿಡಿಕೆ ಇಂಟೆಲ್‌ನಿಂದ (ಡೇಟಾ ಪ್ಲೇನ್ ಅಭಿವೃದ್ಧಿ ಕಿಟ್), ಸಿಸ್ಕೋದಿಂದ VPP (ವೆಕ್ಟರ್ ಪ್ಯಾಕೆಟ್ ಸಂಸ್ಕರಣೆ), ನೆಟ್‌ಮ್ಯಾಪ್ ಮತ್ತು ಸಹಜವಾಗಿ, ಸೇರಿದಂತೆ ಇತರ ಪ್ರಸಿದ್ಧ ಪರಿಕರಗಳು ಮತ್ತು ತಂತ್ರಗಳು ಇದ್ದರೂ, ಸ್ನಾಬ್.

ಬಳಕೆದಾರರ ಜಾಗದಲ್ಲಿ ನೆಟ್ವರ್ಕ್ ಸಂವಹನಗಳ ಸಂಘಟನೆಯು ಹಲವಾರು ಅನಾನುಕೂಲಗಳನ್ನು ಹೊಂದಿದೆ:

  • OS ಕರ್ನಲ್ ಹಾರ್ಡ್‌ವೇರ್ ಸಂಪನ್ಮೂಲಗಳಿಗಾಗಿ ಅಮೂರ್ತ ಪದರವಾಗಿದೆ. ಬಳಕೆದಾರ-ಸ್ಪೇಸ್ ಪ್ರೋಗ್ರಾಂಗಳು ತಮ್ಮ ಸಂಪನ್ಮೂಲಗಳನ್ನು ನೇರವಾಗಿ ನಿರ್ವಹಿಸಬೇಕಾಗಿರುವುದರಿಂದ, ಅವರು ತಮ್ಮದೇ ಆದ ಹಾರ್ಡ್‌ವೇರ್ ಅನ್ನು ಸಹ ನಿರ್ವಹಿಸಬೇಕಾಗುತ್ತದೆ. ಇದು ಸಾಮಾನ್ಯವಾಗಿ ನಿಮ್ಮ ಸ್ವಂತ ಡ್ರೈವರ್‌ಗಳನ್ನು ಪ್ರೋಗ್ರಾಮ್ ಮಾಡುವುದು ಎಂದರ್ಥ.
  • ನಾವು ಕರ್ನಲ್ ಜಾಗವನ್ನು ಸಂಪೂರ್ಣವಾಗಿ ಬಿಟ್ಟುಕೊಡುತ್ತಿರುವುದರಿಂದ, ಕರ್ನಲ್ ಒದಗಿಸಿದ ಎಲ್ಲಾ ನೆಟ್‌ವರ್ಕಿಂಗ್ ಕಾರ್ಯವನ್ನು ಸಹ ನಾವು ಬಿಟ್ಟುಕೊಡುತ್ತಿದ್ದೇವೆ. ಕರ್ನಲ್ ಅಥವಾ ಆಪರೇಟಿಂಗ್ ಸಿಸ್ಟಮ್‌ನಿಂದ ಈಗಾಗಲೇ ಒದಗಿಸಲಾದ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಬಳಕೆದಾರ-ಸ್ಪೇಸ್ ಪ್ರೋಗ್ರಾಂಗಳು ಮರು-ಅನುಷ್ಠಾನಗೊಳಿಸಬೇಕು.
  • ಪ್ರೋಗ್ರಾಂಗಳು ಸ್ಯಾಂಡ್‌ಬಾಕ್ಸ್ ಮೋಡ್‌ನಲ್ಲಿ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತವೆ, ಇದು ಅವರ ಪರಸ್ಪರ ಕ್ರಿಯೆಯನ್ನು ಗಂಭೀರವಾಗಿ ಮಿತಿಗೊಳಿಸುತ್ತದೆ ಮತ್ತು ಆಪರೇಟಿಂಗ್ ಸಿಸ್ಟಂನ ಇತರ ಭಾಗಗಳೊಂದಿಗೆ ಸಂಯೋಜಿಸುವುದನ್ನು ತಡೆಯುತ್ತದೆ.

ಮೂಲಭೂತವಾಗಿ, ಬಳಕೆದಾರರ ಜಾಗದಲ್ಲಿ ನೆಟ್‌ವರ್ಕಿಂಗ್ ಮಾಡುವಾಗ, ಪ್ಯಾಕೆಟ್ ಸಂಸ್ಕರಣೆಯನ್ನು ಕರ್ನಲ್‌ನಿಂದ ಬಳಕೆದಾರರ ಜಾಗಕ್ಕೆ ಚಲಿಸುವ ಮೂಲಕ ಕಾರ್ಯಕ್ಷಮತೆಯ ಲಾಭಗಳನ್ನು ಸಾಧಿಸಲಾಗುತ್ತದೆ. XDP ನಿಖರವಾಗಿ ವಿರುದ್ಧವಾಗಿ ಮಾಡುತ್ತದೆ: ಇದು ನೆಟ್‌ವರ್ಕ್ ಪ್ರೋಗ್ರಾಂಗಳನ್ನು ಬಳಕೆದಾರರ ಸ್ಥಳದಿಂದ (ಫಿಲ್ಟರ್‌ಗಳು, ಪರಿವರ್ತಕಗಳು, ರೂಟಿಂಗ್, ಇತ್ಯಾದಿ) ಕರ್ನಲ್ ಪ್ರದೇಶಕ್ಕೆ ಚಲಿಸುತ್ತದೆ. ಪ್ಯಾಕೆಟ್ ನೆಟ್‌ವರ್ಕ್ ಇಂಟರ್‌ಫೇಸ್ ಅನ್ನು ಹೊಡೆದ ತಕ್ಷಣ ಮತ್ತು ಅದು ಕರ್ನಲ್‌ನ ನೆಟ್‌ವರ್ಕ್ ಸಬ್‌ಸಿಸ್ಟಮ್‌ಗೆ ಪ್ರಯಾಣಿಸಲು ಪ್ರಾರಂಭಿಸುವ ಮೊದಲು ನೆಟ್‌ವರ್ಕ್ ಕಾರ್ಯವನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸಲು XDP ನಮಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಪರಿಣಾಮವಾಗಿ, ಪ್ಯಾಕೆಟ್ ಸಂಸ್ಕರಣೆಯ ವೇಗವು ಗಮನಾರ್ಹವಾಗಿ ಹೆಚ್ಚಾಗುತ್ತದೆ. ಆದಾಗ್ಯೂ, ಕರ್ನಲ್ ಜಾಗದಲ್ಲಿ ತಮ್ಮ ಪ್ರೋಗ್ರಾಂಗಳನ್ನು ಚಲಾಯಿಸಲು ಬಳಕೆದಾರರಿಗೆ ಕರ್ನಲ್ ಹೇಗೆ ಅವಕಾಶ ನೀಡುತ್ತದೆ? ಈ ಪ್ರಶ್ನೆಗೆ ಉತ್ತರಿಸುವ ಮೊದಲು, BPF ಎಂದರೇನು ಎಂದು ನೋಡೋಣ.

BPF ಮತ್ತು eBPF

ಸಂಪೂರ್ಣವಾಗಿ ಸ್ಪಷ್ಟವಾಗಿಲ್ಲದ ಹೆಸರಿನ ಹೊರತಾಗಿಯೂ, BPF (ಪ್ಯಾಕೆಟ್ ಫಿಲ್ಟರಿಂಗ್, ಬರ್ಕ್ಲಿ) ವಾಸ್ತವವಾಗಿ, ಒಂದು ವರ್ಚುವಲ್ ಯಂತ್ರ ಮಾದರಿಯಾಗಿದೆ. ಈ ವರ್ಚುವಲ್ ಯಂತ್ರವನ್ನು ಮೂಲತಃ ಪ್ಯಾಕೆಟ್ ಫಿಲ್ಟರಿಂಗ್ ಅನ್ನು ನಿರ್ವಹಿಸಲು ವಿನ್ಯಾಸಗೊಳಿಸಲಾಗಿದೆ, ಆದ್ದರಿಂದ ಈ ಹೆಸರು.

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; ಸಂಚಯಕ ಮತ್ತು ಸೂಚ್ಯಂಕ ರೆಜಿಸ್ಟರ್‌ಗಳು), ಸ್ಕ್ರ್ಯಾಚ್ ಮೆಮೊರಿ ಸಂಗ್ರಹಣೆ ಮತ್ತು ಸೂಚ್ಯ ಪ್ರೋಗ್ರಾಂ ಕೌಂಟರ್ ಅನ್ನು ಸಹ ವ್ಯಾಖ್ಯಾನಿಸುತ್ತದೆ. ಕುತೂಹಲಕಾರಿಯಾಗಿ, BPF ಬೈಟ್‌ಕೋಡ್ ಅನ್ನು Motorola 6502 ISA ಮಾದರಿಯಲ್ಲಿ ರೂಪಿಸಲಾಗಿದೆ. ಸ್ಟೀವ್ ಮೆಕ್‌ಕಾನ್ ಅವರಲ್ಲಿ ನೆನಪಿಸಿಕೊಂಡಂತೆ ಸಮಗ್ರ ವರದಿ Sharkfest '11 ನಲ್ಲಿ, ಅವರು Apple II ನಲ್ಲಿ ಪ್ರೋಗ್ರಾಮಿಂಗ್ ಮಾಡುವಾಗ ಹೈಸ್ಕೂಲ್‌ನಿಂದ ಬಿಲ್ಡ್ 6502 ಅನ್ನು ಪರಿಚಿತರಾಗಿದ್ದರು ಮತ್ತು ಈ ಜ್ಞಾನವು BPF ಬೈಟ್‌ಕೋಡ್ ಅನ್ನು ವಿನ್ಯಾಸಗೊಳಿಸುವ ಅವರ ಕೆಲಸದ ಮೇಲೆ ಪ್ರಭಾವ ಬೀರಿತು.

BPF ಬೆಂಬಲವನ್ನು ಲಿನಕ್ಸ್ ಕರ್ನಲ್‌ನಲ್ಲಿ ಆವೃತ್ತಿ v2.5 ಮತ್ತು ನಂತರ ಅಳವಡಿಸಲಾಗಿದೆ, ಇದನ್ನು ಮುಖ್ಯವಾಗಿ ಜೇ ಸ್ಚುಲಿಸ್ಟ್ ಸೇರಿಸಿದ್ದಾರೆ. BPF ಕೋಡ್ 2011 ರವರೆಗೆ ಬದಲಾಗದೆ ಉಳಿಯಿತು, ಎರಿಕ್ ಡುಮಾಸೆಟ್ 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 ಉದಾಹರಣೆ

Linux ಕರ್ನಲ್ ಮೂಲಗಳಲ್ಲಿ 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

ಮಾದರಿ/ಬಿಪಿಎಫ್/ನಲ್ಲಿನ ಎಲ್ಲಾ ಇತರ ಕಾರ್ಯಕ್ರಮಗಳು ಇದೇ ರೀತಿ ರಚನೆಗೊಂಡಿವೆ. ಅವು ಯಾವಾಗಲೂ ಎರಡು ಫೈಲ್‌ಗಳನ್ನು ಒಳಗೊಂಡಿರುತ್ತವೆ:

  • XXX_kern.c: eBPF ಪ್ರೋಗ್ರಾಂ.
  • XXX_user.c: ಮುಖ್ಯ ಕಾರ್ಯಕ್ರಮ.

eBPF ಪ್ರೋಗ್ರಾಂ ಒಂದು ವಿಭಾಗಕ್ಕೆ ಸಂಬಂಧಿಸಿದ ನಕ್ಷೆಗಳು ಮತ್ತು ಕಾರ್ಯಗಳನ್ನು ವ್ಯಾಖ್ಯಾನಿಸುತ್ತದೆ. ಕರ್ನಲ್ ಒಂದು ನಿರ್ದಿಷ್ಟ ಪ್ರಕಾರದ ಈವೆಂಟ್ ಅನ್ನು ಹೊರಸೂಸಿದಾಗ (ಉದಾಹರಣೆಗೆ, tracepoint), ಬೌಂಡ್ ಕಾರ್ಯಗಳನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸಲಾಗುತ್ತದೆ. ನಕ್ಷೆಗಳು ಕರ್ನಲ್ ಪ್ರೋಗ್ರಾಂ ಮತ್ತು ಯೂಸರ್-ಸ್ಪೇಸ್ ಪ್ರೋಗ್ರಾಂ ನಡುವೆ ಸಂವಹನವನ್ನು ಒದಗಿಸುತ್ತದೆ.

ತೀರ್ಮಾನಕ್ಕೆ

ಈ ಲೇಖನದಲ್ಲಿ, BPF ಮತ್ತು eBPF ಅನ್ನು ಸಾಮಾನ್ಯ ಪರಿಭಾಷೆಯಲ್ಲಿ ಚರ್ಚಿಸಲಾಗಿದೆ. ಇಂದು eBPF ಕುರಿತು ಸಾಕಷ್ಟು ಮಾಹಿತಿ ಮತ್ತು ಸಂಪನ್ಮೂಲಗಳಿವೆ ಎಂದು ನನಗೆ ತಿಳಿದಿದೆ, ಆದ್ದರಿಂದ ಹೆಚ್ಚಿನ ಅಧ್ಯಯನಕ್ಕಾಗಿ ನಾನು ಇನ್ನೂ ಕೆಲವು ವಸ್ತುಗಳನ್ನು ಶಿಫಾರಸು ಮಾಡುತ್ತೇನೆ.

ನಾನು ಓದಲು ಶಿಫಾರಸು ಮಾಡುತ್ತೇವೆ:

  • BPF: ಯುನಿವರ್ಸಲ್ ಇನ್-ಕರ್ನಲ್ ವರ್ಚುವಲ್ ಯಂತ್ರ ಜೊನಾಥನ್ ಕಾರ್ಬೆಟ್. BPF ಗೆ ಒಂದು ಪರಿಚಯ ಮತ್ತು ಅದು eBPF ಆಗಿ ಹೇಗೆ ವಿಕಸನಗೊಂಡಿದೆ.
  • eBPF ಗೆ ಸಂಪೂರ್ಣ ಪರಿಚಯ ಬ್ರೆಂಡನ್ ಗ್ರೆಗ್. LWN.net ನಿಂದ ಲೇಖನ. ಬ್ರೆಂಡನ್ ಆಗಾಗ್ಗೆ eBPF ಕುರಿತು ಟ್ವೀಟ್ ಮಾಡುತ್ತಾರೆ ಮತ್ತು ಅವರ ವೆಬ್‌ಸೈಟ್‌ನಲ್ಲಿ ವಿಷಯದ ಕುರಿತು ಸಂಪನ್ಮೂಲಗಳ ಪಟ್ಟಿಯನ್ನು ನಿರ್ವಹಿಸುತ್ತಾರೆ. ಬ್ಲಾಗ್ ಪೋಸ್ಟ್.
  • BPF ಮತ್ತು eBPF ಕುರಿತು ಟಿಪ್ಪಣಿಗಳು ಜೂಲಿಯಾ ಇವಾನ್ಸ್. ಸುಚಕ್ರ ಶರ್ಮಾ ಅವರ ಪ್ರಸ್ತುತಿಯ ಕುರಿತು ಪ್ರತಿಕ್ರಿಯೆಗಳು “ಬಿಎಸ್‌ಡಿ ಪ್ಯಾಕೆಟ್ ಫಿಲ್ಟರ್: ಬಳಕೆದಾರರ ಮಟ್ಟದ ಪ್ಯಾಕೆಟ್ ಕ್ಯಾಪ್ಚರ್‌ಗಾಗಿ ಹೊಸ ಆರ್ಕಿಟೆಕ್ಚರ್”. ಕಾಮೆಂಟ್‌ಗಳು ಉತ್ತಮವಾಗಿವೆ ಮತ್ತು ಸ್ಲೈಡ್‌ಗಳನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳಲು ನಿಜವಾಗಿಯೂ ಸಹಾಯ ಮಾಡುತ್ತವೆ.
  • eBPF, ಭಾಗ1: ಭೂತ, ವರ್ತಮಾನ ಮತ್ತು ಭವಿಷ್ಯ ಫೆರ್ರಿಸ್ ಎಲ್ಲಿಸ್. ಜೊತೆ ಲಾಂಗ್ರೆಡ್ ಮುಂದುವರಿಕೆಆದರೆ ಓದಲು ಯೋಗ್ಯವಾಗಿದೆ. ನಾನು ಕಂಡ ಅತ್ಯುತ್ತಮ eBPF ಲೇಖನಗಳಲ್ಲಿ ಒಂದಾಗಿದೆ.

ಮೂಲ: www.habr.com

ಕಾಮೆಂಟ್ ಅನ್ನು ಸೇರಿಸಿ