自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(419)
  • 资源 (7)
  • 收藏
  • 关注

原创 RS触发器

虽然当 R=1,S=1 时 RS触发器 的电路也能达到一个稳定状态,但是在设计 RS触发器 的时候,就已经规定了 Q和`Q 必须是反相的,基于 RS触发器 的其他应用也默认 Q和`Q 是反相进行设计。此时我们把 S 端 的脚和高电平断开(此时悬空了),由于 Q 反馈到N2(Q=1),所以 S 端断开后 N2 仍就输出 0,整个RS触发器输出保持不变。还有一种情况就是当 R=1、S=1 近乎同时跳变到 R=0、S=0 时。当 R=0,S=1 时,表示 Set 激活了,那么 Q = Set = 1。

2024-01-12 21:14:23 561

原创 UC3842的内部结构和工作原理

但是,在一些应用情况中,逐个脉冲限流功能并不能提供可靠的过流保护,这是因为为了滤除开关管开通瞬间的尖峰电流,防止开关管误触发而关断,电流测量信号使用RC滤波或前沿消隐时间(Leading Edge Blanking LEB),开关管开通瞬间的这段时间内,系统对检测电流信号不做响应,过了这一段时间,系统才处理电流检测信号,这样,在输出电流非常大时,每个开关周期,控制器都会让开关管导通最小的这一段时间,然后过流保护关断开关管,系统连续工作在最小脉冲宽度状态,电感会逐渐饱和,电感电流走飞,从而导致系统失效。

2024-01-12 21:10:14 1478

原创 dirty file page

0.前言Linux 内核Page Cache 和Buffer Cache 关系及演化历史 一文中讲过Linux 2.4之后将Page Cache和Buffer Cache 进行了融合,在buffer_head 中添加了b_page,很容易就能找到缓存的Page Cache,而buffer_head 的存在就是能够快速确定页中的一个块在磁盘中的地址。

2024-01-12 21:03:03 927

原创 v4l2_subdev_init_finalize

***/#define})intstate =return 0;int ret;if (!state)if (!if (!goto err;ret =sdpadinit_cfg, state);goto err;err:

2023-08-27 17:58:23 161

原创 phy_mipi_dphy_get_default_config

**/if (!cfg)/**/return 0;

2023-08-27 17:54:58 371

原创 of_node_init

endifnode->fwnode.ops = &;= {structfwnode;#endif#endif。

2023-08-27 17:48:40 158

原创 min_free_kbytes

上图基本揭示了几个水位的含义,当 MemFree 低于 watermarklow 时,kswapd 进行内存回收,直到空闲内存达到 watermarkhigh 后停止回收。如果申请内存的速度太快,导致空闲内存降至 watermarkmin 后,内核就会进行 direct reclaim(直接回收),用回收上来的空闲页满足内存申请,这样会阻塞应用程序。可用内存至少 8G,不达标就无法安装。为了凑这3台10G内存的服务器我已经费了不少劲了,free -m 输出中 free 不是有 9G 吗,为什么还报错?

2023-07-25 21:39:01 343

原创 send_sig

intsend_sigreturn/**/int/**/if (!returnintret =return ret;static int*/force =!*/*/if (!returnstatic intif (!goto ret;/**/goto ret;/**/

2023-07-20 12:35:08 76

原创 UDP-组播,广播

UDP是面向非连接的协议,它不与对方建立连接,而是直接把数据报发给对方。UDP无需建立类如三次握手的连接,使得通信效率很高。因此UDP适用于一次传输数据量很少、对可靠性要求不高的或对实时性要求高的应用场景。

2023-07-19 14:11:28 238

原创 获取网络包的硬件时间戳

在发送完或接收完报文后,时间戳被记录到一个 cmsg_level为SOL_SOCKET, cmsg_type 为SCM_TIMESTAMPING, data为 struct scm_timestamping 的一个control message中。为了验证获取的时间戳的正确性,我们使用两块飞灵科技的TSync时钟同步开发板作为报文的发送端和接收端,并分别在两个板子上捕获发送和接收的硬件时间戳。从发送端和接收端的log可以看到, 报文的接收时间戳和发送时间戳之差,就是路由器的链路延时。

2023-07-17 22:28:54 959 1

原创 do_notify_resume

**/do {schedule();} else {();/**/void(void)/**/if (!return;();bl#endif/*

2023-07-15 15:24:02 295

原创 dma_alloc_wc

returnvoid *cpu_addr =elsevoid *if (!return。

2023-07-14 22:00:59 515

原创 kmalloc

***/kmalloc#endifreturnif (!index)#endifget_order(size);return/*** ...*/get_orderif (!size)return 0;size--;#else。

2023-07-14 21:35:13 265

原创 phy_polling_mode

if (!dev);;don't*/int i;for (i = 1;i++) {continue;if (ret)break;} else {if (ret) {return dev;/***/voidbreak;break;

2023-07-12 17:05:48 160

原创 nanosleep

nanosleepif (!returnlongu64 slack;slack = 0;ret =(&t, mode);if (ret!goto out;goto out;out:return ret;void/** expiry.*/;if (task)(task);

2023-07-11 18:31:26 174

原创 Linux信号机制-3

信号很早就在 unix 系统中出现了,它用于用户进程之间的交互,几十年以来,变化都不大。信号是一个发送给进程或者进程组的消息,它只是一个数字,没有参数或者其他辅助的信息。以 SIG 为前缀的宏定义表示着这些不同的信号数字。信号的最大特点是它是异步的,也就是在进程执行的任意时刻信号都可能产生,此时进程的状态是不可知的。发送给进程的信号如果没有被执行,就会由内核将它保存起来,直到进程被唤醒开始执行。如果某个信号被进程配置为屏蔽,那么这个信号就会一直被挂起而不会被触发,直到它被 unblock。

2023-07-11 17:12:15 345

原创 do_signal

** mistake.*/do_signal/* Whee!if (r0)} else {if (r0) {break;caseregs->r0 =;break;voiddo {schedule();} else {do_signalr0 = 0;} else {/***/

2023-07-11 13:08:17 106

原创 Linux信号机制-2

send_signal() 首先调用 kmem_cache_alloc() 函数来申请一个类型为 struct sigqueue 的队列节点,然后把节点添加到 pending 队列中,接着根据参数 info 的值来进行不同的操作,最后通过 sigaddset() 函数来设置信号对应的标志位,表示进程接收到该信号。事实上,进程也不知道信号到底什么时候到达。sys_kill() 的代码比较简单,首先初始化 info 变量的成员,接着调用 kill_something_info() 函数来处理发送信号的操作。

2023-07-11 12:26:48 150

原创 Linux进程调度

转自:深入理解Linux进程调度(0.4)_进程调度 城_城中之城的博客-CSDN博客一、进程调度概览进程调度是操作系统最重要的内容之一,也是学习操作系统的重点和难点。关于进程本身的实现和管理请参看《深入理解Linux进程管理》。关于进程调度,我们首先就会问出一些问题,什么是进程调度,为什么要进程调度,如何进行调度。下面我们用一幅图把这些问题关联起来: 在这里插入图片描述这张图把进程调度的所有问题和知识点都关联了起来,本文后面所有的内容都是对这张图的解释和扩展延伸,下面让我们来一一讲解。1.1 什么是调度

2023-07-08 23:09:24 1105

原创 Linux时间子系统

转自:深入理解Linux时间子系统(0.7)_城中之城的博客-CSDN博客一、时间概念解析我们住在空间里,活在时间中。时间对我们来说是既熟悉又陌生。熟悉是因为我们每天都在时间的驱动下忙碌着,陌生是因为我们从来没有停下来认真思考过时间是什么。今天我们先从对时间的使用需求开始说起。1.1 时间使用的需求我们对使用时间有三种需求:知时、定时和计时。知时就是我们需要知道现在的时间是多少,表达方式是时分秒、年月日。定时是我们需要在某个时间点被告知,时间点可以是相对的或者绝对的,告知可以是一次性的或者是周期性的,比如每

2023-07-08 22:35:57 1208

原创 Linux信号机制

转自:深入理解Linux时间子系统(0.7)_城中之城的博客-CSDN博客一、信号机制概览相信大家对信号并不陌生,很多人都用过kill命令或者Ctrl+C组合键杀死过进程,或者遇到过程序因为收到SIGSEGV信号而崩溃的。而对信号的基本原理,估计很多人都不太了解,今天我们就来详细讲解一下。1.1 信号基本原理信号机制是UNIX系统最古老的机制之一,它不仅是内核处理程序在运行时发生错误的方式,还是终端管理进程的方式,并且还是一种进程间通信机制。信号机制由三部分构成,首先是信号是怎么产生的,或者说是谁发送的,然

2023-07-08 22:01:14 1319

原创 __pthread_mutex_lock_full

static intint oldval;while (1)oldvalbreak;= 0)#else#endifnewvalif (newval!= oldval)continue;#endifNULL);NULL);return 0;

2023-07-06 17:11:44 417

原创 makefile-2

工作作用,将头文件放在include文件夹,cpp文件放在source文件夹,test.cc为可执行文件。方式一:$(shell shell_command)打印用info,Makefile提供了三个命令。结果输出当前工作目录:home/sc/test。三、简提Makefile中打印日志信息。表示比目标还要新的依赖文件列表。Makefile中,格式为这样的。一、理解$@、$^、$<的含义。$^ 表示所有的依赖文件。$< 表示第一个依赖文件。Makefile文件为。目标:需要依赖的条件。

2023-07-06 13:37:05 107

原创 malloc原理

事实是这样的,_edata + 30K 只是完成虚拟地址的分配,A 这块内存现在还是没有物理页与之对应的,等到进程第一次读写 A 这块内存的时候,发生缺页中断,这个时候,内核才分配 A 这块内存对应的物理页。由此,当我们需要访问一个比较大的文件,尤其是当我们只需要访问其中的一小部分数据的时候,我们可以尝试通过 mmap 的方式来进行访问,减少由于该文件过大而对物理内存的过度占用。在第一次访问已分配的虚拟地址空间的时候,发生缺页中断,操作系统负责分配物理内存,然后建立虚拟内存和物理内存之间的映射关系。

2023-07-04 14:37:51 170

原创 Makefile之 =, :=, ?=

"进行赋值的时候如果该变量已经赋值过了,那么将跳过这一句,使用"="的时候,如果变量已经赋值过了,它会在进行一次赋值。用“:="进行变量的赋值时,如果右边有变量,那么只会使用在这条语句之前定义的变量,如果变量此时未定义,就默认这个变量为空。用“=”定义变量的时候,右边如果有变量,则这个变量的定义可以是整个Makefile文件中的任意位置。正常赋值这方面来说,"?="是和"="一样使用。

2023-07-03 22:56:02 175

原创 CFS调度器-2

系统LinuxCFS 的产生就是为了在真实的硬件上模拟“理想的多任务处理器”,使每个进程都能够公平的获得 CPU。

2023-07-03 14:28:52 139

原创 handle_irq

_irq_svc:svc_entry/**/.macroblr x1.endmint __inithandle_irq;return 0;#endif/**/voidhandle_irq(int irq)/**/if (!irq);return;irq_enter();(desc);irq_exit();

2023-06-21 14:23:59 197

原创 kmem_cache_alloc

***/void *slab_allocreturn ret;slab_allocvoid *objp;cachep))objp =return。

2023-06-21 14:02:29 245

原创 kmem_cache_create

***/returnctor);/***/int err;if (err) {/**/if (!usersize)if (s)if (!if (err) {name, err);else {name, err);

2023-06-21 13:57:17 207

原创 pagecache_get_page

***/repeat:if (!page)if (!} else {*/no_page:if (!int err;if (!page)/**/

2023-06-14 17:43:59 638

原创 devtmpfs分析

do_path_lookup()调用filename_lookup(),然后调用path_lookupat()函数。//对于"/usr/"路径, 此时已到路径尾。统一设备模型里,几乎任何总线的任何设备,只要发生注册操作,即device_add()操作,就有可能调用devtmpfs留给统一设备模型的接口devtmpfs_create_node().*err = sys_mount("devtmpfs", "/", "devtmpfs", MS_SILENT, options);//第一次mount。

2023-06-14 17:40:58 811

原创 do_dentry_open

static intint error;return 0;if (error)if (error)if (!open)if (error)if (!/**/return 0;

2023-06-14 17:38:54 755

原创 Linux 虚拟文件系统 VFS 源码剖析

fs_context 是 file_system_type 和 super_block 之间的桥梁,创建和配置 super_block 都离不开 fs_context,主要在 mount 调用时使用。Linux 中挂载的 super_block 除了链接到对应的 file_system_type::fs_supers 链表上,还将其链接到全局链表 super_blocks 中。mount_bdev() 和 kill_block_super() 两个函数都不是 ext4 专有函数,都是通用函数。

2023-06-14 17:29:57 1064 1

原创 Linux内存分配器slub

因此,每次添加的时候都会判断当前的pobjects是否大于kmem_cache的cpu_partial成员,如果大于,那么就会将此时per cpu partial链表中所有的slab移送到kmem_cache_node的partial链表,然后再将刚刚释放obj的slab插入到per cpu partial链表。当然,kmem_cache_create仅仅是创建了一个描述slab缓存池布局的数据结构,并没有从伙伴系统申请内存,具体的申请内存操作是在kmeme_cache_alloc中完成的。

2023-06-14 17:26:57 654

原创 linux mount 流程详解

本文代码基于Linux 5.10。Linux mount 主要通过mount 命令或者mount api来实现, 本文主要介绍mount 调用在内核中的实现。

2023-06-14 17:26:15 917

原创 Linux 文件 io 的原子性与 O_APPEND 参数

文件 io 的原子性,是用锁来保证的,文件表有一把,保护偏移量,inode 有一把,保护读写数据。实际上,只有加上了 O_APPEND 参数,才能对同一个文件的写入操作实现真正的原子性这里没有讨论 read(),但是类比 write(),其行为也是一样的,只是写数据变为读数据。

2023-06-14 17:22:29 1066

原创 Linux内存管理 —— 文件系统缓存和匿名页的交换

所以swapness反映了是否积极地使用swap空间,而将swapness=0则意味着不再交换匿名页,除非当内存不足(free and file-backed pages < high watermark in a zone)的情况下才使用swap空间(这里的意思是,内存触到low之后就发起回收,直到内存回到high水位停止,但如果回收完file-backed页面都到不了high,就得开始回收匿名页了,这段时间内即使swapness=0也出现了回收匿名页的情况)。可认为是为匿名页伪造的文件背景。

2023-06-14 17:18:08 443

原创 irq_exit

voidirq_exit(void)#else#endifif (!();*/

2023-06-14 17:13:58 76

原创 基数树RadixTree

对于长整型数据的映射,如何解决Hash冲突和Hash表大小的设计是一个很头疼的问题。radix树就是针对这种稀疏的长整型数据查找,能快速且节省空间地完成映射。借助于Radix树,我们可以实现对于长整型数据类型的路由。利用radix树可以根据一个长整型(比如一个长ID)快速查找到其对应的对象指针。这比用hash映射来的简单,也更节省空间,使用hash映射hash函数难以设计,不恰当的hash函数可能增大冲突,或浪费空间。radix tree是一种多叉搜索树,树的叶子结点是实际的数据条目。

2023-05-07 12:26:14 488 1

原创 arm64函数参数

【代码】可变参数。

2023-04-20 22:01:31 545

基于linux系统的H_264视频监控系统的实现

基于linux系统的H_264视频监控系统的实现

2012-10-29

v4l2驱动高级编写篇

v4l2驱动高级编写篇

2012-10-29

v4l2结构介绍

v4l2结构介绍

2012-10-29

Linux下usb摄像头驱动编写

Linux下usb摄像头驱动编写

2012-10-29

linux驱动头文件位置及作用

linux驱动头文件位置及作用,用于编写Linux驱动程序的参考书,Linux驱动程序员必备

2012-10-29

linux内核完全解读(赵炯)

Linux内核完全解读,详细的叙述了Linux内核的工作原理,内容实在,不空洞,直接解读内核代码

2012-10-29

空空如也

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

TA关注的人

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