
linux内核编程
文章平均质量分 69
linux内核编程实践与思考
hello-Will
软件开发学习交流
展开
-
linux内核发包工具pktgen
pktgen运用了proc 文件系统特征来实现用户和内核的交互,用户通过向proc中传输数据,内核接收到数据后进行解析按照预定义的操作执行,添加端口,填充报文,通过内核发包接口dev_queue_xmit/netdev_start_xmit 发送给网卡,省去了从用户态发包的大部分流程(发包流程介绍,引用)。代码分析:加载pktgen.ko内核模块,module_init(pg_init);会发现多了跟cpu core数相等的kpktgend_%d 内核线程,};原创 2022-08-22 16:02:28 · 949 阅读 · 0 评论 -
linux 主机网络分析
在我们学习,分析网络的时候,无论是教科书,畅销书,视频,通常都会把网络模块分拆开了来讲解,导致我们可能只知其一,不知其二,对整个网络的收发包流程没有一个清晰认识。网络收发包可以理解为流水线模型,想想一下,长江从源头(源地址)出发经过各个省,到达出开口(目的地址),流经的各个省份可以理解为各个处理模块,分工配合。我找到几篇英文博客,讲解的非常详细https://blog.packagecloud.io/eng/2016/06/22/monitoring-tuning-linux-networking-s原创 2020-09-03 14:34:13 · 212 阅读 · 0 评论 -
linux x86 vs arm&mips 启动流程对比
做linux 开发的需要了解启动流程,不建议一下子就钻进去研究整个流程(你会发现流程很复杂,细节很多),建议带着问题去看,不如优化启动流程时间,然后分阶段的处理,这样效果会好很多。在我们做开发的过程中不同架构下linux的启动流程稍有不同,下图展示,建议遇到问题再对应阶段具体分析。1:x862:arm & mips...原创 2020-07-10 11:37:06 · 666 阅读 · 0 评论 -
ip 报文在内核处理的实现
ip 报文在内核处理的实现这篇文章解释了ip报文在内核里面的实现,我们会根据报文穿过 ip协议协议层来介绍ip的基本属性。 为了确保我们的解释清晰易理解,我们假定这是一个普通的ip报文没有特殊属性。所有关于ip的特殊属性, 例如 分片和整形, 源路由,组播,等等都会在下一个章节介绍。一个IP 报文以三种方式进入ip协议栈报文通过网络适配器存储在对应CPU的输入 队列里面, 一旦报文在数...翻译 2020-01-08 15:13:40 · 841 阅读 · 0 评论 -
initramfs 文件系统打包进内核
把initramfs编译到内核里面去使用initramfs最简单的方式,莫过于用已经做好的cpio.gz把kernel里面那个空的给换掉。这是2.6 kernel天生支持的,所以,你不用做什么特殊的设置。kernel的config option里面有一项CONFIG_INITRAMFS_SOURCE(I.E. General setup--->Initramfssource fil...原创 2019-11-06 08:44:30 · 2346 阅读 · 1 评论 -
U-boot引导内核流程分析
U-boot引导内核流程分析1. 加载内核当U-boot完成重定位和初始化外设后,它将正式进入工作状态,可以加载内核镜像到DDR的链接地址中了,具体的地址也可以通过bootcmd这个环境变量来指定,内核镜像有两种加载方式:一种是通过tftp将镜像文件直接引导入DDR中内核的链接地址(对于s5pv210来说是30008000),这种方法很适合调试另一种是从存储介质中的特定扇区读取,这个扇区...转载 2018-11-14 18:44:28 · 1056 阅读 · 0 评论 -
linux内核数据结构之kfifo
1、前言 最近项目中用到一个环形缓冲区(ring buffer),代码是由linux内核的kfifo改过来的。缓冲区在文件系统中经常用到,通过缓冲区缓解cpu读写内存和读写磁盘的速度。例如一个进程A产生数据发给另外一个进程B,进程B需要对进程A传的数据进行处理并写入文件,如果B没有处理完,则A要延迟发送。为了保证进程A减少等待时间,可以在A和B之间采用一个缓冲区,A每次将数据存放在缓冲区中,B每...转载 2018-04-11 14:53:54 · 279 阅读 · 0 评论 -
龙芯内核添加系统调用介绍
添加主要有两个模块 1:交叉工具链的修改 2:内核代码的修改 1:交叉工具链的修改添加交叉工具链 新系统调用的 定义; 龙芯官网下载交叉工具链。 不妨按照以下思路来实现 添加过程,在交叉工具链代码中全局查找 __NR_open , 以此为模版,在系统调用表的最后面添加上自己的定义。交叉工具链:gcc-4.4-gnu实现如下; 1:在原创 2017-11-29 14:16:36 · 1153 阅读 · 0 评论 -
kmalloc、vmalloc、malloc的区别
简单的说:kmalloc和vmalloc是分配的是内核的内存,malloc分配的是用户的内存 kmalloc保证分配的内存在物理上是连续的,vmalloc保证的是在虚拟地址空间上的连续,malloc不保证任何东西(这点是自己猜测的,不一定正确)kmalloc能分配的大小有限,vmalloc和malloc能分配的大小相对较大 内存只有在要被DMA访问的时候才需要物理上连续 vmalloc转载 2017-01-05 17:56:01 · 444 阅读 · 0 评论 -
Linux文件系统架构分析
Linux文件系统架构分析1:架构设计1.1:首先看一下Linux 中文件系统的逻辑关系示意图,如下: 图1.1Linux 中文件系统的逻辑关系示意图1.2:VFS虚拟文件系统又称虚拟文件系统转换( Virual Filesystem Switch)之所以说它虚拟,是因为它所有的数据结构都是在运行原创 2016-11-04 18:58:02 · 2913 阅读 · 0 评论 -
Linux字符设备注册函数 register_chrdev详解
Linux字符设备注册函数 register_chrdev详解 当我们需要注册字符设备的时候,需要module_init()中调用register_chrdev()注册。下面主要介绍接口的实现过程与细节。内核函数前面添加__ 代表内核级函数。谨慎调用。源代码如下:int __register_chrdev(unsigned int major, unsigned int原创 2016-10-24 18:03:28 · 46969 阅读 · 1 评论 -
Linux内核态和用户态共享内存
Linux内核态和用户态共享内存1、mmap系统调用(功能) void* mmap ( void * addr , size_t len , int prot , int flags ,int fd , off_t offset ) 内存映射函数mmap,负责把文件内容映射到进程的虚拟内存空间,通过对这段内存的读取和修改,来实现对文件的读取和修改,而不需要再原创 2016-10-24 14:32:49 · 9887 阅读 · 0 评论 -
Linux 中task_struct和文件系统的关系
Linux 中task_struct和文件系统的关系 在内核进程运行的时候,有current 宏对应目前进程task_struct结构 Linux进程主要数据结构之间的关系。 如图: 一个进程文件位置是有fs_struct描述的,进程打开的文件是有files_struct描述的,具体打开的文件描述符是有file控制的。 一:fs_structcount原创 2016-10-20 14:42:46 · 3533 阅读 · 0 评论 -
list_entry()宏详解
list_entry()宏#define list_entry(ptr, type, member) \ ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))lish.h中定义#define list_entry(ptr, type, member) / conta原创 2016-10-14 15:08:30 · 1887 阅读 · 0 评论 -
进程间通信 IPC 系列一 消息队列
本系列主要根据内核代码,分析 消息队列 共享内存 信号量 三种 进程间通信的方法。内核 目录下有个ipc文件夹, 实现代码在这个里面linux/ipc$ lsbuilt-in.a ipc_sysctl.c modules.order mqueue.c msgutil.c sem.c syscall.c util.hcompat.c Makefile mq_...原创 2019-11-12 18:03:50 · 387 阅读 · 1 评论 -
第七章 :7.1 socket进程间通信-系统调用socket
对照linux内核4.8.6的代码进行研究的。1:socket进程间通信 unix的发展史上 ,AT&T的贝尔实验室和伯克利软件中心(BSD)做出了重大的贡献。AT&T 实现的 SysV IPC , BSD对socket的实现。2:系统调用socket像SysV IPC一样,socket有个总入口,sys_socketcall(); socket实现的核心代码在 内核中原创 2016-12-29 13:41:41 · 1031 阅读 · 0 评论 -
linux 主设备号为1 以及/dev/null的介绍
介绍个特殊的字符设备,主设备号为1的设备 1 char Memory devices 1 = /dev/mem Physical memory access 2 = /dev/kmem Kernel virtual memory access 3 = /dev/null Null device 4 = /dev/port I/O port access 5 =原创 2017-01-03 13:31:46 · 1863 阅读 · 0 评论