Network 2

  1. 要求是先回答几个问题
    为什么要用大页?
    从逻辑地址到物理地址的转换我们知道,如果采用常规页(4KB)并且使TLB总能命中,那么至少需要在TLB表中存放两个表项,在这种情况下,只要寻址的内容都在该内容页内,那么两个表项就足够了。如果一个程序使用了512个内容页也就是2MB大小,那么需要512个页表表项才能保证不会出现TLB不命中的情况。我们知道TLB大小是很有限的,随着程序的变大或者程序使用内存的增加,那么势必会增加TLB的使用项,最后导致TLB出现不命中的情况。那么,在这种情况下,大页的优势就显现出来了。如果采用2MB作为分页的基本单位,那么只需要一个表项就可以保证不出现TLB不命中的情况;对于消耗内存以GB(230)为单位的大型程序,可以采用1GB为单位作为分页的基本单位,减少TLB不命中的情况。

以helloworld为例,描述一下DPDK的执行流?
主线程运行入口是main函数,调用了rte_eal_init入口函数,启动基础运行环境。
入口参数是启动DPDK的命令行。对于HelloWorld这个实例,最需要的参数是“-c”,线程掩码(core mask)指定了需要参与运行的线程(核)集合。rte_eal_init本身所完成的工作很复杂,它读取入口参数,解析并保存作为DPDK运行的系统信息,依赖这些信息,构建一个针对包处理设计的运行环境。RTE_LCORE_FOREACH_SLAVE(lcore_id)遍历所有EAL,指定可以使用的lcore,然后通过rte_eal_remote_launch在每个lcore上,启
动被指定的线程。第一个参数是从线程,是被征召的线程;第二个参数是传给从线程的参数;第三个参数是指定的逻辑核,从线程会执行在这个core上。具体来说,int rte_eal_remote_launch(lcore_hello,NULL,lcore_id);参数lcore_id指定了从线程ID,运行入口函数lcore_hello。运行函数lcore_hello,它读取自己的逻辑核编号(lcore_id),打印出“hello from core#”
读skeleton的代码,描述收发包的API。
static inline uint16_t rte_eth_rx_burst(uint8_t port_id, uint16_t queue_id, struct rte_mbuf **rx_pkts, const uint16_t nb_pkts)
static inline uint16_t rte_eth_tx_burst(uint8_t port_id, uint16_t queue_id, struct rte_mbuf **tx_pkts, uint16_t nb_pkts)
端口,队列,报文缓冲区以及收发包数

解释rte_mbuf的数据结构。
主要用来封装网络帧缓存,也可用来封装通用控制信息缓存。Mbuf头部的大小为两个Cache Line,之后的部分为缓存内容,其起始地址存储在Mbuf结构的buffer_addr指针中。在Mbuf头部和实际包数据之间有一段控制头空间(head room),用来存储和系统中其他实体交互的信息,如控制信息、帧内容、事件等。Mbuf报头包含包处理所需的所有数据。head room的长度可由RTE_PKTMBUF_HEADROOM定义。head room的起始地址保存在Mbuf的buff_addr指针中。数据帧的起始指针可通过调用rte_pktmbuf_mtod(Mbuf)获得。巨型帧的单
帧长度只由rte_pktmbuf_datalen(Mbuf)返回,而rte_pktmbuf_pktlen(Mbuf)用于访问巨型帧所有帧长度的总和。

image.png

你可能感兴趣的:(Network 2)