自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

九天小哥的专栏

天道酬勤

  • 博客(170)
  • 资源 (2)
  • 收藏
  • 关注

原创 GCC链接脚本语法

在操作系统之上编程时我们是不需要关注这部分内容的,因为按照ld默认的行为链接即可,然后所有的事情都交给作系统处理完成。但是在嵌入式开发过程中,特别是移植Bootloader和内核的时候,链接脚本就显得格外的重要了。因为这个时候程序的运行环境都是裸机环境,没有任何的内存管理功能,代码操作的是物理地址,所以就要求我们对程序二进制镜像在链接和运行时的内存布局进行理安排。下面介绍的链接脚本就是干这件事的。详细的链接脚本语法可以参考官方文档《Using as》。链接脚本格式首先,链接脚本就是文本文件。其中

2022-04-17 19:49:54 1353

原创 GCC内嵌汇编

这篇笔记录的内容来自GCC手册中关于内嵌汇编的说明。通过asm关键字,可以实现在C/C++代码中插入汇编代码,GCC提供了两种格式的内嵌汇编代码:1)基本asm汇编(无操作数);2)扩展asm汇编(有一个或多个操作数)。推荐使用扩展asm汇编,但也有些场景是必须使用基本asm汇编来完成。基本asm汇编基本asm汇编语法如下:asm [ volatile ] ( AssemblerInstructions )asm是GNU扩展的关键字,如果可以使用__asm__(对编译选项有要求),那么

2022-04-17 19:32:54 1416

原创 ARM的异常处理机制

目录异常种类异常中断向量表异常处理进入部分复位异常未定义指令异常SWI软件中断指令预取中止异常中断数据访问中止异常中断IRQ异常FIQ异常离开部分SWI软件中断未定义指令异常中断IRQ和FIR异常中断指令预取中止异常数据访问中止异常异常种类ARM共有如下7种异常模式:复位(RESET):当处理器复位引脚有效时,系统产生复位异常中断。复位异常中断通常在系统加电和系统复位时发生,直接跳转到复位中断向量处执行称为软复位。 未定义的指

2022-04-01 21:12:28 2313

原创 Generic Netlink机制

文章目录数据结构genl_familygenl_ops多播组: genl_multicast_groupGeneric Netlink框架Generic Netlink消息消息头部消息API消息的封装消息的解析消息的发送协议初始化family的管理family的注册&去注册family操作集的注册&去注册控制familyfamily查询命令: ctrl_getfamily()消息接收: genl_rcv()genl_rcv_msg()Generic Netlink组播多播组的注册&去

2022-03-27 13:11:55 820

原创 Netlink协议族核心操作

文章目录数据结构传输控制块: netlink_sock套接字操作集: netlink_ops协议族地址: sockaddr_nl创建: netlink_create()__netlink_create()绑定: netlink_bind()netlink_autobind()netlink_insert()连接: netlink_connect()消息发送: netlink_sendmsg()单播发送: netlink_unicast()单播发送给内核: netlink_unicast_kernel()单播

2022-03-26 23:14:37 1149

原创 Netlink协议族

文章目录数据结构协议对象: netlink_table协议族初始化Netlink协议管理Netlink协议注册: netlink_kernel_create()Netlink消息消息头消息整体格式相关API消息payload格式相关API消息属性格式相关API内核其它消息API消息的构造消息的解析消息的发送消息属性相关API用户态消息宏这篇笔记记录了Netlink协议族的初始化,并对Netlink消息格式及对应的内核态API进行了详细解释。Netlink用户态编程麻烦的一点是用户态对Neltink消息的处

2022-03-26 23:13:57 1379

原创 Netlink组播机制

文章目录数据结构协议对象: netlink_table传输控制块: netlink_sock组播发送控制信息: netlink_broadcast_data协议注册时套接字绑定时netlink_realloc_groups()更新签约信息: netlink_update_subscriptions()更新监听信息: netlink_update_listeners()套接字连接时套接字发送时do_one_broadcast()小结数据结构下面仅罗列了和组播机制相关的数据结构及其字段。协议对象: net

2022-03-26 23:12:05 1851

原创 linux网络校验和计算API

文章目录校验和算法IP首部校验和计算APIip_compute_csum()ip_fast_csum()ip_send_check()ip_decrease_ttl()通用校验和计算APIskb_checksum()csum_fold()csum_partial系列csum_block_add/sub()csum_add/sub()skb_checksum_help()csum_tcpudp_magic()校验和算法发送方先把校验和字段置为0,然后对参与校验的数据每16bit进行二进制反码求和,然后将结

2021-12-18 14:06:37 861

原创 套接字缓存区sk_buff

文章目录数据结构缓存区: sk_buffskb指针: sk_buff_data_t协议头指针缓存区队列: sk_buff_headskb共享信息: skb_shared_info片段: skb_frag_t数据组织格式关于数据长度skb的分配alloc_skb()dev_alloc_skb()skb的释放skb_release_all()skb_release_head_state()skb_release_data()数据预留和对齐skb_reserve()skb_push()skb_put()skb_p

2021-12-15 02:03:50 1224

原创 邻居子系统之代理功能

文章目录代理条件通用代理机制延时处理请求代理请求入队列: pneigh_enqueue()代理请求处理定时器: neigh_proxy_process()代理类型目的地址代理配置项: pneigh_entry目低地址代理配置项查询: pneigh_lookup()ARP代理arp_process()arp代理启用条件: arp_fwd_proxy()邻居子系统支持代理功能,即主机在收到一个目的地址查询不属于自己地址的ARP请求时,可以代替真正的主机做出响应,这就是邻居代理。代理条件当然,主机不能对任何

2021-11-29 22:17:00 1556 1

原创 邻居子系统之邻居项的回收

文章目录邻居项的销毁: neigh_destroy()垃圾回收同步清理异步清理邻居项的刷新L3地址变化: neigh_ifdown()L2地址变化: neigh_changeaddr()neigh_flush_dev()邻居项删除涉及邻居子系统的垃圾回收机制,所以这里单独分析其代码实现。邻居项删除主要有如下三个原因:邻居子系统感知到该邻居项不可达,将邻居项状态设置成了NUD_FAILED,这种邻居项会有异步垃圾回收机制回收;该邻居项关联的L2地址发生了变化,但是它L3地址不变,这种邻居项需要先进入

2021-11-29 22:15:33 335

原创 邻居子系统之Netlink接口

文章目录数据结构邻居项Netlink命令消息: ndmsg命令行添加邻居项: neigh_add()删除邻居项: neigh_delete()设置邻居协议参数: neightbl_set()在邻居子系统框架的系统初始化函数neigh_init()中,有看到其向RtNetlink注册了几个事件用于配置邻居项,这篇笔记分析下邻居项的配置过程。数据结构邻居项Netlink命令消息: ndmsgstruct ndmsg{ __u8 ndm_family; __u8 ndm_pad1; __u16

2021-11-29 22:13:15 413

原创 入口流量控制

文章目录handle_ing()入口数据包过滤: ing_filter()接收方向qdisc: ingress_qdiscingress_qdisc私有数据结构: ingress_qdisc_data入队: ingress_enqueue()在驱动将数据包递交给协议栈的最后一步netif_receive_skb()函数中,有这个宏CONFIG_NET_CLS_ACT控制的相关逻辑是入口流量控制。handle_ing()static inline struct sk_buff *handle_ing(s

2021-11-06 13:38:24 152

原创 u32过滤器

文章目录命令行说明示例数据结构match参数: tc_u32_key/tc_u32_sel命令行参数解析: u32_parse_opt()内核态实现数据结构tc_u_commonfilter对象: tc_u_hnodematch信息: tc_u_knodeu32 filter操作集: cls_u32_ops初始化: u32_init()获取filter对象/match对象: u32_get()修改参数: u32_change()分类: u32_classify()u32是最通用的一个数据包filter,它

2021-11-06 13:37:42 543

原创 分类流控qdisc之htb

文章目录tc参数配置示例算法思想用户态实现数据结构htb全局配置参数: tc_htb_globhtb类配置参数: tc_htb_optqdisc配置参数解析: htb_parse_opt()class配置参数解析: htb_parse_copt()内核实现数据结构qdisc操作集私有数据: htb_schedhtb类结构: htb_classqdisc操作集: htb_qdisc_ops初始化: htb_init()qdisc类操作集: htb_class_opschange()回调: htb_change

2021-11-06 13:36:49 896

原创 流量控制机制概述

文章目录数据结构qdiscqdisc句柄qdisc对象: Qdiscqdisc操作集: Qdisc_opsqdisc类操作集: Qdisc_class_ops注册qdisc: register_qdisc()classclass的IDclass哈希表: Qdisc_class_hashclass哈希表的分配和初始化: qdisc_class_hash_init()class公共信息: Qdisc_class_commonfilterfilter对象: tcf_protofilter操作集: tcf_prot

2021-11-06 13:32:56 897

原创 设备接口层NetPoll机制

文章目录数据结构NetPoll对象: netpollNetPoll信息: netpoll_info模块初始化: netpoll_init()注册NetPoll对象: netpoll_setup()发送数据: netpoll_send_udp()netpoll_send_skb()延时发送任务: queue_process()接收数据netpoll_poll()poll_napi()netpoll_rx()__netpoll_rx()NetPoll是设备接口层基于NAPI模式提供的一种纯粹的轮询接收数据包机

2021-10-20 15:38:22 389

原创 设备接口层初始化

文章目录数据结构网络命名空间net系统开机初始化: net_dev_init()网络命名空间级别初始化: netdev_init()数据结构网络命名空间netstruct net {... struct list_head dev_base_head; struct hlist_head *dev_name_head; struct hlist_head *dev_index_head;...};设备接口层在net结构中保存了三个链表用来维护系统中所有注册的网络设备对象:dev

2021-10-14 17:45:18 102

原创 CAN核心RAW协议

文章目录数据结构sock对象raw_sockPF_CAN协议族地址: sockaddr_can初始化raw_sock初始化: raw_init()socket接口实现绑定: raw_bind()使能过滤器: raw_enable_allfilters()设置socket选项: raw_setsockopt()发送数据: raw_sendmsg()接收数据: raw_recvmsg()raw_rcv()数据结构sock对象raw_sockstruct can_frame { canid_t ca

2021-10-12 21:11:41 1050

原创 CAN核心初始化流程

文章目录初始化PF_CAN接口socket创建接口: can_create()协议注册: can_proto_register()初始化static __init int can_init(void){ printk(banner); // 创建接收者高速缓存 rcv_cache = kmem_cache_create("can_receiver", sizeof(struct receiver), 0, 0, NULL); if (!rcv_cache)

2021-10-12 16:40:47 708

原创 CAN核心帧收发流程

文章目录数据结构CAN数据接收链表dev_rcv_listsCAN数据接收者receiver接收流程接收者列表维护CAN核心收到数据can_rcv()CAN核心分发接收数据: can_rcv_filter()发送流程数据结构CAN数据接收链表dev_rcv_listsCAN核心为每个CAN类型网络设备都关联一个该链表对象(表头为can_rx_dev_list),用于保存所有对该CAN网络设备数据感兴趣的接收者。enum { RX_ERR, RX_ALL, RX_FIL, RX_INV, RX_EFF

2021-10-11 20:40:27 566

原创 libnl资料

开发指导:http://www.infradead.org/~tgr/libnl/doc/core.html#_introductionAPI手册:http://www.infradead.org/~tgr/libnl/doc/api/index.html

2021-07-03 00:11:21 114

原创 Python模块学习之unittest

文章目录概述测试用例测试夹具断言测试套件添加测试用例测试用例加载器测试执行者用例执行结果其它主题总结这篇笔记记录了Python内建模块unittest的知识点,所记录的内容均来自unittest的官方文档。概述unittest是Python标准库中的一个模块,使用它可以对Python代码进行单元测试,它支持如下特性:测试自动化;共享测试夹具(即测试用例的setUp()和tearDown()代码);将测试用例组织成集合;测试用例和测试报告框架之间相独立;为了支持上述特性,unittest实

2020-12-20 23:51:53 222 1

原创 ARM指令集之伪指令

文章目录

2020-12-20 14:10:29 895 1

原创 ARM指令集之杂类指令

文章目录状态寄存器访问指令MRSMSR信号量操作指令SWP字交换指令SWPB字节交换指令异常中断产生指令SWI软中断指令BKPT断点中断指令这篇笔记记录了如下几类ARM指令:状态寄存器访问指令;信号量操作指令;异常中断产生指令;状态寄存器访问指令ARM提供了两条指令用于在状态寄存器和通用寄存器直接交换数据。MRS:Move Register <-- State,将状态寄存器的值传送到通用寄存器中;MSR:Move State <-- Register,将通用寄存器的值传送的

2020-12-19 23:50:58 260 2

原创 ARM指令集之批量Load/Store指令

2020-12-16 22:30:44 1157

原创 ARM指令集之Load/Store访存指令(二)

文章目录寻址方式LDRH(半字数据读取指令)STRH(半字数据写入指令)LDRSB(有符号字节数据读取指令)LDRSH(有符号半字数据读取指令)这篇笔记记录了第二类Load/Store指令,即操作数为16位半字和有符号字节数据的Load/Store指令。助记符说明LDRH半字数据读取指令STRH半字数据写入指令LDRSB有符号字节数据读取指令LDRSH有符号半字数据读取指令寻址方式这类指令拥有一致的寻址方式,具体介绍见这里。语法说明

2020-12-16 21:54:32 686

原创 ARM指令集之Load/Store指令寻址方式(二)

文章目录

2020-12-16 21:31:36 426

原创 ARM指令集之Load/Store访存指令(一)

文章目录

2020-12-15 23:44:38 3079

原创 ARM指令集之Load/Store指令寻址方式(一)

文章目录语法格式寻址方式立即数偏移量寻址寄存器偏移量寻址寄存器移位偏移量寻址这篇笔记记录的是操作32位子类型和无符号字节数据的Load/Store指令所使用的寻址方式。所有类型的Load/Store指令的寻址方式都是由基址加偏移量组成的,基址用任意的通用寄存器指定,偏移量的指定方式有如下三种:立即数;寄存器;寄存器和一个移位常数;寻址方式的计算又有如下三种方式:偏移量方法;事先更新方法;事后更新方法;.注意:上述内容适用于所有类型的Load/Store指令。语法格式操作32位

2020-12-10 00:05:38 1547

原创 ARM指令集之乘法指令

文章目录

2020-12-06 23:55:46 1855

原创 ARM指令集之数据处理类指令

文章目录数据处理指令1. MOV传送指令2. MVN传送指令3. ADD加法指令4. ADC带进位加法指令5. SUB减法指令6. SBC带位减法指令7. RSB逆向减法指令8. RSC带位逆向减法指令数据处理指令常见的数据处理指令如下表所示,它们支持相同的寻址方式,详情可见笔记。助记符说明实现逻辑MOV数据传送Rd = Rn(Rn可能需要运算)MVN数据取反传送Rd = ~Rn(Rn可能需要运算)ADD加Rd = Rn + op2ADC带进位加

2020-11-26 00:08:31 529

原创 ARM指令集之数据处理指令寻址方式

文章目录数据处理指令寻址方式1. 立即数寻址2. 寄存器寻址3. 寄存器逻辑左移立即数寻址4. 寄存器逻辑左移寄存器寻址5. 寄存器逻辑右移立即数寻址6. 寄存器逻辑右移寄存器寻址7. 寄存器算数右移立即数寻址8. 寄存器算数右移寄存器寻址9. 寄存器循环右移立即数寻址10. 寄存器循环右移寄存器寻址11. 寄存器扩展循环右移寻址所谓的寻址方式,是指当一个指令中的操作数涉及内存访问时,那么指令已什么样的方式来确定内存的地址。ARM的寻址方式分好几类,这篇笔记记录了数据处理类指令的寻址方式。数据处理指令

2020-11-19 02:13:05 661

原创 ARM指令集之跳转指令

文章目录跳转指令B指令和BL指令长跳转指令ARM中有两种程序跳转方式:跳转指令;向PC写入目标地址值;跳转指令通过跳转指令,可以实现从当前指令向前或者向后32MB的地址空间跳转(一般来讲也足够了,基本上没有需要使用汇编语言写超过32MB程序的场景),总共有4种跳转指令:B:跳转指令;BL:带返回的跳转指令;BLX:带返回和状态切换的跳转指令;BX:带状态切换的跳转指令;带X的指令中的状态切换指的ARM状态和Thumb状态的切换,我们不关注,所以这些指令暂不介绍。B指令和BL指令

2020-11-18 00:36:15 2504

原创 ARM处理器模式与寄存器

文章目录模式寄存器通用寄存器状态寄存器指令集指令条件码模式不同的体系结构所定义的模式是有差异的,不过它们是向后兼容的,下面是ARM920T CPU所支持的处理器模式。模式名称代码描述User(USR)10000大部分应用程序运行时所处的用户模式,也叫非特权模式FIQ10001FIQ异常中断IRQ10010IRQ异常中断Supervisor(SVC)10011管理调用指令被执行或者reset的时候Monitor(MON)10110安全扩展

2020-11-15 21:52:15 480

原创 [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 1881

原创 [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 1719

原创 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 683

原创 邻居子系统之ARP协议数据处理过程

ARP协议报文格式

2020-03-05 00:18:30 154

原创 邻居子系统之邻居项状态更新

邻居项可取状态如下:名称值描述NUD_NONE0x00邻居项新建后的状态,此时还没有有效的映射信息,如果需要可以启动可达性确认过程NUD_INCOMPLETE0x01邻居地址正在解析时出于该状态,此时正在发送solicitations多播请求NUD_REACHABLE0x02NUD_STALE0x04邻居项有映射地址,但是该地址已经有一段时...

2020-03-01 22:41:31 847 1

实验代码: vcard.rar

和https://blog.csdn.net/fanxiaoyu321/article/details/102768690配合的源码

2019-10-27

linux内核完全剖析

力顶呀,非常好,耐着性子看完一定会功力大增

2013-04-21

空空如也

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

TA关注的人

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