| [ CnUnix ] in KIDS 글 쓴 이(By): Tony (관객2) 날 짜 (Date): 2002년 3월 13일 수요일 오후 04시 56분 57초 제 목(Title): Re: [Q] kernel ping 더더 구체적으로..코� 구체적으로 이렇게 입니다... user mode의 프로그램을 보면 proto를 설정해 주는 부분이 있는데 그부분은 kernel level로 변경이 어렵더군요...쩝 == 보통 유저에서 해주는 코드가 있으면 커널에서 1:1메칭입니다. 찾을 수 있을껍니다. 유닉스보이님 말씀처럼 커널이라고 결코 쉬운게 아닙니다^^; 커널을 마음대로 고쳐도 된다고 한다면 저라면 이런경우 유저에선 주기적으로 ICMP메시지를 날리고 커널에서는 ip_input에서 IP 핸들하는 것처럼 Ethernet에서 ICMP메시지 받는 부분을 찾은 후 거기에 코드를 끼어넣어서 원하는 ICMP메시지가 왔는지 확인하는 방법을 사용하겠습니다. 혹시 죽어서 ICMP메시지가 안왔다는걸 확인하고 싶다면 카운터와 타이머를 둬야될꺼고... 복잡복잡하군요. 웬만하면 유저레벨에서 구현하죠? 커널에서 네트웍을 써야하는 경우는 단 두경우뿐입니다. 유저에서 불가능한걸 하려고 할때. 그리고 퍼포먼스가 크리티컬할때(SystemCall Overhead, Copy Overhead를 0으로만들수도 있죠...). 아, 그리고 커널안에서 System Call을 타는건 unistd의 __syscall3(~~~)같은걸로 커널 안에서도 시스템콜 선언한 후에 그냥 무식하게 그 펑션을 부릅니다. 그럼 int 0x80인터럽트 걸고 시스템콜 트리 타고 그대로 수행됩니다. 단, 조심해야할것은 Address Space때문에 Buffer가 넘나들어야하는 경우에는 set_fs(KERNEL??) 이런식으로 address space때문에 꼬이지 않도록 해줘야합니다. 유저레벨과 똑같이 int 0x80을 타고들어가기 때문에 퍼포먼스는 무지하게 나쁘지만 상관없는 오퍼레이션에선 이런방법을 쓸수도 있습니다. == "너희는 이 곳, 이 세상을 어떻게 생각해?" "천국도 지옥도 갈 수 없는 '평범한 영혼'들이 잠시 들려 쓸쓸히 방황하는 곳이라고 생각합니다." |