自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 VitualBox添加串口调试的步骤

在VirtualBox中安装了Linux虚拟机,为了ssh链接方便调试内核:虚拟机配置,打开串口,取消勾选:

2025-07-27 11:40:06 166

原创 单向屏障Acquire和Release语义

Acquire和Release内存语义详解 摘要:Acquire语义构建单向内存屏障,确保后续读写操作不会重排到屏障前,保证数据一致性。它要求屏障后的内存访问必须基于最新同步状态。Release语义则确保屏障前的操作完成并可见,防止重排到屏障后。二者协同工作:Release方推送修改到内存,Acquire方获取最新数据视图。ARM64通过STLR、STLXR等指令实现这些语义,为并发编程提供关键的内存顺序保证。(150字)

2025-07-23 09:39:00 556

原创 ARM64高速缓存Cache类型

摘要:ARM64架构提供了专门的高速缓存管理指令集,包括DC(数据缓存)和IC(指令缓存)两类指令,支持对缓存行的无效化、清除和清零操作。这些指令可针对不同范围(全缓存、特定地址或组/路)和一致性级别(PoC/PoU)进行操作。Linux内核实现了相应的缓存管理接口函数,如flush_cache_range()等。ARMv8最多支持7级缓存,并通过内存属性(普通内存/设备内存)控制访问行为,其中设备内存具有严格的访问顺序限制。Linux使用MAIR_ELn寄存器定义6种内存属性,通过页表项索引实现灵活的内存

2025-07-18 15:25:32 988

原创 低精度定时器 (timer_list) 和 高精度定时器 (hrtimer)

Linux内核提供两种定时器:低精度(timer_list)和高精度(hrtimer)。timer_list基于jiffies实现毫秒级精度,适合简单任务,通过timer_setup初始化和mod_timer启动。hrtimer提供纳秒级精度,适用于实时系统,使用hrtimer_init初始化和hrtimer_start启动。两种定时器都需要正确设置回调函数并在模块卸载时取消定时器。示例代码展示了5秒低精度定时器和500微秒高精度定时器的实现方法,包括初始化、设置和清理流程。

2025-07-16 16:24:29 366

原创 ARMv8.1原子操作指令(ll_sc/lse)

ARMv8.1指令集相对于ARMv8指令集添加了不少新的功能,其中有很大的一块功能称作LSE(Large System Extensions),这其中添加了很多平台原生就支持的原子操作指令。在这之前,如果想实现某个原子操作,必须要使用LL/SC操作,在ARMv8以前的32位系统中使用LDREX和STREX指令,从ARMv8起,它们被改名成了LDXR和STXR。LL/SC操作本质上是很多CPU核去抢某个内存变量的独占访问,以前ARM主要用来在低功耗设备上运行,CPU核也不会太多,不会存在太大的问题。

2025-07-14 14:04:24 799

原创 arm64平台下linux访问寄存器

以读取寄存器为例 :read_sysreg和read_sysreg_s的区别是一个检测权限?(来自deepseek答案),实际操作read_sysreg接受字符串类型寄存器写法,如elr_el1,vbar_el1等。linux内核定义了read_sysreg/write_sysreg相关的函数:arch/arm64/include/asm/sysreg.h。

2025-04-02 10:08:01 347

原创 arm64函数源码和汇编解析(objdump)

/stp指令将x29,x30保存在sp-32地址,后面的!,是完成后将sp-32的地址值给sp。意味着sp向地地址移动。每次函数都会开辟自己的栈。这个栈的大小根据函数的本地变量或者参数来决定。//将sp的值保存到x29寄存器。//还原x29,x30,sp。

2025-01-04 17:34:40 524

原创 Linux内核的栈回溯dump_stack原理

浅析ARMv8体系结构:Aarch64过程调用标准_aarch64-64-little-优快云博客 (重磅原创)冬之焱: 谈谈Linux内核的栈回溯与妙用-腾讯云开发者社区-腾讯云 (tencent.com)

2024-08-26 11:23:32 500

原创 crash查看percpu变量在每个cpu上的基地址和内容

查看这个percpu变量在每个cpu上的地址。

2024-08-22 15:24:16 1128

原创 内核参数cmdline/command_line怎么传递到内核?

linux kernel中的cmdline的详细介绍_kernel command line-优快云博客

2024-08-08 11:26:40 1358

原创 arm64电源管理之PSCI

通过mailbox核间通信,如风扇,温度。psci:调用smc。如开关机,cpu停止启动。

2024-06-13 11:41:27 725

原创 浅析ARMv8体系结构:原子操作

原子操作的实现依赖处理器硬件提供支持,在不同的处理器体系结构上,原子操作会有不同的实现,例如在x86体系结构下,通常使用锁缓存/总线的方式实现原子操作。LL/SC机制使用多个指令,并且每个处理器都需要实现一个专有监视器,LL/SC机制利用独占内存访问指令和独占监视器共同实现原子操作。在编程中,当多个处理器或线程访问共享数据,并且至少有一个正在写入时,操作必须是原子的,这意味着数据访问必须被视为相对于其他处理器的单个操作,以避免数据竞争条件。STXR:内存独占存储指令,它以独占的方式把数据存储到内存中。

2024-06-12 10:11:53 705

原创 memblock_free_all释放page到buddy,前后nr_free的情况

在zone_sizes_init 之后,各个node,zone'的page总数已知。但是此时的每个order的空闲链表是空的,也就是无法通过alloc_page这种接口来分配。此时page还在memblock管控,需要memblock释放。

2024-05-29 11:54:47 271

原创 arm64内核efi格式入口函数efi_pe_entry

所以最开始我认为efi_pe_entry中使用的是startup_32的绝对地址,即上面输出的0,这种想法是错误的,其实它是根据当前rip中的地址,以及startup_32到下一条指令的偏移量,计算出真正的运行时中的startup_32的地址,这样不管compressed部分被加载到了内存的什么位置,startup_32的地址都是正确的,即位置无关。也就是说,该拷贝操作是把bzImage中的setup_header里的内容拷贝到boot_params里的setup_header里。

2024-04-28 17:06:44 2237 1

原创 gicv3初始化与acpi表

【代码】gicv3初始化与acpi表。

2024-02-18 17:39:12 581

原创 pmd_alloc/pte_alloc/pud_alloc设置页表

pte_t;} pmd_t;} pud_t;

2024-01-29 14:44:37 763

原创 Linux 进程调度通知机制(sched_in/sched_out/preempt_notifier)

提供了一个任务被抢占和重新调度时的一个通知机制,这样任务可以实时的知道自己的调度状态。比如被调度出去,或者调度回来的时候触发通知。

2024-01-24 16:30:35 797

原创 关于softlockup和rcu stall错误分析

当发生中断时,会执行el1_irq来处理中断,来读取当前任务的thread_info.preempt_count 判断thread_info.preempt_count是否为0,如果为0 则调用arm64_preempt_schedule_irq 进行抢占式调度。spin_lock最终会调用preempt_disable:关闭抢占,此时CONFIG_PREEMPT=y。内核日志:此时rcu是 依靠其它cpu检查print_other_cpu_stall。如果使用关闭抢占,比如通过自旋锁的方式会如何呢?

2023-11-15 15:21:19 2308

原创 openEuler 安装lightdm+xfce桌面

这一步可选,在greeter界面可以选择使用那个session。

2023-11-14 16:18:33 1434

原创 numactl 设置numa内存分配规则

内核也有对应的枚举类型,include/uapi/linux/mempolicy.h。1. 缺省(default):总是在本地节点分配(分配在当前进程运行的节点上);4. 优先(preferred):在指定节点上分配,失败则在其他节点上分配。3. 交叉(interleave):在所有节点或者指定的节点上交织分配;2. 绑定(bind):强制分配到指定节点上;numactl分配的内存策略,

2023-11-10 15:10:29 3253

原创 内核cpumask_t,设置中断irq的cpu亲和性

打印可阅读的方式如下:比如在128核的cpu下面,有四个long类型,总共128。中断亲和性使用cpumask_t来表示。

2023-11-08 14:02:57 859

原创 arm smmu v3 (5.10) 设备和iommu的关联

【代码】arm smmu v3 (5.10)

2023-10-17 10:55:34 498

原创 深入理解Linux内核之内核抢占

对于这三个内核抢占配置选项,桌面Linux选项配置一般都是CONFIG_PREEMPT_VOLUNTARY,服务器Linux配置选项一般都是CONFIG_PREEMPT_NONE,嵌入式Linux配置选项一般都是CONFIG_PREEMPT。

2023-10-16 14:56:42 1502

原创 内核线程和用户进程的区别(task_struct)

内核一开始只有内核进程,那用户进程的mm创建在什么时候?

2023-09-22 09:39:40 161

原创 arm64内存初始化

内存numa模型是需要acpi表的SRAT [System Resource Affinity Table]来描述。内核解析日志: 同属于一个Node的物理内存的片段。

2023-09-08 09:58:10 449

原创 内核efifb的显示功能

比如我们直接操作/dev/fb0;将调用drivers/video/fbdev/core/fbmem.c:fb_write ,将数据写入screen_base。在函数efifb_probe中会将screen_info中的内容提取存储到fb_info中并注册register_framebuffer。//screen_info用来获取uefi提供的显示信息。代码在 drivers/firmware/efi/efi-init.c 中。在arm64上有arch/arm64/kernel/efi.c定义了。

2023-09-01 11:14:35 2258 1

原创 内核宏 —IRQCHIP_DECLARE

1212345678910111213fn : fn }宏展开后1234567__used __section(__irqchip_of_table) //编译时将定义的of_device_id结构体添加到irqchip_of_table section中= {将初始化的结构体插入到section 中123456789INIT_DATA //添加init section。

2023-08-28 18:28:10 471

原创 Linux内核大页类型和使用

我们成功用大页面申请了8M内存,4个大页面,同时进行清零操作成功,再munmap之前,我们需要确认内存确实是被我们使用了。新的2.6.32内核通过支持MAP_HUGETLB方式来使用内存,避免了烦琐的mount操作,对用户更友好。到某个点去,部署起来很不方便,我们只想要点匿名页面,要搞的那么麻烦吗?过去使用大页面内存主要透过hugetlbfs需要mount文件。再来看演示代码如下:# cat huge.c。

2023-07-05 10:09:11 686

原创 USB学习

根据上面的lspci和lsusb。应该是一个控制器带了两个root_hub。一个高速的一个低速的。lsusb -v 可以看到iSerial信息。其中有具体的pcie设备。lsusb列举当前的usb设备: root_hub是当前控制器上的hub。hub也是一个特殊的usb设备。下面才是常规的usb设备。

2023-05-17 09:46:52 359

原创 arm64内核地址空间(arm64架构linux内核地址转换__pa(x)与__va(x)分析) (4.x内核)

相关内容 在arch/arm64/include/asm/memory.h ,arch/arm64/include/asm/pgtable.h。

2023-05-10 10:02:56 1310

原创 内核线程的创建kthread_run

https://blog.youkuaiyun.com/CQ062364/article/details/39646623?spm=1001.2101.3001.6650.8&utm_medium=distribute.wap_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-8-39646623-blog-81703583.wap_relevant_t0_download&depth_1-utm_source=distribute.wa

2023-04-13 08:08:11 1538

原创 当我们切换linux终端时,背后发生了什么?

当用户登录时,使用的是虚拟终端。使用Ctcl+Alt+[F1—F6]组合键时,我们就可以切换到tty1、tty2、tty3等上面去。此时显示器的内容发生了变化,那这个和显卡驱动,是如何关联的?事实上,我们切换的时候需要调用到显卡驱动中的接口,重新设置显示器的输出,也就是定位到不同的显存内容,并且原理的显存应该保留,以便切换回来后依然是原来的内容。下面是一段打印的dump_stack内容: 这个是agetty程序调用的。

2023-04-04 09:42:11 752

原创 libdrm核心API

libdrm重要api分析。

2023-04-02 10:53:03 673

原创 modetest工具测试(linux-5.10)

本内容通过modetest的打印,了解drm中各个object之间的关联,即如何正确的设置crtc,connector,encoder,plane的组合,才能正确的显示成功。内核驱动在加载后需要创建crtc,connector,encoder,plane等。且他们直接需要正确的匹配,比如connector和encoder。

2023-04-01 22:15:01 2960

原创 dma_mask和coherent_dma_mask 的默认值

【代码】dma_mask和coherent_dma_mask 的默认值(PCI设备)

2023-03-28 15:09:19 1190

原创 linux下读取物理内存工具devmem2源码

该工具是ubunut系统上提取出来的。

2023-03-27 17:19:20 810

原创 内核中__init 和module_init宏的作用。

编写内核驱动模块需要include这个头文件。

2023-03-01 13:16:00 1100

原创 smmu和vfio

前面了解到一个dma_map_ops和设备关联。在透传设备的时候,map的操作实际上上guestOS进行的行为,这种操作应该会触发kvm/qemu进行拦截。那么vfio会重新创建一个domain和这个设备关联,不过这个domain的type是IOMMU_DOMAIN_UNMANAGED。其它的设备数字形式的代表的iommu_group号,和/sys/kernel/iommu_groups/下的一致,因为是用一个设备透传到虚拟机。一个设备关联到一个iommu_group,且和iommu_domain关联。

2023-02-09 17:42:26 798

原创 PCIe拓扑结构

第一个是通过一个bridge拓展的显卡,第二个直接从switch中。

2023-02-06 16:28:54 404

原创 没有IOMMU的DMA操作-swiotlb(转)

因为DMA受32位访问的限制,所以只能访问0x0000_0000到0xFFFF_FFFF地址空间的内存,再加上DMA需要访问连续的物理内存,故coherent pool,cma,buddy,swiotlb必须保证在0x0000_0000~0xFFFF_FFFF以内的连续物理空间。我们知道DMA映射有两种方式,一种是一致性映射 dma_alloc_coherent,一种是流式映射 dma_map_single (dma_map_sg可以映射多个dma buffer)。

2023-02-02 15:32:39 2300

pmd-alloc/pte-alloc/pud-alloc设置页表

缺页过程的页表创建设置流程.drawio

2024-02-29

空空如也

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

TA关注的人

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