自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(225)
  • 资源 (1)
  • 收藏
  • 关注

原创 V4l2框架分析

V4L2是Video for linux2的简称,为linux中关于视频设备的内核驱动。在Linux中,视频设备是设备文件,可以像访问普通文件一样对其进行读写。V4L2在设计之初时,是要支持很多广泛的设备的,如声卡, display, FB, I2C, camera等.它们之中只有一部分在本质上是真正的视频设备,也是造成V4l2源码冗余的原因之一。

2024-04-18 17:41:15 679 3

原创 camera驱动学习总结记录

几乎所有的设备都有多个 IC 模块,它们可能是实体的(例如 USB 摄像头里面包含 ISP、sensor 等)、也可能是抽象的(如 USB 设备里面的抽象拓扑结构),它们在 /dev 目录下面生成了多个设备节点,并且这些 IC 模块还创建了一些非 v4l2 设备:DVB、ALSA、FB、I2C 和输入设备。正是由于硬件的复杂性,v4l2 的驱动也变得非常复杂。特别是 v4l2 驱动要支持 IC 模块来进行音/视频的混合/编解码操作,这就更加使得 v4l2 驱动变得异常复杂。

2024-04-12 11:45:40 989

原创 彻底搞懂CPU特权级

每个计算机资源例如本文阐述的内存段(数据段,代码段,栈段)和核心存储结构(门描述符)都被操作系统打上了特权级标签,我们称这些内存资源的特权级为DPL,在文章里内存段特权级我们叫做段特权级(DPL_SEG),门描述符的特权级我们叫做门特权级(DPL_DOOR),通常我们访问内存段或者门描述符时,CPU特权级(CPL)必须高于或者等于内存特权级DPL(DPL_SEG和DPL_DOOR),从数值的角度看CPL

2024-03-05 15:22:17 903

原创 保护模式笔记九 中断门和IDT(中断描述符表)

所有保护模式索引链接:保护模式笔记一 保护模式介绍前面学习了调用门之后继续学习中断门中断门执行后会将EFL(标志位寄存器)中的IF标志位 置0,使CPU不再响应可屏蔽中断执行中断门时,分为两种情况:在没有权限切换时,只向堆栈中压入3个值:①CS;②EFL;③返回地址在涉及权限切换时,会向堆栈中压入5个值:①SS;②ESP;③EFL;④CS;⑤返回地址中断门不允许传递参数,调用门允许传递参数中断门通过INT N(索引)执行,调用门通过远调用 CALL FAR CS:EIP执行。

2024-03-04 14:22:26 946

原创 深入Linux内核(进程篇)—进程切换之ARM体系架构 简单总结

1. 调用switch_mm() 完成用户空间切换,刷新I-CACHE,处理ASID和TLB,页表转换基址切换(即把TTBR0寄存器的值设置为新进程的PGD);2. 调用switch_to() 完成内核栈及寄存器切换,分为保存现场和切换到下一个进程运行去运行。**其实ARM体系架构中涉及进程切换的寄存器只包含r4-r9,sl,fp,sp和pc寄存器。(不像x86还要涉及到gdt,ldt,TSS)**

2024-02-29 16:32:48 1153

原创 简单了解何为跳入保护模式

其实根本没有“跳入保护模式”这一说法。应该这样理解这句**中文**,首先设置CPU cr0寄存器开启保护模式,后边紧接着jmp跳转指令就会通过保护模式的方式寻址要执行的指令。

2024-02-28 15:13:13 819

原创 分段与分页,LDT与GDT,页目录表与页表简单的认识

1.cr3里保存页目录表的基址的地址类型为物理地址,页目录表里的每一项也是页表的物理地址。2.gdtr里保存的地址类型为线性地址。系统开机时,进入的实模式,这个时候如果想进入保护模式,必须先设置GDT表,所以首先是在实模式设置GDT表为进入保护模式做准备,这个时候当然用的都是物理地址。但进入保护模式后,分段启用,那些设置的物理地址就被当成线性地址使用了,所以GDT要设置成使得物理地址和线性地址等价。就linux来说,进入保护模式后利用实模式设置的那个临时GDT,开启分页,以后又再次重新设置了新的GDT。

2024-02-28 13:51:49 985

原创 【IMX6ULL学习笔记】Linux启动流程

ENTRY 指明了了 Linux 内核入口,入口为 stext,stext 定义在文件arch/arm/kernel/head.S 中。具体IMX6ULL内核启动流程分析看下面两篇文章:【IMX6ULL学习笔记】七、Linux 顶层Makefile。

2024-02-21 17:43:28 872

原创 32位Linux内核空间地址映射--------总结

对于32位机,总的来说物理内存被分为高端和地段内存两部分。我们可以使用virt_to_phys() 和 phys_to_virt() 方法用于896MB以下低端内存的虚拟地址和物理内存地址之间换算关系,高端内存的虚拟地址和物理内存地址之间不存在如此简单的换算关系。内核将高端内存划分为3部分:VMALLOC_START ~ VMALLOC_END、KMAP_BASE ~ FIXADDR_START和FIXADDR_START ~ 4G。对于高端内存的3部分,内存映射有三种方式:

2024-02-20 11:49:52 948

原创 DDR简单了解

DDR全称为 double data rate Synchronous Dynamic Random Access Memory 既DDR SDRAM。顾名思义需要依次了解这些名词DRAM, SDRAM, DDR, DDR2, DDR3, DDR4。

2024-02-16 15:46:02 812

原创 简单讲下makefile

例如makefile在解析myboot: mystart.o mylowlevel_init.o myboot.lds时,碰到mystart.o就会找mystart.s,碰到mylowlevel_init.o就会找mylowlevel_init.s。当然myboot.lds没有匹配到%.o,也就不会去找它的.s文件了。all依赖mystart.o和mylowlevel_init.o.这样makefile会首先检查编译两个依赖mystart.o和mylowlevel_init.o。

2024-02-16 11:58:06 356

原创 一个简单的链接脚本,用来将两个以上的.o文件合并在一起,以及如何看机器码的含义

下面是一个简单的lds链接脚本,用来将两个以上的.o文件合并在一起,并且用来指定链接后的代码加载到内存中的起始地址。以及如何查看机器码的含义。

2024-02-16 10:03:30 428

原创 VBAR设置方法

为 0 的话中断向量表基地址为 0X00000000,软件可以使用 VBAR 来重映射此基地址.

2024-02-15 16:05:47 483

原创 关于uboot的CONFIG_SPL_BUILD宏的一个小知识点(定义位置)

我们知道uboot分为BL0, BL1, BL2。其中BL0就是我们常说的ROM Code。BL1就是我们常说的SPL1,BL2就是我们常说的狭义的uboot。其中SPL 和uboot共用一个源码体系。他们之间的产生是通过一个重要的宏CONFIG_SPL_BUILD来在源码中分开的。

2024-02-15 14:33:40 380

原创 linux文件系统 - 初始化(三)

init程序的主要工作就是加载磁盘文件系统,将rootfs下重要的目录迁移到磁盘文件系统下,最后将内核根目录从rootfs切换到磁盘文件系统的根目录。根文件系统首先是一种文件系统,但是相对于普通的文件系统,它的特殊之处在于,它是内核启动时所mount的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行。我们首先从主机上所安装的Linux操作系统中了解一些根文件系统的信息。

2024-01-23 14:38:48 894

原创 linux文件系统 - 初始化(二) 转载

本文详细介绍了cpio格式的initrd文件,以及解压后各个目录的含义。initrd文件系统提供了init程序,在linux初始化阶段的后期会跳转到init程序,由该程序负责加载驱动程序和挂载磁盘文件系统以及其他的初始化工作。linux在代码段中定义了一个特殊的段initcall,该段中存放的都是函数指针;linux初始化阶段调用do_initcalls()依次执行该段的函数。关于该段的详细信息可以参见vmlinux.lds.S链接脚本。用户可以调用以下一组宏在initcall段中注册函数指针;

2024-01-23 14:22:17 1097

原创 linux文件系统 - 初始化(一)

linux文件系统初始化过程主要分为三个阶段:挂载rootfs,提供第一个挂载点''/;加载initrd,扩展VFS树;执行init程序,完成linux系统的初始化。下面会详细介绍每个阶段的主要内容。linux文件系统在初始化时,同时挂载了sysfs和rootfs文件系统,但是只有rootfs处于进程的命名空间中,且进程的root目录和pwd目录都指向rootfs的根目录。至此,linux的VFS已经准备好了根目录(rootfs的根目录’/'),此时用户可以使用系统调用对VFS树进行扩展。

2024-01-23 11:58:58 996

原创 Linux线程概述

所以由此可知,**任何一个进程都包含一个主线程**,只有主线程的进程称为单线程进程,譬如前面章节内容中所编写的所有应用程序都是单线程程序,它们只有主线程;既然有单线程进程,那自然就存在多线程进程,所谓多线程指的是除了主线程以外,还包含其它的线程,其它线程通常由主线程来创建(调用pthread_create 创建一个新的线程),那么创建的新线程就是主线程的子线程。

2024-01-23 11:09:34 819

原创 浅谈ARM嵌入式中的根文件系统rootfs

根文件系统和 Linux 内核是分开的,单独的 Linux 内核是没法正常工作的,必须要搭配根文件系统。根文件系统的这个“根”字就说明了这个文件系统的重要性,它是其他文件系统的根,没有这个“根”,其他的文件系统或者软件就别想工作。嵌入式会把rootfs保存在NAND flash或EMMC中。内核可以直接挂载Emmc中的rootfs;也可以使用uboot把rootfs加载到ramdisk中,挂载内存中的rootfs。

2024-01-22 15:03:21 941

原创 文件系统(六)—文件系统mount过程 转载

对于内核的Mount流程,内核定义了一个Mountpoint结构体表示跟文件系统中的一个挂载点,挂载点对应跟文件系统中的一个dentry实例,用户通过mount系统调用实现文件系统的挂载,其主要流程为:执行内核的挂载函数vfs_kern_mount:该函数主要是创建文件系统超级块super_block、根目录项dentry和inode结构体实例,并创建表示本次挂载操作的mount结构体实例,mount实例添加到超级块实例s_mounts成员链表中,并与挂载文件系统根目录项dentry建立关联。

2024-01-22 13:53:34 825

原创 Linux内核源码学习 Ext2文件系统布局,文件数据块寻址,VFS虚拟文件系统 转载

https://zhuanlan.zhihu.com/p/441979618文件系统中存储的最小单位是块( Block),一个块究竟多大是在格式化时确定的,例如 mke2fs 的 -b 选项可以设定块大小为 1024、 2048 或 4096 字节。而上图中引导块/自举块( Boot Block)的大小是确定的,就是 1KB,引导块是由 PC 标准规定的,用来存储磁盘分区信息和启动信息,任何文件系统都不能使用启动块。启动块之后才是 ext2 文件系统的开始, ext2 文件系统将整个分区划成若干个同样大小的

2024-01-22 11:25:43 821

原创 linux文件系统调用---mount(图例解析)转载

linux挂载文件系统主要分为三个阶段:创建源文件系统,查找目的文件系统的终于挂载文件夹并创建挂载节点。最后将源文件系统关联到挂载节点上。

2024-01-22 11:09:02 892

原创 浅谈linux中的根文件系统(rootfs的原理和介绍)【转】

[1*]处设置了根目录的名字为“/”;[2*]处设置了vfsmount中的root目录;[3*]处设置了vfsmount中的超级块;[4*]处设置了vfsmount中的文件挂载点,指向了本身;[5*]处设置了vfsmount中的父文件系统的vfsmount为本身;

2024-01-20 16:52:25 968

原创 写操作系统之开发加载器

这篇文章写的很好是理解操作系统加载部分的基础https://www.cnblogs.com/chuganghong/p/15415208.html从软盘中把操作系统内核读取到内存中。进入保护模式。把内存中的操作系统内核重新放置到内存中。执行操作系统内核。如果理解不了上面的部分语句,先搁置,后面会详细说明。先看loader的流程图。不必全部看懂。我觉得可能对读者理解后面的内容有帮助,所以先给出这张图。代码在加载kernel到内存中之前,先要有一个内核。我们马上写一个。下面的代码在文件kernel.

2024-01-19 16:50:47 850

原创 解析Linux中的VFS文件系统机制(根文件系统的由来)以及 ARM Linux启动流程-根文件系统的加载

《解析Linux中的VFS文件系统机制(根文件系统的由来)》 以及 《ARM Linux启动流程-根文件系统的加载》两篇文章都是好文章,但是第一篇缺少了rootfs的由来,让人觉得不能融会贯通,缺点火候。第一篇:试图从一个比较高的角度来解释 Linux 下的 VFS 文件系统机制,所以在叙述中更侧重于整个模块的主脉络,而不拘泥于细节,同时配有若干张插图,以帮助读者理解。第二篇:在Kernel启动的初始阶段,首先去创建虚拟的根文件系统(rootfs),接下来再去调用do_mount来加载真正的文件系统。

2024-01-19 15:02:03 987

原创 《30天自制操作系统》OS_30 day30主要代码及注解

要想看懂操作系统开始部分的代码,三个基本概念要记在心间。第一,CPU会按照代码在内存中的地址,一条一条地自动往下执行,直到碰到跳转或者是中断。跳开一些检查保护性的代码,尽量抓到程序的主干,思路不要被打断了。第二,是给CPU下指令时,只需要向CPU的特定寄存器写入数值即可,当特定寄存器的数值改变时,CPU就会自动执行相应的操作。第三,是理解分段机制,在CPU进入保护模式后,所有的变量代码都会保存在固定的段中。相应地所有代码和变量的寻找都是通过段基址+段内偏移来寻址的(也就是通过线性地址来寻址)。

2024-01-19 11:38:28 394 2

原创 段描述符SEGMENT_DESCRIPTOR了解

英特尔的设计者们非常巧妙地在段属性里设置了一个标志位,叫做Gbit,如果Gbit = 1,那么limit的单位不再是byte,而是page,在CPU中,1 page就是4 KB。接下来,我们将段上限的低16位存在limit_low中,高4位存在limit_high的低4位中。(3)段的属性:即段的访问属性,用12位来保存,其中,高4位放在limit_high的高4位中,低8位存在assess_right中。这4位由“GD00”构成,其中G是指Gbit,D是指段的模式(1指32位模式,0指16位模式)。

2024-01-19 11:15:15 319

原创 浅谈CPU进入保护模式的方法

不同的操作系统作者有自己的方法,代码看起来也是有很大差异。但是让CPU进入保护模式最终还是要向GdtPtr寄存器中写入全局描述表GDT地址。以及向CPU下达切换保护模式的指令,也就说向CPU的CR0寄存器写如固定的值。看程序要想思路不乱,最重要的就是要抓到程序的主线,不要被一些只是用来保护的代码打乱。比较法学习代码是比较有效的,比如对于CPU如何进入保护模式的理解。下面这篇博主是这样解释进入CPU进入保护模式的。上面两部就是CPU进入保护模式的必要条件。

2024-01-19 09:21:51 378

原创 《30天自制操作系统》学习笔记(七)

如果要让一个中断处理程序发挥作用,首先要将其注册到idt中,书中使用了函数set_gatedesc(idt+0x21,(int)asm_inthandler21,2*8,AR_INTGATE32)2。版权声明:本文为CSDN博主「qq_35041101」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。即将_asm_inthandler21注册为idt的第21号,如果发生中断了,cpu就会自动调用asm_inthandler21。根据书中的描述,整个项目的编译过程如图。

2024-01-18 15:08:18 563

原创 进程上下文的概念和切换简单通俗的解释

进程上下文是进程执行活动全过程的静态描述。我们把已执行过的进程指令和数据在相关寄存器与堆栈中的内容称为进程上文,把正在执行的指令和数据在寄存器与堆栈中的内容称为进程正文,把待执行的指令和数据在寄存器与堆栈中的内容称为进程下文。实际上linux内核中,进程上下文包括进程的虚拟地址空间和硬件上下文。原文链接:Linux内核进程上下文切换深入理解。

2024-01-16 17:44:17 333

原创 《深入分析Linux内核源代码》读后感 --所有的进程都使用相同的逻辑地址空间,那么不同的进程是如何区分自己的数据段和代码段的呢

书中讲到从2.2版开始,Linux让所有的进程(或叫任务)都使用相同的逻辑地址空间,每个进程的逻辑地址空间范围为0~4GB,而且段基址也一样。那么不同的进程是如何区分自己的数据段和代码段的呢。看到另外一篇博文介绍了:linux使用了物理内存写时复制的机制。原来是因为写时复制的机制让不同的进程区分自己的代码和数据的。下面分两半部分,分别介绍一下linux的分段机制和写时复制机制。学习就需要融会贯通。

2024-01-16 17:20:58 832

原创 《ARM Linux内核源码剖析》读书笔记——0号进程(init_task)的创建时机

最近在读《ARM Linux内核源码剖析》,一直没有看到0号进程(init_task进程)在哪里创建的。直到看到下面这篇文章才发现书中漏掉了set_task_stack_end_magic(&init_task)这行代码。下面这篇文章提到:start_kernel()上来就会运行 set_task_stack_end_magic(&init_task)创建初始进程。init_task是静态定义的一个进程,也就是说当内核被放入内存时,它就已经存在,它没有自己的用户空间,一直处于内核空间中运行

2024-01-13 17:24:37 1080 2

原创 浅谈Linux文件系统逻辑结构图

而files_struct结构体中保存着该进程已经打开的文件数组fd_arrays[fid],我们在程序中使用open命令打开的文件就会保存在这个数组中。fs_struct结构体中root指向本进程的“根目录”,即root所指向的dentry结构体代表着本进程的“根目录”,也就是当用户登录进入系统时所“看到”的根目录。2.就是动态的文件系统,指的是被进程挂载后的文件系统,这时文件系统存储分为两部分,躺在磁盘中的文件和目录的集合,已经在内存高速缓冲区中的一个镜像。下面分别解释这两个结构体。

2024-01-03 09:16:50 378

原创 在imx6ull中加入ov5640模块

NXP原厂提供ov5640.c文件也需要替换成正点原子出厂的ov5640.c。不然影像花屏,无法辨认物体。替换后影像清楚很多可以辨认物体了。重新使用正点原子手册《I.MX6U嵌入式Linux C应用编程指南V1.4.pdf》第三十四章 实战小项目之视频监控,把影响调试了出来。当然,仅仅配置那两项肯定是不行的,经过了几次尝试后后发现能让影像输出的配置如下。本来觉得是一件很简单的事情但是走了很多的弯路,记录一下调试过程。

2023-12-08 16:06:18 1207 5

原创 stm32mp157和imx6ull在设备树节点上设置ap3216c的主要区别

设备树格式:stm32mp157使用的设备树格式是Device Tree Compiler(DTC)格式,而imx6ull使用的是Flattened Device Tree(FDT)格式。stm32mp157和imx6ull在设备树节点上设置ap3216c的主要区别是,它们使用的不同的硬件架构和不同的设备树格式。总体上来说,stm32mp157和imx6ull之间的差异在于它们所用的硬件架构和设备树格式,但在设置ap3216c设备树节点时,它们的区别不大。/* 读取ALS传感器的数据 */

2023-12-04 09:48:59 1028

原创 Linux多核飞控

因此,在飞控系统中,可以使用Linux作为主操作系统,在处理高计算量和大内存需求的任务时使用多核支持。同时,在实时控制和导航等需要高实时性的任务中,可以使用FreeRTOS运行在不同核心上,并使用其多核支持进行调度。Linux通常用于具有较高计算量和较大内存需求的系统,而FreeRTOS通常用于较小的嵌入式系统,其主要任务是对实时性要求高的任务进行调度。总之,Linux多核飞控系统是一种高性能、灵活、可扩展和易维护的飞控系统,可以为飞行器提供更好的控制和导航能力。下编译好的.elf 文件。

2023-12-02 15:48:33 684

原创 pinctrl_hog_1 子节点所使用的 PIN 配置信息MX6UL_PAD_UART1_RTS_B__GPIO1_IO19 0x17059解析

mux_reg寄存器值,在这里就相当于设置IOMUXC_SW_MUX_CTL_PAD_UART1_RTS_B 寄存器为 0x5,也即是设置 UART1_RTS_B 这个 PIN 复用为 GPIO1_IO19。0x020e0000+0x0090=0x020e0090,IOMUXC_SW_MUX_CTL_PAD_UART1_RTS_B 寄存器地址。这个就是寄存器 IOMUXC_SW_PAD_CTL_PAD_UART1_RTS_B 的地址。:input_reg 寄存器值,在这里无效。

2023-11-28 09:25:06 1007

原创 开发板启动进入系统以后再挂载 NFS 文件系统, 这里的NFS文件系统是根据正点原子教程制作的ubuntu_rootfs

如果是想开发板启动进入系统以后再挂载 NFS 文件系统,开发板启动进入文件系统,开发。cd进入mi,执行mount.sh即可切换到nfs文件系统。ls mi/查看挂载的nfs文件系统内容.

2023-11-23 11:25:21 443

原创 linux使用spi读取icm20608传感器数值一直显示0

这个问题困扰了我两天,ICM20608 ID 读出的数值一直为 0X0。后来发现是cs-gpio少些了一个s。改后就可以读到ID值了。

2023-11-17 09:47:37 145 2

原创 解决!!VMware Workstation failed to start the VMware Authorization Service.解决办法

不小心改了一下window下虚拟机安装盘符,显示VMware Workstation failed to start the VMware Authorization Service。解决方法就是把虚拟机器run as administrator.然后从新在VMware里面重新加载ubuntu.

2023-11-04 16:11:49 255

BLE协议,BLE协议

BLE协议

2024-01-13

数字信号处理C语言程序集

数字信号处理C语言程序集,<br>这是想用C语言进行信号处理编程的必看资料.

2008-07-04

空空如也

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

TA关注的人

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