- 博客(25)
- 收藏
- 关注
原创 文件系统和磁盘的关系
在blkdev_get_by_path->lookup_bdev->bd_acquire->bdget函数中如果/dev/sda1分区对应的dev_t dev设备号没有对应的struct block_device块设备描述符则会通过bdget->iget5_locked函数创建该描述符并在bdev_set函数中将BDEV_I(inode)->bdev.bd_dev设置为/dev/sda1分区对应的dev_t dev设备号。例如,“/dev/sdb1” 表示要挂载的设备是 /dev/sdb1。
2024-04-29 19:34:10
697
1
原创 bonding原理分析和问题排查
即可进行tcp通信。dev_queue_xmit_nit即为发送报文的抓包点,netdev_start_xmit最开始为bond3的发送报文是会被抓包回调函数即bond_start_xmit然后再通过两个物理网卡发送出去,即实际物理网卡发送报文时会再次被tcpdump抓包。在bond_xmit_broadcast函数中通过bond_for_each_slave_rcu(bond, slave, iter)遍历所有bond的网卡并调用bond_dev_queue_xmit通过该网卡进行报文发送。
2024-04-18 11:54:53
1756
原创 drop cache原理分析
1.drop slab cache会遍历所有所有注册到shrinker_list的链表并调用其回调函数scan_objects释放slab cache。2.drop page cache 会释放所有struct super_block下的所有inode节点地址空间inode->i_mapping的所有非锁定非脏页非回写页非映射页进行page cache释放。3.通过/proc/sys/vm/drop_caches 写入特定的值时释放cache缓存。写入值1表示释放page页cache。
2024-04-09 19:23:02
1923
原创 /dev/目录下字符设备文件创建流程
1.字符设备文件(/dev/)是Linux系统中用于管理字符设备的特殊目录,应用程序可以通过打开和读写该目录下的文件节点与字符设备进行通信。2.device_add函数是Linux内核中用于向系统添加设备的函数,它将设备添加到设备层次结构中,并进行资源分配和数据结构初始化,以便内核和驱动程序管理设备。3.devtmpfs是一个临时文件系统,用于在系统启动时自动创建和管理设备节点。它为字符设备和块设备分配设备号,并与驱动程序建立连接,使得设备能够被应用程序访问和操作。
2024-03-26 11:55:25
1777
原创 linux内核报文接收流程
1.当网络设备接收到数据包时,硬件会将数据包存储在设备驱动的接收环(receive ring)中。接着,硬件会触发中断,通知操作系统有数据包可用。2.在接收到数据包后,驱动程序会调用netif_rx()函数来处理数据包。netif_rx()函数会将数据包放入软中断队列中,并触发软中断处理函数来处理数据包。3.软中断处理函数net_rx_action通过poll回调函数process_backlog获取到接收到的数据包。并转交给__netif_receive_skb函数处理。
2024-03-18 14:21:51
1140
原创 prp协议原理解析
PRP协议通过使用两个冗余的并行路径和冗余检查机制,提供了实时以太网网络的高可靠性和容错性。它可以在链路故障发生时快速切换到冗余路径,确保数据的可靠传输。PRP协议的独立性使其能够与各种上层协议兼容,并广泛应用于工业控制系统、电力系统、交通系统等对通信可靠性要求较高的领域。使用:1.PRP协议主要应用于实时工业以太网领域,用于提供高可靠性的通信。2.PRP协议通过在物理层上提供两个冗余的并行网络路径来实现冗余性。每个路径都有独立的链路、交换机和设备。
2024-03-14 18:07:29
2800
1
原创 ip协议之报文发送流程
1.__ip_queue_xmit函数将报文从ip层发送给首先判断sk->sk_dst_cache缓存的路由项是否可用。不可用的情况一般有路由项被释放,网络命名空间发生改变如添加/删除路由或up/down网卡。如果sk->sk_dst_cache缓存的路由项不可用则根据目的地址查找路由项并设置到sk->sk_dst_cache。2.应用层通过netlink通信进行路由表的添加/删除操作,且路由表的"修改"是通过先删除再添加的方式完成的。
2024-02-28 18:56:13
1073
原创 tcp协议之报文发送流程
1.若开启了tcp pacing功能则每次的报文发送实际是由高精度定时器pacing_timer的回调函数中进入tcp_write_xmit->tcp_transmit_skb将报文发送到ip层。若没有开启tcp pacing功能则每次tcp_write_xmit函数再判断是否使用Nagle机制进行报文的合并发送。
2024-02-26 19:25:40
1682
原创 watchdog看门狗soft lockup软死锁和Hard LOCKUP硬死锁原理分析
软死锁表示产生死锁的cpu上运行的任务超过了一定的时间限度导致无法进行内核线程调度。典型场景为某个cpu上一直在while死循环,导致该cpu无法调度运行他任务。硬死锁表示产生死锁的cpu上在一定的时间限度上一直无法响应中断。典型场景为在同一个cpu上调用关中断的自选锁spin_lock_irqsave产生了死锁。
2024-02-19 18:12:12
2133
原创 softirq软中断线程和tasklet工作队列原理分析
如果ht->thread_should_run(td->cpu)返回0即ksoftirqd_should_run()函数返回0表示不存在软中断进行schedule()切换,如果存在软中断需要执行则调用ht->thread_fn(td->cpu);进而在软中断被调度运行时能执行软中断的回调函数tasklet_action。在softirq_init初始化函数中首先会调用open_softirq设置低优先级TASKLET_SOFTIRQ和高优先级HI_SOFTIRQ的tasklet工作队列的回调函数。
2024-02-19 11:53:49
898
原创 低精度定时器timer_list
低精度和高精度定时器。低精度定时器基于硬件的周期性中断实现,其定时周期的粒度为1/HZms,例如,内核HZ为1000,那么低精度的定时器最小定时时间为1ms;高精度定时器可以实现ns级的定时,不过,实际的定时周期粒度与CPU的主频有关,比如,桌面级的CPU一般都是GHZ级别,那么,其定时粒度可以达到ns级别,而对于嵌入式CPU,其主频一般在百兆级别,那么定时粒度就只能达到us级别了。api函数:timer_setup():初始化定时器和回调函数mod_timer():修改定时器延迟时间。
2024-02-18 17:58:31
978
原创 linux-5.10.38-epoll源码分析
路径:fs\eventpoll.cepoll_create创建epoll描述符static int do_epoll_create(int flags){ int error, fd; struct eventpoll *ep = NULL; struct file *file; /* Check the EPOLL_* constant for consistency. */ BUILD_BUG_ON(EPOLL_CLOEXEC != O_CLOEXEC); if (flags &
2022-05-23 19:19:39
356
原创 redis-6.0.8-均衡哈希函数
static int clusterManagerCommandRebalance(int argc, char **argv) { //均匀分配哈希槽 int port = 0; char *ip = NULL; clusterManagerNode **weightedNodes = NULL; list *involved = NULL; if (!getClusterHostFromCmdArgs(argc, argv, &ip, &port
2022-05-22 16:30:01
189
原创 c++学习
类构造函数初始化列表c++#include <iostream> // std::coutusing namespace std;class CMyClassaa { public: CMyClassaa(int x, int y); int m_x; int m_y=5;};CMyClassaa::CMyClassaa(int x, int y) : m_y(y), m_x(m_y){}int main(){ CMyCl
2022-05-12 16:52:34
231
原创 内存管理maclloc,jemalloc
内存分配malloc一、c库函数Malloc()和free()Gun下默认会链接 libc库,路径为/lib64/libc.so.6。Malloc()类函数调用时相应的会调用libc中的maloc函数。定义如图所示,其中用了一些gun的c关键字,大概意思为malloc的是__libc_malloc的别名,__malloc也是__libc_malloc的别名。二、内存分配的具体实现在调用__libc_malloc函数时首先会判断全局钩子函数malloc_hook_ini是否被定义,在libc库
2022-05-11 13:08:34
2034
原创 可变参数宏__VA_ARGS__
宏定义中的可变参数 **…**可用宏__VA_ARGS__替代#include "stdio.h"#include "stdlib.h"#include "string.h"#include "time.h"int add(int a,int b,int c,int d,int f);#define INDIRECT_CALL_1(f, f1, ...) \ ({ \ (f == f1) ? f1(__VA_ARGS__) : f(__VA_ARGS__); \ }
2022-05-11 11:02:35
224
原创 redis-6.0.8-dict的一些杂谈
数据结构typedef struct dict { dictType *type; //函数指针 void *privdata; /*ht属性是一个包含两个项的数组,数组中的每个项都是一个dictht哈希表,一般情况下, 字典只使用ht[0]哈希表,ht[1]哈希表只会在对ht[0]哈希表进行rehash时使用*/ dictht ht[2]; //hash表 /*它记录了rehash目前的进度,如果目前没有在进行rehash,那么它的值为-1*/ lon
2022-05-08 12:35:51
303
原创 redis-6.0.8-reactor网络模型
版本:redis-6.0.8主要内容:reactor网络模型初始化initServersrc\server.c server.el = aeCreateEventLoop(server.maxclients+CONFIG_FDSET_INCR); //创建监听时间描述符 epoll函数定义: #ifdef HAVE_EVPORT#include "ae_evport.c"#else #ifdef HAVE_EPOLL #include "ae_epoll.c"
2022-05-03 12:12:19
819
原创 mysql源码分析-8.0.28-LogErr模块
LogErr定义include\mysql\components\services\log_builtins.h:#define LogErr(severity, ecode, ...) \ LogEvent() \ .prio(severity) \ .errcode(ecode) \ .subsys(LOG_SUBSYSTEM_TAG) \
2022-05-02 12:27:51
1022
原创 c++学习
c++学习模板使用,求最大值#include <iostream>namespace guodong {template<class T>T max(T head) { return head;}template<class T, typename... Args>T max(T head, Args... args) { T t = max(args...); return (head > t)?head:t;}
2022-05-02 11:44:25
791
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人