eBPF (Burkeley Packet Filter)

익명 사용자의 이미지

eBPF bytecode가 커널에 적재되기 전에 verifier를 통해 검증을 합니다.
검증하는 항목중에는 "무한 loop를 도는지"에 대한 것도 검사하는 걸로 알고있는데
무한loop 탐지 알고리즘은 만드는게 불가능하다고 알고있습니다. 휴리스틱을 섞어서 탐지하나요, 다른 트릭을 섞어서 탐지하나요??

bushi의 이미지

"알고 있다" 라는 말은 어디서 누가 한 말을 들었다는 뜻인가요, 아니면 본인이 전에 공부와 연구를 해서 내린 결론이 그렇다는 뜻인가요.

소스 코드를 한 번이라도 보세요.
까막눈이 볼까봐 코멘트도 엄청 친절하게 달려있네요.
https://github.com/torvalds/linux/blob/master/kernel/bpf/verifier.c#L7482
그런데도 뭐가 확 와닿지는 않습니다.
개념적으론, https://ratsgo.github.io/data%20structure&algorithm/2017/11/20/DFS/ 의 그림에서 back-edge 로 가면, 그러니까 노드 탐색이 완료되는 부모들 중의 하나를 다시 만나는 길로 가면 100% 루프 돌긴 하잖아요.
누구나 알듯이.

+

차라리 https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next.git/commit/?id=2589726d12a1b12eaaa93c7f1ea64287e383c7a5 이게 보기엔 더 편하겠습니다. linux-5.3 에 반영된 것.

익명 사용자의 이미지

감사합니다. BPF를 깊게 알려고 하는게 아니라 조사하고있는 상황이라 인터넷에 있는 글들만 봤습니다.

혹시 "알고있다" 보다 좋은 표현이 있을까요?
그리고 여기 계시는 고수분들은 모르는게 있으면 전부 소스코드를 보고 이해하시나요?

아직 그정도 수준이 아니라서 질문글을 올린건데 답을 찾기가 힘드네요..

432243의 이미지

그건 아니지만 어쨌든 loop avoid로 구현을 해놨으니 코드를 보면 실마리를 얻겠죠.

익명 사용자의 이미지

근데 제가 궁금한건 단순한 loop 탐지가 아니라 "무한 loop"탐지 입니다.
무한 loop탐지는 불가능하다고 알고있는데 BPF verifier에서는 탐지한다고해서 질문드린겁니다.
아니면 BPF verifier가 무한 loop탐지한다는 것이 잘못된 것인가요?

432243의 이미지

그니까요... 님은 ebpf가 "무한 loop"를 탐지하는지 아닌지 궁금하잖아요. 그러면 코드를 보고 실마리를 얻으면 되잖아요..
그게 진짜 무한 loop를 탐지하는지 아닌지는 보면 알거 아닙니까.. 님이 하는 말은 "난 아무것도 모르는데 그렇다고 내가 직접 알아내기도 싫어"로 들려요.

익명 사용자의 이미지

아하 DFS 글과 "loop탐지" 단어만 보고 제 의미가 잘못 전달된 줄 알았는데 그게 아니였군요.

ymir의 이미지

'알고 있다' 는 내용이 사실인지 아닌지 판단할만한 근거가 있는지 보여달란 의미로 보이네요.
말 그대로, 뭘 보고 그렇게 판단했는가? 근거는 믿을만한가? 또는 해석은 정확한가? 확인할 수 있을만한..

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

익명 사용자의 이미지

제가 블로그 글들을 보고 알게된건데 그런 링크 마음대로 달아도 되나요? 홍보 등의 문제로 못하게 하는 곳이 있어서..

ymir의 이미지

안 될 이유가 없죠. 오히려 자신의 글에 대한 신뢰성을 확보하기 위해 레퍼런스를 붙이는 건 자연스럽고 권장할만한 일이라고 봅니다.

간단히 'detecting infinite loops' 등으로 검색해 보면, infinite loop 에 대한 문제는 많이 논의 되고 있음을 알 수 있고, 꽤 어려운 문제라는 걸 짐작할 수 있었습니다.

그런데, ebpf verifier 에서 그걸 해결했다고 하시니, 궁금해져서 ebpf detecting infinite loops 와 같이 ebpf 또는 bpf 를 덧붙여서 검색해 봤는데, 특별히 그에 대한 언급은 볼 수 없었습니다.

그나마 loop 를 지원하지 않기 때문에, verifier 에서 loop 를 탐지 한다거나, 최근 bounded loop 는 지원하기 시작했다는 글은 검색이 되더군요.
이쯤되면 문외한인 사람도 궁금해지기 시작하더군요. 검색으로 쉽게 안 나오는 내용 같은데 어디서 본걸까? 하고 말이죠.

https://github.com/torvalds/linux/blob/master/kernel/bpf/verifier.c#L8591

위에 bushi 님이 올리신 소스에서, 8591 라인을 보면..
visited branch 의 경우, state 가 current state 와 같으면 infinite loop 로 간주한다는 구문이 있는데, 혹시 이게 그와 관련 있는건가 하는 의심은 있습니다.

loop 가 발견되었는데, state 에 변화가 없다면 계속해서 현재 node 로 다시 돌아올 가능성이 높으니, infinite loop 로 간주해도 괜찮을 것 같긴 합니다.

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

bushi의 이미지

여기서 누가 뭘 말하건 간에 그걸 그대로 받아들인다음에,
다른 기회에 다른 곳에서 다른 누군가에게 또다시 "제가 알기론" 하면서,
질문처럼 생긴 어떤 글을 올리지말고,
이 기회에 고민을 좀 하시는 게 무척 좋을 것 같아서요.

graph 에선 모든 branch 를 전부 지나가봤느냐 아니냐로 loop 를 판별하는게 쉽지만,
코드 (VM 에서 실행되는) 에선 branch 의 갯수(라기 보다 조건)가 딱 정해지지 않으니 어렵긴하겠습니다.
linux eBPF 의 저 패치에선...
시뮬레이션을 돌리며 이전과 같은 곳에서 이전과 같은 코드를 fetch 했을 때의 시뮬레이터 VM 의 레지스터 상태가,
지난 번에 그 곳에서 그 코드를 run 한 다음의 상태와 동일하면 infinite loop 로 판단하는 것 같습니다.
물론, 코드를 다 해석하고 하는 말은 아닙니다.
아무튼 간에 코드에 붙은 코멘트대로 시뮬레이션이 가능하다면, 저런 식으로 비교하면 되지 않을까 생각했습니다.
+
한 줄 요약하면, "그 동안 뭐 바뀐게 없는 데 이거 또 해봐야 뭐가 달라지겠냐" 죠.
사람이건 CPU 건, 열심히 다람쥐 챗바퀴 도는게 능사가 아니고, 달라질 만한 뭔가를 해야 분기랄까 전환점이랄까 일어나겠죠.
자의든 타의든... 한번 시작했으면 한 번 보세요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.