- 博客(68)
- 收藏
- 关注
原创 le32_to_cpu 和cpu_to_le32 大小断对齐
A53 是大端对齐的,但是其中一个spi的slave是小端对齐的。看一下 le32_to_cpu 的实现:/* little_endian.h */#define __cpu_to_le32(x) ((__force __le32)(__u32)(x))#define __le32_to_cpu(x) ((__force __u32)(__le32)(x))/*big_endian.h*/#define __le32_to_cpu(x) __swab32((__force __u3
2022-01-13 14:18:37
1156
原创 ftrace+printk 跟踪dma_alloc_coherent分配失败
系统:linux 3.0硬件平台:zynq用dma_alloc_coherent 分配160k Bytes给dma用的物理内存总是失败。还是深究下其原因吧!为了方便跟踪函数走向,安装了ftrace进行跟踪。1.ftrace的安装。make menuconfig 选择 kernel hacking ---->Tracers:我把相关trace都打开了,比如跟踪中断时延,抢占时延选定后然后进行保存。从新make即可。2.ftrace的使用:#我是通过char字符驱动的wr
2021-04-20 08:35:07
1775
原创 linux 内核哈希链表
首先了解下相关的数据结构:struct hlist_node { struct hlist_node *next, **pprev;};struct hlist_head { struct hlist_node *first;};struct hlist_node { struct hlist_node *next, **pprev;};哈希表我们一般用链接地址法来解...
2020-04-06 09:42:47
315
原创 zynq gic中断控制器
先了解一些gic 中断控制器(Zynq中的中断控制器基于ARM GIC v1.0版本)。左面可以看出中断的几种分类:1. SGI:软件产生的中断。2.PPI:私有中断。3.SPI:共享中断。1.SGI(Software Generated Interrupts) 每个cpu都可以用SGI中断自己或者其它CPU。通过写SGI中断号到ICDSGIR寄存器中,并且需要制...
2020-03-20 14:39:55
1817
转载 lru 双向链表+哈希
/*LRUCacheImpl.c*/#include<stdio.h>#include<stdlib.h>#include<string.h>#include"LRUCache.h"#include"LRUCacheImpl.h"typedef struct cacheEntryS{ char key; char data;...
2020-02-18 08:26:58
432
原创 内存踩踏解决
上面文章写了内存踩踏的原因:由于malloc的heap内存占到了irq的stack,导致出现内存重叠。主要原因是用到了uc2的malloc函数,这个malloc是由c库来实现的,当malloc太大,heap区域的不够大的时候,malloc会向上增长从而导致占用了heap的内存。解决方法就是增大heap的的大小:链接脚本中增大heap的大小:当然也可以应用ucos2自己实现的内...
2020-02-12 09:17:13
4581
1
原创 DS5解决 内存踩踏
最近发现个问题:malloc出来的几组值(UINT32)总是发生变化,总有地方改他。硬件平台:zynq 7045。软件平台 ucos II操作系统。这种问题定位起来非常费劲,有可能数组越界,有可能野指针等等。不过运气不错,我找到了神器:DS5。1.DS5的使用硬件连接就不用说了,软件开始。1.1 建立工程。将代码考入到ds5 目录下 workspaceFile---...
2020-02-11 09:40:13
936
原创 zynq MIO驱动
给了原理图,该怎么把MIO管脚配置成gpio模式?怎么做输入输出?做输出怎么发拉高拉低呢?比如下图原理图,你怎么把ps的MIO20和MIO21配置起来呢?1.首先你通过ug585 datasheet 要找到MIO20和MIO21所对应的寄存器。找了寄存器,那么开始查看内容,把他配置成gpio模式:三态(高阻态得关闭了),开始这个没配置,一直无法output高电平。...
2019-12-04 19:37:05
983
原创 DEVICE_ATTR
使用DEVICE_ATTR,可以在sys fs中添加“文件”,通过修改该文件内容,可以实现在运行过程中动态控制device的目的。这样方便用户空间调试。#include <linux/kernel.h>#include <linux/init.h>#include <linux/module.h>#include <linux/slab.h...
2019-11-21 17:11:43
151
原创 i2c_register_driver
打开打印后,如下:1. bus: 'i2c': add driver at242. bus: 'i2c': driver_probe_device: matched device 0-0056 with driver at243. bus: 'i2c': really_probe: probing driver at24 with device 0-00564. at24 0-0056:...
2019-11-18 16:10:11
557
原创 linux 之i2c 24FC256驱动
基于zynq平台调试 24FC256驱动。需要注意的是此款eeprom是32K x 8 (256 Kbit)。为了支持此款eeprom的寻址范围,地址需要16位来表示。 1.先看此款eeprom的设备地址。 a0,a1,a2,三根线可以选择设备的地址为多少。我们靠硬件把地址设置为0x56(0b10101...
2019-11-15 16:47:03
577
转载 【转】creat_mapping
http://blog.csdn.net/huyugv_830913/article/details/58846281 ARM920T的MMU工作原理下图显示了MMU地址转化关系一级表项的地址(pmd) = ( (TLB) & (0xFFFFC000) )+ ( (Table Index)<<2 );注1:TLB(Translate tabl...
2019-11-05 19:25:41
231
转载 各种栈了解下
本文链接:https://blog.csdn.net/yangkuanqaz85988/article/details/52403726转载请注明出处: http://kyang.cc/栈是什么?栈有什么作用?首先,栈 (stack) 是一种串列形式的 数据结构。这种数据结构的特点是 后入先出 (LIFO, Last In First Out),数据只能在串列的一端 (称为:栈顶 top...
2019-10-24 16:53:13
203
原创 内存泄漏工具kmemleak 使用方法
1.kmemleak使用方法https://www.cnblogs.com/arnoldlu/p/8568090.html2.英文手册https://www.kernel.org/doc/html/latest/dev-tools/kmemleak.html3.原理分析http://blog.chinaunix.net/uid-26859697-id-5758036.html...
2019-07-22 14:14:33
2196
原创 arm linux 系统调用
操作系统为在用户态运行的进程与硬件设备进行交互,提供操作系统的系统服务,提供了一组接口。在应用程序和硬件之间,提供内核的系统-服务设置一个额外层具有很多最优点。首先,这使得编程更加容易,把用户从学习硬件设备的低级编程特性中解放出来。其次,这极大地提高了系统的安全性,因为内核在试图满足某个请求之前在接口级就可以检查这种请求的正确性。最后,更重要的是这些接口使得程序具有可移植性,因为只要内...
2019-06-29 18:11:20
268
原创 initcall 机制
1.pa的pinctrl申请及初始化pa_init(np); nufront_sta_of_probe nufront_sta_init 2.驱动注册late_initcall(nufront_sta_init); #define late_initcall(fn) __define_initcall(fn, 7) #define __define_initcall(f...
2019-06-10 09:56:41
203
转载 linux内存malloc【转】
Linux的虚拟内存管理有几个关键概念:Linux 虚拟地址空间如何分布?malloc和free是如何分配和释放内存?如何查看堆内内存的碎片情况?既然堆内内存brk和sbrk不能直接释放,为什么不全部使用 mmap 来分配,munmap直接释放呢 ?Linux 的虚拟内存管理有几个关键概念: 1、每个进程都有独立的虚拟地址空间,进程访问的虚拟地址并不是真正的物理地址; 2、虚拟地址可通...
2019-02-14 17:55:54
351
转载 linux 内核 内存管理 slub算法 (一) 原理
https://blog.csdn.net/lukuen/article/details/6935068 内核管理页面使用了2个算法:伙伴算法和slub算法,伙伴算法以页为单位管理内存,但在大多数情况下,程序需要的并不是一整页,而是几个、几十个字节的小内存。于是需要另外一套系统来完成对小内存的管理,这就是slub系统。slub系统运行在伙伴系统之上,为内核提供小内存管理的功能。...
2019-02-12 19:24:00
259
原创 【leetcode】无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: "pwwkew"输出: 3解释: 因为无重复字符的最长子串...
2019-02-11 17:45:47
189
原创 kernel之启动第一个用户进程
上一篇说到,kernel代码重定位完成后,设置栈,跳转到 start_kernel去启动init进程。uboot的环境变量打印:bootargs=console=ttyS0,115200 mem=512M root=/dev/mmcblk1p1 rw rootwait init=/sbin/initstart_kernel rest_init(); kerne...
2019-02-01 15:36:43
373
原创 kernel之启动流程head.S
通过上一篇Makefile我们分析到了,编译出vmlinux的第一个原材料是head.o。.先回顾下uboot是怎么启动kernel的。uboot将kernel从flash中拷贝到sdram后,设置tag进行工作交接,然后启动内核。theKernel (0, bd->bi_arch_number, bd->bi_boot_params);r0 : 0r1 : bd->bi...
2019-01-29 16:31:09
667
原创 kernel之Makefile分析
首先拿到kernel,我们和uboot一样,首先进行 make *_defconfig,然后看到底做了什么呢?搜索: find . -name *defconfig 文件。我们找到对应板卡。./arch/arm/configs/xilinx_zynq_defconfig首先我们执行 make xilinx_zynq_defconfig看打印:# configuration w...
2019-01-24 19:51:03
762
原创 uboot分析之板卡初始化和启动内核
start.s完成后,跳转到start_armboot继续执行相关操作。1.gd相关初始化。放在sdram中,记录一些相关信息。如环境变量等,下面会用到。2.nor falsh识别及初始化flash_init flash_detect_legacy (BANK_BASE(i), i) //jedec协议查找flash类型 cmdset_intel_read_j...
2019-01-23 19:17:09
528
原创 uboot之第一阶段start.s
Makefile分析完成后,发现0bj 第一个文件时start.o,我们找到start.s进行分析。1.首先看到的是中断向量表_start: b reset //0 ldr pc, _undefined_instruction //0x4 ldr pc, _software_interrupt //0x8 ldr pc, _pref...
2019-01-20 18:45:05
145
原创 uboot之Makefile浅析
拿到新的 uboot后(uboot1.1.6),最开始进行 make xxx_config。然后再进行make。这里面进行了什么操作呢?以三星的 s3c2410为例。首先打开Makefile发现其中:$(shell [ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR}) //-d是判断BUILD_DIR是否存在。倘若不存在就创建。mkdir的-...
2019-01-19 09:58:51
376
原创 I2C协议及驱动
1.环境软件基于linux 2.2.26。硬件基于s3c2440。2.I2C协议 2条双向串行线,一条数据线SDA,一条时钟线SCL。 SDA传输数据是大端传输,每次传输8bit,即一字节。总线上每个设备都有自己的一个addr,共7个bit。2.1开始传输和结束传输开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。结束信号:SCL为高电平时,SDA由低...
2018-12-22 22:40:19
582
原创 mmu工作原理【3】代码实战
环境1.硬件平台:s3c2440 (arm920t核)2.软件:裸机代码。目前已经支持sdram,nandflash,norflash,lcd与触摸屏校准。s3c2440 MMU相关知识(datesheet) 首先了解下cpu的内部构成。我们关于mmu的基本操作都是协处理器CP15。经过指令mmu或者数据mmu将物理地址发送给AMBA总线。关于icache和dcache...
2018-12-11 20:12:29
677
原创 计算机系统总结之 MMU工作原理 【2】
1.二级页表 在MMU工作原理1 中,我们只是描述了1级页表。如果我们有一个32位的地址空间,每个页框是4k,和一个4Byte的 页表,则也需要4M(4* 2^(32-12))的页表驻留在存储器中。 如下图(虚拟存储器中)。虚拟存储器中,0-2047:表示已经分配出去2k个代码和数据的VM页,接下来6k个未分配的vm页,接下来1023个未分配的页,最后一个页用来做...
2018-12-05 20:06:20
779
原创 计算机系统总结之MMU工作原理【1】
1. mmu产生原因 许多年以前,当人们还在使用DOS或是更古老的操作系统的时候,计算机的内存还非常小,一般都是以K为单位进行计算,相应的,当时的程序规模也不大,所以内存容量虽然小,但还是可以容纳当时的程序。但随着图形界面的兴起还用用户需求的不断增大,应用程序的规模也随之膨胀起来,终于一个难题出现在程序员的面前,那就是应用程序太大以至于内存容纳不下该程序,通常解决的办法是把程序分割成许多称为...
2018-12-04 19:09:04
1287
原创 【数据结构】之内核链表
#include <string.h>struct list_head{ struct list_head *next,*pre;};#define LIST_HEAD(name) struct list_head name = {&(name),&(name)} void __list_add(struct list_head *new,st...
2018-11-29 18:49:45
140
转载 【转】【linux内核】linux调度算法--快速找到最优进程及时间片算法
为什么要了解内核的调度策略呢?呵呵,因为它值得我们学习,不算是废话吧。内核调度程序很先进很强大,管理你的LINUX上跑的大量的乱七八糟的进程,同时还保持着对用户操作的高灵敏响应,如果可能,为什么不把这种思想放到自己的应用程序里呢?或者,有没有可能更好的实现自己的应用,使得操作系统能够以自己的意志来分配资源给自己的进程?带着这两个问题来看看KERNEL。首先回顾上我们开发应用程序,基本上就两种类...
2018-11-13 16:56:01
335
转载 【转】【Linux 内核】内存管理(二)伙伴算法
https://blog.csdn.net/wenqian1991/article/details/27968779 通常情况下,一个高级操作系统必须要给进程提供基本的、能够在任意时刻申请和释放任意大小内存的功能,就像malloc 函数那样,然而,实现malloc 函数并不简单,由于进程申请内存的大小是任意的,如果操作系统对malloc 函数的实现方法不对,将直接导致一个不可避免...
2018-11-12 14:56:28
137
原创 nandflash linux 驱动
上一节讲述了nandfalsh的硬件时序图和基本的操作,本节分析一下nandfalsh的驱动。首先看下驱动的代码:你会发现和norflash的驱动非常像,其实就是实现了最基本的操作,读,写,擦除命令。然后递交给MTD。struct s3c_nand_regs { unsigned long nfconf ; unsigned long nfcont ; unsigned lon...
2018-11-06 15:26:43
177
原创 nand flash 分析
首先看下原理图:1.CE:片选信号。低电平有效。当我们开始操作这个nandflash时候拉低。操作结束后拉高。2. CLE:发命令信号,高电平有效。具体如下所示:3.ALE:发地址信号,高电平有效。可以发送要读或者要写信号的地址。3.WE:写信号。低电平有效。4.RE:读信号。低电平有效。5.D0-D7:数据信号。命令信号,地址信号,数据信号共用。分析写读nan...
2018-11-06 11:08:57
1901
原创 norflash linux 驱动
上一节已经了解了norfalsh的用法。这一节熟悉下norflash(xip结构)的用法。 首先看下图,MTD层已经帮我们做好了如何擦除falsh,怎么读flash,怎么写flash。我们写驱动主要就是告诉kernel,我们的norfalsh相关信息,来匹配MTD层函数。 块设备怎么读写,比如应用层open,write后发生什么,主要就是通过文件系统调用了ll...
2018-11-04 21:32:45
392
原创 norflash 分析
norflash 是一种xip(eXecute In Place结构,类似于sdram),读的速度自然比nandflash快很多,可以在norflash上执行相关程序,但是不能执行写操作(要发一些列写操作命令才能执行)。 以s3c2440为例,讲述norflash操作及启动过程。norflash接在片选0上,从cpu看到的地址0启动。 然后了解硬...
2018-11-02 16:02:42
1351
原创 中断处理流程
以s3c2440为例讲述,中断处理流程:1.开中断。产生外部中断。流程如下按键----->中断控制器------->cpu(总开关)* 按键:需要设置GPIO为中断模式,上升沿还是下降沿触发。* 中断控制器:* cpu:2.中断处理* 跳转到中断向量表。如果从nandflash启动,代码已经重定位到sdram,此时候是绝对跳转,会跳转的真正的0地址(...
2018-10-25 17:19:01
2618
转载 运行地址,链接地址,加载地址,存储地址 位置无关码、位置有关码
https://blog.csdn.net/linux_103/article/details/8888427 搞ARM开发时,在连接目标代码会提到运行地址和加载地址。这两者有什么区别呢?其次,网上也有说链接地址和存储地址,那么这四个地址之间有什么区别?1、运行地址<--->链接地址:他们两个是等价的,只是两种不同的说法。2、加载地址<--->存储地址:他...
2018-10-15 19:22:48
670
原创 linux reserved memory用法
主要做项目时候,需要分配一块连续的大的物理内存。1.kmalloc 不能分配那么大。2.alloc_pages MAX_ORDER为11,也就是最大分配2的11次方的页。reserverd memory在最开始时候分配好,这块内存不会再分配给kernel用。主要更改devicetree。 memory { device_type = "memory"; ...
2018-10-09 19:24:49
7809
1
原创 代码重定位
学习下重定位,做下总结吧。 首先,我们的代码经过预处理,编译(.s),汇编,链接后生成可执行的bin文件,通过反汇编就可以查看bin文件组成,依次为.text(代码段),.rodata(只读数据段),.data(数据段),.bss(未初始化数据)..common(注释)。 下面实验,bin文件download到norfalsh中,从norflash启动。...
2018-09-28 19:19:35
726
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人