- 博客(553)
- 收藏
- 关注
原创 使用Qemu模拟32位ARM系统
是一个临时内存文件系统,所有文件在启动时解压到内存中,运行时修改仅影响内存副本,不会回写到原始的。修改文件系统,这些改动仅在本次运行中有效。关闭 QEMU 后,下次启动仍会从原始的。一个开发板可能支持不同的CPU,可以通过以下命令查看对应的开发板。不能直接引导Linux系统启动,能引导Linux系统启动的是。在使用 QEMU 启动 Linux 内核时,如果通过。作为根文件系统(如你的命令所示),那么默认情况下 。处理后的二进制内核映像,下文用到的内核镜像就是。开发板,其处理器是 32-bit 的。
2025-03-30 15:23:06
1048
原创 Linux设备驱动程序第九章——与硬件通信
几乎每种外设都通过读写寄存器来对它进行控制。大部分外设都有几个寄存器,无论是在内存地址空间还是在IO地址空间,这些寄存器的访问地址都是连续的。Linux在所有的计算机平台上都实现了IO端口。一般ISA设备通常使用IO端口,而大多数PCI设备则把寄存器映射到谋个内存地址区段。这种IO内存的方式才是首选的方案,因为不需要特殊的处理器指令;而且CPU访问内存更有效率,同时在访问内存的时候,编译器在寄存器分配和寻址方式的选择上也有更多的自由。
2025-03-19 17:18:57
721
原创 Linux设备驱动程序第八章——分配内存
kmalloc是一个分配内存的函数,功能类似于malloc。的第一个参数是要分配内存块的大小size,第二个参数是分配标志flags。关于flags,最常用的就是GFP_KERNEL,它表示是内核空间的进程来执行这个内存分配的(最终是通过调用,所以其标志最前面才是GFP使用GFP_KERNEL允许kmalloc在空闲内存较少时把当前进程转入休眠以等待内存页。所以使用GFP_KERNEL的分配内存的函数必须是可重入的。在其他情况下,GFP_KERNEL就不适用了。对于在中断处理函数,tasklet。
2025-03-12 16:34:43
334
原创 Linux设备驱动程序第六章——高级字符驱动程序操作(三)
使用非阻塞IO的应用程序也经常使用selectpollepoll等IO多路复用的系统调用。关于poll是 Linux 内核提供的一种用于和的机制。驱动程序实现poll函数是为了允许用户空间进程能够在不阻塞的情况下,检测设备或文件描述符是否准备好进行读写操作。这使得应用程序可以同时监听多个文件描述符(如网络连接、硬件设备等),而无需一直阻塞等待某个事件的发生。poll当用户空间的程序执行selectpollepoll等系统调用时,驱动程序的poll函数随即被调用。
2025-02-26 15:30:26
671
原创 Linux设备驱动程序第六章——高级字符驱动程序操作(二)
当一个进程进入休眠之后,它会被标记为一种特殊的状态,并且从调度器的运行队列中移除。直到某些情况下,这个状态被改变,这个进程才能继续被CPU调度,也就是运行。进程安全休眠方式的原则:1.不能在原子上下文中进入休眠。驱动程序不能在拥有自旋锁,seqlock,RCU锁时休眠;如果禁止了中断,也不能休眠;在拥有信号量的时候休眠是合法;2.不能假定进程被唤醒后的状态,对于被唤醒后的进程必须检查以确保等待的条件确实是真实的。为了唤醒休眠的进程,Linux内核提供了一种等待队列。
2025-02-24 17:49:34
739
原创 Linux设备驱动程序第六章——高级字符驱动程序操作(一)
它可以通过特定的命令和参数控制设备的行为。对设备的访问一般由设备文件的权限控制,驱动程序一般不进行权限检查。但是也存在一些例外,允许对设备进行一般的读写操作,但是对于其他操作都是禁止的。这样某个特定的用户或者程序就可以被授权执行某一特定的操作,同时又没有执行其他不相关操作的能力。的作用是提供一种机制,使得用户空间的程序可以直接与内核空间的设备驱动交互,执行控制命令和获取设备特定的状态。当一个指针指向用户空间时,必须要确保其指向的用户空间地址是合法的。参数的不同而执行不同的操作。,实现了其基本的读写功能。
2025-02-21 18:21:12
608
原创 Leetcode.264 丑数 II
这个丑数已经在当前的答案集合。更小的丑数也肯定在答案集合。个丑数,那么我们记录答案,中,所以后面只需要考虑比。中了,那么比当前丑数。,三个其中的一个而来。
2025-02-20 15:58:08
355
原创 Linux设备驱动程序第5章——并发和静态
的缺陷,本质上就是多个线程(进程)同时执行这段代码,其中一个线程修改了对应的状态,其他线程还不知道这个状态已经改变了,还是依照原来的逻辑执行。的时候,如果尚未分配内存,则先分配内存,然后才继续写入内容。,那么这个进程就会阻塞在这里,直到另外的进程释放该信号量;),知道其他线程(进程)释放了该信号量,然后当前线程被唤醒,此时。中的代码已经考虑到这个问题,已经添加上了对应的。,然后在必要的时候唤醒阻塞在这个信号量上的进程。希望进入临界区的进程在对应的信号量上执行。需要注意的是,这里的情况是。
2025-02-18 17:32:43
997
原创 Linux设备驱动程序第三章——字符驱动scull
出现这个结果,说明加载驱动和创建设备文件成功,申请的主设备号为。需要注意的是,这些内存都需要通过内核的内存申请函数。就是表示每一块“量子” 的内存大小,也就是。指向的才是其真正的内存区域。出现这个说明,驱动程序加载成功。编译成一个可执行的测试文件。节点默认管理的内存就是。所指向的那块内存的大小。
2025-02-15 16:23:21
655
原创 Leetcode.1735 生成乘积数组的方案数
请你找出有多少种可行的方案。由于答案可能会很大,方案数需要对。我们可以发现,对于不同的质因子都可以单独计算。、每个元素都是正整数的数组,且满足所有元素的乘积为。个箱子,并且允许出现空箱子的放法有多少种。的所有质因数,也就是求出所有。给你一个二维整数数组。请你返回一个整数数组。那么我们就可以处理出。,最后计算方案即可。
2024-06-24 23:16:37
938
原创 Leetcode.2786 访问数组中的位置使分数最大
所以我们可以直接降维,使用两个变量来模拟。个元素,最后一个元素是奇数或者偶数。注意 ,你一开始的分数为。
2024-06-14 11:03:25
1073
原创 Leetcode.2862 完全子集的最大元素和
分组,同一组内元素两两相乘都是完全平方数。直接遍历获取最大的和返回即可。,其中每对元素下标的乘积都是一个。是一个 完全平方数,那么。也是一个完全平方数。也是完全平方数,所以。依旧是一个完全平方数。也是一个完全平方数。就是一个完全平方数。
2024-06-13 16:32:34
1146
原创 Leetcode.2709 最大公约数遍历
将每一个元素 以及 他对应的质因数都合并到一起,表明他们是在一个集合中。,判断是否所有的元素都是在同一个集合中。这样才能保证,任何的。如果任意满足条件的下标对都可以遍历,那么返回。都会在同一个集合中。接着我们就可以通过判断。,你可以在一些下标之间遍历。时,我们可以在两个下标之间通行,其中。中的每一个元素都抽象成一个点,对应。,是否存在若干次通行可以从。是否在同一个集合中,来确定。的操作,就对应的变成了合并。数组中 任意 两个满足。内每个元素的质因数,记作。为了方便操作,在合并。,这样就避免了冲突。
2024-06-13 14:52:44
1223
原创 Leetcode.2601 质数减法运算
还必须是满足条件的最大质数。,也就是满足该条件的最大质数。选择一个之前未选过的下标。,并选择一个 严格小于。区间内所有的质数,存到。为前一个数,当前数为。等价于需要找到最后一个。
2024-06-12 11:30:32
1173
原创 Leetcode.866 回文质数
一个整数如果从左向右读和从右向左读是相同的,那么它是。测试用例保证答案总是存在,并且在。的基础之上,剩下的余数依旧是。
2024-06-06 22:23:50
869
原创 Leetcode.826 安排工作以达到最大收益
输入: difficulty = [2,4,6,8,10], profit = [10,20,30,40,50], worker = [4,5,6,7]在做了以上的预处理操作之后,我们在确定了工人可以选择的工作范围之后,同时也能得到最大收益。此时的最大收益就是工人能够选择最大难度工作对应的收益。解释: 工人被分配的工作难度是 [4,4,6,6] ,分别获得 [20,20,30,30] 的收益。排序了,所以可以通过二分的方式快速得到某一个工人可以选择工作的范围。按照上述的例子,工人的能力值。
2024-05-17 19:37:25
743
原创 [蓝桥杯 2017 省 AB] 包子凑数
个包子,卖包子的大叔就会迅速选出若干笼包子来,使得这若干笼中恰好一共有。表示能够被凑出来,反之就是不能被凑出来。我们最终要返回的就是。小明几乎每天早晨都会在一家包子铺吃早餐。当然有时包子大叔无论如何也凑不出顾客想买的数量。如果凑不出的数目有无限多个,输出。每种蒸笼都有非常多笼,可以认为是无限笼。小明想知道一共有多少种数目是包子大叔凑不出来的。(为了保险起见,一般都要多定义几个)。个包子时,大叔就凑不出来了。由于所有元素的总和不会超过。,所以背包的容量直接定义为。个包子时,大叔就会选。,我们就使用完全背包。
2024-04-07 16:20:47
1152
原创 [蓝桥杯 2016 省 B] 交换瓶子
输出数据为一行一个正整数,表示至少交换多少次,才能完成排序。个正整数,用空格分开,表示瓶子目前的排列情况。对于这么简单的情况,显然,至少需要交换。你可以通过编程来解决。个瓶子,交换它们的位置。不在它正确的位置上,即。在其正确的位置上,即。
2024-04-02 22:42:10
1095
原创 Leetcode2466. 统计构造好字符串的方案数
解释:好字符串为 “00” ,“11” ,“000” ,“110” 和 “011”。输入:low = 3, high = 3, zero = 1, one = 1。输入:low = 2, high = 3, zero = 1, one = 2。可以这样构造得到:“” -> “0” -> “01” -> “011”。从 “000” 到 “111” 之间所有的二进制字符串都是好字符串。之间(包含上下边界)的字符串,那么这个字符串我们称为。按照定义,我们最终返回的就是。一个可能的好字符串是 “011”。
2024-04-02 20:41:15
1065
原创 [蓝桥杯 2015 省 B] 生命之树
经过 atm 的努力,他已经知道了上帝给每棵树上每个节点上的整数。但是由于 atm 不擅长计算,他不知道怎样有效的求评分。他给每棵树的每个节点(叶子也称为一个节点)上,都标了一个整数,代表这个点的和谐值。为根节点的最大点权和。可能是空集,也就是我们可能一个节点也不选,那说明。里面的元素,且序列中相邻两个点间有一条边相连。由于这是一棵树,所以是不存在环的。输出一行一个数,表示上帝给这棵树的分数。这个最大的和就是上帝给生命之树的评分。个整数,依次表示每个节点的评分。中的点所对应的整数的和尽量大。
2024-03-21 22:11:46
1138
原创 [蓝桥杯 2019 省 A] 修改数组
现在小明要按以下方法将其修改为没有重复整数的数组。的时候,其 祖先节点 不会和之前的重复。如果出现过,则小明会给。仍在之前出现过,小明会持续给。就是我们的答案,它一定大于之前。,数组中有可能有重复出现的整数。时,我们都将其 祖先节点 加。这样设置就可以保证下一次出现。也经过上述修改之后,显然。数组中就没有重复的整数了。数组,请你计算出最终的。个整数 ,依次是最终的。每次我们只需要求得当前。
2024-03-21 21:09:55
1080
原创 [蓝桥杯 2020 省 AB3] 乘法表
请注意,乘法表中两个数相乘的顺序必须为样例中所示的顺序,不能随意交换两个乘数。九九乘法表是学习乘法时必须要掌握的。在不同进制数下,需要不同的乘法表。我们可以用 “短除法”,将十进制的数转换成任意。
2024-03-19 21:39:11
1120
原创 [蓝桥杯 2022 省 B] 修剪灌木
爱丽丝修剪灌木的顺序是从最左侧的灌木开始,每天向右修剪一棵灌木。当修剪了最右侧的灌木后,她会调转方向,下一天开始向左修剪灌木。直到修剪了最左的灌木后再次调转方向。棵灌木整齐的从左到右排成一排。爱丽丝在每天傍晩会修剪一棵灌木,让灌木的高度变为。厘米, 而其余时间不会长高。在第一天的早晨, 所有灌木的高度都是。行, 每行一个整数, 第行表示从左到右第。爱丽丝想知道每棵灌木最高长到多高。爱丽丝要完成一项修剪灌木的工作。灌木每天从早上到傍晩会长高。棵树的最大高度,实际就是。棵树最高能长到多高。
2024-03-19 16:43:44
1193
原创 [蓝桥杯 2015 省 A] 饮料换购
请你计算一下,如果小明不浪费瓶盖,尽量地参加活动,那么,对于他初始买入的。型饮料,并且可以一直循环下去(但不允许暂借或赊账)。个瓶盖,需要用总的瓶盖数减去消耗掉的瓶盖数,即。乐羊羊饮料厂正在举办一次促销优惠活动。,就要一直循环模拟这个过程,直到换掉所有饮料。瓶饮料,最后他一共能喝到多少瓶饮料。一个整数,表示实际得到的饮料数。瓶饮料,我们直接将其转换为。瓶饮料,所以我们消耗掉了。,表示开始购买的饮料数量。我们可以换到的饮料瓶数为。此时我们直接累加到答案。瓶饮料,所以还要加上。
2024-03-17 22:33:05
905
1
原创 [蓝桥杯 2020 省 AB1] 走方格
这些点的编号就像二维数组的编号一样,从上到下依次为第。注意,如果行号和列数都是偶数,不能走入这一格中。列,每一个点可以用行号和列号来表示。按照定义,最终返回的就是。在平面上有一些二维的点阵。只能向右或者向下走。行,从左到右依次为第。输出一个整数,表示答案。输入一行包含两个整数。
2024-03-17 22:02:39
1143
原创 [蓝桥杯 2021 省 AB2] 完全平方数
是一个完全平方数,是指它是某一个整数的平方,即存在一个 整数。是完全平方数,那么他一定有两个相同的因子。是相等的,所以他们各自的质因数也相等。是一个完全平方数,将其质因数分解为。,使得它们的乘积是一个完全平方数。我们就可以很容易的得出一个结论,变成完全平方数,我们只要让。输入一行包含一个正整数。输出找到的最小的正整数。,所以我们要将其变为。,请找到最小的正整数。
2024-03-16 23:42:29
1324
原创 [蓝桥杯 2020 省 B2] 平面切分
根绿色的线,然后又来了一根黑色的线,与之前绿色的线共有。我们直接枚举每一条直线,与前面直线的交点即可。请计算这些直线将平面分成了几个部分。个部分,一分为二,即又新增了。行, 每行包含两个整数。
2024-03-07 16:54:27
882
原创 [蓝桥杯 2019 省 B] 等差数列
数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一部分的数列,只记得其中。对于原数列,我们先将其从小到大排序,得到新数列。并不一定是按等差数列中的顺序给出 )。个整数的最短的等差数列有几项?最大,等价于求其最大公约数。个整数,小明想知道包含这。输入的第一行包含一个整数。对于其中任意两项的差值。输出一个整数表示答案。对于所有的这样的差值。对于求出的最大公约数。
2024-03-07 13:39:51
1497
原创 [蓝桥杯 2015 省 B] 移动距离
星球居民小区的楼房全是一样的,并且按矩阵样式排列。,需要求出它们之间的最短移动距离。(不能斜线方向移动)当排满一行时,从下一行相邻的楼往反方向排号。我们的问题是:已知了两个楼号。,我们分别求出他们行的位置。行,其所在列的位置就是。行,其所在列的位置就是。比如:当小区排号宽度为。要求输出一个整数,表示。两楼间最短移动距离。,其所在列的位置就是。,其所在列的位置就是。
2024-03-06 23:02:21
1354
原创 [蓝桥杯 2017 省 B] k 倍区间
为了不漏掉从第一个元素开始的。,如果其中一段连续的子序列。的倍数,我们就称这个区间。你能求出数列中总共有多少个。所以我们可以直接使用哈希表。相同的前缀和的个数即可。,我们只需要找到前面与。
2024-03-03 16:31:14
1188
原创 [蓝桥杯 2023 省 A] 平方差
输出一行包含一个整数满足题目给定条件的。的数量 ,最终返回的答案就是。如此我们就可以定义一个函数。范围内的奇数都满足条件。之差一定是偶数,所以。,那么4的倍数个数就为。区间内所有满足条件的。输入一行包含两个整数。
2024-03-03 15:49:26
3063
2
原创 Leetcode.2369 检查数组是否存在有效划分
解释:数组可以划分成子数组 [4,4] 和 [4,5,6]。如果获得的这些子数组中每个都能满足下述条件。输入:nums = [4,4,4,5,6]这是一种有效划分,所以返回 true。输入:nums = [1,1,1,2],你必须将数组划分为一个或多个。只要上述三种情况有一个为真,那么。,即没有元素也是一种有效划分!,则可以称其为数组的一种。解释:该数组不存在有效划分。存在一种有效划分,返回。就是最终要返回的答案。
2024-03-02 15:12:52
853
1
原创 [蓝桥杯 2021 省 AB] 砝码称重
2 = 6 − 4 (天平一边放 6,另一边放 4);请你计算一共可以称出多少种不同的重量?个砝码中选择,是否能够称出重量。输入的第一行包含一个整数。,表示什么也不选也成立。输出一个整数代表答案。是所有法码的重量之和。
2024-02-27 15:26:18
1469
原创 Leetcode.2735 收集巧克力
解释:我们将会按最初的成本收集全部三个类型的巧克力,而不需执行任何操作。因此,收集所有类型的巧克力需要的总成本是 1 + 2 + 3 = 6。接着,我们用成本 5 执行一次操作,巧克力的类型变更为 [1,2,0]。然后,我们用成本 5 执行一次操作,巧克力的类型变更为 [2,0,1]。因此,收集所有类型的巧克力需要的总成本是 (1 + 5 + 1 + 5 + 1) = 13。解释:最开始,巧克力的类型分别是 [0,1,2]。我们可以用成本 1 购买第 1 个类型的巧克力。
2023-12-29 21:28:31
1220
原创 [蓝桥杯 2014 省 A] 波动数列
共一行,包含一个整数,表示满足条件的方案数。是给定的,也就是确定的,于是我们可以通过。栋栋对这种数列很好奇,他想知道长度为。由于这个数很大,请输出方案数除以。这个数列中后一项总是比前一项。而且后一项总是比前一项增加。的整数数列可能有多少种呢?两个满足条件的数列分别是。可以是任意的整数,而。共一行,包含四个整数。我们能够进一步推导出。
2023-12-16 15:24:55
368
原创 Leetcode.2477 到达首都的最少油耗
输入:roads = [[3,1],[3,2],[1,0],[0,4],[0,5],[4,6]], seats = 2。城市里的代表可以选择乘坐所在城市的车,或者乘坐其他城市的车。个节点的树(一个无向、连通、无环图),每个节点表示一个城市,编号从。每个城市里有一个代表,他们都要去首都参加一个会议。辆车,为了用尽可能少的燃料,所以我们直接用。的边,经过的车越多,所消耗的燃料也就越多。由于我们求得是消耗的最少的燃料,假设以点。为根节点的子树上的所有节点都要经过边。开始遍历所有的边,记录总的燃料即可。
2023-12-05 22:15:12
555
原创 Leetcode.330 按要求补齐数组
现在如果我们将 2 添加到 nums 中, 组合变为: [1], [2], [3], [1,3], [2,3], [1,2,3]。其和可以表示数字 1, 2, 3, 4, 5, 6,能够覆盖 [1, 6] 区间里所有的数。根据 nums 里现有的组合 [1], [3], [1,3],可以得出 1, 3, 4。输入: nums = [1,5,10], n = 20。输入: nums = [1,2,2], n = 5。输入: nums = [1,3], n = 6。解释: 我们需要添加 [2,4]。
2023-12-03 16:15:37
240
原创 Leetcode.1542 找出最长的超赞子字符串
解释:“213123” 是最长的超赞子字符串,交换其中的字符后,可以得到回文 “231132”解释:“24241” 是最长的超赞子字符串,交换其中的字符后,可以得到回文 “24142”如果一个子串,在进行任意次的字符交换之后,能够变成回文串,相差一位的情况,求最大值。位的二进制数来表示对应数字字符的出现次数。的数字组成的,所以我们直接用一个。输入:s = “3242415”输入:s = “213123”这样的情况,记录到哈希表中。表示子串对应的二进制数。,对应的二进制数就是。输入:s = “00”
2023-11-26 21:19:04
569
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人