10 2019 档案
摘要:1. 归并排序 归并排序,是创建在归并操作上的一种有效的排序算法,效率为O(nlogn)。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子
阅读全文
摘要:OTG 检测的原理是: USB OTG标准在完全兼容USB2.0标准的基础上,增添了电源管理(节省功耗)功能,它允许设备既可作为主机,也可作为外设操作(两用OTG)。USB OTG技术可实现没有主机时设备与设备之间的数据传输。例如:数码相机可以直接与打印机连接并打印照片,手机与手机之间可以直接传送数
阅读全文
摘要:在SmartQ 7上面,同时存在USB HOST与 USB OTG两个接口,我想问一下,这两个接口有什么区别么?我怎么认为HOST属于是多余呢? 麻烦高手解答,感激不尽!!! 转自 "USB HOST与 USB OTG的区别及工作原理" 零 USB背景知识 USB是一种数据通信方式,也是一种数据总线
阅读全文
摘要:排序 堆排序 一:定义 作为选择排序的改进版,堆排序可以把每一趟元素的比较结果保存下来,以便我们在选择最小/大元素时对已经比较过的元素做出相应的调整。 二:堆排序算法 作为选择排序的改进版,堆排序可以把每一趟元素的比较结果保存下来,以便我们在选择最小/大元素时对已经比较过的元素做出相应的调整。 堆排
阅读全文
摘要:以msm8909为例,高通的主要文件有几个: qpnp linear charger.c(线性充电器) qpnp vm bms.c(BMS管理) power_supply_core.c(power_supply对外部提供对应接口) 其中,vm_bus的power_supply一般为struct po
阅读全文
摘要:电池充电是由qpnp vm bus.c(电池驱动BMS)和qpnp linear charger.c(线性充电器)组成; SMMB charger:Switch ModeBattery Charger and Boost peripheral开关模式电池充电器和升压外围设备 CV:ConstantV
阅读全文
摘要:LK把相关参数报存到cmdline上: 在 上`gcdb_display_cmdline_arg`函数里: 调用过程如图所示: aboot_init()函数里面: target_display_panel_node()函数里面: 这是将command_line保存下来:
阅读全文
摘要:Kernel启动时会解析cmdline,然后根据这些参数如console root来进行配置运行。 Cmdline是由bootloader传给kernel,如uboot,将需要传给kernel的参数做成一个tags链表放在ram中,将首地址传给kernel,kernel解析tags来获取cmdlin
阅读全文
摘要:前情回顾:直接插入排序(对插入排序不熟悉的建议先阅读此文) 一天,一尘拿着扑克自己在那玩,刚被师傅看见了 首先它把较大的数据集合分割成若干个小组(逻辑上分组),然后对每一个小组分别进行插入排序,此时,插入排序所作用的数据量比较小(每一个小组),插入的效率比较高 可以看出,他是按下标相隔距离为4分的组
阅读全文
摘要:接下来我来讲述一下插入排序法。 首先来解释一下插入排序法的原理,它的原理是每插入一个数都要将它和之前的已经完成排序的序列进行重新排序,也就是要找到新插入的数对应原序列中的位置。那么也就是说,每次插入一个数都要对原来排序好的那部分序列进行重新的排序,时间复杂度同样为O(n²)。 这种算法是稳定的排序方
阅读全文
摘要:前面分析了伙伴管理算法的初始化,在切入分析代码实现之前,例行先分析一下其实现原理。 伙伴管理算法(也称之为Buddy算法),该算法将所有空闲的页面分组划分为MAX_ORDER个页面块链表进行管理,其中MAX_ORDER定义: 通常该值都是定义为11,而CONFIG_FORCE_MAX_ZONEORD
阅读全文
摘要:本文在上述的基础上介绍优先队列的另外一种支持高效合并操作的实现——二项队列。原来在介绍二叉堆和左式堆的时候喜欢从结构性和堆序性两个方面介绍,它们二者都是特殊的二叉树结构,但是二项队列不能单纯的从结构性和堆序性两个方面介绍了因为二项队列并不是我们熟悉的树结构,而是树的集合——森林,本篇文章从二项队列的
阅读全文
摘要:一.O(logn)代码小证明 我们先来看下面一段代码: 2. 欧几里得算法 3.幂运算 四.库里有log()函数和log2()函数 log()函数的底数默认为自然对数的底数e log2()函数的底数很显然就是2咯qwq include include include in
阅读全文
摘要:这一次,我们来讲一讲二叉堆的另外一个应用:优先队列 队列的特点是什么? 聪明的小伙伴们都知道,是先进先出(FIFO)。 入队列: 出队列: 那么,优先队列又是什么样子呢? 优先队列不再遵循先入先出的原则,而是分为两种情况: 最大优先队列,无论入队顺序,当前最大的元素优先出队。 最小优先队列,无论入队
阅读全文
摘要:前面已经分析了linux内存管理算法(伙伴管理算法)的准备工作。 具体的算法初始化则回到start_kernel()函数接着往下走,下一个函数是mm_init(): 乍看仅仅是几个函数的调用,实际上这里的事情远远没这么简单。其中page_cgroup_init_flatmem()与cgroup相关,
阅读全文
摘要:前面分析了memblock算法、内核页表的建立、内存管理框架的构建,这些都是x86处理的setup_arch()函数里面初始化的,因地制宜,具有明显处理器的特征。而start_kernel()接下来的初始化则是linux通用的内存管理算法框架了。 build_all_zonelists()用来初始化
阅读全文
摘要:文件页 内存回收,也就是系统释放掉可以回收的内存,比如缓存和缓冲区,就属于可回收内存。它们在内存管理中,通常被叫做文件页(File backed Page)。大部分文件页,都可以直接回收,以后有需要时,再从磁盘重新读取就可以了。 脏页 那些被应用程序修改过,并且暂时还没写入磁盘的数据(也就是脏页),
阅读全文
摘要:先说说cpu的cache,和cpu的cache比起来访问主内存是非常慢的,为了加快速度根据本地性原则,cpu在访问主内存的时候会把附近的一块数据都加载到cpu的cache里,之后读写这块数据都是在cache里做的。 linux本来有伙伴系统分配内存页,为了加快单个内存页的分配linux在每个node
阅读全文
摘要:前面已经分析了内存管理框架的构建实现过程,有部分内容未完全呈现出来,这里主要做个补充。 如下图,这是前面已经看到过的linux物理内存管理框架的层次关系。 现着重分析一下各个管理结构体的成员功能作用。 struct zone node_zones[MAX_NR_ZONES]; ——存放该pg_dat
阅读全文
摘要:虽说前文分析内存管理框架构建的实现,提到了find_zone_movable_pfns_for_nodes(),但这里不准备复述什么,仅针对required_movablecore和required_kernelcore做一个补充。 以required_movablecore为例,代码中没有很清晰地
阅读全文
摘要:此处接前文,分析free_area_init_nodes()函数最后部分,分析其末尾的循环: 这里面的关键函数是free_area_init_node(),其入参find_min_pfn_for_node()用于获取node节点中最低的内存页框号。 而free_area_init_node()其实现
阅读全文
摘要:前面构建内存管理框架,已经将内存管理node节点设置完毕,接下来将是管理区和页面管理的构建。此处代码实现主要在于setup_arch()下的一处钩子:x86_init.paging.pagetable_init()。据前面分析可知x86_init结构体内该钩子实际上挂接的是native_pageta
阅读全文
摘要:传统的计算机结构中,整个物理内存都是一条线上的,CPU访问整个内存空间所需要的时间都是相同的。这种内存结构被称之为UMA(Uniform Memory Architecture,一致存储结构)。但是随着计算机的发展,一些新型的服务器结构中,尤其是多CPU的情况下,物理内存空间的访问就难以控制所需的时
阅读全文
摘要:前面已经分析了内核页表的准备工作以及内核低端内存页表的建立,接着回到init_mem_mapping()中,低端内存页表建立后紧随着还有一个函数early_ioremap_page_table_range_init(): 该函数主要是用于建立固定内存映射区的。固定内存映射区是指FIXADDR_STA
阅读全文