рдмреАрдкреАрдПрдл рдФрд░ рдИрдмреАрдкреАрдПрдл рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкрд░рд┐рдЪрдп

рд╣реЗ рд╣рдмрд░! рд╣рдо рдЖрдкрдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдПрдХ рдкреБрд╕реНрддрдХ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреА рддреИрдпрд╛рд░реА рдХрд░ рд░рд╣реЗ рд╣реИрдВ"рдмреАрдкреАрдПрдл рдХреЗ рд╕рд╛рде рд▓рд┐рдирдХреНрд╕ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд┐рд▓рд┐рдЯреА".

рдмреАрдкреАрдПрдл рдФрд░ рдИрдмреАрдкреАрдПрдл рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдкрд░рд┐рдЪрдп
рдЪреВрдВрдХрд┐ рдмреАрдкреАрдПрдл рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рд▓рдЧрд╛рддрд╛рд░ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛ рд░рд╣реА рд╣реИ рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ, рд╣рдордиреЗ рдЖрдкрдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдФрд░ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рд▓реЗрдЦ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд┐рдпрд╛ рд╣реИред

рд╣рд╛рд▓ рдХреЗ рд╡рд░реНрд╖реЛрдВ рдореЗрдВ, рдЙрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрд╣рд╛рдВ рдЙрдЪреНрдЪ-рдкреНрд░рджрд░реНрд╢рди рдкреИрдХреЗрдЯ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдХреА рд╕реАрдорд╛рдУрдВ рдХреА рднрд░рдкрд╛рдИ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЯреВрд▓ рдФрд░ рддрдХрдиреАрдХреЛрдВ рдиреЗ рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рд╣рд╛рд╕рд┐рд▓ рдХреА рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреЛрд░ рдмрд╛рдИрдкрд╛рд╕ (рдХрд░реНрдиреЗрд▓ рдмрд╛рдпрдкрд╛рд╕) рдФрд░ рдХрд░реНрдиреЗрд▓ рдХреА рдиреЗрдЯрд╡рд░реНрдХ рдкрд░рдд рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдерд╛рди рд╕реЗ рд╕рднреА рдкреИрдХреЗрдЯ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдХрд░реНрдиреЗрд▓ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдореЗрдВ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛рд░реНрдб рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдирд╛ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ рдЙрдкрдпреЛрдХреНрддрд╛ рд╕реНрдерд╛рди. рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛рд░реНрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдбреНрд░рд╛рдЗрд╡рд░ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ рдЙрдкрдпреЛрдХреНрддрд╛ рд╕реНрдерд╛рди.

рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛рд░реНрдб рдХрд╛ рдкреВрд░реНрдг рдирд┐рдпрдВрддреНрд░рдг рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рд╕реНрдкреЗрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдХреЗ, рд╣рдо рдХрд░реНрдиреЗрд▓ (рд╕рдВрджрд░реНрдн рд╕реНрд╡рд┐рдЪ, рдиреЗрдЯрд╡рд░реНрдХ рдкрд░рдд рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг, рдЗрдВрдЯрд░рдкреНрдЯ рдЗрддреНрдпрд╛рджрд┐) рдХреЗ рдХрд╛рд░рдг рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдУрд╡рд░рд╣реЗрдб рдХреЛ рдХрдо рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ 10 рдЬреАрдмреА / рдПрд╕ рдпрд╛ рдХреА рдЧрддрд┐ рдкрд░ рдЪрд▓рдиреЗ рдкрд░ рдХрд╛рдлреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдЙрдЪреНрдЪрддрд░. рдХрд░реНрдиреЗрд▓ рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЕрдиреНрдп рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рд╕рдВрдпреЛрдЬрди (рдкреНрд░рдЪрдп рд╕рдВрд╕рд╛рдзрди) рдФрд░ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдкреНрд░рджрд░реНрд╢рди рдЯреНрдпреВрдирд┐рдВрдЧ (NUMA рд▓реЗрдЦрд╛рдВрдХрди, рд╕реАрдкреАрдпреВ рдЕрд▓рдЧрд╛рд╡, рдЖрджрд┐) рдЙрдЪреНрдЪ-рдкреНрд░рджрд░реНрд╢рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рд╕реНрдкреЗрд╕ рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рдлрд┐рдЯ рдмреИрдарддреЗ рд╣реИрдВред рд╢рд╛рдпрдж рдкреИрдХреЗрдЯ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЗ рдЗрд╕ рдирдП рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдПрдХ рдЕрдиреБрдХрд░рдгреАрдп рдЙрджрд╛рд╣рд░рдг рд╣реИ рдбреАрдкреАрдбреАрдХреЗ рдЗрдВрдЯреЗрд▓ рд╕реЗ (рдбреЗрдЯрд╛ рдкреНрд▓реЗрди рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдХрд┐рдЯ), рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдиреНрдп рдкреНрд░рд╕рд┐рджреНрдз рдЙрдкрдХрд░рдг рдФрд░ рддрдХрдиреАрдХреЗрдВ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕рд┐рд╕реНрдХреЛ рд╕реЗ рд╡реАрдкреАрдкреА (рд╡реЗрдХреНрдЯрд░ рдкреИрдХреЗрдЯ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ), рдиреЗрдЯрдореИрдк рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЭрдкрдЯрдирд╛.

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдерд╛рди рдореЗрдВ рдиреЗрдЯрд╡рд░реНрдХ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЗ рд╕рдВрдЧрдарди рдХреЗ рдХрдИ рдиреБрдХрд╕рд╛рди рд╣реИрдВ:

  • OS рдХрд░реНрдиреЗрд▓ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдореВрд░реНрдд рдкрд░рдд рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдЕрдВрддрд░рд┐рдХреНрд╖ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рд╕реАрдзреЗ рдЕрдкрдиреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИ, рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХрд╛ рднреА рдкреНрд░рдмрдВрдзрди рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдЕрдХреНрд╕рд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рдирд╛ рд╣реЛрддрд╛ рд╣реИред
  • рдЪреВрдБрдХрд┐ рд╣рдо рдХрд░реНрдиреЗрд▓ рд╕реНрдкреЗрд╕ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЫреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВ, рд╣рдо рдХрд░реНрдиреЗрд▓ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рд╕рднреА рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рднреА рдЫреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рд╕реНрдкреЗрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдЙрди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд░реНрдиреЗрд▓ рдпрд╛ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред
  • рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдореЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЙрдирдХреА рдмрд╛рддрдЪреАрдд рдХреЛ рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЕрдиреНрдп рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдерд╛рди рдореЗрдВ рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп, рдкреИрдХреЗрдЯ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЛ рдХрд░реНрдиреЗрд▓ рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдерд╛рди рдкрд░ рд▓реЗ рдЬрд╛рдХрд░ рдкреНрд░рджрд░реНрд╢рди рд▓рд╛рдн рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред XDP рдмрд┐рд▓реНрдХреБрд▓ рд╡рд┐рдкрд░реАрдд рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ: рдпрд╣ рдиреЗрдЯрд╡рд░реНрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдерд╛рди (рдлрд╝рд┐рд▓реНрдЯрд░, рдХрдиреНрд╡рд░реНрдЯрд░реНрд╕, рд░реВрдЯрд┐рдВрдЧ, рдЖрджрд┐) рд╕реЗ рдХрд░реНрдиреЗрд▓ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред рдЬреИрд╕реЗ рд╣реА рдкреИрдХреЗрдЯ рдиреЗрдЯрд╡рд░реНрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдЯрдХрд░рд╛рддрд╛ рд╣реИ рдФрд░ рдХрд░реНрдиреЗрд▓ рдХреЗ рдиреЗрдЯрд╡рд░реНрдХ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рддрдХ рдпрд╛рддреНрд░рд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ XDP рд╣рдореЗрдВ рдиреЗрдЯрд╡рд░реНрдХ рдлрд╝рдВрдХреНрд╢рди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдкреИрдХреЗрдЯ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЧрддрд┐ рдореЗрдВ рдХрд╛рдлреА рд╡реГрджреНрдзрд┐ рд╣реБрдИ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХрд░реНрдиреЗрд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХрд░реНрдиреЗрд▓ рд╕реНрдкреЗрд╕ рдореЗрдВ рдЕрдкрдиреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдХреИрд╕реЗ рджреЗрддрд╛ рд╣реИ? рдЗрд╕ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдмреАрдкреАрдПрдл рдХреНрдпрд╛ рд╣реИред

рдмреАрдкреАрдПрдл рдФрд░ рдИрдмреАрдкреАрдПрдл

рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдирд╛рдо рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдмреАрдкреАрдПрдл (рдкреИрдХреЗрдЯ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ, рдмрд░реНрдХрд▓реЗ) рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдореЙрдбрд▓ рд╣реИред рдпрд╣ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдореВрд▓ рд░реВрдк рд╕реЗ рдкреИрдХреЗрдЯ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЧрдИ рдереА, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдпрд╣ рдирд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ред

BPF рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрдзрд┐рдХ рдкреНрд░рд╕рд┐рджреНрдз рдЙрдкрдХрд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ tcpdump. рдкреИрдХреЗрдЯ рдХреИрдкреНрдЪрд░ рдХрд░рддреЗ рд╕рдордп tcpdump рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреИрдХреЗрдЯ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдХреЗрд╡рд▓ рдЗрд╕ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреИрдХреЗрдЯ рд╣реА рдХреИрдкреНрдЪрд░ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ "tcp dst port 80тАЭ рдкреЛрд░реНрдЯ 80 рдкрд░ рдЖрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдЯреАрд╕реАрдкреА рдкреИрдХреЗрдЯреЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░ рдЗрд╕ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдмреАрдкреАрдПрдл рдмрд╛рдЗрдЯрдХреЛрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдХреЗ рдЫреЛрдЯрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

$ 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 (рдЖрдИрдкреАрд╡реА4 рдХреЗ рд▓рд┐рдП рдИрдерд░рдЯрд╛рдЗрдк рдорд╛рди) рд╕реЗ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЙрддреНрддрд░ рд╕рддреНрдп рд╣реИ, рддреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо (007) рдкрд░ рдЬрд╛рддрд╛ рд╣реИ, рдпрджрд┐ рдирд╣реАрдВ, рддреЛ (015) рдкрд░ рдЬрд╛рддрд╛ рд╣реИред

рдФрд░ рдЗрд╕реА рддрд░рд╣, рдЬрдм рддрдХ рдХрд┐ рдкреИрдХреЗрдЯ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдИ рдкрд░рд┐рдгрд╛рдо рди рджреЗ рджреЗред рдЖрдорддреМрд░ рдкрд░ рдпрд╣ рдмреВрд▓рд┐рдпрди рд╣реЛрддрд╛ рд╣реИ. рдЧреИрд░-рд╢реВрдиреНрдп рдорд╛рди (рдирд┐рд░реНрджреЗрд╢ (014)) рд▓реМрдЯрд╛рдиреЗ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкреИрдХреЗрдЯ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдФрд░ рд╢реВрдиреНрдп рд▓реМрдЯрд╛рдиреЗ (рдирд┐рд░реНрджреЗрд╢ (015)) рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкреИрдХреЗрдЯ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ рд╣реИред

рдмреАрдкреАрдПрдл рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рдЗрдЯрдХреЛрдб рдХреЛ 1992 рдХреЗ рдЕрдВрдд рдореЗрдВ рд╕реНрдЯреАрд╡ рдореИрдХрдХреИрди рдФрд░ рд╡реИрди рдЬреИрдХрдмрд╕рди рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬрдм рдЙрдирдХрд╛ рдкреЗрдкрд░ рд╕рд╛рдордиреЗ рдЖрдпрд╛ рдерд╛ред рдмреАрдПрд╕рдбреА рдкреИрдХреЗрдЯ рдлрд╝рд┐рд▓реНрдЯрд░: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рд╕реНрддрд░реАрдп рдкреИрдХреЗрдЯ рдХреИрдкреНрдЪрд░ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░, рдкрд╣рд▓реА рдмрд╛рд░ рдЗрд╕ рддрдХрдиреАрдХ рдХреЛ 1993 рдХреА рд╕рд░реНрджрд┐рдпреЛрдВ рдореЗрдВ рдпреВрд╕реЗрдирд┐рдХреНрд╕ рд╕рдореНрдореЗрд▓рди рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдЪреВрдБрдХрд┐ BPF рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рд╣реИ, рдпрд╣ рдЙрд╕ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд▓рддреЗ рд╣реИрдВред рдмрд╛рдЗрдЯрдХреЛрдб рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдПрдХ рдкреИрдХреЗрдЯ рдореЗрдореЛрд░реА рдореЙрдбрд▓ (рд▓реЛрдб рдирд┐рд░реНрджреЗрд╢ рдПрдХ рдкреИрдХреЗрдЯ рдкрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ), рд░рдЬрд┐рд╕реНрдЯрд░ (рдП рдФрд░ рдПрдХреНрд╕; рд╕рдВрдЪрд╛рдпрдХ рдФрд░ рдЗрдВрдбреЗрдХреНрд╕ рд░рдЬрд┐рд╕реНрдЯрд░), рд╕реНрдХреНрд░реИрдЪ рдореЗрдореЛрд░реА рд╕реНрдЯреЛрд░реЗрдЬ рдФрд░ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛рдЙрдВрдЯрд░ рдХреЛ рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдмреАрдкреАрдПрдл рдмрд╛рдЗрдЯрдХреЛрдб рдХреЛ рдореЛрдЯреЛрд░реЛрд▓рд╛ 6502 рдЖрдИрдПрд╕рдП рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЬреИрд╕рд╛ рдХрд┐ рд╕реНрдЯреАрд╡ рдореИрдХреНрдХреИрди рдиреЗ рдЕрдкрдиреЗ рдореЗрдВ рдпрд╛рдж рдХрд┐рдпрд╛ рдкреВрд░реНрдг рд░рд┐рдкреЛрд░реНрдЯ рд╢рд╛рд░реНрдХрдлреЗрд╕реНрдЯ '11 рдореЗрдВ, рдПрдкреНрдкрд▓ II рдкрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп рд╡рд╣ рд╣рд╛рдИ рд╕реНрдХреВрд▓ рд╕реЗ рдмрд┐рд▓реНрдб 6502 рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдереЗ, рдФрд░ рдЗрд╕ рдЬреНрдЮрд╛рди рдиреЗ рдмреАрдкреАрдПрдл рдмрд╛рдЗрдЯрдХреЛрдб рдХреЛ рдбрд┐рдЬрд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рдЙрдирдХреЗ рдХрд╛рдо рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ред

рдмреАрдкреАрдПрдл рд╕рдорд░реНрдерди рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рд╕рдВрд╕реНрдХрд░рдг v2.5 рдФрд░ рдмрд╛рдж рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЬреЗ рд╢реВрд▓рд┐рд╕реНрдЯ рджреНрд╡рд╛рд░рд╛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред рдмреАрдкреАрдПрдл рдХреЛрдб 2011 рддрдХ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣рд╛, рдЬрдм рдПрд░рд┐рдХ рдбреБрдорд╛рд╕реЗрдЯ рдиреЗ рдЬреЗрдЖрдИрдЯреА рдореЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреАрдкреАрдПрдл рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдбрд┐рдЬрд╛рдЗрди рдХрд┐рдпрд╛ (рд╕реНрд░реЛрдд: рдкреИрдХреЗрдЯ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЗ рд▓рд┐рдП JIT). рдЙрд╕рдХреЗ рдмрд╛рдж, BPF рдмрд╛рдЗрдЯрдХреЛрдб рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдХрд░реНрдиреЗрд▓ рд╕реАрдзреЗ BPF рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рд▓рдХреНрд╖реНрдп рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ: x86, ARM, MIPS, рдЖрджрд┐ред

рдмрд╛рдж рдореЗрдВ, 2014 рдореЗрдВ, рдПрд▓реЗрдХреНрд╕реА рд╕реНрдЯрд╛рд░реЛрд╡реЛрдЗрдЯреЛрд╡ рдиреЗ рдмреАрдкреАрдПрдл рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдЬреЗрдЖрдИрдЯреА рддрдВрддреНрд░ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдирдпрд╛ JIT BPF рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рдирдпрд╛ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдмрди рдЧрдпрд╛ рдФрд░ рдЗрд╕реЗ eBPF рдХрд╣рд╛ рдЧрдпрд╛ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рджреЛрдиреЛрдВ рд╡реАрдПрдо рдХреБрдЫ рд╕рдордп рдХреЗ рд▓рд┐рдП рд╕рд╣-рдЕрд╕реНрддрд┐рддреНрд╡ рдореЗрдВ рдереЗ, рд▓реЗрдХрд┐рди рдкреИрдХреЗрдЯ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдИрдмреАрдкреАрдПрдл рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд▓рд╛рдЧреВ рдХреА рдЧрдИ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрдИ рдЖрдзреБрдирд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ, рдмреАрдкреАрдПрдл рдХреЛ рдИрдмреАрдкреАрдПрдл рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╢рд╛рд╕реНрддреНрд░реАрдп рдмреАрдкреАрдПрдл рдХреЛ рдЖрдЬ рд╕реАрдмреАрдкреАрдПрдл рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред

eBPF рдХреНрд▓рд╛рд╕рд┐рдХ BPF рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЛ рдХрдИ рддрд░реАрдХреЛрдВ рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ:

  • рдЖрдзреБрдирд┐рдХ 64-рдмрд┐рдЯ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред eBPF 64-рдмрд┐рдЯ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдкрд▓рдмреНрдз рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ 2 (рд╕рдВрдЪрд╛рдпрдХ рдФрд░ X) рд╕реЗ рдмрдврд╝рд╛рдХрд░ 10 рдХрд░ рджреЗрддрд╛ рд╣реИред eBPF рдЕрддрд┐рд░рд┐рдХреНрдд рдСрдкрдХреЛрдб (BPF_MOV, BPF_JNE, BPF_CALL...) рднреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
  • рдиреЗрдЯрд╡рд░реНрдХ рд▓реЗрдпрд░ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдмреАрдкреАрдПрдл рдмреИрдЪ рдбреЗрдЯрд╛ рдореЙрдбрд▓ рд╕реЗ рдЬреБрдбрд╝рд╛ рдерд╛ред рдЪреВрдБрдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреИрдХреЗрдЯреЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рдерд╛, рдЗрд╕рдХрд╛ рдХреЛрдб рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдерд╛ рдЬреЛ рдиреЗрдЯрд╡рд░реНрдХ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рдерд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, eBPF рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдЕрдм рдбреЗрдЯрд╛ рдореЙрдбрд▓ рд╕реЗ рдмрдВрдзреА рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рднреА рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рддреЛ, рдЕрдм eBPF рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдЯреНрд░реЗрд╕рдкреЙрдЗрдВрдЯ рдпрд╛ kprobe рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЕрдиреНрдп рдХрд░реНрдиреЗрд▓ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдИрдмреАрдкреАрдПрдл рдЗрдВрд╕реНрдЯреНрд░реВрдореЗрдВрдЯреЗрд╢рди, рдкреНрд░рджрд░реНрд╢рди рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдФрд░ рдХрдИ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рджреНрд╡рд╛рд░ рдЦреЛрд▓рддрд╛ рд╣реИред рдЕрдм рдИрдмреАрдкреАрдПрдл рдХреЛрдб рдЕрдкрдиреЗ рдкрде рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ: рдХрд░реНрдиреЗрд▓/рдмреАрдкреАрдПрдлред
  • рд╡реИрд╢реНрд╡рд┐рдХ рдбреЗрдЯрд╛ рднрдВрдбрд╛рд░ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдкреНрд╕ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдорд╛рдирдЪрд┐рддреНрд░ рдХреБрдВрдЬреА-рдореВрд▓реНрдп рднрдВрдбрд╛рд░ рд╣реИрдВ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдерд╛рди рдФрд░ рдХрд░реНрдиреЗрд▓ рд╕реНрдерд╛рди рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рд╡рд┐рдирд┐рдордп рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред eBPF рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдб рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
  • рджреНрд╡рд┐рддреАрдпрдХ рдХрд╛рд░реНрдп. рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдХрд┐рд╕реА рдкреИрдХреЗрдЬ рдХреЛ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░рдиреЗ, рдЪреЗрдХрд╕рдо рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ, рдпрд╛ рдХрд┐рд╕реА рдкреИрдХреЗрдЬ рдХреЛ рдХреНрд▓реЛрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдпреЗ рдлрд╝рдВрдХреНрд╢рди рдХрд░реНрдиреЗрд▓ рдХреЗ рдЕрдВрджрд░ рдЪрд▓рддреЗ рд╣реИрдВ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рд╕реНрдкреЗрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, eBPF рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реЗ рд╕рд┐рд╕реНрдЯрдо рдХреЙрд▓ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред
  • рдХреЙрд▓ рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ. eBPF рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд╛ рдЖрдХрд╛рд░ 4096 рдмрд╛рдЗрдЯреНрд╕ рддрдХ рд╕реАрдорд┐рдд рд╣реИред рдПрдВрдб рдХреЙрд▓ рд╕реБрд╡рд┐рдзрд╛ рдПрдХ eBPF рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдирд┐рдпрдВрддреНрд░рдг рдХреЛ рдПрдХ рдирдП eBPF рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЗрд╕ рд╕реАрдорд╛ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рддреА рд╣реИ (32 рдкреНрд░реЛрдЧреНрд░рд╛рдо рддрдХ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЬрдВрдЬреАрд░ рдмрдирд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИ)ред

рдИрдмреАрдкреАрдПрдл рдЙрджрд╛рд╣рд░рдг

рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рд╕реНрд░реЛрддреЛрдВ рдореЗрдВ eBPF рдХреЗ рдХрдИ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред рд╡реЗ рдирдореВрдиреЗ/рдмреАрдкреАрдПрдл/ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рдЗрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдЯрд╛рдЗрдк рдХрд░реЗрдВ:

$ sudo make samples/bpf/

рдореИрдВ рд╕реНрд╡рдпрдВ рдИрдмреАрдкреАрдПрдл рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдирдпрд╛ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рд▓рд┐рдЦреВрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдирдореВрдиреЗ/рдмреАрдкреАрдПрдл/ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдирдореВрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред рдореИрдВ рдХреЛрдб рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ рджреЗрдЦреВрдВрдЧрд╛ рдФрд░ рд╕рдордЭрд╛рдКрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рддреМрд░ рдкрд░, рдореИрдВрдиреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдЪреБрдирд╛ tracex4.

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдирдореВрдиреЗ/рдмреАрдкреАрдПрдл/ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рджреЛ рдлрд╝рд╛рдЗрд▓реЗрдВ рд╣реЛрддреА рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ:

  • tracex4_kern.c, рдХрд░реНрдиреЗрд▓ рдореЗрдВ eBPF рдмрд╛рдЗрдЯрдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рд╕реНрд░реЛрдд рдХреЛрдб рд╢рд╛рдорд┐рд▓ рд╣реИред
  • tracex4_user.c, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдерд╛рди рд╕реЗ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╢рд╛рдорд┐рд▓ рд╣реИред

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рд╕рдВрдХрд▓рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ tracex4_kern.c рдИрдмреАрдкреАрдПрдл рдмрд╛рдЗрдЯрдХреЛрдб рдХреЗ рд▓рд┐рдПред рдлрд┐рд▓рд╣рд╛рд▓ рдореЗрдВ gcc eBPF рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рд░реНрд╡рд░ рдкрд╛рд░реНрдЯ рдирд╣реАрдВ рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, clang рдИрдмреАрдкреАрдПрдл рдмрд╛рдЗрдЯрдХреЛрдб рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░ рд╕рдХрддрд╛ рд╣реИред Makefile рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ clang рд╕рдВрдХрд▓рди рдХрд░рдирд╛ tracex4_kern.c рдСрдмреНрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ.

рдореИрдВрдиреЗ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдИрдмреАрдкреАрдПрдл рдХреА рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдорд╛рдирдЪрд┐рддреНрд░ рд╣реИред рдЯреНрд░реЗрд╕рдПрдХреНрд╕4_рдХрд░реНрди рдПрдХ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ:

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"). рдПрд╕рдИрд╕реА рдПрдХ рдореИрдХреНрд░реЛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╛рдЗрдирд░реА рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдПрдХ рдирдпрд╛ рдЕрдиреБрднрд╛рдЧ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рджрд░рдЕрд╕рд▓, рдЙрджрд╛рд╣рд░рдг рдореЗрдВ 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

рдпреВрдЬрд░ рд╕реНрдкреЗрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдФрд░ рдИрдмреАрдкреАрдПрдл рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреИрд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ? рдЖрд░рдВрднреАрдХрд░рдг рдкрд░ 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: рдИрдмреАрдкреАрдПрдл рдХрд╛рд░реНрдпрдХреНрд░рдоред
  • XXX_user.c: рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо.

eBPF рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд┐рд╕реА рдЕрдиреБрднрд╛рдЧ рд╕реЗ рдЬреБрдбрд╝реЗ рдорд╛рдирдЪрд┐рддреНрд░реЛрдВ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЬрдм рдХрд░реНрдиреЗрд▓ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреА рдШрдЯрдирд╛ рдЙрддреНрд╕рд░реНрдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, tracepoint), рдмрд╛рдЙрдВрдб рдлрд╝рдВрдХреНрд╢рдВрд╕ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдорд╛рдирдЪрд┐рддреНрд░ рдХрд░реНрдиреЗрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рд╕реНрдкреЗрд╕ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдмреАрдЪ рд╕рдВрдЪрд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред

рдирд┐рд╖реНрдХрд░реНрд╖

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, BPF рдФрд░ eBPF рдкрд░ рд╕рд╛рдорд╛рдиреНрдп рд╢рдмреНрджреЛрдВ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИред рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЖрдЬ рдИрдмреАрдкреАрдПрдл рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реА рдЬрд╛рдирдХрд╛рд░реА рдФрд░ рд╕рдВрд╕рд╛рдзрди рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЖрдЧреЗ рдХреЗ рдЕрдзреНрдпрдпрди рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдФрд░ рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред

рдореИрдВ рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ:

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ