딱국 왈:
"파라미터로 x 받아와놓고선 (copy로 받아온거)
그거에다가 *(&x) = ~~; 이딴 병신짓 해놓는것도 그렇고
야... 그거 그냥 로컬변수만 바껴...
코드를 잘못짤수도 있는데, *(&x) 이거는 진짜 충격임. 이거는 그냥 흠... 아니 이거는 솔직히 장애가 있는거야. 실무자로 쓰면 안되는 그런거... 그리고 얘가 막 프로그래밍 배운지 반년된 초짜 그런것도 아니잖아?? 급식때부터 C로 프로그래밍하던애아님? 도대체 이런 장애가 왜 있는거지?
"
딱국이가 eip는 copy한 값이라 &eip는 새롭게 copy된 녀석의 주소 값을 가리키므로
*(새롭게 카피된 엉뚱한 주소) 로 original eip를 수정하는게 아니니까 잘못된 코드라고 하는 거 같은데
반박 간다.
문제의 코드: do_signal (kernel/signl.c)
해당 함수를 부르기 전 스택 layout에 대해서는 kernel/system_call.c에 아래와 같이 정리되어있다
do_signal 함수 인자랑 순서를 비교해 보면 똑같다는 거 알 수 있다.
do_signal을 호출하는 곳은 kernel/system_call.s인데 그 코드는 아래와 같다.
중요한 거는 do_signal을 하고 나서 부터야
위에서 볼 수 있듯이 스택을 pop하기 시작하는데
eax, ebs, ..., ds까지 pop하고 eip직전에서 멈춘다.
그다음에 iret을 부르지.
iret이 뭐하는 거냐구? 핵심만 말하면 스택에서 eip를 pop해서 글로 점프함.
eip에는 뭐가 저장되어 있다구? 시그널 핸들러의 주소가 저장되어 있지 *(&eip) = sa_handler
3줄 요약하면
1. 딱국이가 *(&eip) = sa_handler 는 희대의 ㅄ짓이라고 리누스를 오질나게 까내림
2. 딱국이 말을 의역해 보면 eip는 함수 내에서 copy로 받아온 값인데 거기다가 &를 취하고 *를 취하면 original eip레지스터가 변하겠냐고 지적하는 거 같음
3. original eip가 변하지 않고 stack에 복사된 eip가 변하는 건 맞는데, 결국 iret가 그 eip를 pop해서 그 주소로 점프하기 때문에 코드에 이상 없음.
한 마디로 딱국 == 리누스 발끝에도 못미치는 ㅄ
개추좀 해줘라. 딱국이 뭐라하나 보게.
딱국이가 원하는대로 답변 다해주네
ㄹㅇㅋㅋ
아 이걸 도와줘버리네 ㅋㅋㅋ - dc App
이거왜념글안가냐 추천이 12개인데
디시에 질문하는법 검색해봐라 ㅋㅋㅋ 딱국이가 모르는거 정답찾으려고 어그로질문 올린건데 그걸 낚이네 이런글 올려봤자 너만 시간낭비임 ㅅㄱ
딱
국
야 니들 프로그래밍을 씨발 정치하듯이하네? 병신아 니가말하는 본문에 논리가있다고생각하냐? 글삭하지마라 빡대가리새끼야 이 비융신새끼는 10중에 1을 이해하면 그거에만물고빠는새끼네
아니다 너말이 반은 맞다. 스택으로 인자를 받아오던 규약때문에, 인자변경하라는게 스택을 손상시키라는 의미가 되는거 ㅇㅈ. 근데 그럼 eip = 대신, *(&) 한거는 뭐임
병신아 그리고 아님. 너말 반쪽짜리인건 ㅇㅈ하는데, 아직도 좀 더 생각해봐야할 문제는 있음. 이건 컴파일러에 대한 이해도가 없다면 확답불가임. 코드저렇게짜면 안되는거는 맞아 빙신새끼야 파라미터는 input이기땜에, 파라미터에 쓰라는게 "=r"인지 "=m"일지 컴파일러재량인거고
애초에 지금 인자가 스택으로 받아온것이기땜에 메모리영역은 output처리가 안되더라도 해당공간이 다른요소에의해 손상되지 않는단 전제를 사용중인건데, 그렇다고 씨발 "=m"처럼 메모리에 동기화시켜줄 이유는 없음. 그리고 씨발 코드를 이따구로 짜도 된다고생각하는거냐?
근데 대충은 알거 같긴 함. 저거 애새끼가 시그널관련은 디버깅도안해본 그런 개병신짓인줄알았더니 돌아는 가는 코드였나보네. 난 컴파일러규칙땜에 우연히 리누스는 뭣도모르고 동작하는 코드를 짰다는게 첫째고 (*&가 아니었으면 의도했다고 여겼을거임) 둘째로, 스택으로 받아온 메모리는 output처리가 된다는거
이게 그래서 현업에서 쓰이는 기법인지 의아함. 아니 근데, 일단 난 쓰긴 할듯. 물론, 현대에 와서는 파라미터가 8개이상인경우에만 쓸수 있는 이상한 기법이고, 일부러 저렇게 파라미터 존나늘려서 (가짜파라미터들 ㅈㄴ넣어가면서) 스택을 손상시키는 기법? 뭐 그런게 그래서 현업에 쓰이는건지 니가 불어봐라
input으로 받아오는건 저 시절 규약이니까 저 시절상 당연한건 맞는데 씨발 output으로 내보내는게 뭐 근데 그럴수 있다고 치자. 여하튼 *& 실드나 치셈 이거 실드치기전까진 저새끼 진짜 뭔 ㅅㅂ
보냈던 인자에 대한 수거는 caller쪽에서 이뤄지는게 맞는데,씨발 보냈던 인자를 일부러 수거하지 않고 iret로 이용하고있는 경우도 맞고근데 씨발 보냈던 인자가 변경될거라고 생각하는것도 일리가 있네ㅅㅂ 너말이 맞긴하다보냈던 인자를 수거하지 않는다는거자체가 이미 많이 이레귤러임.1. 메모리에 output내주는거에서 운빨인거 실드치고
*& 까지 실드쳐라
1. 레지스터에 캐쉬안하고 "=m" 되는거 확실히 보장되는지, 즉 eip= 기준으로코드 저따구로 짜도 되는지 2. *&eip 를 하는 이유는 뭔지 이 두가지를 실드안치면 니새낀 걍 나보다 저급한새끼라서 문제의식을 못느끼고 짖어대는거
그리고 난 씨발 일단 니들한테 설명해주는것도 입아프니까 이건 니들도 이해할듯하고 가져오는거거든?난 딴건몰라도 그냥 *& 이 단어보자마자이새끼 C초급이용자다거의 확신을 했음여기서 냄새가 안난다는건 개소리아니냐
내가 실드치라는거 1번 2번중 1번은 실드되는거같다. 만약 레지스터 캐쉬가 이루어진다고 하더라도, &오퍼랜드가 사용되면, 다시 메모리와 바인드해서 메모리의 주소를 내뱉어야하는데,
아 씨발 그래서 & 연산을 한번 하고가는거구나 씨발.... 미친 리누스 대가 인정한다
주소연산자를 사용해서 인자가 레지스터에 캐쉬되었다면 메모리에 다시 넣고 메모리주소를 가져오라 라는 코드를 짠거군
너가 할건 없다 1번 2번 다 실드됐다 ㅇㅇㅇ 리누스 고수 인정한다
아니 그러면 리누스 어리버리깐건 당시 시대적문제라고 치고 (Posix자체가 이상하다던지 각종 기능들의 도입상황이라던지) 이새끼 이정도로 프로그래밍할정도면 부심부릴만한새끼 맞긴 하네 ㅇㅇ
글쓴이 너는 머리굴리면 이해는 할듯 이게 지금 뭔말인지. 딴새끼들은 설명해줄수도 없고, 일단 너 글은 뭔가 걍 코드 디버깅보다는 코드이해정도를 하는거같고 거기서 "=m"이라는 키워드가 빠져있음. 나는 "=m"없이 개소리말라고했고 리누스는 한술 더떠서 *&로 =m을 만들었는데 뭔소리냐고 한 상황임
근데 내가 첨엔 리누스 병신확정때리고 ㅋ 이건 실드못쳐주겠지 하다가 이걸 실드치는 니새끼를보고선 "진짜 이게 맞을지도?" 하고 보니까 도움이 됐다 고맙다 글고 너정도면 가르쳐서 키울만은 한 프로그래머인듯
근데 지금 다시보니까*& 를 보고뭐야 얘 병신이야?부터 하고본 내 미스다걍 *& 보자마자 뭐하는짓인지 눈치깠어야했네이거 캐쉬인밸리데이트같은거임cr3에 무의미하게 0집어넣기 뭐 그런거랑 유사한 테크닉
내가 니 패는 이유는 다름아니라 뭔 ㅂㅅ이 유치원생이야기 들먹이면서 일침충짓하길래 패는거임 너가 나한테 좀 배워라 넌 재능있어보이네
노아의방주 만들건데 그때 문 두들기셈 너정도면 합격가능할듯
십새야 빨리와서 뭐라고 얘기좀 해봐 난 너가 대딩이길 간절히 바라는중이다
쳐발려놓고 니가 나한테 배워라 이지랄하고 있노ㅋㅋ지가 헛소리쳐해서 지금 배우는 중인데ㅋㅋ
병신이 이해를 못하나보네. 너도 걍 뭐 리누스니까 맞겠지 하고 넘기는 애새낀갑네
prove or disprove 에서 답안지를 써내야지, 니들 개 병신새끼들마냥 찬반 정치질로 수학이건 프로그래밍이건 하는새끼들은 싹다 쳐죽일생각임
닌 니가 낸 답안지가 제대로 된 답안지라고 생각하는거냐?
ㅋㅋㅋㅋ너랑 글쓴 새끼 사이에서 얘기하는데 리누스가 왜나오냐ㅋㅋ 니가 쳐틀려놓고 글쓴 새끼한테 나한테 배우라니 씨부리니까 하는 소리지ㅋㅋ
하긴 니가 씨부리는 논리수준이 딱 그정도니까 그런 식으로 말하겠지 헛소리 하루종일 씨부리면서 남까내리다가 지적받으면 끝까지 "리누스니까 맞겠지" 딱 상대를 이 수준으로 끌어내린 다음 자기는 prove or disprove하는 논리적 투사로 포장하다가 상대가 근거들어서 제대로 지적하면 "너는 좀 하는 새끼네 나한테 배워라" 이 지랄하는데ㅋㅋ 나같으면 쪽팔려서
안나댄다ㅋㅋ
ㅇㅇ 그래서 니가 그수준. 진지하게 조언치는거임
쪽팔림이라느니 도의라던지 윤리의식들먹여서 남 매장시켜봐라 매장당한건 본인이시구요
이 업계에서 나갈 준비나 하고들 계시라고요
답도 없노ㅋㅋ실력이라도 있던가ㅋㅋ
니들 어차피 다같이 기생충짓할거라 서로 예의지키면서 돈타가자 이논리지? 누가 전쟁모드로나오면 밥그릇수호 가야하는거고 ㅋㅋㅋ 십새야 전쟁은 이미 시작된거임. 니들 의사랑은 관련 없어. 뒤지던가 적응하던가 니들 알아서해라 선택포기도 선택임
응 그래서 니 코드들고와봐 내가 미국가서 싸부리면 털리는건 맞는데 니들은 걍 좆밥새끼들 맞는데 니가 그래서 이기거나 버틸수있는 근거나제시해봐 볍신새끼가 시궁창 깜깜한곳에서 찍찍대는데는 도가텄지
막말로 너말처럼 쌉고수면 사회성이니 도의니 윤리의식이니 필요없다 혼자다하면되니까 근데 넌 좆밥새끼면서 왜케 사회성이 없냐ㅋㅋ
그러니까 ㅅㅂ 쌈나는거보면 이해 좆도못하고걍 새우 아니 플랑크톤만도못한 버러지주제에정치질은 또 존나게잘해요IT, 비즈니스, 학력 세가지가 뭐가좋은지 아냐?이 바닥은 패왕색의 패기가 적용됨.금융은 아님.니들 걍 뒤질준비나하시라고요
ㅇㅇ 너가 선택한 길은 "설마 이 바닥이 깨지겠어 ㅋ 딱국이 병신이겠지. 난 계속 기생충짓하는 코인 탑승이다!!" 고 잘 뒤지셈 Bye 비와이 이이~~
아주 찐 따 들이 담당일진 싹다 미국으로빠졌다고 신났어? 글고 미국으로 빠지는애들도 뱀의꼬리냐 용의꼬리냐의 차이인거고 이 병신들 진짜 담당일진 없다고 신났어 니들 학창시절때 쳐맞던거 사라져서 신났었냐? 사회에서 쳐맞는건 급식시절 쳐맞는거보다 셀거다
지가 동네방네 시비걸다 남들이 코드나 인증요구할 때는 씹고 헛소리 내뱉더만 지가 후달리니까 나보고 코드까라 이지랄ㅋㅋ 너부터 까던가 여기서 씨부리는 새끼들중 씨부리는 양대비 깐게 제일 없는게 니새낀데ㅋㅋ
ㅋㅋㅋㅋ 왜케 여기 뜨거워 딱국아 미안해 리누스를 너무 ㅄ취급해서 욱해서 글싸질렀따 너도 훌륭해 ㅇㅅㅇ
아니 222야, 리누스가 맞은것도 맞고 너 본문 글도 맞는데 내가 뭐 걍 밑도끝도없이 나한테 배우라고한게 기분나빴을수도 있는데 난 그거 너 공격하거나 비난하는게 아니라 극찬임 나한테 배우라는거 극찬이라고 넌 살아남을 능력이 충분해보인다
아니 뭐냐 중간에 나한테 욕박은거 글쓴이 아녔구나 잠깐 오해함. ㅇㅇ 내가보기에 너 대딩일거같다 글쓴아
난 시발 10중에 1은 이해한새끼가 왜 지랄하나 했네. 나도 10중 5도 모를거임. 리누스 본인조차 자기코드 10중 10 아닐거임. 코드란게 버그라는게 항상 있는거니. 여하튼 ㅇㅇ 공격박은거는 그거임. 1아는거는 1아는데에서 끝. 가장 그거 못지키는게 나 본인인거같다만
말은 이렇게 해도 뒤에선 부족하다고느끼고 자가체크 항상 하는중이고 너도 그거 하라는 의미에서 공격박은거고 어떤 다른새끼가 짖은거에 오인사격함. 여하튼 너 대딩같고 재능 및 포텐 있어보이니 열심히 해봐.
10 중 1에 들어왔으면 그 다음부터는 경험이 해결해줌. 너 본문 글은 이미 그 특이점은 넘은샛기네 ㅇㅇㅇ
여하튼 너 본문글이 다 맞고 이건 너도 이미 진행중일거같은데, C를 논하려면 컴파일러를 논해야함. 거기다 이건 인라인 어셈블리라기보단 어셈블리 안에 인라인 C가 있는거거든? 너 본문글에서, 인자의 수거가 C바깥으로 넘어가서 컴파일러 대신 수동으로 진행된다는점 + 메모리에 접근하기 위해 *& 를 한다는점 이 두개를 추가하면 됨
너가 이미 알고서 입아파서 설명 안했었을 가능성도 당연히 배제하지 않고있음. 근데 뭔 정치놀음하자는새끼들은 아웃임. 프로그래밍하러왔다면서 자가판단안되는새끼들 싹다쳐낼거임 ㅇㅇㅇ
글고 씨발 리누스한테 욕박은건 씹 이새끼 21살때는 병신이었어야 되는거임. 물론 나이가 뭔 대수고 프로그래밍 경력이중요한거라고하면 할말없지만 내가 뭐 "난 늦게시작해서 괜찮아"하고 딸쳐야겠음? 난 팰 가치가없는 애들은 안패. 욕만박고 끝내지. 리누스 생각보다 대단한새끼긴 한듯
이번에도 이새끼 "ㅋㅋ 설마 이것까지..." 했는데 그거 이상이었네 이 씹새끼 씨발 21살에 이미 동시성이니 뭐니 아니 그냥 이새끼 이미 거의 완전체였던건 맞는거같다. 적어도 한국은 역사상 21살 리누스 넘어본새끼 있냐 그러면 의문부호찍힐듯. 21살 == 아직 항해출발도안한 나이
이스트블루의 돈클리크같은새끼들밖에 없을듯. 시작부터 뗏목타고 바다나간 사보한테 찢길 자칭 그 구역의 수장새끼들
하 시발 " ㅋ 역시 하버드생아니고 헬싱키대학? ㅋㅋㅋ 걍 평범충이 조기교육 + 프밍올인인생으로 노력 ㅈ빠지게 했나보네" 하고 치울랬더니만 리누스 얘 진짜는 진짜인가
저번에도 한번 "ㅋ 이새끼 OS할거라면서 cpncurrency는 알고있을까? 카피충새끼인거 털어내라" 했더니 그새끼가 맞았었음. 비효율이 없더라고
함수간에 goto하는 느낌임?
뭣도모르면 빠져있으셈
딱꾺
둘다 훌륭하다!!!
확실한 건 저딴 마인드 가지고 있는 사람 밑으로 들어가서 자발적으로 일하고 싶은 사람 구할 가능성은 0%에 수렴할 거라는 거 ㅇㅇ 너는 그냥 혼자서 개발해라 좀. 그딴 마인드로 누구랑 협업을 하겠다는 거냐 ? 돈 많이 준다 해도 정신병 걸려서 줄퇴사할 듯 - dc App
정리하자면 C&어셈을 같이 쓰는 코드를 급식 딱꾺이가 전혀 이해를 못해서 혼자 지랄발광햇다는거지? 딲꾺이는 실력도 안되면서 전세계 탑개발자를 왜 언급하는지 모르겟다 가만있으면 되는데 ㅇㅅㅇ 코세는 그래도 코드에서는 틀린게 없엇는데 딲꾺이는 그냥 관종인가보다
그냥 eip = 로 대입해도 될 것 같은데 굳이 *(&eip) = 으로 넣는건 왜 그런거임?
&x : x를 메모리에 집어넣어라 인라인어셈블리 안다뤄봤으면 뭔소린지 이해 잘 안갈수도. C보단 어셈블리를 알아야함
메모리 : 레지스터의 반댓말, 즉 스택
그냥 eip라고 하면 레지스터랑 헷갈릴까봐 변수명인 x라고 해보겠음. x = ~~; 라고 하면, 컴파일러가 지금 x를 메모리랑 바인드했는지, 아니면 레지스터랑 바인드했는지 모름. input은 메모리로 들어왔지만 컴파일러가 당연히 지 멋대로 eax 같은데에다가 옮겨서 사용할 수 있고, C언어 특성상, input으로 들어온 저 메모리 어차피 사용하는 메모리가 아니기 때문에 레지스터에서 다 사용한 이후라던지, x = ~~; 이런거 쓸때, input으로 들어왔던 메모리에다가 동기화 안시킴. 처음 들어온 인자가 담겨있던 메모리공간은 input 용이지 output용이 아니란 뜻임. 그래서 내가 이새끼 병신인가? 했었는데, 그걸 *& 로 명시하면, & 연산자때문에 컴파일러가 x를 다시 메모리에 바인드하는거임.
여기서 그러면, 메모리에 바인드하는건 알겠는데, 처음 들어왔던 그 메모리에 바인드 안하고 다른데에 바인드하면 어쩌나요? 이거는 컴파일러가 무엇이던지간에, 최적화레벨이 무엇이던지간에, 한번 배정되었던 메모리는 재사용되지 않기때문에, 메모리에 접근하라고 하면, 그 메모리가 달라지는 경우는 없음. 물론, 최적화 레벨이 존나게 올라가고 나중가면 어케 바뀔진 모르겠는데, 여하튼 그정도 수준이면 호환성 인정일거임. 나도 아직 정확히, 이게 현재에도 완전히 문제가 없는 코드인지는 잘 모르겠는데, 적어도 리누스가 병신짓한건 절대 아님
근데 스택공간 재활용, 특히 인자로 받아온 스택을 재활용하는것은 아마 없을거 같음. 그거 가능해지면 애초에 리눅스 0.11 코드 싹다 막힘. C쓰면 안되는 수준으로 막혀버림. 컴파일러 최적화 수준을 올리는 댓가로 해당 프로그래밍 기법 자체를 삭제시켰을진 나도 모르겠다. 안그랬을거같음. 일단, 해당 영역이 return 하는 주소보다도 더 이전에 쌓인 공간인데, 거기를 건드리는건 좀 너무하다고 생각함.
중간에 뭐 이상한 얘기가 껴들어갔는데, 여하튼 &x 이거 안하면, x가 메모리에 바인드 안되어있을수도 있음. 그리고 x가 메모리에 바인드된다고 한다는거 자체는, 원래 input으로 들어왔던 그 공간이 필연적이고 (이게 필연적인 이유를 이야기하다가 좀 딴길로 샜던거고)
3줄 요약하면 1. 딱국이가 *(&eip) = sa_handler 는 희대의 ㅄ짓이라고 리누스를 오질나게 까내림 2. 딱국이 말을 의역해 보면 eip는 함수 내에서 copy로 받아온 값인데 거기다가 &를 취하고 *를 취하면 original eip레지스터가 변하겠냐고 지적하는 거 같음 3. original eip가 변하지 않고 stack에 복사된 eip가 변하는 건 맞는데, 결국 iret가 그 eip를 pop해서 그 주소로 점프하기 때문에 코드에 이상 없음. 글쓴이가 쓴 세줄요약에서, 3번째 저게 맞말인데 사실 *&에 대한 이야기 없이는 맞지 않는 말임. 그래서 그런거임. 그리고 글쓴이가 저렇게 이야기하기땜에 "어 이거 진짜로 되는 코든가?"하고 다시보니까 내가 걍 *& 가 뭐하는지를 몰라봤던거더라고
글쓴이가 다 맞은거 맞음 3번에 대한 근거를 안쓴거고, *&가 뭐하는건지만 설명해주면 되는 이야기임. 3번이 *&없이는 틀린말임. *&가 아니면, 3번이 아니라고. 스택에 있는 데이터가 안바뀔수도 있음. *& 대신 그냥 쓰면 스택이 안바뀔수도 있다고 ㅇㅇ
글쓴이가 걍 말하기 입아파서 이야기 안했을 가능성 많음. ㅇㅇㅇ 아마 그랬을거라고 생각함.
흠... 지금 & 연산자의 부작용에 대해서 좀 생각해보는중임. &를 한번만 사용해도 그 이후에 레지스터에 캐시하는 과정에서 문제가 생기는지, 아니면 &직후에만 메모리에 바인드되고, 그 이후에는 다시 재량껏 레지스터에 옮겨담는지 그게 좀 생각해볼만한 여지가 있네
여하튼, & 연산자가 가지는 의미가 좀 특별한건 확실함. 그냥 &x; 만으로도 의미있는 코드가 될 수 있을정도로