- 博客(69)
- 收藏
- 关注
原创 实战:动态设备管理与sysfs高级控制——从规则编写到内核通知链
udev自动化:通过规则文件实现“插入即用”,减少手动操作sysfs属性控制:提供更安全的用户态交互接口通知链机制:打破模块间耦合,实现高效状态同步这套方案已在实际工业设备中验证,稳定性显著优于传统字符设备驱动。完整代码示例可通过文末链接获取。实战建议:在树莓派等开发板上测试时,可通过CONFIG_LEDS_GPIO启用内核自带LED驱动作为参考实现。
2025-02-15 15:18:19
287
原创 Linux用户态交互高级技巧:从ioctl到sysfs属性控制
优先选择ioctl:当需要多样化控制命令时(如摄像头设置分辨率、焦距)推荐使用sysfs:暴露设备状态信息(如传感器数据、硬件版本号)保留write/read:仅用于流式数据传输(如字符设备)通过合理搭配这三种方式,可以构建出既安全又高效的驱动交互接口。
2025-02-15 11:30:17
231
原创 深入理解Linux设备模型核心机制:从kobject到热插拔事件
kobject是设备模型的原子单位,管理引用计数和sysfs接口。sysfs通过属性文件实现用户态与内核的高效交互。总线-设备-驱动模型实现了硬件资源的动态管理。理解这些机制,是掌握Linux驱动开发、设备调试的关键一步。下一篇文章将深入探讨如何利用ioctl和sysfs实现更灵活的用户态交互。注:文中代码基于Linux 5.x内核版本。实验环境建议使用QEMU虚拟机(搭配内核选项观察kobject行为)。
2025-02-15 11:11:32
465
原创 Linux 设备驱动分类(快速理解驱动架构)
• Linux 设备驱动的 3 大分类(字符设备、块设备、网络设备)• /dev 目录下的设备文件解析• 设备驱动与文件系统的关系
2025-02-05 14:56:05
1370
原创 为什么要学习 Linux 设备驱动?—— 嵌入式工程师的必经之路
• 什么是设备驱动?• 驱动工程师的就业前景和薪资• 驱动开发 vs. 应用开发的区别• 如何快速入门 Linux 设备驱动?
2025-02-05 14:34:12
611
原创 jetson 裁剪之后从sd卡版本移植到emmc版本
由于sd卡可以放置更大的系统,所以我们先使用sd卡版本的jetson开发应用,开发完应用,发行sd卡版本的jetson板没货了,这TM坑爹玩意儿要转到emmc版本,emmc版本仅支持16GB的,这TM坑爹玩意儿裁剪吧!裁剪过程忽略不谈,这玩意儿根据各家的需求,自行决定裁剪完毕,将之灌装到emmc中。
2023-09-07 09:53:15
442
原创 MYSQL事务原理分析
目录事务是什么ACID特性原子性(A)隔离性(I)持久性(D)一致性(C)隔离级别简介有些什么READ UNCOMMITTED(读未提交)READ COMMITTED(读已提交)REPEATABLE READ(可重复读)SERIALIZABLE实现MVCC锁锁类型锁算法undologredolog并发异常读异常脏读不可重复读幻读死锁加锁顺序事务是什么将数据库从一种一致性状态转换为另一种一致性状态可以是一条语句,也可以是一组语句ACID特性原子性(A)事务操作要么都做(提交),要么都不做(
2022-11-24 22:27:48
462
原创 【Django】python后端的POST与GET请求
目录简介POST与GET协议中的区别使用中的区别开始整理代码先来GET接口再来整理POST接口代码访问本路径的请求参数HttpRequest简介POST与GET超文本协议中总共四种数据交互方式:PUT、DELETE、POST、GET对应数据处理的增、删、改、查PUT、DELETE两种方式此处不做介绍主要说下POST与GET,也就是改、查协议中的区别http报文中标签不一致,一个是POST,一个是GETGET是直接将整个报文发出(这里不考虑MSS MTU这些因素),POST是先发header
2022-04-25 21:27:40
1231
原创 【Django】初入数据库--mysql
目录Django模型架构OMR与数据库的对应关系建立数据库Navicatubuntu在Django中配置数据库Django模型Django可以支持四种数据库(python3.7)PostgreSQLMySQLSQLiteOracle我这边目前只使用mMySql架构Django的模型为数据库提供了提供了统一接口,名为OMROMR与数据库的对应关系Models类 <====> 数据表对象实例 <====> 一条记录属性 <====> 字
2022-04-23 19:27:04
1663
原创 【Django】模板应用
目录模板介绍建立模板模板文件声明模板文件路径编写代码使用模板配置访问路径结果模板介绍上文helloworld中,我们是直接将hello world以文本的方式通过django.http.HttpResponse传到http访问response中,这样我们将视图与数据混合到了一起,并不方便维护代码,所以建议采用模板的方式,将视图与数据分离开来。建立模板模板文件makdir templatesvim templatges/first.html<h1>{{ hello }}</h
2022-04-23 11:31:23
563
原创 【TCP】网络拥塞
目录什么是网络拥塞如何判断如何网络拥塞RTT抖动什么时候认为出现了网络拥塞网络拥塞的解决方案慢启动避免拥塞通知发包方滑动窗口什么是网络拥塞随着网络的发展,网络服务越来越多,热门的网络服务将会面临xxxx好吧,这个有些 扯淡了,一句白话描述:接收端接受的包太多,造成了接受时候网络拥堵,此为网络拥塞如何判断如何网络拥塞RTT计算超时,从TCP的三次握手开始,一次往返数据所用时间我们名之为RTT抖动由于网络环境的突然变化,比如从开阔地进入电梯、地下车库时候网络质量急剧下降,这个时候RTT理论上将
2022-04-21 22:22:59
1593
原创 【Django】第一行代码
目录生成helloworld工程工程文件介绍ASGI与WSGI是什么coding编写视图增加路径运行生成helloworld工程django-admin startproject helloworld工程文件介绍manage.py项目管理脚本helloworld项目路径helloworld/init.py指示改文件夹是个python包helloworld/asgi.pyASGI兼容的web server入口helloworld/settings.pydjango配置文件he
2022-04-20 11:18:20
254
原创 【Django】startup
目录安装生成django项目运行django访问django服务器安装pip3 install django -i http://pypi.douban.com/simple/ --trusted-host=pypi.douban.com/simple生成django项目django-admin startproject testdjango运行djangocd testdjangopython3 mange.py runserver访问django服务器上面有输出http://1
2022-04-20 10:28:29
396
原创 TCP/IP协议
目录协议code头文件TCP/IP协议收发数据协议code头文件#include <stdio.h>#include <sys/poll.h>#include <arpa/inet.h>#define NETMAP_WITH_LIBS#include <net/netmap_user.h>TCP/IP协议struct ethhdr { unsigned char h_dst[ETH_ADDR_LENGTH]; unsigned
2022-04-19 21:14:34
2773
原创 内存泄露了好烦,搞个内存泄漏检测插件试试
目录内存泄漏原因危害解决方案如何知道内存泄漏如何定位哪一行代码引起内存泄漏手动实现工具方案一方案二现有工具介绍内存泄漏原因代码不带垃圾回收机制动态分配(malloc、new)了内存没用释放(free、delete)危害导致某些内存被系统强制回收进程可能被强制killmalloc或者new等动态内存分配失败解决方案如何知道内存泄漏如何定位哪一行代码引起内存泄漏file、func、LINEbuiltin_return_address()addr2line -f -e xxx.
2022-04-18 13:09:28
297
原创 ICMP协议
目录ICMP协议简介协议code头文件ICMP协议收发数据ICMP协议简介这是一个简单的网络收发包比如ping操作就使用该协议它能够确认数据是否可以到达目的地它可能能够得到丢包的原因它是属于IP层的协议协议code头文件#include <stdio.h>#include <unistd.h>#include <string.h>#include <stdlib.h>#include <sys/poll.h>#
2022-04-14 22:22:47
256
原创 ARP协议以及攻击
目录ARP简介ARP是什么ARP攻击ARP协议内容code头文件ARP协议ARP攻击ARP简介ARP是什么ARP(地址解析协议),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址。ARP攻击局域网中的成员需要将网络数据发送出局域网,进入广域网,需要经过网关转发数据,但是一开始并不知道网关是在哪里,那么就需要广播寻找网关现在局域A与B属于同一局域网,A开始寻找网关,向局域网发起广播,B
2022-04-14 22:15:36
2410
原创 网络协议栈
五层协议应用层–>传输层 : 加上TCP(8B) 头传输层–>网络层 : 加上IP(20B)头网络层–>链路层 : 加上以太网(14B)头struct ethhdr { unsigned char h_dst[6]; //MAC addrs unsigned char h_src[6]; //MAC addrs unsigned short h_proto; //协议类型}链路层–>物理层 : 通过网卡做DA转换为模拟信号发送出去物理层:光纤网线中的信
2022-04-14 21:48:39
2984
原创 Nginx(filter)过滤模块开发
目录upstream(转发)模块filter(过滤器)模块handler(前置挡板)模块upstream(转发)模块filter(过滤器)模块模块配置位置选择NGX_HTTP_MAIN_CONF //放置到http的根目录下handler(前置挡板)模块...
2022-03-28 16:51:25
5450
原创 【C++11特性】右值、左值、右值引用、左值引用
目录右值引用与移动语义moveforward判定左值还是右值的方法右值引用与移动语义避免无谓的复制,提高了程序性能避免深拷贝,优化性能&& 可能是右值引用也可可能是左值引用& 也可能是左值左值,是能够被赋值的右值,是临时的movea = MyString("Hello"); // moveMyString b = a; // copyMyString c = std::move(a); // move, 将左值转为右值forward左值变右值不改变值
2022-03-21 15:12:33
987
原创 【C++11特性】智能指针
目录缘起头文件auto_ptr可能造成的问题解决方法shared_ptr存在以下问题:unique_ptrwake_ptr缘起提出该方法目的:很多时候开辟了空间都忘记释放,为了解决该问题,提出了智能指针方案头文件#include auto_ptrauto_ptr <double> pd(new double);C++98中提供方案,C++11已经放弃该方法,当其他方法不能使用时候,那就认命吧。可能造成的问题auto_ptr<string> a(new string
2022-03-21 09:17:07
1384
原创 移植第一个django项目
目录搭建环境安装miniconda安装python3.5方案一方案二安装依赖包安装mysql设置宿主机Navicat允许访问搭建环境git clone https://gitee.com/feiyujun/pyenv.git ~/.pyenvsudo vim /etc/profileexport PYENV_ROOT="/root/.pyenv" #这里需要改成用户电脑的具体地址export PATH="$PYENV_ROOT/bin:$PATH"eval "$(pyenv init -)"
2022-03-17 16:23:54
1417
原创 ubuntu 18.04 iso虚拟机安装
下载 ubuntu18.04下载地址:http://big.xiazaicc.com/bigfile/500/ubuntu-9.10-desktop-i386.iso打开VMware workstation,进入主页,选择创建新的虚拟机选择自定义,一路下一步,直至选择镜像文件。选择刚刚下载的ubuntu 18.04 iso文件下一步,输入用户名密码,此处密码为获取root权限时候需要输入的密码,需要记忆。下一步,此处需要设置该虚拟系统存放路径,以后需要复制虚拟机,只需要复制该路径便可。接下
2022-03-16 20:52:57
2080
原创 Nginx介绍与参数配置conf原理
目录Nginx优势安装指令安装方式源码安装方式操作控制方式启动conf原理配置进程数配置每一个进程对应的连接数链接方式配置路径请求路径资源路径转发路径设置负载均衡Nginx优势C语言架构,可阅读性强文档超级全面开源社区活跃,问题能够得到很快的反应性能高安装指令安装方式apt-get install nginx源码安装方式操作控制方式启动的时候conf文件解析的时候运行时候的接收到请求3.1 http3.2 rtmp3.3 smtp启动下面指令中nginx.co
2022-03-11 15:45:06
4129
原创 EPOLL的实现原理
目录协议栈为什么要在用户态协议栈实现epoll数据结构所有fd的集合:红黑树就绪fd的集合:队列协议栈如何与epoll通信如何对epoll加锁epoll_createepoll_ctlepoll_waitET与LT的区别LTET协议栈首先明确,网络协议栈中,recv与send都是异步执行,所谓的send与recv只是从buffer中读取或者写入buffer,剩余操作将在kernel中执行。epoll代码路径:kernel源码中fs/eventpoll.c为什么要在用户态协议栈实现epolle
2022-03-09 21:51:24
429
原创 UDP可靠性传输协议(QUIC)
UDP与TCP对比可靠性机制ACK机制重传机制ARQ协议的三种模式(1) 即停等式ARQ : 等待ACK, 规定事件内没有收到对面ACK,则重传该帧(2) 回退n帧ARQ : 不等待对面ACK,每个包存在生命周期,生命结束之前没有收到ACK,则回退到该该包重新发包(错误帧之后的包已经发送过,任然需要重新发送)(3) 选择性重传ARQ : 不等待对面ACK,每个包存在生命周期,生命结束之前没有收到ACK,不需要回退到该该包重新发包, 仅需重发该包流控控制控制发送方发送速率,以
2022-02-12 16:49:37
6698
原创 单例模式需要注意的问题点
目录单例模式版本一问题分析版本二问题分析版本三问题分析方案四cpu reorder代码版本五版本六单例模式保证一个类仅有一个实例,并提供一个该实例的全局访问点。版本一class A{ public : static A *GetInstance(){ if(!_instance ) _instance = new A(); return _instance; } private: A(); ~A(); A(const A & a); A&a
2022-02-08 17:10:43
660
原创 内存池的实现原理
内存池实现意义避免频繁开辟空间解决堆空间频繁开辟与关闭的造成的内存碎片。这种碎片会随着程序运行的递进,碎片内存越来越多,导致无法再次malloc而引起的程序崩溃不建议自己实现内存池,使用开源内存池jemalloctcmalloc方案1:使用链表该方案就是开辟空间只开辟,不释放,然后使用链表管理起来。typedef struct memnode { void *addr; uint32_t size; bool flag;//是否被使用 struct memnode *next;
2022-01-25 14:05:49
679
原创 Posix API实现原理(TCP)
Posix APItcp serversocket创建tcbbind作用:绑定ip、port到fd, 不调用的话使用默认值(填充五元组)listen(fd, backlog)backlog: (unix中)半连接+全连接的总数的最大值, 容易收到DDOS攻击: (其他)全连接的最大数, 不会遭受DDOS攻击acceptrecv发现tcb的recv_buffer中存在了数据,再cp过来(TCP协议栈执行)tcb每收到一个包,重置延时定时器,发现有包没有收全,比如收到了包序号1,2,
2022-01-24 16:41:45
1772
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人