操作系统实战 45 讲
彭东
网名 LMOS,Intel 傲腾项目关键开发者
65203 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 60 讲
尝尝鲜:从一个Hello到另一个Hello (2讲)
特别放送 (1讲)
操作系统实战 45 讲
15
15
1.0x
00:00/00:00
登录|注册

37 | 从内核到应用:网络数据在内核中如何流转

实现邮箱和系统线程相关的关键部分移植
网络连接的抽象
基于操作系统的IPC机制
数据发送给用户态监听的应用进程
数据解包
数据复制到内存
数据进入网卡
数据发送给网卡驱动接口层
数据打包
数据流进lwIP组件层
BSD套接字API
Netconn API
原始API
硬件驱动层
lwIP的核心层
lwIP的API层
MCU的业务层
支持IPv6的标准实现
实现相对完整的TCP/IP协议栈
尽量用少量资源消耗
数据发送给用户态监听的应用进程
数据层层解包
网络协议收到数据
网卡驱动处理中断复制数据
发送中断通知网卡驱动
数据通过DMA复制到指定内存
网卡接收数据
数据交给网卡驱动
数据层层打包
数据移交给网络协议栈
内核态将数据复制到内核内存空间
调用系统API接口函数
应用程序准备数据
有操作系统模式
数据接收
数据发送
lwIP的三套应用程序编程接口
lwIP的四层结构
lwIP的设计目标
接收过程总览
发送过程总览
协议栈移植
lwIP执行流程
认识lwIP架构
网络数据在内核中的流转
从内核到应用:网络数据在内核中如何流转

该思维导图由 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
立即购买
登录 后留言

全部留言(8)

  • 最新
  • 精选
  • 相逢是缘
    置顶
    我们的 Cosmos 操作系统已经实现了xTaskCreateStatic、osSemaphoreCreate 等这些函数了吗? 一路跟着课程过来,没有发现呢,37课代码里面也没有呢

    编辑回复: 相逢是缘你好,感谢你的留言。需要自己在Cosmos实现 ,这里代码只是为了演示移植的思路。先理解移植的核心思想即可,暂时不必深究。受限于工程规模,Cosmos系统的网络栈移植将会安排在项目正式开源之后排期开发,同学们敬请期待哈~

    2021-08-02
    3
  • pedro
    由于历史的原因,主流的操作系统都是在内核实现网络协议栈,但是由于网络环境的日益复杂,用户对服务稳定性的要求越来越高。 内核网络协议栈的封闭性是一个很大的桎梏点,因此非内核网络协议栈早就被很多人实现了,例如 DPDK,号称能解决 c10m 问题。虽然现在内核协议栈仍然是主流,但可以预见的是非内核协议栈会越来被人接受,解决更多的实际需求。

    作者回复: 期待老铁能够实现Cosmos用户待协议栈

    2021-08-02
    2
    12
  • 青玉白露
    网络协议栈也可以放在用户态来执行。 需要注意的是,如今网速加快、网络环境复杂,多核的CPU在处理高速的网络请求时也会有很大的性能局限性。 而将网络协议栈放在用户态,就可以实现高度自定义,有关这方面的知识可以参考这个博客:https://www.cnblogs.com/jmilkfan-fanguiju/p/12789805.html

    作者回复: 6666

    2021-08-02
    2
    6
  • Fan
    找到个 lwIP的教程。 https://www.kancloud.cn/jiejietop/tcpip/988547

    编辑回复: 感谢分享~

    2021-08-03
    3
    2
  • LDxy
    协议栈应该也可以放在用户态实现,这时候就需要绕过内核的协议栈,直接和网卡驱动程序通信

    作者回复: 是的

    2021-08-02
    1
  • kocgockohgoh王裒
    请问cosmos到底用的是nosys模式+ 模拟层实现的函数 还是带操作系统模式啊 有点晕

    作者回复: 操作系统

    2022-01-07
  • 苏流郁宓
    放在用户态是不是也有一个好处?由于网络数据包过来,假如原来给它分配的内存空间不够用(关键是还不能一直排队等)操作系统还要重新忙下手中的活,重新为它分配新的内存空间。再干别的,放在用户态的话。需求跟着用户态程序走(分配内存资源)翻译等任务跟着用户态程序走。操作系统不用在此之外重新去操心网络数据包的文件情况(例如,视频,照片等。),只需配合用户态程序工作就行(用户态需要调节用到的内核态指令)。这样大大利于网络的流畅稳定。 就像原来是参谋本部,管这管哪,中间存在很多需要通信功能问题(需要与用户态程序反复沟通,浪费时间和资源)现在是管大放小,实时任务由下面的将军(用户态程序)操心,操作系统管好后勤配合工作就行。

    作者回复: 是的

    2021-11-05
  • 云师兄
    理解软件的设计思想,最重要的是先要理解需求。而内核中的数据流转也只是为了满足网络收发的需求而进行的设计。

    作者回复: 是的

    2021-08-02
收起评论
显示
设置
留言
8
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部