ARM开发
文章平均质量分 92
落尘纷扰
服务于制造业的码农,没怎么写过代码
展开
-
linux内核中打印栈回溯信息 - dump_stack()函数分析
当内核出现比较严重的错误时,例如发生Oops错误或者内核认为系统运行状态异常,内核就会打印出当前进程的栈回溯信息,其中包含当前执行代码的位置以及相邻的指令、产生错误的原因、关键寄存器的值以及函数调用关系等信息,这些信息对于调试内核错误非常有用。原创 2015-05-08 21:19:32 · 28184 阅读 · 0 评论 -
Linux内存管理 —— 内核态和用户态的内存分配方式
1. 使用buddy系统管理ZONE我的这两篇文章buddy系统和slab分配器已经分析过buddy和slab的原理和源码,因此一些细节不再赘述。所有zone都是通过buddy系统管理的,buddy system由Harry Markowitz在1963年提出。buddy的工作方式我就不说了,简单来说buddy就是用来管理内存的使用情况:一个页被申请了,别人就不能申请了。通过/proc/b...原创 2018-03-06 17:36:04 · 14941 阅读 · 0 评论 -
Linux内存管理 —— 为buddy做准备:MMU, TLB, ZONE
本文都是假设系统是32位,页大小为4KB,基于ARM架构(不过和体系结构相关的内容不多)。1. 了解MMU在启用MMU的Linux内核中,CPU是通过虚拟地址来访问物理内存的。MMU(Memory Management Unit),即内存管理单元,它集成在CPU中,负责虚拟地址到物理地址的映射,以及物理地址的访问,并提供内存访问权限检查机制,以达到内存保护的作用(ARM里面的MPU(M...原创 2018-03-06 17:12:32 · 2246 阅读 · 1 评论 -
Linux内核中的锁
1. 为什么要保证原子性处理器分两种:cisc(复杂指令集,可以直接在内存上进行操作,如x86,一条汇编指令可以原子的完整读内存、计算、写内存)和rics(精简指令集,所有操作都必须是在CPU内部进行。所以你想给内存某个变量做加法,你要先用load指令把内存load到CPU的寄存器、再执行add,再执行store把结果放到内存中)。因此a++这句话在rics上并不是原子的,必须翻译成一个r...原创 2018-03-07 00:05:34 · 6516 阅读 · 0 评论 -
Linux内存管理 —— DMA和一致性缓存
1. 出现内存不一致的原因CPU写内存的时候有两种方式: 1. write through: CPU直接写内存,不经过cache。 2. write back: CPU只写到cache中。cache的硬件使用LRU算法将cache里面的内容替换到内存。通常是这种方式。DMA可以完成从内存到外设直接进行数据搬移。但DMA不能访问CPU的cache,CPU在读内存的时候,如果cache命中...原创 2018-03-06 18:34:30 · 27367 阅读 · 6 评论 -
Linux内存管理 —— 文件系统缓存和匿名页的交换
1. swap的含义在Linux里swap有两个意思: 1. 动词:交换。内存和磁盘的颠簸行为。 2. 名词:硬盘的swap分区。没有文件背景的页面,即匿名页(anonymous page),如堆,栈,数据段等,不是以文件形式存在,因此无法和磁盘文件交换,但可以通过硬盘上划分额外的swap交换分区或使用交换文件进行交换。即上面wap作为名词的意思。Swap分区可以将不活跃的页交换到硬盘...原创 2018-03-06 18:27:22 · 16914 阅读 · 3 评论 -
理解APCS-- ARM过程调用标准
原文地址:http://blog.csdn.net/skyflying2012/article/details/37510171 介绍APCS,ARM 过程调用标准(ARM Procedure Call Standard),提供了紧凑的编写例程的一种机制,定义的例程可以与其他例程交织在一起。最显著的一点是对这些例程来自哪里没有明确的限制。它们可以编译自 C、 Pascal、也转载 2017-02-15 23:06:24 · 1149 阅读 · 0 评论 -
ARM Linux中的非对齐内存访问(Alignment trap警告的原因)
介绍ARM Linux中进行编程时非对齐内存地址访问时需要注意的问题,以及Alignment trap警告的原因。原创 2016-06-04 22:12:05 · 16174 阅读 · 0 评论 -
Linux内存管理 —— 进程的虚拟地址空间和VSS
1. 进程虚拟地址空间进程的虚拟地址空间记录在其task_struct结构的指针成员mm中(struct mm_struct),这是用户态进程才有的,里面包含pgd、代码段、堆、栈地址等信息。(kernel不需要mm,因为kernel不需要引用动态库,内核线程有自己的栈空间,虚拟地址映射关系也是全局可见的,注意vmalloc和kmap产生的映射是由内核中的全局变量swapper_pg_dir和...原创 2018-03-06 17:47:07 · 1486 阅读 · 0 评论