- 博客(178)
- 资源 (2)
- 收藏
- 关注
原创 ARM指令集之数据处理指令寻址方式
文章目录数据处理指令寻址方式1. 立即数寻址2. 寄存器寻址3. 寄存器逻辑左移立即数寻址4. 寄存器逻辑左移寄存器寻址5. 寄存器逻辑右移立即数寻址6. 寄存器逻辑右移寄存器寻址7. 寄存器算数右移立即数寻址8. 寄存器算数右移寄存器寻址9. 寄存器循环右移立即数寻址10. 寄存器循环右移寄存器寻址11. 寄存器扩展循环右移寻址所谓的寻址方式,是指当一个指令中的操作数涉及内存访问时,那么指令已什么样的方式来确定内存的地址。ARM的寻址方式分好几类,这篇笔记记录了数据处理类指令的寻址方式。数据处理指令
2020-11-19 02:13:05
1467
原创 ARM指令集之跳转指令
文章目录跳转指令B指令和BL指令长跳转指令ARM中有两种程序跳转方式:跳转指令;向PC写入目标地址值;跳转指令通过跳转指令,可以实现从当前指令向前或者向后32MB的地址空间跳转(一般来讲也足够了,基本上没有需要使用汇编语言写超过32MB程序的场景),总共有4种跳转指令:B:跳转指令;BL:带返回的跳转指令;BLX:带返回和状态切换的跳转指令;BX:带状态切换的跳转指令;带X的指令中的状态切换指的ARM状态和Thumb状态的切换,我们不关注,所以这些指令暂不介绍。B指令和BL指令
2020-11-18 00:36:15
3857
原创 ARM处理器模式与寄存器
文章目录模式寄存器通用寄存器状态寄存器指令集指令条件码模式不同的体系结构所定义的模式是有差异的,不过它们是向后兼容的,下面是ARM920T CPU所支持的处理器模式。模式名称代码描述User(USR)10000大部分应用程序运行时所处的用户模式,也叫非特权模式FIQ10001FIQ异常中断IRQ10010IRQ异常中断Supervisor(SVC)10011管理调用指令被执行或者reset的时候Monitor(MON)10110安全扩展
2020-11-15 21:52:15
843
原创 [linux无线子系统]主动扫描之发送Probe Request帧
文章目录数据结构通用管理帧首部: struct ieee80211_mgmt三地址帧首部: struct ieee80211_hdr_3addr支持速率定义: struct ieee80211_rate支持的band定义: struct ieee80211_supported_band支持的channel定义: struct ieee80211_channelieee80211_scan_state_send_probe()组装帧: ieee80211_build_probe_req()组装IE: ieee
2020-09-21 23:56:41
2793
原创 [linux无线子系统]主动扫描之命令处理
文章目录命令入口nl80211_trigger_scan()struct cfg80211_scan_requestmac80211发起扫描请求: ieee80211_scan()__ieee80211_start_scan()启动软件扫描: ieee80211_start_sw_scan()扫描work: ieee80211_scan_work()小结这篇笔记记录了linux内核无线子系统处理主动扫描命令的过程。命令入口在nl80211中,对主动扫描的netlink命令定义如下:static st
2020-09-05 10:25:03
2849
原创 IP地址管理
IP地址是和主机相关的,但是在linux内核中,IP地址却是配置到网卡的,即struct net_device中,在网络设备结构中,字段ip_ptr和ip6_ptr分别指向该网络设备的IP配置块和IPv6配置块,下面我们只关注IP配置块,ip_ptr指针实际指向的结构是struct in_device对象。struct net_device{... void *ip_ptr; /* IPv...
2020-03-08 11:15:21
1093
原创 邻居子系统之邻居项状态更新
邻居项可取状态如下:名称值描述NUD_NONE0x00邻居项新建后的状态,此时还没有有效的映射信息,如果需要可以启动可达性确认过程NUD_INCOMPLETE0x01邻居地址正在解析时出于该状态,此时正在发送solicitations多播请求NUD_REACHABLE0x02NUD_STALE0x04邻居项有映射地址,但是该地址已经有一段时...
2020-03-01 22:41:31
1768
1
原创 邻居子系统之数据发送流程
邻居子系统只影响数据包的发送过程,为了使系统更加灵活,邻居子系统首先引入了一个协议无关层,L3协议只需要和该协议无关层交互即可,如下图所示。这里面起作用的一个核心数据结构是sturct neigh_ops,每个邻居项都关联一个该结构,L3协议只需要在不同的上下文环境中调用该结构的函数就可以了,具体这些函数指针的实现方是谁,由邻居子系统根据邻居项的状态和各自的逻辑决定。这种设计使得邻居子系统向上...
2020-03-01 12:24:27
633
原创 邻居子系统之概述
邻居协议的管理邻居子系统框架将所有的邻居协议组织成一个链表来维护。// 系统中所有的邻居协议实例组织到该链表中static struct neigh_table *neigh_tables;// 该读写锁只保护neigh_tables的增加和删除,并不保护其中某个邻居协议实例的内容static DEFINE_RWLOCK(neigh_tbl_lock);注册邻居协议:neigh_ta...
2020-03-01 11:20:00
888
原创 邻居子系统之ARP概述
arp_init()void __init arp_init(void){ // 向系统注册arp邻居协议,注册过程中也会对arp_tbl中的邻居子系统公共字段进行初始化 neigh_table_init(&arp_tbl); // 向网络设备接口层注册数据包接收回调,这样当网卡收到arp报文时,将交给本协议处理 dev_add_pack(&arp_packet_typ...
2020-03-01 00:50:58
904
原创 IPv4之分片重组(三)
这篇笔记来看看分片重组功能额外的一些细节实现,包括:IP分片队列的回收;哈希表的重新散列;IP分片队列的回收首先,最正常的情况就是收到了所有的IP分片,然后将其组装成一个完整的IP报文,然后递交给上层。情况最差的,就是在规定的时间内没有收到全部的分片,这时需要有老化机制,使得之前缓存的片段能够被释放,否则对系统是一种负担。重组完成后的IP分片队列回收在ip_frag_reasm()...
2020-02-27 23:12:10
1417
原创 servicemanager之事件处理
在servicemanager之启动过程中,有看到servicemanager在一切准备工作就绪后,就进入binder_loop()开始不停的处理事件,这篇笔记重点分析下这些核心事件时如何处理的。命令解析: binder_parse()首先要解析命令,根据不同的命令进行不同的动作。从下面的代码看,servicemanager支持的命令并不太多。int binder_parse(struct ...
2020-02-16 18:50:58
496
原创 servicemanager的客户端代理: BpServiceManager
servicemanager作为一个守护进程在开机时被启动,此后就可以说servicemanager的服务端已经就绪,其它服务(如MediaService等具体服务)就可以向servicemanager注册自己了,为了实现和servicemanager的交付,在libbinder库中也为servicemanager提供了客户端(即代理部分),相关核心类就是下图中的IServiceManager和B...
2020-02-15 20:07:23
1300
原创 Native空间binder核心类
这篇笔记粗略的介绍下libbinder中,代理端和服务端相关的核心类以及它们之间的继承关系。代理端类继承关系如下(IServiceManager和BpServiceManager是具体的代理端需要实现的类):服务端类继承关系如下(INetd、BnNetd和NetdNativeService是具体的服务端需要实现的类):IInterface无论是代理端还是服务端,描述接口的类都会从IIn...
2020-02-15 19:10:18
972
1
原创 servicemanager之启动过程
相关代码文件如下:代码路径说明frameworks/native/cmds/servicemanager/service_manager.cservicemanager守护进程启动文件frameworks/native/cmds/servicemanager/binder.cservicemanager在实现时,并没有引用libbinder库,所以将一些和binde...
2020-01-21 22:25:02
788
原创 binder驱动之初始化
binder驱动在内核源码树中的如下路径:kernel/drivers/ (不同Linux分支路径略有不同)staging/android/binder.candroid/binder.c模块初始化static int __init binder_init(void){ int ret; // 创建一个工作队列 binder_deferred_workqueue ...
2020-01-19 23:07:53
296
原创 IPv4之分片重组(二)
继上一篇IPv4之接收过程中的分片重组(一),这篇笔记从整体上看linux是如何进行IP片段重组的。在接收路径上的ip_local_deliver()函数中,此时已经确认数据包是给本机的,会首先调用ip_defrag()判断是否是一个完整的IP报文,即是否需要进行重组,如果一切ok,那么继续过防火墙的LOCAL_IN点,继续数据包的接收流程,这里重点看报文重组逻辑:int ip_local_d...
2020-01-05 13:34:37
1006
1
原创 IPv4之分片重组(一)
/* Process an incoming IP datagram fragment. */int ip_defrag(struct sk_buff *skb, u32 user){ struct ipq *qp; struct net *net; IP_INC_STATS_BH(IPSTATS_MIB_REASMREQDS); net = skb->dev ? skb-&...
2020-01-05 13:24:07
2771
3
原创 RFS特性
核心思想RPS的核心思想是将不同流的数据包映射到不同的CPU上进行接收,进而发挥多核的优势。数据包到达L4后会放入接收buffer中等待应用程序读取,如果能够更近一步,接收数据包的CPU和应用程序读取数据的CPU是同一个,那么就可以更好的提高cache命中率,进而能有更高的接收速率,这就是RFS补丁要做的事情。数据结构rps_sock_flow_table首先,引入了一个全局的哈希表来记录...
2020-01-04 11:59:43
1202
原创 RPS特性
数据结构RPS接收队列/* This structure contains an instance of an RX queue. */struct netdev_rx_queue { // 对应/sys/class/net/网卡/queues/rx-xxx/rps_cpus文件 struct rps_map *rps_map; struct kobject kobj; // 因为可...
2020-01-03 00:49:17
2277
原创 IPv4之报文分片
文章目录重要说明分片时机: ip_finish_output()报文分片: ip_fragment()分片是网络层的一个重要任务,IPv4需要对两种IP数据包进行分片:本地产生的数据包;转发的数据包;这两种数据包的长度如果超过了出口设备的MTU(或者PMTU),IPv4就会对数据包进行分片处理,使其适配出口设备的MTU。重要说明IPv4使用ip_fragment()函数执行分片处理,在设计时,要求该函数能够处理所有的情况。在实现过程中,可能高层协议已经为分片进行了一些准备工作,所以代码也充分
2019-12-29 22:42:14
2492
原创 无类流控qdisc之tbf
这篇笔记记录无类排队规则TBF的内核代码实现。/* Simple Token Bucket Filter. ======================================= SOURCE. ------- None. Description. ------------ A data flow obeys TBF with rate R and depth B,...
2019-11-22 00:26:36
2069
1
原创 无类流控qdisc之bfifo和pfifo
这篇笔记分析了内置的bfifo排队规则的实现。排队规则的注册在流量控制机制的初始化过程中,就向内核注册了pfifo和biffo两个排队规则。static int __init pktsched_init(void){ register_qdisc(&pfifo_qdisc_ops); register_qdisc(&bfifo_qdisc_ops);... retu...
2019-11-14 00:39:56
785
原创 流量控制Netlink接口
netlink消息接口注册显然,netlink接口应该支持流量控制中三个组件的增加、删除和查询操作。对排队规则、类的接口注册在pktsched_init()中完成;对过滤器的接口的注册在tc_filter_init()中完成。static int __init pktsched_init(void){ // 注册pfifo和bfifo两种排队规则 register_qdisc(&...
2019-11-08 01:13:56
969
原创 net_device的打开与关闭
前面的笔记分析了net_device的分配和注册流程,在可以进行数据收发之前,还需要打开net_device。对应的net_device不再工作时需要关闭net_device,这篇笔记来分析下这两个流程是如何实现的。
2019-11-03 12:35:56
2170
原创 实验:NAPI模式数据包接收
和实验: 非NAPI模式数据包接收类似,这篇笔记使用vcard虚拟网卡来演示NAPI模式如何和协议栈配合完成数据包的接收,以便加深对这种接收模式的理解。核心思想vcard虚拟网卡使用NAPI模式和协议栈配合完成数据包接收;用户态使用AF_PACKET套接字编程接收来自vcard虚拟网卡的数据;内核态核心代码网络设备的定义需要包含struct napi_struct,所以不能再是简单的...
2019-11-02 23:41:21
505
原创 实验: 非NAPI模式数据包接收方式
这篇笔记对vcard驱动进行改造,使其使用非NAPI模式和协议栈进行数据包的接收,以此来进一步加深对该模式的理解。核心思想使用定时器来模拟数据包的到来,这里假定每隔1s产生一个数据包;用户态使用AF_PACKET协议族套接字直接接收vcard网络设备上的数据包,以此来观察数据包接收情况;驱动核心代码用户态核心代码...
2019-11-01 21:23:17
376
原创 实验: vcard虚拟网络设备生命周期
vcard介绍vcard是一个虚拟网卡,和具体的硬件无关,它没有任何的实际意义,但是通过编写这样一个虚拟网卡,我们可以很好的研究内核中网络设备层的代码逻辑。这篇笔记通过vcard虚拟网卡展示了网络设备的分配、注册、注销和销毁这一完整过程。网络设备的分配...
2019-10-27 16:58:28
410
原创 网络设备: net_device
在linux内核中,struct net_device是对一张网卡的定义,该网卡可能是物理网卡,也可能是虚拟网卡,甚至是对多张物理网卡的组合的抽象。下面是该结构的定义,其定义相当的复杂,其中有很多是特性相关的成员,可以暂时不关注。/* * The DEVICE structure. * Actually, this whole structure is a big mistake. It ...
2019-10-27 00:53:14
3368
原创 策略路由之Netlink接口
在笔记策略路由之初始化中有看到,策略路由在初始化时又向路由套接字注册三个子命令:RTM_NEWRULE、RTM_DELRULE和RTM_GETRULE分别用于策略路由规则的添加、删除和查询。这篇笔记就来看看内核是如何实现这些接口的,从这些接口的实现中也可以进一步理解策略路由规则相关数据结构的含义和组织关系。源代码路径说明net/core/fib_rules.c策略路由非协议...
2019-08-17 00:36:28
1359
3
原创 策略路由之概述
策略路由需要分两块来看:非协议相关和协议相关。内核中可以有多个协议族都可以支持策略路由,这部分共性操作可以抽象出来,这就是非协议相关代码要做的是,各个协议族特有的操作通过一组回调函数来实现。这篇笔记就从初始化过程中看看策略路由的实现和组织结构。源代码路径说明net/core/fib_rules.c策略路由非协议相关实现include/net/fib_rules.h策...
2019-08-11 14:16:32
721
原创 路由数据库之外部事件响应
当网络设备状态发生变化,或者IP地址发生变化时,路由数据库也应该要做出相应的变化,比如删除无效的路由。这篇笔记就来看看路由数据监听了哪些外部事件,以及在各事件发生时做了哪些处理。源代码路径说明net/ipv4/fib_frontend.c路由数据库的初始化和事件响应处理代码实现net/ipv4/fib_semantics.c路由数据库核心操作实现1. 初始化在路由数据库的初始化函数ip_fib_init()中,IPv4项netdevice通知链和inetaddr通知链
2019-08-10 11:42:19
445
原创 IPv4路由数据库之hash方式路由项的添加
文章目录fn_hash_insert()查找路由结点: fib_find_node()查找路由项: fib_find_alias()新建路由区: fn_new_zone()新建路由项信息: fib_create_info()查找路由项信息: fib_find_info()下一跳地址检查: fib_check_nh()总结这篇笔记从路由项的添加过程来加深对路由表组织方式的理解,hash方式路由表的路由添加回调为fn_hash_insert()。涉及的文件有:源代码路径说明include
2019-08-07 01:56:38
2150
原创 IPv4路由数据库之hash方式路由表数据结构
文章目录路由表私有数据对象: fn_hash路由区: fn_zone路由结点: fib_node路由项: fib_alias路由项信息: fib_info下一跳地址: fib_nh之前的笔记介绍过,IPv4路由数据库是支持用不同数据结构组织路由表的,这篇笔记介绍哈希表方式的路由表实现中涉及的数据结构,就是这些数据结构组成了路由表,理解它们之间的组织关系非常重要。涉及的文件有:源代码路径说明include/net/ip_fib.hIPv4路由数据库头文件路由表私有数据对象: f
2019-08-07 01:55:31
4210
原创 IPv4路由数据库之hash方式路由表查询
文章目录数据结构路由查询条件: flowi路由查询结果: fib_result路由查询输入路由查询条件输出路由查询条件路由表查询: fn_hash_lookup()路由项匹配: fib_semantic_match()这篇笔记介绍了哈希方式路由表的查询过程。hash方式路由表的路由查询回调为fn_hash_lookup()。涉及的文件有:源代码路径说明include/net/ip_fib.hIPv4路由数据库头文件core/ipv4/fib_hash.c哈希方式的路由数据库
2019-08-07 01:54:09
4211
原创 IPv4路由数据库之Netlink接口
文章目录命令行数据结构路由消息: rtmsgNetlink消息属性路由项配置: fib_configNetlink消息到fib_config转换: rtm_to_fib_config()添加路由项: inet_rtm_newroute()删除路由项: inet_rtm_delroute()路由项的Dump用户空间程序如ip和netstat等工具都是通过Netlink接口实现对内核空间中路由表的增删改查,route是通过ioctl()系统调用与内核交互的,这篇笔记介绍了较新的Netlink路由配置接口实现。
2019-08-07 01:50:51
2962
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅