- 博客(114)
- 资源 (15)
- 问答 (1)
- 收藏
- 关注
原创 内存管理(十):伙伴分配器
1、伙伴分配器概述内核初始化完毕后,使用页分配管理器管理物理页,当前使用的页分配器是伙伴分配器。页分配管理自然而然,分配的单位是页。并且伙伴分配器只能分配2的n次幂个页,n称为阶(order),2的n次幂个连续页称为n阶页块。满足以下条件的两个n阶页块称为伙伴(buddy)两个页块的物理地址是连续的页块的第一页的物理页号必须是2的n次幂的整数倍,如0号页,2号页,4号页,8号页…如果合并成(n+1)阶页块,第一页的物理页号必须是2的(n+1)次幂的整数倍。如两个2阶页块合并,第一页应是0,4,8
2020-07-19 20:05:18
849
原创 内存管理(九):内存分配概述
本文是对之后章节的一个概述,主要是对常见的内存分配进行简单的总结,对后面文章的内容有一个简单的了解。通过前面几章的介绍,我们知道linux中内存是以页为单位组织起来的,所以首先是页分配管理器buddy system 伙伴分配器。在系统长时间运行后,物理内存可能出现碎片,为了预防内存碎片,内核根据可移动行对分配的页进行分组。对于小块内存,也就是小于一页的内存,使用slub分配器假如不要求分配的物理内存连续,只要其虚拟地址连续,可以使用vmalloc对于大块的物理连续内存,可以使用CMA机制后面
2020-07-18 16:22:02
363
原创 内存管理(八):zone的初始化
linux版本:4.14.74硬件:ARMV8 A531 zone概念物理内存可以分为内存区域zone,内核定义的对zone类型的定义如下enum zone_type {#ifdef CONFIG_ZONE_DMA /* * ZONE_DMA is used when there are devices that are not able * to do DMA to all of addressable memory (ZONE_NORMAL). Then we * carve
2020-07-04 19:38:03
1607
原创 内存管理(七):物理内存组织
1 体系结构目前多处理器系统有两种体系结构1、对称多处理器(Symmetric Muti-Processsor,SMP):即一致内存访问(UMA),UMA系统有以下特点所有硬件资源都是共享的,每个处理器都能访问到系统中的内存和外设资源所有处理器都是平等关系统一寻主访问内存处理器和内存通过内部的一条总线连接在一起。2 非一致性内存访问(Non-Uniform Memory Access, NUMA):内存被划分为多个内存节点,访问一个内存节点花费的时间取决于处理器和内存节点的距离,每个处理器
2020-05-18 22:01:07
1251
原创 为git添加alias,命令缩写
git一些常用的命令git branch,git pull,git status等,可以为这些常用的命令添加缩写,在~/.gitconfig中添加[alias] co=checkout ci=commit st=status pl=pull ps=push dt...
2020-05-08 09:57:26
370
原创 git自动显示当前分支名称
在~/.bashrc中添加function git_branch { branch="`git branch 2>/dev/null | grep "^\*" | sed -e "s/^\*\ //"`" if [ "${branch}" != "" ];then if [ "${branch}" = "(no branch)" ];then ...
2020-05-08 09:54:08
692
原创 内存管理(六):系统映射
通过memblock已经有了内存布局的信息,接下来就要完成内存的映射。映射的过程位于paging_init函数中1. /* 2. * paging_init() sets up the page tables, initialises the zone memory 3. * maps and sets up the zero page. 4. */ 5. void __init...
2020-05-05 22:16:56
1321
原创 内存管理(五):memblock
完成DTB的映射之后,内核可以访问这一段的内存了, Dtb通过choosen node/memory node/reserved-memory node等节点勾勒出整个内存布局的情况,为后续内存管理初始化奠定基础。Dtb中有了内存布局的信息之后,如何管理这些模块呢,这就是引导内存分配器memblock1. struct memblock { 2. bool bottom_up; /...
2020-05-05 22:08:50
678
原创 内存管理(四):DTB的映射
Linux版本:4.14.741 建立系统映射的过程经过前面几章的内容,我们开启了MMU,为kernel image创建了映射,通过调用start_kernel setup_arch建立页表映射,读取kernel建立页表映射的代码和流程如下图所示,下面分章节对这三个部分进行说明1. void __init setup_arch(char **cmdline_p) 2. { 3. ...
2020-05-05 20:27:54
1438
1
原创 内存管理(三):内核上电启动阶段的页表映射
Linux版本:4.14.741 启动阶段所需页表在kernel启动阶段,会创建两次地址映射Identity mappingKernel image mapping在BootLoader以及uboot中,mmu功能是关闭的,操作的都是物理地址。为了提高性能,加快初始化速度,我们必须某个阶段(越早越好)打开MMU和cache,打开MMU之后操作的就是虚拟地址,为了从物理地址(Physi...
2020-05-05 19:03:26
2267
原创 内存管理(二):页表映射过程
Linux源码版本:4.14.75我们知道在Linux中,操作的都是虚拟地址(有MMU的情况下),那么Linux是如何从虚拟地址找到物理地址的呢?通过[内存管理(一):虚拟地址空间布局]我们(https://blog.youkuaiyun.com/u012142460/article/details/105867221)...
2020-04-30 19:12:57
1397
原创 内存管理(一)虚拟地址布局
Linux版本:4.14.74#1 Linux虚拟内存布局#在ARM64中,地址线由32bit变为64bit,但是64bit并不是全用到了,最大支持48位物理寻址,最大可寻找256T的物理地址空间,对于目前的应用来讲完全足够了。虚拟地址的最大宽度可配置,最大为48bit,还可以有36bit,39bit,42bit,47bit1. [arch/arm64/Kconfig] 2. ...
2020-04-30 18:20:20
2517
1
原创 devm_xxx申请资源释放资源的流程
devm_xxx的函数是在申请资源,释放资源的一种补充,对于devm_xxx打头的申请资源的函数,在设备detach的时候会自动释放申请的资源。本文来看看devm_xxxx机制的实现首先在设备device结构体中,有一个devres_head链表,维护该设备所绑定的资源,在设备detach的时候,遍历这个链表,一个一个进行资源释放。struct device { ... spi...
2019-08-26 18:19:03
1395
原创 c语言之零长度数组
我们设想这样一个场景, 我们在网络通信过程中使用的数据缓冲区, 缓冲区包括一个len字段和data字段, 分别标识数据的长度和传输的数据, 我们常见的有几种设计思路1、定长数据缓冲区, 设置一个足够大小 MAX_LENGTH 的数据缓冲区2、设置一个指向实际数据的指针, 每次使用时, 按照数据的长度动态的开辟数据缓冲区的空间.对于第一种,很明显会出现空间的浪费,比如实际buffer大小...
2019-08-26 16:53:43
366
2
原创 linux debugfs
1、概述内核开发者经常需要向用户空间应用输出一些调试信息,在稳定的系统中可能根本不需要这些调试信息,但是在开发过程中,为了搞清楚内核的行为,调试信息非常必要,printk可能是用的最多的,但它并不是最好的,调试信息只是在开发中用于调试,而printk将一直输出,因此开发完毕后需要清除不必要的printk语句,另外如果开发者希望用户空间应用能够改变内核行为时,printk就无法实现。因此,需要一...
2019-07-13 17:19:21
385
原创 printf 制表符格式对齐
printf中的\t表示的是制表符,能有很好的实现列对齐。对齐的规则是,在\t之前的内容的大小为n,若n不是8的倍数,对其在右侧空格补齐为8的倍数,如果大小正好是8的倍数,则右侧再补8个空格。#include <stdio.h>int main(){ printf("name\tChinese\tMatch\tEnglish\n"); pr...
2019-07-05 14:34:04
12794
原创 内存映射与VMA
 一般情况下,用户空间是不能也不应该直接访问设备的,但是,设备驱动程序中可以实现mmap()函数,这个函数使得用户空间能直接访问设备的物理地址。实际上,mmap()实现了这样的一个映射过程:他将用户空间的一段内存与设备内存关联,当用户访问用户空间的这段地址范围时,实际上会转化为对设备的访问。῕这种能力对于显示适配器一类的设备非常有意义,如果用户空间可以直接通过...
2019-05-19 17:33:32
1436
原创 友元函数
友元函数c++控制对类对象私有部分的访问。通常,公有类方法提供唯一的访问途径,但是有时候这种限制太严格,以致于不适合特定的编程问题。这种情况下,c++提供了另一种形式的访问权限:友元。友元有三种:1.友元函数2.友元类3.友元成员函数这一篇文章我们先来看看友元函数。在介绍如何成为友元之前,先介绍为何需要友元,在为类重载二元操作符(带两个参数的操作符)时常需要友元在操作符重载这篇文章里...
2019-03-16 22:58:08
1219
原创 git自动补全
刚安装的git默认是没有自动补全功能,git源码提供了这样的脚本文件,只要在.bashrc中默认执行这个脚本就可以了,脚本名称为git-completion.bash.1、如果没有源码,可下载源码$ git clone git://git.kernel.org/pub/scm/git/git.git2、然后将该文件copy一下$ cp git/contrib/completio...
2019-03-06 11:07:52
1156
1
原创 c++文件的输入输出
#c++ 文件输入输出要写入文件,要做以下几步骤1.创建一个ofstream对象来管理输出流2.将该对象与特定的文件关联起来3.像使用cout的方式使用该对象,唯一的区别是:输出将进入文件,而不是屏幕要完成上述任务,首先应包含头文件fstream,对于大多数实现(但不是全部)来说,包含该文件便自动包括iostream文件。ofstream fout;接下来,必须将这个对象与特定的文...
2019-03-02 22:17:31
207
转载 查看ubuntu版本信息
一、查看操作系统是32位的还是64位的在控制台输入:sudo uname --m回车后:如果显示i686,则表示安装了32位操作系统如果显示 x86_64,则表示安装了64位操作系统二、查看操作系统的版本号:cat /etc/issue比如输出:Ubuntu 14.04.4 LTS \n \l三、查看系统类型,其中lsb表示(Linux Standard Base):...
2019-02-25 16:12:51
596
原创 操作符重载
之前我们学习过了函数重载,在c++中操作符也是可以重载的。例如“+”操作符,我们可以用来操作两个int变量相加,那如何实现一个整型数组相加的,在c语言中,可以使用for循环的方式。for(int i = 0; i < 20; i++) sum[i] = a[i] + b[i]; 但在c++中,可以定义一个表示数组的类,并重载+操作符,于是便可以看到这样的语...
2019-02-24 22:28:36
174
原创 函数模板
1、简单函数模板函数模板是通用的函数描述,也就是说他们使用通用类型来定义函数,其中的通用类型可用具体的类型替换。通过将类型作为参数传递给模板,可使编译器生成该类型的函数。比如我们定义了一个函数,函数实现交换两个int变量的值。void swap(int &a, int &b);如果我们要实现一个交换两个double变量的值,如何做呢,我们可以重新复制一份代码,更改...
2019-01-15 23:20:30
229
原创 函数重载
函数重载可以让我们能够使用多个同名的函数。函数重载的关键是函数的参数列表----也就是函数特征标。如果两个函数的参数数目和类型相同,同时参数的排列顺序也相同,则他们的特征标相同。只有函数的特征标不同,才允许同名函数重载。例如,void print(const char *str, int width);void print(double d, int width);void pr...
2019-01-14 23:34:22
142
原创 默认参数
c++允许为函数的参数设置默认值,使用起来也很方便,我们常规声明一个函数时如下int func(int x,int y);我们可以将第二个参数设置为默认参数,比如设置为1,可以在声明的时候如下int func(int x, int y = 1);我们在调用这个函数的时候,如果我们要使用默认的参数,就可以不带第二个参数func(2);如果我们对第二个参数赋值了,那就将默...
2019-01-10 23:54:24
273
原创 类和对象
类介绍及其简单使用 c和c++最大的区别在哪里呢?c语言时面向过程的语言,c++是面向对象的编程。c++中也多了类的概念,类就是为了表示一类具有某些共同特性的对象。类中一般包括数据和类方法,类方法也就是要实现某些功能的函数,其实在c语言也可以实现类似功能,我们可以通过结构体的方式,类方法则可以通过函数指针来声明。但是结构体和类仍然有很多区别,类的功能更加丰富。我...
2018-12-18 23:43:50
175
原创 引用变量
c++新增了一种复合类型--引用变量。引用是已定义的变量的别名。(面试或笔试中也会常问道引用和指针的区别)常将引用变量用作函数的形参,函数将使用原始数据,而不是其拷贝,这点是不是和指针很像,确实很像,但同时又不同,让我们来具体看一看 c和c++中使用&符号来指示变量的地址。c++给&符号赋予了另一个含义,将其用来声明引用。例如,要将rodents作为rats变量的...
2018-12-15 22:56:09
219
原创 c++数据类型string
c++中数据类型大部分和c语言都一样,像整型,浮点,char,结构体,数组等等,有区别的一点是c++中提供了字符串类型string,更严谨一点,string是c++提供的一个类。这一点是c语言中没有的,c语言中是以字符数组来存储字符串的。 要使用string类,必须在程序中包含头文件string。string类位于名称空间std中。string类定义隐藏了字符串的数组性质,让您能...
2018-12-14 23:15:56
4164
原创 进入c++的世界
闲话少说,学习一下面向对象的编程,之前多次学习c++,多次半途而废。希望这一次能坚持下来。每天能有一点更新。先来一段简单的代码,和c语言是不是有一些不一样呢。对于iostream,namespace,cout,endl.我们一个一个解释#include <iostream> ...
2018-12-11 23:02:20
262
原创 链接器ld
链接器的作用是什么呢?还记得在Linux学习(十二)中gcc编译的过程吗?gcc编译分为四个过程:预编译、编译、汇编、链接链接是gcc编译的最后一步,就是把生成的所有可执行文件.o按照一定的规则合并成一个文件,而链接脚本就是这个规则文件。 1、重定位的概念链接生成的可执行文件虽然是放在文件中的,但当程序运行时需要加载到内存当中。各段应放在内存空间的什么位置是由可...
2018-12-01 17:14:00
2216
原创 工具集binutils
该文章主要参考大牛李云的博客http://blog.51cto.com/yunli/186727,自己写一写更有助于加深记忆1、addr2line,用程序地址得到对应的函数和行号。这个一般用在错误分析的时候,根据backtrace显示的代码地址,得到出错的行号和函数。一个简单的实例:#include <stdio.h>void go(){ pri...
2018-12-01 12:27:33
257
原创 Makefile中常用函数
Makefile常用函数总结1、realpath 返回一个绝对路径例:ROOT = $(realpath ./) 返回当前路径的绝对地址,赋值给ROOT2、wildcard 通配符函数,类似于linux中的 “*”命令格式:$(wildcard pattern)例子 :SRCS = $(wildcard *.c) 得到当前目录下的所有.c文件3、patsubst...
2018-12-01 11:36:21
1322
原创 MMU与cache(ARM920)
1、虚拟地址与物理地址 CPU通过地址来访问内存中的单元,地址有虚拟地址和物理地址之分,如果CPU没有MMU(Memory Management Unit,内存管理单元),或者有MMU但没有启用,CPU核在取指令或访问内存时发出的地址将直接传到CPU芯片的外部地址引脚上,直接被内存芯片(以下称为物理内存,以便与虚拟内存区分)接收,这称为物理地址(Physical Address,...
2018-11-04 22:32:22
922
转载 System V 与 POSIX通信
转自https://blog.youkuaiyun.com/firstlai/article/details/50705042System V 以及POSIX 对信号量、共享内存、消息队列等进程之间共享方式提供了自己的解决方案。因此,在学习时难免存在疑惑,到底有什么区别,哪种方式更佳。经过网上搜索各种博客,做出简单的总结。历史 UNIX两大贡献者贝尔实验室和BSD,在进程之间通信侧重不...
2018-09-10 18:19:24
323
原创 linux多线程之 线程数据TSD Thread Specific Data
在linux中,同一进程下所有线程是共享全局变量的,但有时候会有这样的需求,某一个线程想单独用于某个全局变量。这就有了TSD,Thread Specific Data。使用TSD时需要创建一个全局的键值,每个线程都通过键值来设置和获取自己所独有的全局变量。使用TSD分为以下几个步骤1、创建一个键值,key为一个键值,destructor是一个destructor函数,如果这个参数不...
2018-09-10 11:46:19
580
原创 线程调度与优先级
linux内核调度三种策略:1,SCHED_OTHER 分时调度策略,2,SCHED_FIFO实时调度策略,先到先服务3,SCHED_RR实时调度策略,时间片轮转分时进程则通过nice和counter值决定权值,nice越小,counter越大,被调度的概率越大,也就是曾经使用了cpu最少的进程将会得到优先调度。所以分时调度与优先级是无关的,在这种调度下,优先级是无法修改的,默认情...
2018-09-04 15:21:04
652
原创 linux spi主机控制器pl022驱动注册以及匹配设备过程
最近看海思的spi比较多,海思3519的spi ip使用的时ARM提供的pl022,这里对pl022驱动注册和匹配设备树中的设备这个过程捋一下。pl022是ARM提供的片内外设,很多厂商都用了这个ip,只在一些细小的区别。所以它的驱动也是非常通用的。pl022的手册可以看这里点击打开链接我们需要首先了解amba总线。本段摘自https://blog.youkuaiyun.com/yuanlulu/articl...
2018-06-30 19:09:43
3883
USB协议以及USB HOST MSC类通信过程
2017-09-26
利用队列和栈解决球钟问题
2017-09-13
addr2line 行号显示乱码
2018-12-01
TA创建的收藏夹 TA关注的收藏夹
TA关注的人