最后一个实验了,代码在Github上。

这一个实验其实挺简单的,就是要实现网卡的e1000_transmite1000_recv函数。不过看以前的实验好像还要实现上层socket相关的代码,今年就只有网卡驱动了。

虽然实验文档里面给了一本400多页的网卡文档,但其实也不需要怎么读这本厚厚的文档,实验的hints里面就讲的挺清楚了。

实验

首先是e1000_transmit函数,按照hints一步步来就行了,唯一一个要查文档的就是cmd域,但其实这个域的宏定义里面就只给了E1000_TXD_CMD_RE1000_TXD_CMD_EOP这两个,也就是说我们只要关注这两个就行了:

int
e1000_transmit(struct mbuf *m)
{
acquire(&e1000_lock); uint32 idx = regs[E1000_TDT];
struct tx_desc* desc = &tx_ring[idx]; if((desc->status & E1000_TXD_STAT_DD) == 0){
release(&e1000_lock);
printf("buffer overflow\n");
return -1;
} if(tx_mbufs[idx])
mbuffree(tx_mbufs[idx]); desc->addr = (uint64)m->head;
desc->length = m->len;
desc->cmd = E1000_TXD_CMD_RS | E1000_TXD_CMD_EOP;
tx_mbufs[idx] = m; regs[E1000_TDT] = (idx + 1) % TX_RING_SIZE;
__sync_synchronize();
release(&e1000_lock);
return 0;
}

然后是e1000_recv函数,这里注意一次中断应该把所有到达的数据都处理掉,剩下的按hints里面的来就行了:

static void
e1000_recv(void)
{
int idx = (regs[E1000_RDT] + 1) % RX_RING_SIZE;
struct rx_desc* desc = &rx_ring[idx]; while(desc->status & E1000_RXD_STAT_DD){
acquire(&e1000_lock); struct mbuf *buf = rx_mbufs[idx];
mbufput(buf, desc->length); rx_mbufs[idx] = mbufalloc(0);
if (!rx_mbufs[idx])
panic("mbuf alloc failed");
desc->addr = (uint64) rx_mbufs[idx]->head;
desc->status = 0; regs[E1000_RDT] = idx;
__sync_synchronize();
release(&e1000_lock); net_rx(buf); idx = (regs[E1000_RDT] + 1) % RX_RING_SIZE;
desc = &rx_ring[idx];
}
}

总结

到这里整个XV6的实验就完成了,赶在了过年之前写完了。不得不说国外的实验设计的真的好,实验的代码量都不大,每个实验就是几个函数,实验的难度也设置的很合适。十一个实验做完,配套讲义看完之后就把XV6内核的绝大部分内容都看完了,对于操作系统的核心部分也都通过实验有了更加深入的了解。知道了线程和进程切换之间的区别以及上下文切换是如何进行的;从以前只直到页表这个概念到现在知道了整个分页机构是如何运行的,亲手实现了基于分页和缺页异常的COW fork,mmap,lazy allocation等技术;知道了系统调用是如何实现的以及操作系统是如何与硬件配合来对系统调用和中断陷阱进行处理。

总而言之,强烈推荐学完了操作系统系统通过这个课程的实验来加深和巩固理解,而不是只停留在课本的那些概念上,一点实际的内核代码都没有接触过。XV6内核的实现非常精简,但是所有核心功能都实现了,而且编译速度快,也不需要很多的配置,相比于Linux内核更加适合初学者来学习,在讲义中也介绍了很多相比于Linux的可以改进的地方。

XV6学习(16)Lab net: Network stack的更多相关文章

  1. xv6学习笔记(5) : 锁与管道与多cpu

    xv6学习笔记(5) : 锁与管道与多cpu 1. xv6锁结构 1. xv6操作系统要求在内核临界区操作时中断必须关闭. 如果此时中断开启,那么可能会出现以下死锁情况: 进程A在内核态运行并拿下了p ...

  2. Contiki Network Stack

    一.协议栈 主要有两大网络协议栈,uIP和Rime这两大协议栈(network stack): The uIP TCP/IP stack, which provides us with IPv4 ne ...

  3. 深度强化学习(DQN-Deep Q Network)之应用-Flappy Bird

    深度强化学习(DQN-Deep Q Network)之应用-Flappy Bird 本文系作者原创,转载请注明出处:https://www.cnblogs.com/further-further-fu ...

  4. XV6学习笔记(1) : 启动与加载

    XV6学习笔记(1) 1. 启动与加载 首先我们先来分析pc的启动.其实这个都是老生常谈了,但是还是很重要的(也不知道面试官考不考这玩意), 1. 启动的第一件事-bios 首先启动的第一件事就是运行 ...

  5. xv6学习笔记(3):中断处理和系统调用

    xv6学习笔记(3):中断处理和系统调用 1. tvinit函数 这个函数位于main函数内 表明了就是设置idt表 void tvinit(void) { int i; for(i = 0; i & ...

  6. xv6学习笔记(4) : 进程调度

    xv6学习笔记(4) : 进程 xv6所有程序都是单进程.单线程程序.要明白这个概念才好继续往下看 1. XV6中进程相关的数据结构 在XV6中,与进程有关的数据结构如下 // Per-process ...

  7. XV6学习笔记(2) :内存管理

    XV6学习笔记(2) :内存管理 在学习笔记1中,完成了对于pc启动和加载的过程.目前已经可以开始在c语言代码中运行了,而当前已经开启了分页模式,不过是两个4mb的大的内存页,而没有开启小的内存页.接 ...

  8. Queueing in the Linux Network Stack !!!!!!!!!!!!!!!

    https://www.coverfire.com/articles/queueing-in-the-linux-network-stack/ Queueing in the Linux Networ ...

  9. RH253读书笔记(5)-Lab 5 Network File Sharing Services

    Lab 5 Network File Sharing Services Goal: Share file or printer resources with FTP, NFS and Samba Se ...

随机推荐

  1. 【Oracle】delete表后commit后怎么找回,方法

    有些时候,不小心删除了一些需要的表,而且数据库不能停止,只能一直运行下去,这样的话很麻烦 下面介绍的方法就是删除表后通过时间戳后者scn找回删除的数据 模拟实验环境: 创建一个新表 SQL> c ...

  2. os.system('cmd')在linux和windows系统下返回值的差异

    今天,用os.system('cmd')分别在windows和linux平台上执行同一ping命令,命令执行失败时返回码不同,windows为1,而linux下返回为256,如下: linux下: & ...

  3. WPF NET5 Prism8.0的升级指南

    前言 ​ 曾经我以学习的目的写了关于在.NET Core3.1使用Prism的系列文章.NET Core 3 WPF MVVM框架 Prism系列文章索引,也谢谢大家的支持,事实上当初的版本则是Pri ...

  4. [Usaco2008 Mar]牛跑步

    题目描述 BESSIE准备用从牛棚跑到池塘的方法来锻炼. 但是因为她懒,她只准备沿着下坡的路跑到池塘, 然后走回牛棚. BESSIE也不想跑得太远,所以她想走最短的路经. 农场上一共有M (1 < ...

  5. IDEA安装codota插件和使用,开发人员的知心伙伴

    打开IDEA 点击左上角的File之后,如下图 成功后如图所示

  6. 使用Swagger2

    一.Swagger2是什么? Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务. 优点: 及时性 (接口变更后,能够及时准确地通知相关前后端开 ...

  7. Vue使用Ref跨层级获取组件实例

    目录 Vue使用Ref跨层级获取组件实例 示例介绍 文档目录结构 安装vue-ref 根组件自定义方法[使用provide和inject] 分别说明各个页面 结果 Vue使用Ref跨层级获取组件实例 ...

  8. 浅谈自动化构建之grunt

    自动化构建 开发行业的自动化构建 一句话把源代码转化为生产代码,作用是脱离运行环境兼容带来的问题开发阶段使用提高效率的语法,规范 和标准,构建转换那些不被支持的特性转化成能够执行的代码. 一.简单的自 ...

  9. C指针的这些使用技巧,掌握后立刻提升一个Level

    这是道哥的第016篇原创 关注+星标公众号,不错过最新文章 目录 一.前言 二.八个示例 1. 开胃菜:修改主调函数中的数据 2. 在被调用函数中,分配系统资源 2.1 错误用法 2.2 正确用法 3 ...

  10. 洛谷P4127

    Description 给出两个数 \(a\),\(b\) ,求出 \([a,b]\) 中各位数字之和能整除原数的数的个数 Solution 设 \(f[i][j][k][q]\) 表示 枚举到第 i ...