首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux 内核网络协议

前言 本文主要记录 Linux 内核网络协议运行原理 数据报文封装与分用 封装:当应用程序用 TCP 协议传送数据时,数据首先进入内核网络协议中,然后逐一通过 TCP/IP 协议族每层直到被当作一串比特流送入网络...Linux 内核网络协议 协议全景图 协议分层结构 逻辑抽象层级: 物理层:主要提供各种连接物理设备,如各种网卡,串口卡等。...毫无疑问,这是整个内核网络协议核心。这一层主要实现了各种网络协议,最主要的当然是 IP,ICMP,ARP,RARP,TCP,UDP 等。...NAPI 技术适用于高速率短长度数据包处理。 网络协议初始化流程 这需要从内核启动流程说起。...函数 start_kerenl() 将会调用一系列初始化函数,如:平台初始化,内存初始化,陷阱初始化,中断初始化,进程调度初始化,缓冲区初始化,完成内核本身各方面设置,目的是最终建立起基本完整 Linux

3K61

Linux各种:进程 线程 内核 中断

各种内存位置? 介绍完工作原理和用途作用后,我们回归到 Linux 内核上来。...Linux 内核将这 4G 字节空间分为两部分,将最高 1G 字节(0xC0000000-0xFFFFFFFF)供内核使用,称为 内核空间。...进程初始化大小是由编译器和链接器计算出来,但是实时大小并不是固定Linux 内核会根据入情况对区进行动态增长(其实也就是添加新页表)。...,那我们看下 Linux 内核中是怎么体现上面内存布局。...二、线程Linux 内核角度来说,其实它并没有线程概念。Linux 把所有线程都当做进程来实现,它将线程和进程不加区分统一到了 task_struct 中。

3.4K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Linux各种:进程 线程 内核 中断

    各种内存位置? 介绍完工作原理和用途作用后,我们回归到 Linux 内核上来。...Linux 内核将这 4G 字节空间分为两部分,将最高 1G 字节(0xC0000000-0xFFFFFFFF)供内核使用,称为 内核空间。...进程初始化大小是由编译器和链接器计算出来,但是实时大小并不是固定Linux 内核会根据入情况对区进行动态增长(其实也就是添加新页表)。...,那我们看下 Linux 内核中是怎么体现上面内存布局。...二、线程Linux 内核角度来说,其实它并没有线程概念。Linux 把所有线程都当做进程来实现,它将线程和进程不加区分统一到了 task_struct 中。

    2.9K50

    Linux内核IO技术详解

    这是《Linux系统调用那些事》高级部分第一章《聊聊Linux IO》。高级部分文章均假设读者完整学习过Linux系统基础以及Linux系统编程相关内容,并已有一定工程实践经验。...Linux内核IO 这一小节来看Linux内核IO结构。...先上一张全貌图[4]: 由图可见,从系统调用接口再往下,LinuxIO致大致有三个层次: 文件系统层,以 write 为例,内核拷贝了write参数指定用户态数据到文件系统Cache中,并适时向下层同步...设备层,通过DMA与内存直接交互,完成数据和具体设备之间交互 结合这个图,想想Linux系统编程里用到Buffered IO、mmap、Direct IO,这些机制怎么和Linux IO联系起来呢...当脏页在内存中驻留时间超过一个特定阈值时,内核必须将超时脏页写回磁盘。 用户进程调用sync、fsync、fdatasync系统调用时,内核会执行相应写回操作。

    2.6K10

    一文搞懂 | Linux各种(进程 线程 内核 中断

    各种内存位置? 介绍完工作原理和用途作用后,我们回归到 Linux 内核上来。...Linux 内核将这 4G 字节空间分为两部分,将最高 1G 字节(0xC0000000-0xFFFFFFFF)供内核使用,称为 内核空间。...进程初始化大小是由编译器和链接器计算出来,但是实时大小并不是固定Linux 内核会根据入情况对区进行动态增长(其实也就是添加新页表)。...,那我们看下 Linux 内核中是怎么体现上面内存布局。...二、线程Linux 内核角度来说,其实它并没有线程概念。Linux 把所有线程都当做进程来实现,它将线程和进程不加区分统一到了 task_struct 中。

    6.7K33

    一文读懂 | Linux各种:进程 线程 内核 中断

    各种内存位置? 介绍完工作原理和用途作用后,我们回归到 Linux 内核上来。...进程初始化大小是由编译器和链接器计算出来,但是实时大小并不是固定Linux 内核会根据入情况对区进行动态增长(其实也就是添加新页表)。...,那我们看下 Linux 内核中是怎么体现上面内存布局。...二、线程Linux 内核角度来说,其实它并没有线程概念。Linux 把所有线程都当做进程来实现,它将线程和进程不加区分统一到了 task_struct 中。...Linux 为什么需要区分这些? 为什么需要区分这些,其实都是设计上问题。这里就我看到过一些观点进行汇总,供大家讨论: 1. 为什么需要单独进程内核

    1.8K20

    用户态内核态、用户内核

    二、用户内核 内核在创建进程时候,在创建task_struct同时,会为进程创建相应堆栈。每一个进程都有两个,一个用户,存在于用户空间;一个内核,存在于内核空间。...进程陷入到内核态后,先把用户态堆栈地址保存在内核之中,然后设置堆栈指针寄存器内容为内核地址,这样就完成了用户内核转换;当进程从内核态恢复到用户态之后时,在内核态之后最后将保存在内核里面的用户地址恢复到堆栈指针寄存器即可...这样就实现了用户内核互转。 那么,知道从内核转到用户态时,用户地址是在陷入内核时候保存在内核里面的,但是在陷入内核时候,如何知道内核地址?...这是因为当进程在用户态运行时,使用用户,当进程陷入到内核态时,内核保存进程在内核态运行相关信息,但是一旦进程返回到用户态后,内核中保存信息无效,会全部恢复,因此每次进程从用户态陷入内核时候得到内核都是空...所以在进程陷入内核时候,直接把内核顶地址给堆栈指针寄存器就可以了。

    1.9K20

    如何学习 Linux 内核网络协议

    协议细节 下面将介绍一些内核网络协议中常常涉及到概念。...sk_buff 结构自身并不存储报文内容,它通过多个指针指向真正报文内存空间: sk_buff 是一个贯穿整个协议层次结构,在各层间传递时,内核只需要调整 sk_buff 中指针位置就行。...而这里提到 socket 和 sock 是内核两个数据结构,其中 socket 向上面向用户,而 sock 向下面向协议。 如下图所示,这两个结构实际上是一一对应。...L3->L4 我们知道网络协议是分层,但实际上,具体到实现,内核协议分层只是逻辑上,本质还是函数调用。...Netfilter Netfilter 是报文在内核协议必然会通过路径,我们从下面这张图就可以看到,Netfilter 在内核 5 个地方设置了 HOOK 点,用户可以通过配置 iptables

    1.5K20

    如何学习 Linux 内核网络协议

    1 协议细节 下面将介绍一些内核网络协议中常常涉及到概念。...sk_buff 结构自身并不存储报文内容,它通过多个指针指向真正报文内存空间: sk_buff 是一个贯穿整个协议层次结构,在各层间传递时,内核只需要调整 sk_buff 中指针位置就行。...而这里提到 socket 和 sock 是内核两个数据结构,其中 socket 向上面向用户,而 sock 向下面向协议。 如下图所示,这两个结构实际上是一一对应。...L3->L4 我们知道网络协议是分层,但实际上,具体到实现,内核协议分层只是逻辑上,本质还是函数调用。...Netfilter Netfilter 是报文在内核协议必然会通过路径,我们从下面这张图就可以看到,Netfilter 在内核 5 个地方设置了 HOOK 点,用户可以通过配置 iptables

    1.5K20

    浅墨: 聊聊Linux IO(中)——Linux内核IO

    接上一篇浅墨: 聊聊Linux IO(上),先上一张全貌图[4]: ?...由图可见,从系统调用接口再往下,LinuxIO致大致有三个层次: 文件系统层,以 write(2) 为例,内核拷贝了write(2)参数指定用户态数据到文件系统Cache中,并适时向下层同步...设备层,通过DMA与内存直接交互,完成数据和具体设备之间交互 结合这个图,想想Linux系统编程里用到Buffered IO、mmap(2)、Direct IO,这些机制怎么和Linux IO联系起来呢...假设要去读一个冷文件(Cache中不存在),open(2)打开文件内核后建立了一系列数据结构,接下来调用read(2),到达文件系统这一层,发现Page Cache中不存在该位置磁盘映射,然后创建相应...Linux 2.4还要求是文件系统逻辑块整数倍)。

    2.3K20

    DragonOS内核traceback

    简介   内核traceback功能位于kernel/debug/traceback/文件夹中。为内核态提供traceback功能,打印调用到屏幕上。   ...具体使用场景如:内核出错时候,打印调用,以便定位原因。...演示如下图所示: 图片 API void traceback(struct pt_regs * regs) 作用   该接口定义于kernel/debug/traceback/traceback.h中,将会对给定内核进行...参数 regs   要开始追踪第一层内核帧(也就是底端) 实现原理   当内核第一次链接之后,将会通过Makefile中命令,运行kernel/debug/kallsyms程序,提取内核文件符号表...该文件rodata段中存储了text段函数符号表。接着,该文件将被编译为kallsyms.o。最后,Makefile中再次调用ld命令进行链接,将kallsyms.o链接至内核文件。

    45620

    从 0 开始学 Linux 内核之 android 内核溢出 ROP 利用

    作者:Hcamael@知道创宇404实验室 最近在研究一个最简单android内核溢出利用方法,网上资料很少,就算有也是旧版内核,新版内核有了很大不同,如果放在x86上本应该是很简单东西...把上一篇改了一下名字,换成了从0开始学Linux内核,毕竟不是专业搞开发,所以驱动开发没必要学那么深,只要会用,能看懂代码基本就够用了。...本篇开始学Linux kernel pwn了,而内核能搞也就是提权,而提权比较多人搞就是x86和arm指令集Linux系统提权了,arm指令集基本都是安卓root和iOS越狱,而mips指令集几乎没啥人在搞...,内核是有大小限制,在arm32中大小是0x2000,而thread_info信息储存在最底部 所以,如果我们能获取到当前进程在内核中运行时其中一个地址,我们就能找到thread_info...,我也找不到问题原因,在执行完msr cpsr_c, r4指令以后,信息会发现变化,导致没法控制pc跳转 不过后来,我跟踪内核执行,发现内核本身是通过ret_fast_syscall函数来切换回用户态

    1.5K30

    从 0 开始学 Linux 内核之 android 内核溢出 ROP 利用

    作者:Hcamael@知道创宇404实验室 最近在研究一个最简单android内核溢出利用方法,网上资料很少,就算有也是旧版内核,新版内核有了很大不同,如果放在x86上本应该是很简单东西...,但是arm指令集有很大不同,所以踩了很多坑 把上一篇改了一下名字,换成了从0开始学Linux内核,毕竟不是专业搞开发,所以驱动开发没必要学那么深,只要会用,能看懂代码基本就够用了。...本篇开始学Linux kernel pwn了,而内核能搞也就是提权,而提权比较多人搞就是x86和arm指令集Linux系统提权了,arm指令集基本都是安卓root和iOS越狱,而mips指令集几乎没啥人在搞...,内核是有大小限制,在arm32中大小是0x2000,而thread_info信息储存在最底部 所以,如果我们能获取到当前进程在内核中运行时其中一个地址,我们就能找到thread_info...,我也找不到问题原因,在执行完msr cpsr_c, r4指令以后,信息会发现变化,导致没法控制pc跳转 不过后来,我跟踪内核执行,发现内核本身是通过ret_fast_syscall函数来切换回用户态

    1.6K00

    Linux 内核中,多线程空间模型是怎样

    当进程运行起来后,产生另外两个动态区域,这就是堆和。 大多情况下,是CPU直接支持一个内存区域。函数局部变量便位于这个区域。 堆是一个没有严格定义区域。...很简单,通过CPU直接支持区,自动维护“函数调用链”: 顶 printSth函数局部变量 main函数里面调用printSth函数那条指令位置 main函数局部变量 底 对于printSth...而所谓“线程获得执行权”呢,实质上就是把对应线程顶指针等信息载入CPU指示器,使得它沿着这条调用链继续执行下去——执行一段时间,把它顶指针等信息找个地方保存、然后载入另一个线程顶指针等信息...如果维护调用链(以及执行现场)任务全部放在用户空间,不让操作系统知道,这就叫“用户态线程”。 反之,如果操作系统自己提供了开辟新线程以及维护它调用链一整套方法,这就叫“内核态线程”。...换句话说,操作系统认为,诸如动态申请内存、内核对象等各种资源,哪怕是在某个线程里面申请,它所有权仍然属于进程所有——所以,线程退出除了会清理调用链信息外,并不释放其他资源;而进程退出就会自动归还它申请各种资源

    2.2K50

    Linux操作系统原理—内核网络协议

    前言 本文主要记录 Linux 内核网络协议运行原理 数据报文封装与分用 image.png 封装:当应用程序用 TCP 协议传送数据时,数据首先进入内核网络协议中,然后逐一通过 TCP/IP...image.png 分用:当目的主机收到一个以太网数据帧时,数据就开始从内核网络协议中由底向上升,同时去掉各层协议加上报文首部。每层协议都会检查报文首部中协议标识,以确定接收数据上层协议。...image.png Linux 内核网络协议 协议全景图 image.png 协议分层结构 image.png image.png 逻辑抽象层级: 物理层:主要提供各种连接物理设备,如各种网卡...毫无疑问,这是整个内核网络协议核心。这一层主要实现了各种网络协议,最主要的当然是 IP,ICMP,ARP,RARP,TCP,UDP 等。...协议发包流程概述 1、应用层可以通过系统调用接口层或文件操作来调用内核函数,BSD socket 层 sock_write() 会调用 INET socket 层 inet_wirte()。

    3.2K00

    Linux 内核网络协议源码剖析】recvfrom 函数剖析

    大家好,又见面了,我是你们朋友全君。 继前篇介绍完sendto 数据发送函数 后,这里介绍数据接收函数 recvfrom。...其接收到每个数据包都是独立 //如果用户要求读取小于可读取,那么剩下将被丢弃(本版本协议就是这么干) copied = min(len, truesize); /*...shouldn't happen but .. */ *err=-EAGAIN; } return skb;//返回该数据包 } skb_copy_datagram() //将内核缓冲区中数据复制到用户缓冲区...restore_flags(flags);//恢复现场 } 对比数据包发送与接收,发送过程就是把数据从缓冲区拷贝到数据包数据部分,由于需要经过协议,所以对于数据部分区域还需要进行数据封装,添加各层协议头...发布者:全程序员长,转载请注明出处:https://javaforall.cn/163441.html原文链接:https://javaforall.cn

    2.1K20

    查看linux版本内核 Linux内核版本变化

    大家好,又见面了,我是你们朋友全君。...Linux内核版本变化 自从1991年9月17日,Linus Torvals正式宣布了 Linux第一个正式版本—0.02版本,到现在,Linux内核版本发生了一系列变化,新旧版本之间时间间隔是几个月甚至几个星期...从Linux诞生开始,Linux内核就从来没有停止过升级,从Linus第一次发布0.02版本到1999年具有里程碑意义2.2版本,一直到我们现在看到2.4版本,都凝聚了Linux内核开发人员大量辛苦劳动...现在Linux内核里已经开始了这方面的支持。...发布者:全程序员长,转载请注明出处:https://javaforall.cn/172306.html原文链接:https://javaforall.cn

    22.3K20

    (重磅原创)冬之焱: 谈谈Linux内核回溯与妙用

    作者简介:冬之焱,杭州某公司linux内核工程师,4年开发经验,对运用linux内核某些原理解决实际问题很感兴趣。...版权声明:本文最先发表于"Linux阅码场"微信公众号,转载请在文章最开头,保留本声明。 1 前言 说起linux内核回溯功能,我想这对每个Linux内核或驱动开发人员来说,太常见了。...如下演示linux内核崩溃一个回溯打印,有了这个崩溃打印我们能很快定位到在内核哪个函数崩溃,大概在函数什么位置,大大简化了问题排查过程。 ?...本文详细讲解了基于mips、arm架构linux内核回溯原理,通过不少例子,尽可能全面给读者展示各种回溯原理,期望读者理解透彻回溯。...在这个基础上,讲解笔者近几年项目开发过程中使用linux内核回溯功能几处重点应用。

    4.9K31

    在调试器里看LINUX内核溢出

    因为系统中每个进程都有一个用户空间,但是内核空间只有一个,所以内核空间一般都是比较小。对LINUX内核来说,更是这样。多大呢?32位时是8KB,64位时是16KB。...闲言打住 ,今天先说说LINUX内核溢出。 启动一个Ubuntu作为调试目标,再启动一个Ubuntu作为调试主机。在主机上启动GDB,开始双机内核调试。...上图中回溯比较完美地展示了LINUX内核处理中断过程,特别地,这一次是在处理键盘中断,也就是我们刚才按下中断热键。...目前显示为10进制,观察不便,使用printf格式化一下: (gdb) printf "%p\n", regs->sp 0xffff88003b44ba98 Linux内核使用一种特殊约定...靠谱,第一个字段是著名任务结构体,Linux内核源代码中著名current宏就是从这里取到哦。所属CPU为0也是合理

    2.3K41

    Linux源码解析-内核与thread_info结构详解

    1.什么是进程内核?...在内核态(比如应用进程执行系统调用)时,进程运行需要自己堆栈信息(不是原用户空间中),而是使用内核空间中,这个就是进程内核 2.进程内核在计算机中是如何描述?...void *stack; // 指向内核指针 // ... }; task_struct数据结构中stack成员指向thread_union结构(Linux内核通过thread_union...从用户态刚切换到内核态以后,进程内核总是空。因此,esp寄存器指向这个顶端,一旦数据写入堆栈,esp值就递减 3.thread_info作用是?...信息, linux内核是支持不同体系, 但是不同体系结构可能进程需要存储信息不尽相同, 这就需要我们实现一种通用方式, 我们将体系结构相关部分和无关部门进行分离,用一种通用方式来描述进程

    2.8K10
    领券