[TOC]
PF_PACKET协议是专门用于抓包的,往系统网络层注册一个协议,分为两种方式:第一种方法是通过套接字,打开指定的网卡,然后使用recvmsg读取,实际过程需要需要将报文从内核区拷贝到用户区。第二种方法是使用packet_mmap,使用共享内存方式,在内核空间中分配一块内核缓冲区,然后用户空间程序调用mmap映射到用户空间。将接收到的skb拷贝到那块内核缓冲区中,这样用户空间的程序就可以直接读到捕获的数据包了。PACKET_MMAP减少了系统调用,不用recvmsg就可以读取到捕获的报文,相比原始套接字+recvfrom的方式,减少了一次拷贝和一次系统调用。libpcap就是采用第二种方式。 往外发的包和进来的包都会调到net/packet/af_packet.c这个文件里面的packet_rcv函数(PACKET_MMAP调用的是tpacket_rcv()函数),其中outgoing方向(出去的包)会在dev_queue_xmit_nit里面遍历ptype_all链表进行所有网络协议处理的时候调用到packet_rcv;incoming方向(从外面其他机器进来的包)会在__netif_receive_skb_core函数里面同样办法遍历ptype_all进行处理的时候调用到packet_rcv。
ping命令采用ICMP协议,是一个用户空间程序,它打开一个SOCK_RAW套接字或者ICMP套接字发送ICMP_ECHO消息,接收ICMP_ECHOREPLY的消息。本文讲述了ping命令的内核实现。
目前,QEMU里面32bit arm平台比较多,如vexpress-a9,versatilepb等, 64bit arm64平台比较少。而Linero开发的”virt”平台可同时支持32bit 和64bit的arm(详见QEMU源码/hw/arm/virt.c )。“virt”支持 PCI,virtio,最新的arm CPU 和 大容量RAM。如果只想在最新的arm cpu上面运行linux虚拟机,不在意特定的硬件,”virt”平台是最佳选择。 关于“virt”,可进一步参考:
本文详细记录使用buildroot集成编译、使用QEMU “virt”平台来模拟运行arm64 u-boot/linux的过程,从而搭建arm64/linux的学习平台。
netlink协议是一种进程间通信(Inter Process Communication,IPC)机制,为的用户空间和内核空间以及内核的某些部分之间提供了双向通信方法。 本文围绕两张图介绍iprout2命令”ip -s link ls eth0”和”genl ctrl getname nlctrl”的内核实现,来解析netlink套接字协议簇和通用netlink协议,包括初始化、套接字系统调用socket,bind,sendmsg和recvmsg、核心数据结构等。通过分析netlink的实现机制,达到能在生产实践中正确使用netlink的目的。本文基于linux 4.20。
这篇文章是用QEMU模拟运行arm u-boot和linux的一个总结,以arm vexpres板为例,包括用QEMU单独运行u-boot或者linux;实现QEMU运行u-boot和宿主机ubuntu网络通信,u-boot用tftp下载方式引导linux;u-boot从SD卡或者flash引导linux。本文使用buildroot作为构建系统,极大简化了编译和文件系统制作方面的工作。以buildroot自带的configs/qemu_arm_vexpress_defconfig作为起点,增加u-boot,改rootfs为initramfs等,产生了本文所用的默认配置configs/qemu_arm_vexpress-fun_defconfig,保存在github网站:https://github.com/jgsun/buildroot,用于制作sd卡和flash image的脚本文件也放到了该github网站(board/qemu/scripts目录)。
关键字:windows7,virtualbox,ubuntu18.04,buildroot
dynamic debug (dyndbg)是内核提供的一个调试功能,允许动态的开关内核打印输出,包含的API:pr_debug()、dev_dbg() 、print_hex_dump_debug()、rint_hex_dump_bytes()和netdev_dbg等。
dynamic debug通过设置
command ::= match-spec* flags-spec
如:echo -n ‘file svcsock.c line 1603 +p’ >/dynamic_debug/control