自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 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 237

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

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

2025-01-04 17:34:40 452

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

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

2024-08-26 11:23:32 460

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

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

2024-08-22 15:24:16 1030

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

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

2024-08-08 11:26:40 1218

原创 arm64电源管理之PSCI

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

2024-06-13 11:41:27 616

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

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

2024-06-12 10:11:53 659

原创 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 234

原创 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 1974 1

原创 gicv3初始化与acpi表

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

2024-02-18 17:39:12 530

原创 pmd_alloc/pte_alloc/pud_alloc设置页表

pte_t;} pmd_t;} pud_t;

2024-01-29 14:44:37 696

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

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

2024-01-24 16:30:35 746

原创 关于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 1879

原创 openEuler 安装lightdm+xfce桌面

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

2023-11-14 16:18:33 1246

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

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

2023-11-10 15:10:29 2810

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

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

2023-11-08 14:02:57 769

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

【代码】arm smmu v3 (5.10)

2023-10-17 10:55:34 427

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

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

2023-10-16 14:56:42 1321

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

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

2023-09-22 09:39:40 127

原创 arm64内存初始化

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

2023-09-08 09:58:10 363

原创 内核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 2018 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 410

原创 Linux下试验大页面映射(MAP_HUGETLB)

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

2023-07-05 10:09:11 569

原创 USB学习

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

2023-05-17 09:46:52 326

原创 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 1147

原创 内核线程的创建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 1422

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

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

2023-04-04 09:42:11 728

原创 libdrm核心API

libdrm重要api分析。

2023-04-02 10:53:03 575

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

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

2023-04-01 22:15:01 2834

原创 dma_mask和coherent_dma_mask 的默认值

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

2023-03-28 15:09:19 1064

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

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

2023-03-27 17:19:20 709

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

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

2023-03-01 13:16:00 971

原创 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 693

原创 PCIe拓扑结构

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

2023-02-06 16:28:54 325

原创 没有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 2138

原创 arm64 smmu 驱动笔记 (4.19)

设备StreamID:sid。

2023-02-01 16:31:29 1446

原创 ext4文件系统笔记

文件的创建调用 lookup_open函数,其中又调用了目录inode的create函数ext4_create:普通文件的inode_operations是ext4_file_inode_operations,以及f_op的file_operations。对应最顶层的根目录,也就是文件系统分区的根目录,其初始化在mount之后,调用了mount回调函数,其在register_filesystem的时候已经定义了:fs/ext4/super.c。文件的inode_operations需要使用的函数较少。

2023-01-29 11:31:11 408

原创 arm64系统调用之getdents64

在头文件include/uapi/asm-generic/unistd.h 中是所有内核支持的系统调用。通过_SYSCALL宏来定义。分析getdents64系统调用。定义fs/readdir.c。下面是实现的部分在{}中。

2023-01-19 09:44:58 1661

原创 proc文件读写

读写/proc/cpuinfo 文件。

2023-01-18 12:43:31 1471

原创 两种类型的DMA mapping:一致性DMA映射&流式DMA映射 (5.10)

一致性DMA:在驱动初始化时mapping,在驱动shutdown时unmapping**(意味着不是一次性的,是持续性的使用该DMA映射)**。硬件需要保证外设和CPU能并行访问同一块数据,并且保证在软件无显式flush操作的情况下,CPU和外设能同步看到对方对数据的更新。一致性(consistent)可以理解为同步(synchronous)。api:dma_alloc_coherent 直接从dma区域申请内存。流式DMA:一般是需要一次DMA transfer时map,传输结束后unm

2023-01-14 11:23:50 2232

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

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

2024-02-29

空空如也

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

TA关注的人

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