<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[monkea123的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/monkea123</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; monkea123]]></copyright><item><title><![CDATA[File_operations结构体]]></title><link>https://blog.youkuaiyun.com/monkea123/article/details/126527018</link><guid>https://blog.youkuaiyun.com/monkea123/article/details/126527018</guid><author>monkea123</author><pubDate>Thu, 25 Aug 2022 16:09:18 +0800</pubDate><description><![CDATA[file_operation通俗解释]]></description><category></category></item><item><title><![CDATA[epoll 与select poll区别]]></title><link>https://blog.youkuaiyun.com/monkea123/article/details/116174846</link><guid>https://blog.youkuaiyun.com/monkea123/article/details/116174846</guid><author>monkea123</author><pubDate>Mon, 26 Apr 2021 21:53:03 +0800</pubDate><description><![CDATA[(1)select==&gt;时间复杂度O(n)
它仅仅知道了，有I/O事件发生了，却并不知道是哪那几个流（可能有一个，多个，甚至全部），我们只能无差别轮询所有流，找出能读出数据，或者写入数据的流，对他们进行操作。所以select具有O(n)的无差别轮询复杂度，同时处理的流越多，无差别轮询时间就越长。
(2)poll==&gt;时间复杂度O(n)
poll本质上和select没有区别，它将用户传入的数组拷贝到内核空间，然后查询每个fd对应的设备状态， 但是它没有最大连接数的限制，原因是它是基于链表来存储的.]]></description><category></category></item><item><title><![CDATA[json入门]]></title><link>https://blog.youkuaiyun.com/monkea123/article/details/109431849</link><guid>https://blog.youkuaiyun.com/monkea123/article/details/109431849</guid><author>monkea123</author><pubDate>Sun, 01 Nov 2020 18:16:05 +0800</pubDate><description><![CDATA[JSON 语法是 JavaScript 对象表示语法的子集。
数据在名称/值对中
数据由逗号分隔
大括号 {} 保存对象
中括号 [] 保存数组，数组可以包含多个对象
JSON 值可以是：

数字（整数或浮点数）
字符串（在双引号中）
逻辑值（true 或 false）
数组（在中括号中）
对象（在大括号中）
null

JSON 数字可以是整型或者浮点型
"value" : 25   

JSON 对象在大括号 {} 中书写：
JSON对象在大括号{}中书写，对象可以包含单个或者多个JSON数据。
对象（]]></description><category></category></item><item><title><![CDATA[杂项设备（misc device）]]></title><link>https://blog.youkuaiyun.com/monkea123/article/details/109137398</link><guid>https://blog.youkuaiyun.com/monkea123/article/details/109137398</guid><author>monkea123</author><pubDate>Sat, 17 Oct 2020 20:03:29 +0800</pubDate><description><![CDATA[杂项设备（misc device）
杂项设备也是嵌入式系统中用得比较多的一种设备驱动。在 Linux 内核的include/linux目录下有miscdevice.h文件，要把自己定义的misc device从设备定义在这里。其实是因为这些字符设备不符合预先确定的字符设备范畴，所有这些设备采用主编号10 ，一起归于misc device，其实misc_register就是用主标号10调用register_chrdev()的，只不过misc是将一些字符设备存放在misc类中。换句话说，misc设备其实也就是特]]></description><category></category></item><item><title><![CDATA[platform平台驱动模型 总线-驱动-设备]]></title><link>https://blog.youkuaiyun.com/monkea123/article/details/109082515</link><guid>https://blog.youkuaiyun.com/monkea123/article/details/109082515</guid><author>monkea123</author><pubDate>Sat, 17 Oct 2020 19:01:08 +0800</pubDate><description><![CDATA[platform 总线
(1)相对于usb、pci、i2c等物理总线来说，Linux 提出了 platform 这个虚拟总线，相应的就有 platform_driver 和 platform_device。platform总线是虚拟的、抽象出来的。
(2)CPU与外部通信的2种方式：地址总线式连接和专用接口式连接。平台总线对应地址总线式连接设备，也就是SoC内部集成的各种内部外设。
Linux系统内核使用bus_type结构体表示总线，此结构体定义在文件include/linux/device.h，bus_]]></description><category></category></item><item><title><![CDATA[推挽、开漏、强上拉、弱上拉、强下拉、弱下拉输出]]></title><link>https://blog.youkuaiyun.com/monkea123/article/details/109120316</link><guid>https://blog.youkuaiyun.com/monkea123/article/details/109120316</guid><author>monkea123</author><pubDate>Fri, 16 Oct 2020 17:05:08 +0800</pubDate><description><![CDATA[上拉（Pull Up ）或下拉（Pull Down）电阻（两者统称为“拉电阻”）最基本的作用是：将状态不确定的信号线通过一个电阻将其箝位至高电平（上拉）或低电平（下拉），无论它的具体用法如何，这个基本的作用都是相同的，只是在不同应用场合中会对电阻的阻值要求有所不同，从而也引出了诸多新的概念，本节我们就来小谈一下这些内容。
如果拉电阻用于输入信号引脚，通常的作用是将信号线强制箝位至某个电平，以防止信号线因悬空而出现不确定的状态，继而导致系统出现不期望的状态，如下图所示：
在实际应用中，10K欧姆的电阻是使用数]]></description><category></category></item><item><title><![CDATA[自旋锁和互斥锁]]></title><link>https://blog.youkuaiyun.com/monkea123/article/details/108955665</link><guid>https://blog.youkuaiyun.com/monkea123/article/details/108955665</guid><author>monkea123</author><pubDate>Wed, 07 Oct 2020 21:09:23 +0800</pubDate><description><![CDATA[A hybrid mutex behaves like a spinlock at first on a multi-core system. If a thread cannot lock the mutex, it won’t be put to sleep immediately, since the mutex might get unlocked pretty soon, so instead the mutex will first behave exactly like a spinlock.]]></description><category></category></item><item><title><![CDATA[等待队列代码实现]]></title><link>https://blog.youkuaiyun.com/monkea123/article/details/108954844</link><guid>https://blog.youkuaiyun.com/monkea123/article/details/108954844</guid><author>monkea123</author><pubDate>Wed, 07 Oct 2020 20:35:10 +0800</pubDate><description><![CDATA[hpet_read(struct file *file, char __user *buf, size_t count, loff_t * ppos)
{
	DECLARE_WAITQUEUE(wait, current); 			/* 定义一个等待队列 */
	unsigned long data;
	ssize_t retval;
	struct hpet_dev *devp;

	devp = file-&gt;private_data;				 /* 私有化数据 */
	if (!devp-&gt;]]></description><category></category></item><item><title><![CDATA[Linux 阻塞和非阻塞 IO]]></title><link>https://blog.youkuaiyun.com/monkea123/article/details/108922524</link><guid>https://blog.youkuaiyun.com/monkea123/article/details/108922524</guid><author>monkea123</author><pubDate>Sun, 04 Oct 2020 21:00:50 +0800</pubDate><description><![CDATA[IO 指的是 Input/Output，也就是输入/输出，是应用程序对驱动设备的输入/输出操作。当应用程序对设备驱动进行操作的时候，如果不能获取到设备资源，那么阻塞式 IO 就会将应用程序对应的线程挂起，直到设备资源可以获取为止。对于非阻塞 IO，应用程序对应的线程不会挂起，它要么一直轮询等待，直到设备资源可以使用，要么就直接放弃。
比如你打开浏览器，访问新浪首页，浏览器这个程序就需要通过网络IO获取新浪的网页。浏览器首先会发送数据给新浪服务器，告诉它我想要首页的HTML，这个动作是往外发数据，叫Outpu]]></description><category></category></item><item><title><![CDATA[linux驱动开发之地址映射（mmu）]]></title><link>https://blog.youkuaiyun.com/monkea123/article/details/103934022</link><guid>https://blog.youkuaiyun.com/monkea123/article/details/103934022</guid><author>monkea123</author><pubDate>Sat, 11 Jan 2020 14:20:44 +0800</pubDate><description><![CDATA[在编写驱动之前，我们需要先简单了解一下 MMU 这个神器， MMU 全称叫做 Memory Manage Unit，也就是内存管理单元。在老版本的 Linux 中要求处理器必须有 MMU，但是现在Linux 内核已经支持无 MMU 的处理器了。 MMU 主要完成的功能如下：
①、完成虚拟空间到物理空间的映射。
②、内存保护，设置存储器的访问权限，设置虚拟存储空间的缓冲特性。
我们重点来看一下第①点...]]></description><category></category></item><item><title><![CDATA[Linux 设备号]]></title><link>https://blog.youkuaiyun.com/monkea123/article/details/103912543</link><guid>https://blog.youkuaiyun.com/monkea123/article/details/103912543</guid><author>monkea123</author><pubDate>Thu, 09 Jan 2020 17:24:54 +0800</pubDate><description><![CDATA[设备号的组成
为了方便管理， Linux 中每个设备都有一个设备号，设备号由主设备号和次设备号两部分组成，主设备号表示某一个具体的驱动，次设备号表示使用这个驱动的各个设备。 Linux 提供了一个名为 dev_t 的数据类型表示设备号， dev_t 定义在文件 include/linux/types.h 里面
12 typedef __u32 __kernel_dev_t;
......
15 t...]]></description><category></category></item><item><title><![CDATA[printk的用法及优先级]]></title><link>https://blog.youkuaiyun.com/monkea123/article/details/103911927</link><guid>https://blog.youkuaiyun.com/monkea123/article/details/103911927</guid><author>monkea123</author><pubDate>Thu, 09 Jan 2020 17:11:11 +0800</pubDate><description><![CDATA[这里使用了 printk 来输出信息，而不是 printf！因为在 Linux 内核中没有 printf 这个函数。 printk 相当于 printf 的孪生兄妹， printf运行在用户态， printk 运行在内核态。在内核中想要向控制台输出或显示一些内容，必须使用printk 这个函数。不同之处在于， printk 可以根据日志级别对消息进行分类，一共有 8 个消息级别，这 8 个消息级别...]]></description><category></category></item><item><title><![CDATA[linux驱动模块的加载和卸载]]></title><link>https://blog.youkuaiyun.com/monkea123/article/details/103905469</link><guid>https://blog.youkuaiyun.com/monkea123/article/details/103905469</guid><author>monkea123</author><pubDate>Thu, 09 Jan 2020 12:04:03 +0800</pubDate><description><![CDATA[Linux 驱动有两种运行方式，第一种就是将驱动编译进 Linux 内核中，这样当 Linux 内核启动的时候就会自动运行驱动程序。第二种就是将驱动编译成模块(Linux 下模块扩展名为.ko)，在Linux 内核启动以后使用“insmod”命令加载驱动模块。在调试驱动的时候一般都选择将其编译为模块，这样我们修改驱动以后只需要编译一下驱动代码即可，不需要编译整个 Linux 代码。而且在调试的时候...]]></description><category></category></item><item><title><![CDATA[字符设备驱动开发总概]]></title><link>https://blog.youkuaiyun.com/monkea123/article/details/103904610</link><guid>https://blog.youkuaiyun.com/monkea123/article/details/103904610</guid><author>monkea123</author><pubDate>Thu, 09 Jan 2020 11:37:37 +0800</pubDate><description><![CDATA[字符设备是 Linux 驱动中最基本的一类设备驱动，字符设备就是一个一个字节，按照字节流进行读写操作的设备，读写数据是分先后顺序的。比如我们最常见的点灯、按键、 IIC、 SPI，LCD 等等都是字符设备，这些设备的驱动就叫做字符设备驱动。

在 Linux 中一切皆为文件，驱动加载成功以后会在“/dev”目录下生成一个相应的文件，应用程序通过对这个名为“/dev/xxx” (xxx 是具体的驱动...]]></description><category></category></item><item><title><![CDATA[Linux驱动分类简介]]></title><link>https://blog.youkuaiyun.com/monkea123/article/details/103904547</link><guid>https://blog.youkuaiyun.com/monkea123/article/details/103904547</guid><author>monkea123</author><pubDate>Thu, 09 Jan 2020 11:19:17 +0800</pubDate><description><![CDATA[Linux驱动主要具有如下几点作用：

系统调用是应用程序和内核之间的接口，驱动程序是内核和硬件之间的接口；
驱动程序接受上层软件(应用程序、内核)的请求，完成对硬件的操作，屏蔽了硬件的细节；
驱动程序将硬件设备抽象成一个文件，应用程序操作文件即操作硬件，符合Linux“一切皆文件”的思想。


驱动的分类及特点
计算机硬件系统有CPU、存储器以及外设组成，Linux驱动针对的对象是存储器和外设；...]]></description><category></category></item><item><title><![CDATA[linux驱动面试题]]></title><link>https://blog.youkuaiyun.com/monkea123/article/details/103904508</link><guid>https://blog.youkuaiyun.com/monkea123/article/details/103904508</guid><author>monkea123</author><pubDate>Thu, 09 Jan 2020 11:16:42 +0800</pubDate><description><![CDATA[1、字符型驱动设备你是怎么创建设备文件的，就是/dev/下面的设备文件，供上层应用程序打开使用的文件？
答：mknod命令结合设备的主设备号和次设备号，可创建一个设备文件。
评：这只是其中一种方式，也叫手动创建设备文件。还有UDEV/MDEV自动创建设备文件的方式，UDEV/MDEV是运行在用户态的程序，可以动态管理设备文件，包括创建和删除设备文件，运行在用户态意味着系统要运行之后。那么在系统启动...]]></description><category></category></item><item><title><![CDATA[模电学习笔记八 第6-9章 习题]]></title><link>https://blog.youkuaiyun.com/monkea123/article/details/103748717</link><guid>https://blog.youkuaiyun.com/monkea123/article/details/103748717</guid><author>monkea123</author><pubDate>Sat, 28 Dec 2019 21:19:46 +0800</pubDate><description><![CDATA[]]></description><category></category></item><item><title><![CDATA[模电学习笔记七 第9章]]></title><link>https://blog.youkuaiyun.com/monkea123/article/details/103748697</link><guid>https://blog.youkuaiyun.com/monkea123/article/details/103748697</guid><author>monkea123</author><pubDate>Sat, 28 Dec 2019 21:15:17 +0800</pubDate><description><![CDATA[]]></description><category></category></item><item><title><![CDATA[模电学习笔记六 第7章]]></title><link>https://blog.youkuaiyun.com/monkea123/article/details/103748676</link><guid>https://blog.youkuaiyun.com/monkea123/article/details/103748676</guid><author>monkea123</author><pubDate>Sat, 28 Dec 2019 21:14:02 +0800</pubDate><description><![CDATA[]]></description><category></category></item><item><title><![CDATA[模电学习笔记五 第6章]]></title><link>https://blog.youkuaiyun.com/monkea123/article/details/103748633</link><guid>https://blog.youkuaiyun.com/monkea123/article/details/103748633</guid><author>monkea123</author><pubDate>Sat, 28 Dec 2019 21:11:31 +0800</pubDate><description><![CDATA[]]></description><category></category></item></channel></rss>