本文主要是介绍mit6.s081 lab11 networking,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
这个exercise的工作是完善kernel/e1000.c文件中的e1000_transmit()和e1000_recv()函数,从而使得驱动可以发送和接受packet。
e1000_init()函数配置使得E1000从RAM中读取要发送的packet,以及将接收到的packet写入到RAM中,这就是DMA技术,RMA使得硬件可以直接从RAM中读写packet。
有可能出现在短时间内出现大量待处理的packet的情况,因此需要缓冲区来缓冲那些无法被及时处理的packet,在xv6中使用RAM中的descriptor数组来作为buffer,每个descriptor中包含了一个E1000可以写入接收到的packet的RAM地址,对应rx_desc结构体,rx_desc数组是一个环形队列。e1000_init()函数中分配了mbuf packet buffer用于实现DMA。另外,xv6中还存在另外一个用于发送packet的transmit ring(tx_desc结构体),用于存储E1000即将要发送的packet。
当net.c中的network stack需要发送packet时,会调用e1000_transmit()来发送packet,e1000_transmit()的参数mbuf为需要发送的packet。在e1000_transmit()中需要使用tx_desc来记录这个指向packet data的指针,在mbuf被使用后需要保证该mbuf被释放掉,E1000中通过E1000_TXD_STAT_DD来标识该descriptor是否被使用。
当E1000从ethernet中接受到packet时,通过DMA计数将packet保存在下一个rx ring descriptor中的mbuf中,然后产生中断。所以在e1000_recv中需要扫描rx ring并通过net_rx()将其中的mbuf发送到network stack。发送完毕后需要重新申请mbuf并将其放入到descripto
这篇关于mit6.s081 lab11 networking的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!