自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(49)
  • 收藏
  • 关注

原创 linux网络编程 - epoll边沿触发/水平触发内核实现代码分析

linux内核epoll水平触发、边沿触发实现代码介绍

2022-11-23 22:08:58 731 1

原创 jtag调试ls1012a linux-5.3内核

jtag调试ls1012a linux-5.3内核

2022-11-19 22:30:38 1003

原创 linux网络编程 - epoll内核实现代码分析

linux网络编程epoll内核实现代码分析

2022-11-19 20:56:36 857

原创 树莓派4b linux内核调试(jtag、kgdb)

jtag/kgdb调试树莓派4b内核。

2022-11-18 22:42:09 1579

原创 linux网络协议栈源码分析 - 传输层(TCP的输出)

tcp报文发送流程。

2022-11-18 20:18:44 1764

原创 linux网络协议栈源码分析 - 传输层(TCP连接的终止)

tcp关闭过程的四次挥手。

2022-08-24 20:11:54 1314

原创 linux网络协议栈源码分析 - 传输层(TCP连接的建立)

linux网络协议栈源码分析 - 传输层(TCP连接的建立)

2022-08-21 08:00:00 1905

原创 linux网络协议栈源码分析 - 网络层IP网际协议

linux网络协议栈源码分析 - 网络层IP网际协议

2022-08-10 22:11:58 1468

原创 linux网络协议栈源码分析 - 链路层ARP地址解析协议

linux ARP请求/应答

2022-08-02 21:31:09 1189

原创 linux网络协议栈源码分析 - 路由查找树

linux内核路由查找树

2022-07-30 12:36:04 1969

原创 linux网络协议栈源码分析 - 邻居子系统邻居状态转移

linux内核邻居子系统状态转移

2022-07-23 17:44:18 1118

原创 ThreadX内核源码分析(SMP) - 线程多核映射

整个过程就是先把能占的核先占了,如果被占的核上的线程能移动到空闲核上,那么就移动到空闲核上面去,如果不能,那就递归占能占的核。

2022-07-14 22:23:51 1296

原创 ThreadX内核源码分析(SMP) - 核间通信(arm)

多核情况下,一个核可能改变另外一个核的执行状态,例如一个核挂起另外一个核正在执行的线程,如果没有机制通知另外一个核该线程被挂起的话,那么被挂起的线程就感知不到自己被挂起了;ThreadX内核使用SGI中断,从一个核发送一个中断信号到目的核上去,从而使另外一个核产生中断,另外一个核就会去检查状态变化,例如是否要重新调度(别的核改变了该核需要执行的线程)。 参考《ARMv8-A_Architecture_Reference_Manual_(Issue_A.a).pdf》"D8.6.28 ICC_S

2022-07-05 19:46:05 1617

原创 ThreadX内核源码分析(SMP) - 核间互斥(arm)

在单核的ThreadX内核中,内核的临界资源互斥通过关中断实现;在多核cpu上,关闭整个cpu的代价比较大,单核上仍然使用关中断实现(其他核的中断仍然开启),但是与其他核之间互斥通过_tx_thread_smp_protection实现: 首先,单核已经关中断,那么正在访问资源的线程不会被切换出去,在退出临界资源之前,当前核上的线程不会被中断,也就是在退出临界资源前当前核不会有其他线程执行,当前核的线程之间是互斥的; 其次,_tx_thread_smp_protection标记了

2022-07-04 23:44:58 1044

原创 ThreadX内核源码分析 - 消息队列

1、消息队列介绍ThreadX内核的消息可以多线程收发,每个消息的大小固定;消息队列有一定的大小,超过大小之后,发送消息的线程需要等待消息被取走才能往消息队列里面再次发送消息。2、消息的接收_tx_queue_receive消息接收主要检查有没有消息,没有消息就要等待消息或者返回消息队列为空的错误码;如果消息队列不为空,并且没有发送消息的线程等待消息队列(消息队列不为空),那么直接从消息队列最前面读消息即可;如果消息队列满了,有线程等待消息队列,那么检查等待消息队列的第一个线程是不是

2022-03-12 22:19:16 1170

原创 ThreadX内核源码分析 - 事件

1、ThreadX内核事件介绍ThreadX事件有点类似epoll,线程可以等待单个事件/多个事件等(epoll一个事件就绪即可返回,ThreadX可以等待多个事件都就绪才返回),从代码实现上看,ThreadX可以多个线程等待同一个事件,获取事件之后还可以不清除事件,epoll在网络编程中,似乎还没看到多个线程对一个事件监听的情况,具体能否多个线程调用epoll监听同一事件还得看linux内核代码实现;ThreadX等待多个事件就绪才返回,这个实现比较实用,在ceph中等待多个worker结束时,通

2022-03-12 19:22:50 1451

原创 ThreadX内核源码分析 - 计数信号量

1、计数信号量介绍计数信号量的信号量值不为0,表示信号量可获取,每次获取信号量,信号量计数器的值减1,为0是,信号量不看获取,释放信号量是每次加1;计数信号量实现与互斥锁类似,一定程度上可以把互斥锁看出计数为1的信号量,只不过互斥锁有动态优先级调整,信号量没有,互斥锁用于临界资源保护,信号量用于生产消费者这类场景(多个消费者、多个生产者)。2、信号量获取_tx_semaphore_get获取信号量的代码比较简单,主要是对计数信号量的计数进行判断,如果信号量计数器不为0,就减1然后返回(获

2022-03-12 14:40:22 650

原创 ThreadX内核源码分析 - 线程同步之互斥锁及动态优先级

1、ThreadX互斥锁介绍互斥锁一般用来锁多线程都需要访问的临界资源,这些资源不能并发操作,例如对某个内存的互斥读写,这个读写很快,但是不能多线程同时进行,所以需要加互斥锁;占用互斥锁的线程没能执行,可能是被高优先级线程抢占了或者临界资源里面调用了阻塞操作;高优先级线程想要访问临界资源就必须等待低优先级线程被调度然后释放互斥锁,如果低优先级线程不提高优先级不被执行的话,那么高优先级的线程就会阻塞,直到所有高优先级线程都阻塞了,才能轮到占用互斥锁的低优先级线程执行,这样高优先级线程就得不到及时处理,

2022-03-12 13:24:11 1602

原创 ThreadX内核源码分析 - 动态内存管理

ThreadX内核与μC/OS-II、NucleusPlus内核一样,都支持固定大小的内存块管理,也支持不固定大小的内存块管理。固定大小的内存块管理是把一片内存分割成大小相同的多个内存块,以整块内存分配和释放,例如内存块大小为1024字节,那么每次只能申请释放1024字节的内存,一般只适合大小固定的内存块申请释放场景,类似linux的2的n次方的内存页申请,mmu只能管理页,不能把页分成更小的内存管理,因此要分配小的内存前,先按页分配,再在分配的页里面按byte分配内存。

2022-02-19 22:45:02 1042

原创 ThreadX内核源码分析 - 优先级及抢占阈值抢占(arm)

1、抢占阈值thresholdThreadX实时系统内核除了按时间片调度外,还有优先级调度,高优先级线程抢占低优先级线程,另外与其他嵌入式实时系统一个比较明显的差异是,ThreadX支持低优先级线程抢占高优先级线程,通过抢占阈值threshold实现低优先级线程抢占高优先级线程;抢占阈值threshold只有在启用抢占线程正在执行的时候被切换出去的时候才有作用,也就是新创建的启用了抢占的线程就绪时,即使新创建线程的抢占阈值threshold高于正在运行的线程优先级,线程只会添加到同优先级就绪线程链表

2022-02-19 14:58:23 1492

原创 ThreadX内核源码分析 - 定时器及线程时间片调度(arm)

1、线程时间片介绍(tx_thread_time_slice)ThreadX内核同优先级线程之间是按时间片调度的,tx_thread_new_time_slice记录线程的时间片(一次调度的总的时间片),tx_thread_time_slice记录线程的剩余时间片(ThreadX内核每次调度线程时,并不是从tx_thread_new_time_slice,而是从上次换出cpu时的剩余时间片继续计时,只有当时间片用尽时,tx_thread_time_slice才会从tx_thread_new_time_s

2022-02-16 08:00:00 1753

原创 ThreadX内核源码分析 - ports线程上下文相关代码分析(arm)

1、ports源码介绍内核与cpu相关的关键代码基本都是用汇编语言实现的,c语言可能实现不了或者不好编写。ThreadX官网针对ARM9 gcc的移植代码在threadx-6.1.2_rel\ports\arm9\gnu\src目录下,ThreadX文件命名规则基本是以该文件包含的函数名命名的(函数名多了一个"_"前缀,文件名里面没有"_"前缀),每个源文件通常只实现一个函数;ports代码目录如下:tx_thread_context_restore.S是_tx_thread_context

2022-02-15 08:00:00 1364

原创 JLinkGDBServer调试ARM linux内核

1、修改Makefile编译优化级别编译器优化后,很多调试信息看不到,不好调试,修改linux-4.5.3/Makefile的KBUILD_CFLAGS优化级别为“-O1”。("-O0"会导致部分代码编译不过)2、打开编译内核生成调试信息开关Kernel hacking ---> Compile-time checks and compiler options ---> [*] Compile the kernel with debug in...

2021-09-11 17:33:06 1815

原创 TCP/IP应用层协议实现 - 数据收发send/recv(lwip)

1、接收数据(recv)2、发送数据(send)

2021-05-29 21:05:59 3270

原创 TCP/IP传输层协议实现 - TCP的保活定时器(lwip)

参考《TCP-IP详解卷 1:协议》"第23章 TCP的保活定时器"

2021-05-29 18:38:51 1076

原创 TCP/IP传输层协议实现 - TCP的坚持定时器(lwip)

(参考《TCP-IP详解卷 1:协议》“第22章 TCP的坚持定时器”)1、糊涂窗口综合症《TCP-IP详解卷 1:协议》"22.3 糊涂窗口综合症"基于窗口的流量控制方案,如TCP所使用的,会导致一种被称为“糊涂窗口综合症SWS(Silly Window Syndrome)”的状况。如果发生这种情况,则少量的数据将通过连接进行交换,而不是满长度的报文段 [Clark 1982]。该现象可发生在两端中的任何一端:接收方可以通告一个小的窗口(而不是一直等到有大的窗口时才通告) ,而发送方也可以发

2021-05-24 22:46:26 869

原创 TCP/IP传输层协议实现 - TCP的超时与重传(lwip)

(参考《TCP-IP详解卷 1:协议》 第21章 TCP的超时与重传)1、往返时间测量(RTT)1.1、分组交换和RTT测量示例《TCP-IP详解卷 1:协议》中分组交换和RTT测量的示例。1.2、lwip RTT测量lwip RTT测量涉及rttest、rtseq、sa、sv变量,rttest为报文发送的时间,,rtseq为测量往返时间报文的序号,sa(rtt average estimator)、sv(rtt deviation estimator)为计算往返时间的变量。记录

2021-05-24 13:40:24 2208

原创 TCP/IP传输层协议实现 - TCP报文接收/发送(lwip)

(tcp的收发与接收窗口/发送窗口/通告窗口关联比较紧密,接收/发送过程在《TCP/IP传输层协议实现 - TCP接收窗口/发送窗口/通告窗口(lwip)》https://blog.csdn.net/arm7star/article/details/117153533都有介绍,本文对收发过程进行更详细一步介绍。)1、滑动窗口1.1、接收窗口(接收滑动窗口)接收窗口是本地可以接收数据的窗口,接收端只接收窗口内的数据,窗口外的丢弃。接收到数据,接收窗口左边沿右移,接收窗口减小。 .

2021-05-23 19:03:38 4561

原创 TCP/IP传输层协议实现 - TCP接收窗口/发送窗口/通告窗口(lwip)

1、tcp通告窗口/接收窗口/发送窗口接收端有一个接收窗口大小,接收端只能接收这么多数据,接收窗口的数据需要被上层接收后才释放更大接收空间,才可以接收更多数据;接收窗口之前的数据已经被接收,再次接收到接收窗口之前的数据可以认为是重复发送的,不处理,接收窗口之后的数据不能接收,超出接收范围直接丢弃。接收端通过tcp首部通告窗口字段告诉对端本地可以可以接收多少数据,用于控制发送端的发送窗口大小。发送端有一个发送窗口,发送窗口大小即为对端通告窗口的大小,只有发送窗口内的tcp报文才可以发送。发送窗口之

2021-05-22 23:59:24 7048

原创 TCP/IP传输层协议实现 - TCP连接的建立与终止(lwip)

1、lwip tcp相关数据结构1.1、tcp报文格式《TCP-IP详解卷 1:协议》TCP包首部结构如下:1.2、lwip tcp数据结构tcp相关数据结构如下,tcp_pcb_listen为服务器的监听tcp链表,各监听的tcp通过next指针连接成一个链表,tcp_pcb为tcp控制块(tcp_pcb_listen监听仅需要端口、ip地址等信息,tcp_pcb为通信过程的tcp控制块,需要包含tcp通信协议的数据等,tcp_pcb包含了tcp_pcb_listen所有的信息,因为监

2021-05-10 08:27:21 3616

原创 TCP/IP网络层ip协议实现(lwip)

1、lwip ip报文输入1.1 ip报文输入lwip线程ethernetif_input从网卡读取数据,根据ethhdr->type判断是否为ip报文,如果是ip报文,调用netif->input即tcpip_input通过邮箱发送数据给tcpip_thread线程处理。static voidethernetif_input(struct netif *netif){ struct ethernetif *ethernetif; struct eth_hdr *eth

2021-04-26 23:14:25 1607

原创 TCP/IP链路层ARP协议实现(lwip)

1、arp报文格式《TCP-IP详解卷 1:协议》P40中的ARP请求/应答报文格式如下所示:局域网链路层通信使用MAC地址,以交换机为例,连在一个交换机上的主机可以作为一个局域网,该网内的主机通过MAC地址通信;主机发数据到交换机时,交换机会记录该主机的MAC地址所在交换机的端口,其他主机发送报文到该主机时,交换机根据记录的MAC地址与端口的映射,找到对应MAC地址所在端口,然后从该端口把报文转发出去(转发到目的主机)。以太网目的地址、以太网源地址即为目的主机、源主机的MAC地址;帧类型表

2021-04-18 21:29:55 932

原创 lwipwin32 lwip介绍 - 定时器实现原理及报文输入

1、arch相关代码介绍lwip是一个跨系统的tcp/ip协议栈实现,lwip只实现了tcp/ip协议栈部分,不同系统的线程创建及线程同步、通信实现有所不同,lwip提供了一个接口,不同的系统需要实现对应的接口即可。函数接口在lwipwin32\lwip\include\lwip\sys.h头文件中声明,使用操作系统时NO_SYS需要定义为0。1.1、定时器相关函数sys_init 定时器初始化sys_timeout 创建超时定时器(添加定时器到当前线程定时器链表)sys_u...

2021-04-18 17:56:21 1136

原创 tcp/ip协议栈之lwipwin32编译运行环境搭建及示例

(https://github.com/arm7star/lwipwin32)1、lwipwin32编译及运行软件WinPcap_4_1_3、Visual Studio 2015、VMWare(虚拟机网卡)。lwipwin32使用VMware Network Adapter VMnet8网卡收发报文。不使用VMWare网卡的话,在Window 10安装openvpn-install-2.4.8-I602-Win10也可,使用openvpn的虚拟网卡。2、VMware Network Adap

2021-04-18 13:52:09 831

原创 NucleusPlus Signal信号机制(基于ARM处理器)

TCT_Build_Signal_Frame

2021-04-18 11:29:26 401

原创 NucleusPlus protection机制(基于ARM处理器)

1、NucleusPlus protection机制NucleusPlus内核对小段代码保护使用TC_PROTECT进行保护,只有在TC_PROTECT操作时才会关中断,因此NucleusPlus内核中断响应及调度相对与μC/OS-III、ThreadX更及时;互斥锁仅用于应用程序(线程间的互斥)。TC_PROTECT包含两个成员,一个记录获取到TC_PROTECT的线程指针tc_tcb_pointer,另外一个标记是否有线程正在等待TC_PROTECT的变量tc_thread_waiting。

2021-04-15 00:08:49 274

原创 NucleusPlus动态内存管理

1、动态内存Memory Pool介绍NucleusPlus动态内存Memory Pool如下图所示,每个Pool有个DM_PCB记录该Pool的内存情况(pool大小,内存块链表,等待内存的线程,空闲内存搜索指针等),NucleusPlus把一块连续内存Memory Pool按块链接在一起,每个空闲内存块的下一个内存(dm_next_memory)执行该内存块末尾的下一个内存地址(例如一个内存块地址为0x0-0x10,那么下一个内存地址为0x11),整个链表是按内存地址链接在一起的,例如block1、

2021-04-14 22:46:28 306

原创 ThreadX驱动编写(基于ARM处理器)

1、参考文档及代码参考《Azure RTOS ThreadX User Guide》"Chapter 5: Device Drivers for ThreadX"ThreadX 6.1.2Versatile/PB代码参考https://github.com/arm7star/ThreadX(未添加驱动)2、驱动框架介绍ThreadX驱动框架比较简单,与linux驱动比较类似,中断服务程序进行简单的中断处理(外设硬件中断处理、清除外设及中断控制器中断,类似linux中断上半部),然后唤..

2021-04-14 19:34:17 1297

原创 ThreadX中断处理(基于ARM处理器)

1、s3c2440定时器初始化定时器用于内核时钟计数,一用于对当前正在运行的任务的时间片进行更新,二用于对内核timer进行计数。定时器初始化函数如下,调用s3c2440_timer_init设置时钟周期,调用unmask_irq允许定时器4中断。void SMDK2440_Timer_Initialize(void){ s3c2440_timer_init(); // initialize timer4 unmask_irq(INT_TIMER4); // unmask

2021-03-06 18:15:54 1732

原创 NucleusPlus中断处理(基于ARM处理器)

NucleusPlus

2020-04-16 23:24:22 411

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除