37 | 从内核到应用:网络数据在内核中如何流转
LMOS
该思维导图由 AI 生成,仅供参考
你好,我是 LMOS。
上节课我们对一次请求到响应的过程积累了一些宏观认识,相信你已经对整个网络架构有了一个整体蓝图。这节课,让我们来仔细研究一下网络数据是如何在内核中流转的,让你开阔视野,真正理解底层工程的实现思路。
凡事先问目的,在网络数据在内核中的流转,最终要服务于网络收发功能。所以,我会先带你了解一次具体的网络发收过程,然后带你了解 lwIP 的网络数据收发。有了这些基础,我还会示范一下如何实现协议栈移植,你可以在课后自行动手拓展。
先看看一次具体的网络发收过程
理解软件的设计思想,最重要的是先要理解需求。而内核中的数据流转也只是为了满足网络收发的需求而进行的设计。
发送过程总览
下面我们一起来看看应用程序通过网络发送数据的全过程。
应用程序首先会准备好数据,调用用户态下的库函数。接着调用系统 API 接口函数,进入到内核态。
内核态对应的系统服务函数会复制应用程序的数据到内核的内存空间中,然后将数据移交给网络协议栈,在网络协议栈中将数据层层打包。
最后,包装好的数据会交给网卡驱动,网卡驱动程序负责将打包好的数据写入网卡并让其发送出去。
我为你准备了一张流程图供你参考,如下所示。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了网络数据在内核中的流转以及lwIP的架构。在数据发送过程中,应用程序准备数据后,通过系统API接口函数进入内核态,内核将数据移交给网络协议栈进行打包,最终由网卡驱动发送出去。接收数据的过程则是发送数据的逆过程。为了实现网络通信,文章介绍了lwIP这个TCP/IP协议的轻量级开源项目,其架构包括OS层、API层、核心层和硬件驱动层。lwIP提供了三套应用程序编程接口,包括原始API、Netconn API和BSD套接字API。文章还详细介绍了lwIP在数据发送和接收过程中的执行流程。此外,文章还介绍了在Cosmos操作系统下移植lwIP协议栈的关键部分,包括邮箱和系统线程相关的移植。整体而言,本文通过深入讲解网络数据在内核中的流转和lwIP的架构,为读者提供了对网络协议栈的深入理解和移植细节。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《操作系统实战 45 讲》,新⼈⾸单¥68
《操作系统实战 45 讲》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(8)
- 最新
- 精选
- 相逢是缘置顶我们的 Cosmos 操作系统已经实现了xTaskCreateStatic、osSemaphoreCreate 等这些函数了吗? 一路跟着课程过来,没有发现呢,37课代码里面也没有呢
编辑回复: 相逢是缘你好,感谢你的留言。需要自己在Cosmos实现 ,这里代码只是为了演示移植的思路。先理解移植的核心思想即可,暂时不必深究。受限于工程规模,Cosmos系统的网络栈移植将会安排在项目正式开源之后排期开发,同学们敬请期待哈~
2021-08-023 - pedro由于历史的原因,主流的操作系统都是在内核实现网络协议栈,但是由于网络环境的日益复杂,用户对服务稳定性的要求越来越高。 内核网络协议栈的封闭性是一个很大的桎梏点,因此非内核网络协议栈早就被很多人实现了,例如 DPDK,号称能解决 c10m 问题。虽然现在内核协议栈仍然是主流,但可以预见的是非内核协议栈会越来被人接受,解决更多的实际需求。
作者回复: 期待老铁能够实现Cosmos用户待协议栈
2021-08-02212 - 青玉白露网络协议栈也可以放在用户态来执行。 需要注意的是,如今网速加快、网络环境复杂,多核的CPU在处理高速的网络请求时也会有很大的性能局限性。 而将网络协议栈放在用户态,就可以实现高度自定义,有关这方面的知识可以参考这个博客:https://www.cnblogs.com/jmilkfan-fanguiju/p/12789805.html
作者回复: 6666
2021-08-0226 - Fan找到个 lwIP的教程。 https://www.kancloud.cn/jiejietop/tcpip/988547
编辑回复: 感谢分享~
2021-08-0332 - LDxy协议栈应该也可以放在用户态实现,这时候就需要绕过内核的协议栈,直接和网卡驱动程序通信
作者回复: 是的
2021-08-021 - kocgockohgoh王裒请问cosmos到底用的是nosys模式+ 模拟层实现的函数 还是带操作系统模式啊 有点晕
作者回复: 操作系统
2022-01-07 - 苏流郁宓放在用户态是不是也有一个好处?由于网络数据包过来,假如原来给它分配的内存空间不够用(关键是还不能一直排队等)操作系统还要重新忙下手中的活,重新为它分配新的内存空间。再干别的,放在用户态的话。需求跟着用户态程序走(分配内存资源)翻译等任务跟着用户态程序走。操作系统不用在此之外重新去操心网络数据包的文件情况(例如,视频,照片等。),只需配合用户态程序工作就行(用户态需要调节用到的内核态指令)。这样大大利于网络的流畅稳定。 就像原来是参谋本部,管这管哪,中间存在很多需要通信功能问题(需要与用户态程序反复沟通,浪费时间和资源)现在是管大放小,实时任务由下面的将军(用户态程序)操心,操作系统管好后勤配合工作就行。
作者回复: 是的
2021-11-05 - 云师兄理解软件的设计思想,最重要的是先要理解需求。而内核中的数据流转也只是为了满足网络收发的需求而进行的设计。
作者回复: 是的
2021-08-02
收起评论