linux kernel 开发
文章平均质量分 75
以实战为主,通过代码来逐步深入学会linux kernel开发中的一些基本套路,并掌握这些套路
zhangdltech
行动大于说道
展开
-
Linux kernel开发(二)Hello world模块
完整的hello world模块我准备写一个hello world的内核模块作为内核开发的入门,先看下hello.c文件源码#include <linux/init.h>#include <linux/module.h>MODULE_LICENSE("DUAL BSD/GPL");static int __init hello_init(void){ printk(KERN_ALERT "Hello, world\n"); retur原创 2021-07-23 00:33:56 · 361 阅读 · 1 评论 -
linux kernel ioctl系统调用
Q:用户空间调用ioctl操作网卡设备行为时,调用链是什么样的?不同的socket类型是否也不一样?先来看一下系统调用ioctl的调用链是什么样的,请看下表函数名称文件名做了什么SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, unsigned long, arg)fs/ioctl.cioctl函数入口do_vfs_ioctlfs/ioctl.c真正入口,这个函数里边会区分哪些是针对真正的文件进行操原创 2021-07-13 17:58:09 · 376 阅读 · 0 评论 -
linux kernel bridge 数据包流向
Q:bridge的入口在哪里?在驱动侧还是内核协议栈?到数据包达到网桥时哪一阶段去匹配目的mac是否与自己的mac匹配,不匹配就丢包?要回答上面的问题,首先需要了解内核模块bridge是如何工作的,当bridge成功加载之后,他受理从用户空间发来的ioctl指令来指示增删桥接口,在嵌入式设备中,通常使用busybox中的brctl命令行工具调用内核ioctl来与内核通信。当用户空间增加一个桥接口时,内核bridge模块就创建对应的桥接口实体,同时将自己的br_handle_frame注入到设备的rx_ha原创 2021-07-13 17:56:27 · 488 阅读 · 0 评论 -
linux kernel内部产生的数据包流向
Q:从内核程序发出的数据包如何走向的?经过了哪些HOOK点?首先看一下内核模块发送数据包的代码#include <linux/slab.h>#include <linux/kernel.h>#include <linux/init.h>#include <linux/module.h>#include <linux/error.h>#include <linux/netdevice.h>static int send_原创 2021-07-13 17:54:17 · 220 阅读 · 0 评论 -
linux kernel 路由转发调用过程
skb的路由cache创建过程函数名称文件名做了什么ip_rcvnet/ipv4/ip_input.c网络数据报的入口函数ip_rcv_finishnet/ipv4/ip_input.cip_route_input_norefnet/ipv4/route.c创建路由表对应的entityip_route_input_slownet/ipv4/route.c本函数内部调用函数fib_lookup函数把转发表信息查出来之后,根据转发表内容决定是走路由转.原创 2021-07-13 17:49:33 · 337 阅读 · 0 评论 -
linux kernel socket系统调用过程
用户空间创建socket过程函数名称文件名做了什么socketany用户空间调用socket函数创建socketnet/socket.c内核socket函数的系统调用入口在/net/socket.c中,关于用户空间网络编程相关的系统调用接口基本都在这个文件中,比如bind函数、shutdown函数等等。sock_createnet/socket.c调用__sock_create__sock_createnet/socket.c首先调用security原创 2021-07-13 17:47:34 · 410 阅读 · 0 评论 -
linux kernel raw packet的接收与发送
Q:如果我要在linux上写一个程序,程序的功能是接收网络数据包,根据接收到的包再决定发送网络数据包,但这里的网络数据包并非TCP/UDP类型的数据包,而是仅包含以太头的原始数据包raw packet,那么这个的程序应该怎样编写呢?为了使贴上来的程序完整,不至于只包含一部分代码,我先将各文件的完整代码附上,之后再针对各个需要注意的点逐一介绍。先定义一个原始包处理的类,类的接口包括发送与接收、socket的创建与关闭、混杂模式的打开与关闭。头文件如下#ifndef __RAWPKT_PROCESSOR_原创 2021-07-13 17:44:16 · 1284 阅读 · 0 评论 -
linux kernel 发送网络数据包处理流程
应用层发送数据包的调用链如下我们的流程以发送一个UDP包为例,阐述linux kernel数据包发送过程,下图为调用链,至上而下。函数名称文件名做了什么udp_send_skbudp.c封装UDP头,调用ip_send_skb发送ip数据包ip_send_skbip_output.cip_local_outip_output.c__ip_local_outip_output.cnf_hookip_output.c调用关系到了这里就再继续下原创 2021-07-13 17:39:40 · 411 阅读 · 0 评论 -
linux kernel 接收网络数据包处理流程
数据包接收处理流程系统启动时,在kernel/softirq.c文件中函数spawn_ksoftirq会调用smpboot_register_percpu_thread,这个函数位于kernel/smpboot.c文件中,他的作用就是为每一个cpu注册一个软中断的线程处理函数,而这个软中断处理线程函数名称为run_ksoftirqd软中断线程入口函数run_ksoftirqd会检测softirq的pengding位是否置位,如果置位则调用__do_softirq();位于文件kernel/softi原创 2021-07-13 17:13:46 · 332 阅读 · 0 评论 -
Linux kernel开发(一)升级内核
背景在写此文章以前,我时常想将linux kernel的源码下载下来,然后搭建一个最基本的开发环境,之后就可以在此基础上自由开发调试,但是都因中文社区没有太多类似的详细教程而止步,最近因工作需要涉及linux kernel module开发,所以在这方面也积累了一些开发经验,为了不忘来时的路,我将之前的一些问题写成文章,便于以后时间间隔太长时能够快速恢复。环境准备一台安装了linux centos 7的电脑在升级内核之前,你起码得有一台linux版本的内核,如果你不知道如何将一台电脑安装成linu原创 2021-04-27 00:59:30 · 470 阅读 · 0 评论