自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(38)
  • 收藏
  • 关注

原创 Linux进程调度——schedule函数分析

近期准备分析一下Linux进程调度相关内容,计划从以下几个方面来分析。

2023-07-07 19:30:57 1536 2

原创 Linux自旋锁使用场景分析

的时候,禁止内核抢占如果涉及到中断上下文的访问,spinlock需要和禁止本CPU。

2023-06-11 13:19:25 846 2

原创 Linux: 进程标准输入输出设备描述符

这两个文件都对应终端的屏幕。进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。返回的新文件描述符一定是当前可用文件描述符中最小数值,该新的描述符是传递给它的描述符的拷贝,这意味着这两个描述符共享同一个数据结构。进程本身是从原来的终端继承过来的,所以要先关闭0设备节点,然后打开获取到名字的。过程中,子进程将继承 shell 程序打开的文件描述符表,所以。进程完成了标准输入、输出、错误的文件打开。打开的进程,都将会继承当前的标准输入输出。

2023-06-10 11:56:46 1094 2

原创 armv7如何触发pabt以及undef(未定义指令)

rtos系统上调试armv7架构异常处理时,为了触发pabt和undef煞费苦心。下面把需要的操作分享出来。

2023-06-07 17:07:34 164

原创 arm32栈回溯原理学习以及示例代码

简单介绍下传统栈回溯原理,方便理解。

2023-02-04 13:06:48 1060

原创 zImage自解压过程解析

zImage自解压过程解析编译过程参考  上文链接中解释了编译生成镜像过程,本文主要分析内核zImage自解压过程。  zImage包含了自解压程序和内核镜像程序。  自解压程序的链接文件位于 arch/arm/boot/compressed/vmlinux.lds.S。链接脚本指定了程序入口ENTRY(_start)。  程序入口位于arch/arm/boot/compressed/head.S。自解压程序head.S需要确认解压后的内核映像绝对地址。* (1)定义了CONFIG_AUTO_Z

2023-02-04 12:19:59 456

原创 如何在编辑代码时快速打开文件所在文件夹(兼容所有IDE)

分享快速打开在编辑文件所在文件夹方法

2023-01-17 16:59:13 185

原创 Linux内核EXPORT_SYMBOL宏解析

Linux内核EXPORT_SYMBOL宏定义解析,以及链接脚本说明

2022-08-27 13:14:46 915

原创 Linux arm进程内核空间页表同步机制

Linux arm进程内核空间页表同步机制进程创建内核页表修改页表项同步  本文针对ARM32处理器进行说明。内核页表: 即书上说的主内核页表,在内核中其实就是一段内存,存放在主内核页全局目录init_mm.pgd(swapper_pg_dir)中,硬件并不直接使用。进程页表: 每个进程自己的页表,放在进程自身的页目录task_struct.pgd中。进程创建  进程创建,frok时会拷贝内核页表到当前进程页表中。调用关系:do_dork->copy_process->copy_m

2021-11-20 12:28:41 1529

原创 /proc/meminfo VmallocUsed为0问题

/proc/meminfo VmallocUsed为0问题说明总结说明  /proc/meminfo可以用来计算用户态内存占用,内核态内存占用(包含slab占用和vmalloc占用等),以及黑洞内存占用。像free命令也是通过cat /proc/meminfo来获取内存使用情况的。  meminfo节点中存在Vmalloc统计功能,用于统计vmalloc区域使用情况。最近在4.9版本内核调试过程中,发现VmallocUsed、VmallocChunk两项值均为0。  随后去查看了内核源码,这两项直接

2021-10-31 10:36:01 828

原创 Linux SPI驱动框架(4)——spi-mem驱动

@[TOC](Linux SPI驱动框架(4)——spi-mem驱动)前言  spi-mem驱动为SPI存储器生态带来一些一致性,该框架实现了在spi nor设备、spi nand设备、以及常规spi外设上复用spi控制器驱动。Kernel版本:5.14.9SPI控制器驱动  传统内核中,spi nor有单独的驱动,芯片厂商根据使用的spi控制器驱动,实现对应的spi-nor驱动。spi-nor驱动只分为driver和core层。但是这种情况下,该spi控制器,就不能再提供给其他外设使用了。以及随

2021-10-17 11:28:31 3649

原创 Linux使用addr2line工具定位内核崩溃(oops)代码位置

Linux使用addr2line工具定位内核崩溃(oops)代码位置示例定位异常代码行示例在驱动代码中增加空指针操作,内核崩溃[ 5.529101] Unable to handle kernel NULL pointer dereference at virtual address 00000000[ 5.529266] pgd = c0004000[ 5.529323] [00000000] *pgd=00000000[ 5.529780] Internal erro

2021-09-11 12:28:08 3453

原创 Linux内存子系统——分配物理页面(alloc_pages)

Linux内存子系统——分配物理页面(alloc_pages)分配页面  内核中常用的分配物理内存页面的接口函数是alloc_pages(),用于分配一个或多个连续的物理页面,分配的页面个数只能是2的整数次幂。  诸如vmalloc、get_user_pages、以及缺页中断中分配页面,都是通过该接口分配的物理页面。分配页面  alloc_pages函数有两个参数,一个是分配掩码gfp_mask,另一个是分配阶数order。[include/linux/gfp.h]#define alloc_p

2021-08-22 22:36:04 4543

原创 Linux内存子系统——vmap/vmalloc

Linux内存子系统——vmalloc重要数据结构vm_structvmap_areavmalloc初始化vmalloc接口分析__get_vm_area_nodealloc_vmap_area__vmalloc_area_nodemap_vm_areavmap接口  vmap机制,将不连续的物理内存页框映射到连续的虚拟地址空间中。vmalloc是一个接口函数, 使用vmap机制在虚拟内存中连续但在物理内存中不一定连续的内存。  vmalloc函数原型如下,只需要一个参数,以字节为单位。:void *

2021-07-31 13:40:44 1614

原创 Linux页表与ARM硬件页表

Linux页表与ARM硬件页表说明ARM二级页表映射关系说明Kernel版本:4.0.0ARM处理器,Contex-A9,QEMU平台  内核初始化arm页表的内容,low_memory映射过程,之前也大概写了。但是在arm平台中,引入了硬件页表、linux页表的概念,本文描述为何要这样处理,以及内核、arm硬件页表属性进行说明。  参考书籍《奔跑吧Linux内核:基于Linux4.x内核源代码问题分析》2.2.1 ARM32页表映射。ARM二级页表映射关系  Linux中ARM32位架构采用

2021-07-31 10:10:53 1553 1

原创 linux /dev/mem /dev/kmem驱动分析

/dev/mem说明驱动注册用户空间调用mmap方法/dev/mem/dev/kmem说明/dev/mem”是linux系统的一个虚拟字符设备,无论是标准linux系统还是嵌入式linux系统,都支持该设备。 物理内存的全镜像。可以用来访问物理内存/dev/kmem: kernel看到的虚拟内存的全镜像。可以用来访问kernel的内容。kernel部分内存用户空间本不可访问。但是因为所有进程共享内核空间的页表。所以内核虚拟地址对应物理地址是确定的。kmem的作用即是根据kernel的虚拟地址,找到对应

2021-07-18 14:21:23 2451

原创 Linux内存初始化(4)——伙伴系统(buddy)

Linux内存初始化说明mm_initmem_initfree_all_bootmem相关文章说明Kernel版本:4.0.0ARM处理器,Contex-A9,QEMU平台  上文完成了zone的初始化工作,接下来需要初始化伙伴系统(Buddy系统)。mm_init  mm_init函数,主要对内核内存分配器进行初始化。start_kernel->mm_init/* * Set up kernel memory allocators */static void __init mm

2021-06-27 17:59:30 979

原创 u-boot给内核传参说明

u-boot给内核传参说明machine_desc数据结构代码初始化小结  众所周知,u-boot传递给内核三个参数,即通过r0、r1、r2寄存器传递给内核。并且,r0的值暂时没有用到,缺省放0。  那么本篇文章主要来讲一下r1和r2的值寄存器含义R1机器号,标识计算机系统的型号R2ATAGS or dtb  说明:关于内核从head.S汇编执行到start_kernel部分这里就不介绍了。最终执行到start_kernel时。r1被赋值给__machine_arc

2021-06-26 10:57:01 1043

原创 zImage/uImage编译过程解析

uImage生成过程编译打印  为什么要用uImage,为什么不直接用未压缩的Image/vmlinux镜像?  嵌入式设备由于成本限制,flash容量往往十分紧张,所以在存放固件时,需要对固件进行压缩处理。  时间换空间,解压缩时花费更多的时间(增加启动时间,节省存储空间)。uImage/zImage应运而生。编译打印 LD vmlinux SYSMAP System.map SYSMAP .tmp_System.map OBJCOPY arch/arm/boot/I

2020-11-01 13:38:33 575

原创 Linux usleep不准问题排查

Linux usleep不准问题排查参考文章测试代码系统调用clock_event中断服务函数usleep不准问题说明流程梳理原因分析解决方案  最近在工作中遇到了一个应用程序usleep不准的问题,排查过程中了解了一下usleep的内核实现,简单的讲一下低精度模式下的usleep机制。  先把最终结论贴出来,内核使能CONFIG_HIGH_RES_TIMERS选项,且平台支持高精度定时器模式,即可解决该问题。  下面主要来分析为什么在未使能高精度定时器的情况下,usleep不准的问题。参考文章可

2020-07-25 22:35:40 6925 2

原创 Linux内核ARM架构异常中断向量表

Linux内核ARM架构异常中断向量表说明ARM中异常中断的种类ARM异常中断向量表内核异常向量表异常向量表跳转vector_srub宏内核启动建立异常向量表  当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行。在异常中断处理程序执行完成后,程序返回到发生中断的指令的下一条指令处执行。说明Kernel版本:4.14.111ARM处理器,Contex-A7ARM中异常中断的种类  ARM体系中的异常中断下图所示ARM异常中断向量表  ARM的异常中断向量表可以是

2020-07-18 13:21:34 3592 1

原创 Linux内核如何生成system.map

  编译Linux内核时,会生成System.map文件,它记录了所有代码的运行地址。本文主要说明内核如何生成这个System.map文件。  顺便扩展下思路,在编写应用程序时,如何参考内核这一机制,生成符号文件。  System.map文件生成的脚本路径位于内核目录scripts/mksysmap,mksysmap文件内容也非常简单,话不多说上代码:#!/bin/sh -x# Based on the vmlinux file create the System.map file# System

2020-07-14 22:26:56 2652

原创 Linux内存初始化(3)——pglist_data/zone初始化

Linux内存初始化说明重要数据结构struct pglist_datastruct zonebootmem_initzone_sizes_initfree_area_init_nodecalculate_node_totalpagesalloc_node_mem_mapfree_area_init_core总结数据结构调用关系相关文章说明Kernel版本:4.14.111ARM处理器,Contex-A7,四核(arm32)  接上文paging_init,对bootmem_init进行说明。  

2020-07-05 17:05:45 1907

原创 Linux内存初始化(2)——paging_init初始化

Linux内存初始化说明paging_initprepare_page_tablemap_lowmemcreate_mapping概念说明重要数据结构create_mapping代码实现重要说明说明Kernel版本:4.14.111ARM处理器,Contex-A7,四核(arm32)Linux内存初始化(1)——memblock初始化  在上文中,跳转到start_kernel前,已知,内核已创建了kernel、dtb的线性映射,即内核可以访问自己代码段等区域,并能访问dtb所在内存区域的虚拟地址

2020-07-05 12:53:47 1354 1

原创 Linux等待队列分析

Linux等待队列分析说明数据结构等待队列操作定义并初始化“等待队列头”等待事件唤醒队列   在Linux驱动程序中,可以使用等待队列(Wait Queue)来实现阻塞进程的唤醒。等待队列很早就作为一个基本的功能单位出现在Linux内核里了,它以队列为基础数据结构,与进程调度机制紧密结合,可以用来同步对系统资源的访问。说明kernel版本:4.14.111数据结构struct wait_queue_head { spinlock_t lock; struct list_head head;

2020-07-04 11:25:35 217

原创 Linux内存初始化(1)——memblock初始化

Linux内存初始化说明物理内存大小说明Kernel版本:4.14.111ARM处理器,Contex-A7,四核物理内存大小  一般情况下,内存大小设置有两种方法,通过设备树设置,或者通过bootargs设置。1)通过dtb设置...

2020-06-27 22:59:34 2378 1

原创 mount系统调用(sys_mount)分析

sys_mount分析sys_mount代码分析   Linux下任何块设备在使用之前,首先要对其进行格式化成特定文件系统,如mkfs.ext4等,   又如ramdisk设备,在内核初始化时,会指定内存虚拟成ext2文件系统格式的块设备。挂载时以ext2格式文件系统挂载。   然后再将其挂载到系统中特定目录下,于是通过该挂载点即可访问该块设备文件系统下的所有文件和目录等。如 mount -t jffs2 /dev/mtdblock0 /home/test,便将设备/dev/mtdblock0 挂载

2020-05-11 23:08:41 2528 1

原创 Linux mmc驱动框架(4)——卡检测及初始化

Linux mmc驱动框架卡检测函数`mmc_rescan``mmc_rescan->mmc_rescan_try_freq`SDIO卡`mmc_rescan->mmc_rescan_try_freq->mmc_attach_sdio`SD卡`mmc_rescan->mmc_rescan_try_freq->mmc_attach_sd`MMC卡`mmc_rescan-...

2020-02-25 22:25:06 2015

原创 Linux mmc驱动框架(3)——host驱动初始化

Linux mmc驱动框架Host驱动设备树Host驱动platform_driver数据结构初始化第一阶段Host驱动设备树  host驱动设备树用于匹配host驱动,host驱动匹配上设备树,初始化流程才能开始。本文举例全志H3设备树以及mmc控制器驱动。  下面的代码段都是一些基本配置,compatible用于与驱动匹配,reg为控制器IO内存地址。interrupt为中断参数,GIC...

2020-02-25 22:20:07 1347 1

原创 Linux mmc驱动框架(2)——重要数据结构

概述数据结构描述struct mmc_host用来表示一个mmc host控制器struct mmc_card用来表示一个mmc设备(卡)struct mmc_driver用来表示 mmc 卡驱动struct mmc_bus_ops总线操作函数集, 有mmc、sd、sdio三种struct mmc_host_opsHost控制器操作函数集,用...

2020-02-25 21:29:42 1069

原创 Linux mmc驱动框架(1)——基本概念

Linux mmc驱动框架SD/MMC/SDIO基础概念的介绍SD/MMC/SDIO基础概念的介绍  SD/MMC/SDIO基础概念的介绍网上可以找到很多,就不重复造轮子了,推荐一篇我觉得写的比较好的介绍文章。链接: SD/MMC/SDIO基础概念的介绍....

2020-02-23 21:06:04 1493

原创 Linux/Android多点触控

1、input事件  对于所有的input设备,报告input事件时候都分这么几部分,首先在probe函数中设置设备发送的事件类型、按键类型,设置设备一些属性信息。然后在发送事件时候要根据probe的设置来发送事件,否则就会被判为无效忽略掉。  input子系统事件分为type、code、value三部分。type表示事件的类型,按键、绝对坐标等。code表示键值、触摸坐标等。value表示数...

2019-12-29 19:50:35 1288

原创 Linux文件系统——/etc配置文件

  之前ramdisk制作传送门Linux文件系统——ramdisk根文件系统制作  今天来讲一下/etc目录下文件系统配置文件/etc/inittab  inittab是init进程初始化时需要读取的配置文件。/etc/inittab文件中每个登记项的结构都是一样的,共分为以冒号“:”分隔的4个字段.具体如下:identifier : run_level : action : proc...

2019-12-11 22:44:47 865

原创 程序是如何运行的——基于linux-ARM架构

  本文基于arm架构,通过一些简单的C语言demo,编译成汇编语言,通过对汇编语言进行解析,从而解释程序是如何在cpu核上运行的。  arm各个模式寄存器如下图:  本文不对arm寄存器进行详细的解释。具体可度娘关键词“arm寄存器”  linux内核工作在svc模式,应用程序工作在User模式。本文demo都为linux应用程序,所以都工作在User模式下。基本概念介绍:1,R0-...

2019-12-10 22:28:35 758

原创 Linux文件系统——ramdisk根文件系统制作

ram disk介绍  ram disk顾名思义,内存磁盘。我们平常接触的一些存储介质,如:nor flash、nand flash、emmc、ufs、以及机械硬盘固态硬盘等,都是用来存储数据的,同理内存也是可以当成磁盘来存储数据的,唯一不同的就是ram是掉电不保存的,而前面提到的那些存储介质掉电都是保存数据的。  我们都知道,在linux中,上面介绍的flash这些存储介质,都是需要有对应的...

2019-11-28 23:18:38 7756 3

原创 Linux SPI驱动框架(3)——设备驱动层

SPI设备驱动层  Linux SPI驱动框架(1)和(2)中分别介绍了SPI框架中核心层,和控制器驱动层。其实实际开发过程中,不是IC原厂工程师比较少会接触控制器驱动层,设备驱动层才是接触比较多的。  本文以内核中spidev设备驱动为例,对基于设备树的SPI设备驱动进行简单的讲解。  spidev驱动代码位于/drivers/spi/spidev.cspidev设备驱动spidev设...

2019-11-17 20:54:20 2663

原创 Linux SPI驱动框架(2)——控制器驱动层

SPI控制器驱动层  上节中,讲了SPI核心层的东西,这一部分,以全志平台SPI控制器驱动为例,对SPI控制器驱动进行说明。SPI控制器驱动,即SPI硬件控制器对应的驱动,核心部分需要实现硬件SPI数据收发部分功能。这样SPI设备驱动,才能通过SPI读写数据。  下面一起来看一下全志平台的SPI控制器驱动。设备树  SPI是一种平台特定的资源,所以它是以platform平台设备的方式注册...

2019-11-14 23:09:14 1654

原创 Linux SPI驱动框架(1)——核心层

概述linux SPI驱动框架主要分为核心层,控制器驱动层以及设备驱动层。具体结构可参考下图图中,最下层是硬件空间,SPI总线控制器,总线控制器负责硬件上的数据交互,...

2019-11-08 21:33:55 2422 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除