- 博客(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
原创 内核参数cmdline/command_line怎么传递到内核?
linux kernel中的cmdline的详细介绍_kernel command line-优快云博客
2024-08-08 11:26:40
1358
原创 浅析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
原创 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
原创 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
原创 深入理解Linux内核之内核抢占
对于这三个内核抢占配置选项,桌面Linux选项配置一般都是CONFIG_PREEMPT_VOLUNTARY,服务器Linux配置选项一般都是CONFIG_PREEMPT_NONE,嵌入式Linux配置选项一般都是CONFIG_PREEMPT。
2023-10-16 14:56:42
1502
原创 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
原创 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
原创 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
原创 没有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
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人