- 博客(55)
- 收藏
- 关注
原创 linux-5.10.110内核源码分析 - 写磁盘(从VFS系统调用到I/O调度及AHCI写磁盘)
linux-5.10.110内核源码分析 - block layer从系统调用到调度队列再到scsi、ahci
2025-03-29 15:11:37
684
原创 linux-5.10.110内核源码分析 - bcm2711 SATA驱动(AHCI)
如上图,其中HBA Registers为PCIe设备的BAR空间,配置空间的ABAR用于指示AHCI用于指示HBA Registers在哪个BAR,默认情况下是BAR5,ahci_init_one没有读该寄存器,而是使用默认AHCI_PCI_BAR_STANDARD,内核驱动根据vendor、device处理非标准情况。
2025-03-15 16:42:25
663
原创 linux-5.10.110内核源码分析 - bcm2711 pcie MSI/MSI-x中断
linux-5.10.110内核源码分析 - bcm2711 pcie MSI/MSI-x中断
2025-02-22 16:01:33
1151
原创 linux-5.10.110内核源码分析 - Freescale ls1012a pcie msi中断
ls1012a msi控制器具体介绍可以参考官网手册”25.1.1 PCI Express MSI implementation“,直接注册账号即可下载芯片手册。
2024-07-07 16:08:43
1008
原创 linux-5.10.110内核源码分析 - Freescale ls1012a pcie host驱动
其中reg里面的configuration space [0x4000000000, 0x4000000000+0x2000)为配置空间的cpu地址,所有ep的配置空间的cpu地址都在这段地址空间,都写这段地址具体是操作总线上的那个设备是由pcie控制器的额外的寄存器也区分,也就是访问具体pcie配置空间的时候,需要把bus、device、function信息写入pcie控制器。后面具体代码后看到读写配置设备配置空间的操作。
2024-07-06 09:37:23
1381
1
原创 ThreadX内核源码分析(SMP) - 线程多核映射
整个过程就是先把能占的核先占了,如果被占的核上的线程能移动到空闲核上,那么就移动到空闲核上面去,如果不能,那就递归占能占的核。
2022-07-14 22:23:51
1729
原创 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
2468
原创 ThreadX内核源码分析(SMP) - 核间互斥(arm)
在单核的ThreadX内核中,内核的临界资源互斥通过关中断实现;在多核cpu上,关闭整个cpu的代价比较大,单核上仍然使用关中断实现(其他核的中断仍然开启),但是与其他核之间互斥通过_tx_thread_smp_protection实现: 首先,单核已经关中断,那么正在访问资源的线程不会被切换出去,在退出临界资源之前,当前核上的线程不会被中断,也就是在退出临界资源前当前核不会有其他线程执行,当前核的线程之间是互斥的; 其次,_tx_thread_smp_protection标记了
2022-07-04 23:44:58
1545
原创 ThreadX内核源码分析 - 消息队列
1、消息队列介绍ThreadX内核的消息可以多线程收发,每个消息的大小固定;消息队列有一定的大小,超过大小之后,发送消息的线程需要等待消息被取走才能往消息队列里面再次发送消息。2、消息的接收_tx_queue_receive消息接收主要检查有没有消息,没有消息就要等待消息或者返回消息队列为空的错误码;如果消息队列不为空,并且没有发送消息的线程等待消息队列(消息队列不为空),那么直接从消息队列最前面读消息即可;如果消息队列满了,有线程等待消息队列,那么检查等待消息队列的第一个线程是不是
2022-03-12 22:19:16
1650
原创 ThreadX内核源码分析 - 事件
1、ThreadX内核事件介绍ThreadX事件有点类似epoll,线程可以等待单个事件/多个事件等(epoll一个事件就绪即可返回,ThreadX可以等待多个事件都就绪才返回),从代码实现上看,ThreadX可以多个线程等待同一个事件,获取事件之后还可以不清除事件,epoll在网络编程中,似乎还没看到多个线程对一个事件监听的情况,具体能否多个线程调用epoll监听同一事件还得看linux内核代码实现;ThreadX等待多个事件就绪才返回,这个实现比较实用,在ceph中等待多个worker结束时,通
2022-03-12 19:22:50
2021
原创 ThreadX内核源码分析 - 计数信号量
1、计数信号量介绍计数信号量的信号量值不为0,表示信号量可获取,每次获取信号量,信号量计数器的值减1,为0是,信号量不看获取,释放信号量是每次加1;计数信号量实现与互斥锁类似,一定程度上可以把互斥锁看出计数为1的信号量,只不过互斥锁有动态优先级调整,信号量没有,互斥锁用于临界资源保护,信号量用于生产消费者这类场景(多个消费者、多个生产者)。2、信号量获取_tx_semaphore_get获取信号量的代码比较简单,主要是对计数信号量的计数进行判断,如果信号量计数器不为0,就减1然后返回(获
2022-03-12 14:40:22
857
原创 ThreadX内核源码分析 - 线程同步之互斥锁及动态优先级
1、ThreadX互斥锁介绍互斥锁一般用来锁多线程都需要访问的临界资源,这些资源不能并发操作,例如对某个内存的互斥读写,这个读写很快,但是不能多线程同时进行,所以需要加互斥锁;占用互斥锁的线程没能执行,可能是被高优先级线程抢占了或者临界资源里面调用了阻塞操作;高优先级线程想要访问临界资源就必须等待低优先级线程被调度然后释放互斥锁,如果低优先级线程不提高优先级不被执行的话,那么高优先级的线程就会阻塞,直到所有高优先级线程都阻塞了,才能轮到占用互斥锁的低优先级线程执行,这样高优先级线程就得不到及时处理,
2022-03-12 13:24:11
2092
原创 ThreadX内核源码分析 - 动态内存管理
ThreadX内核与μC/OS-II、NucleusPlus内核一样,都支持固定大小的内存块管理,也支持不固定大小的内存块管理。固定大小的内存块管理是把一片内存分割成大小相同的多个内存块,以整块内存分配和释放,例如内存块大小为1024字节,那么每次只能申请释放1024字节的内存,一般只适合大小固定的内存块申请释放场景,类似linux的2的n次方的内存页申请,mmu只能管理页,不能把页分成更小的内存管理,因此要分配小的内存前,先按页分配,再在分配的页里面按byte分配内存。
2022-02-19 22:45:02
1610
原创 ThreadX内核源码分析 - 优先级及抢占阈值抢占(arm)
1、抢占阈值thresholdThreadX实时系统内核除了按时间片调度外,还有优先级调度,高优先级线程抢占低优先级线程,另外与其他嵌入式实时系统一个比较明显的差异是,ThreadX支持低优先级线程抢占高优先级线程,通过抢占阈值threshold实现低优先级线程抢占高优先级线程;抢占阈值threshold只有在启用抢占线程正在执行的时候被切换出去的时候才有作用,也就是新创建的启用了抢占的线程就绪时,即使新创建线程的抢占阈值threshold高于正在运行的线程优先级,线程只会添加到同优先级就绪线程链表
2022-02-19 14:58:23
2410
原创 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
2571
原创 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
2182
原创 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
2260
1
原创 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
1127
1
原创 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
3555
1
原创 TCP/IP传输层协议实现 - TCP报文接收/发送(lwip)
(tcp的收发与接收窗口/发送窗口/通告窗口关联比较紧密,接收/发送过程在《TCP/IP传输层协议实现 - TCP接收窗口/发送窗口/通告窗口(lwip)》https://blog.youkuaiyun.com/arm7star/article/details/117153533都有介绍,本文对收发过程进行更详细一步介绍。)1、滑动窗口1.1、接收窗口(接收滑动窗口)接收窗口是本地可以接收数据的窗口,接收端只接收窗口内的数据,窗口外的丢弃。接收到数据,接收窗口左边沿右移,接收窗口减小。 .
2021-05-23 19:03:38
6631
1
原创 TCP/IP传输层协议实现 - TCP接收窗口/发送窗口/通告窗口(lwip)
1、tcp通告窗口/接收窗口/发送窗口接收端有一个接收窗口大小,接收端只能接收这么多数据,接收窗口的数据需要被上层接收后才释放更大接收空间,才可以接收更多数据;接收窗口之前的数据已经被接收,再次接收到接收窗口之前的数据可以认为是重复发送的,不处理,接收窗口之后的数据不能接收,超出接收范围直接丢弃。接收端通过tcp首部通告窗口字段告诉对端本地可以可以接收多少数据,用于控制发送端的发送窗口大小。发送端有一个发送窗口,发送窗口大小即为对端通告窗口的大小,只有发送窗口内的tcp报文才可以发送。发送窗口之
2021-05-22 23:59:24
10409
1
原创 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
4602
1
原创 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
2587
1
原创 TCP/IP链路层ARP协议实现(lwip)
1、arp报文格式《TCP-IP详解卷 1:协议》P40中的ARP请求/应答报文格式如下所示:局域网链路层通信使用MAC地址,以交换机为例,连在一个交换机上的主机可以作为一个局域网,该网内的主机通过MAC地址通信;主机发数据到交换机时,交换机会记录该主机的MAC地址所在交换机的端口,其他主机发送报文到该主机时,交换机根据记录的MAC地址与端口的映射,找到对应MAC地址所在端口,然后从该端口把报文转发出去(转发到目的主机)。以太网目的地址、以太网源地址即为目的主机、源主机的MAC地址;帧类型表
2021-04-18 21:29:55
1339
原创 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
1899
1
原创 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
1221
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人