Пишу модуль ядра. Нашел в исходниках ядра стандартный обработчки приема udp: udp_recvmsg.
Пытаюсь задампить данные, которые в сокете(я так понимаю они в пространсве ядра, т.к. потом их copy_to_user):
skb = skb_recv_datagram(sk, flags, noblock, &err);
if (!skb)
goto out;
for( ; j < skb->len; ++j )
{
printk("%x ", skb->data[j]);
}
А вот когда уже после skb_copy_datagram_iovec смотрю буфер, который в юзер спейсе находится, то в нем все хорошо:
unsigned char* buf = (unsigned char*)msg->msg_iov->iov_base
for( ; i < msg->msg_iov->iov_len; ++i )
{
printk("%x ",buf[i]);
}
Посмотрел, как та самая skb_copy_datagram_iovec() работает. Для моего случая там вседа лишь memcpy_toiovec(которая копирует данные в юзер спейс) вызывается, т.е. отрабатывает вот этот кусочек:
/* Copy header. */
if (copy > 0) {
if (copy > len)
copy = len;
if (memcpy_toiovec(to, skb->data + offset, copy))
goto fault;
if ((len -= copy) == 0)
return 0;
offset += copy;
}
Никак не пойму, как же тогда данные в kernel space посмотреть? Ведь то же самое, что копируется вроде вывожу.