自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux学习笔记协议篇(三):I2C内核子系统分析(下)

方法时,优先调用总线级别的probe函数(dev->bus->probe),如果没有总线probe,则调用驱动自己的probe函数(drv->probe),控制适配器(imx主机)和客户机(mag3110从机)实现I2C通信,传输数据以实现功能。遍历现有 I2C 适配器,立即处理可能匹配的设备(而非等待热插拔事件)。(2)若驱动声明支持异步探测(probe),通过。下的文件时,内核会自动调用对应的函数(如。扫描所在总线上的设备,匹配后调用驱动的。即扫描所在总线上的设备,匹配后调用驱动的。

2025-04-12 20:23:57 321

原创 Linux学习笔记协议篇(二):I2C内核子系统分析(上)

主机、从机、以及主机和从机之间一系列操作的集合Linux系统中,根据Linux设计的软硬件分离思想,当硬件发生变化时,上层的控制逻辑需要保持不变。

2025-04-11 23:33:39 908

原创 Linux学习笔记协议篇(一):IIC通信原理

仲裁可以持续多位,它的第一个阶段是比较地址位,如果每个主机都尝试寻址相同的器件,仲裁会继续比较数据位(如果是主机-发送器),或者比较响应位(如果是主机-接收器)主机只能在总线空闲的时侯启动传输,两个或多个主机可能在起始条件的最小持续时间内产生一个起始条件,结果在总线上产生一个规定的起始条件。因为I2C总线的地址和数据信息由赢得仲裁的主机决定,在仲裁过程中不会丢失信息,丢失仲裁的主机可以产生时钟脉冲直到丢失仲裁的该字节末尾。(4) 根据地址字节中的方向位,确定的数据发送方(发送器)(2)主机发送一个字节的。

2025-04-09 22:58:09 506

原创 Linux学习笔记(四):Linux启动从kernel_init到kernel_execve切换到用户态init进程

在完成这些基础初始化后,start_kernel()会调用rest_init()函数进行最后的启动准备。在Linux内核启动过程中,当进入C语言执行阶段后,系统会调用start_kernel()函数进行核心初始化。这三种方式按照优先级依次尝试,只有当高优先级方式不可行时才会尝试下一级方式,最终确保系统总能启动一个用户空间进程。这些进程的创建标志着内核从初始化阶段转入正常运行阶段,开始提供完整的操作系统服务。

2025-04-07 22:52:01 505

原创 Linux学习笔记(三):Linux启动从rest_init 到 kernel_init创建1号进程(上)

在 kernel_clone --> copy_process 的调用.flags=CLONE_VM|CLONE_FS|CLONE_UNTRACED,表示此时子进程与父进程共享文件系统信息,以及共享内存空间。:如果子进程和父进程属于同一个线程组(CLONE_THREAD被设置),那么子进程必须共享父进程的信号(CLONE_SIGHAND被设置)。如果创建的是线程,直接返回0。如果子进程共享父进程的信号,那么必须同时共享父进程的内存描述符和所有的页表(CLONE_VM被设置)。

2025-04-06 02:10:12 899

原创 Linux学习笔记(二):Linux启动第二阶段---从start_kernel到rest_init创建1号2号进程概述

先创建一个1号进程和2号进程,用作用户态进程的祖先和内核态进程祖先,以及管理用户态和内核态进程,同时开启调度系统并创建一个空闲进程。循环调用do_idle() ,是 Linux 内核空闲任务(idle task)的核心实现,是 CPU 空闲时执行的低功耗循环,主要职责:在无任务可调度时进入低功耗状态;此时kernel_init函数运行在内核态,后续通过execve系统调用实现态切换,从原内核线程转变为用户空间init进程,是用户态所有进程的祖先。负责所有内核进程的调度和管理,是内核所有进程运行的祖先。

2025-04-05 14:00:20 509 1

原创 Linux学习笔记(一):Linux启动第一阶段---Head.S汇编阶段(硬件环境准备)

参考代码:linux-6.6.10

2025-04-04 14:08:51 843

原创 UBOOT学习笔记(七):UBOOT启动--从main_loop()到跳转到kernel入口点(UBOOT完结篇)

第78-84行do_bootm_states:调用do_bootm_states执行各个BOOT 阶段–BOOTM_STATE_OS_PREP 、BOOTM_STATE_OS_FAKE_GO 和BOOTM_STATE_OS_GO。**第534-551行,**调用bootm_start、bootm_find_os、bootm_find_other、bootm_disable_interrupts、bootm_load_os等,start 和 end这两个指针,用于存放解析出的内核映像的起始和结束地址。

2025-03-30 22:25:00 691

原创 UBOOT学习笔记(六):UBOOT启动--CPU架构及板级初始化阶段

考虑到以上情况,uboot的relocation动作会把自己本身relocate到ddr上(前提是在SPL的过程中或者在dram_init中已经对ddr进行初始化了),并且会relocate到ddr的顶端地址使之不会和kernel的冲突。(1)CPU 和基础外设初始化(初始化 CPU、时钟、串口、定时器等基础硬件)→ arch_cpu_init、timer_init、serial_init。ldr r0, =(CONFIG_SYS_INIT_SP_ADDR) 加载主 U-Boot 的默认栈地址到 r0。

2025-03-30 15:55:25 964

原创 UBOOT学习笔记(五): UBOOT汇编启动阶段

根据u-boot.lds可以了解到,所有程序的入口点都是 _start 符号, _start 位于u-boot-2020.01/arch/arm/lib/vectors.S函数里:具体代码如下:因此,可以看出当发生复位时,硬件会自动跳转到_start地址,然后根据向量表执行b reset,进入reset处理函数(在start.S中定义)reset函数是U-Boot启动过程中最先执行的代码,负责将系统从硬件复位状态初始化到可以运行C代码的环境。下面我将详细分析reset函数的功能和执行流程。其中:提供

2025-03-29 23:46:25 957

原创 UBOOT学习笔记(四): UBOOT结构及入口点分析 -- u-boot.lds

段是链接脚本中最核心的代码段,负责存放所有可执行代码。在U-Boot的ARM架构链接脚本中,该段中可以了解到:(1)u-boot 的设计中需要将 u-boot 的镜像拷贝到 ram(sdram,ddr…)中执行,这里表示复制的开始地址(2)ARM复位向量必须位于0x00000000(3)中的代码必须在其他C代码之前执行。

2025-03-29 23:33:53 301

原创 UBOOT学习笔记(三): UBOOT阶段整体流程(基于imx6ull ARMV7)

以上是U-Boot从启动到加载内核的完整函数调用流程,具体实现可能会根据不同的CPU架构、SoC平台和开发板有所调整。

2025-03-29 23:30:41 166

原创 UBOOT学习笔记(二):SoC启动BootROM阶段

BootROM(引导只读存储器)是SoC芯片启动时最先执行的固化代码,由芯片厂商预先烧录,不可修改。它的核心任务是完成最基础的硬件初始化,并加载下一阶段引导程序(如SPL/U-Boot)

2025-03-29 23:28:30 731

原创 UBOOT学习笔记(一): Soc启动流程概述

ARM 架构的嵌入式系统中,BOOTROM、SPL 和 U-Boot 三者构成一个分层次的启动链,各司其职,共同完成从芯片上电到操作系统加载的全过程。以下是它们的核心关系解析:

2025-03-29 23:00:02 755

空空如也

空空如也

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

TA关注的人

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