自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

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

原创 gicv3初始化与acpi表

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

2024-02-18 17:39:12 373

原创 pmd_alloc/pte_alloc/pud_alloc设置页表

pte_t;} pmd_t;} pud_t;

2024-01-29 14:44:37 432

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

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

2024-01-24 16:30:35 609

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

原创 openEuler 安装lightdm+xfce桌面

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

2023-11-14 16:18:33 588

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

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

2023-11-10 15:10:29 852

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

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

2023-11-08 14:02:57 326

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

【代码】arm smmu v3 (5.10)

2023-10-17 10:55:34 223

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

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

2023-10-16 14:56:42 416

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

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

2023-09-22 09:39:40 48

原创 arm64内存初始化

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

2023-09-08 09:58:10 124

原创 内核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 993 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 240

原创 手动将linux安装到U盘

生成grub.conf配置文件。

2023-08-01 18:12:00 240

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

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

2023-07-05 10:09:11 165

原创 USB学习

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

2023-05-17 09:46:52 164

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

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

2023-05-10 10:02:56 646

原创 内核线程的创建kthread_run

https://blog.csdn.net/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 758

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

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

2023-04-04 09:42:11 598

原创 libdrm核心API

libdrm重要api分析。

2023-04-02 10:53:03 349

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

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

2023-04-01 22:15:01 2112

原创 dma_mask和coherent_dma_mask 的默认值

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

2023-03-28 15:09:19 633

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

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

2023-03-27 17:19:20 375

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

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

2023-03-01 13:16:00 696

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

原创 PCIe拓扑结构

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

2023-02-06 16:28:54 223

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

原创 arm64 smmu 驱动笔记 (4.19)

设备StreamID:sid。

2023-02-01 16:31:29 1020

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

原创 arm64系统调用之getdents64

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

2023-01-19 09:44:58 1083

原创 proc文件读写(4.19)

读写/proc/cpuinfo 文件。

2023-01-18 12:43:31 1040

原创 两种类型的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 269

原创 kobject创建文件夹和文件测试。

kobject_create:内部自动关联dynamic_kobj_type,有代码可以看出,sysfs_ops的show/store函数会将动态将attribute转换成kobj_attribute。最简单方式创建kobject。[217963.967093] fw_cfg_sysfs_attr_show+0x13/0x2b [test] //这里直接调用。[217989.280452] kobj_attr_show+0x12/0x20 //这里调用了fw_cfg_showrev。

2023-01-11 22:06:25 553

转载 linux内核同步阻塞网络 IO

在上面的 demo 中虽然只是简单的两三行代码,但实际上用户进程和内核配合做了非常多的工作。回想上面我们在 创建 socket 流程里执行到的 sock_init_data 函数,在这个函数里已经把 sk_data_ready 设置成 sock_def_readable 函数了(可以ctrl + f 搜索前文)。进入系统调用后,用户进程就进入到了内核态,通过执行一系列的内核协议层函数,然后到 socket 对象的接收队列中查看是否有数据,没有的话就把自己添加到 socket 对应的等待队列里。

2023-01-03 17:53:39 311

原创 arm64下dma相关 api(4.19)

上述使用ops->alloc来分配;

2022-12-27 18:02:42 690

原创 arm64平台进程全局页表pgd的创建和切换

分配每个进程的pgd。//exec加载新二进制程序pgd_alloc函数: arch/arm64/mm/pgd.c{}上述PGD_SIZE在PA_BITS为48bit的机器上:PTRS_PER_PGD 64 * sizeof(pgd_t) 8 = 512。因此会用kmem_cache_create接口slub来分配小块内存。返回pgd表虚拟地址。pgd_cache 的kmeme_cache对象初始化在arch/arm64/mm/pgd.c#L31。

2022-12-26 14:57:01 655 2

原创 4.19内核SLUB内存分配器

内核的大部分管理数据结构都是通过kmalloc分配内存的,那么slab本身结构的内存管理就出现了一个鸡与蛋的问题,slab数据结构所需内存远小于一整页的内存块,这些最适合kmalloc分配,而kmalloc只有在slab初始化完之后才能使用。create_kmalloc_caches中循环通过new_kmalloc_cache创建kmem_cache。new_kmalloc_cache创建内核预先准备的固定大小的内存块。1:kmalloc_slab获取kmem_cahce。

2022-12-21 16:25:37 257

转载 Buddy 内存管理机制(下)

内存释放内存分配gfp_masknode 候选策略zone 候选策略zone fallback 策略lowmem reserve 机制order fallback 策略migrate type 候选策略migrate fallback 策略reclaim 方式。

2022-12-21 11:35:37 209

转载 Buddy 内存管理机制(上)

内存是计算机系统中最重要的核心资源之一,Buddy 系统是 Linux 最底层的内存管理机制,它使用 Page 粒度来管理内存。通常情况下一个 Page 的大小为 4K,在 Buddy 系统中分配、释放、回收的最小单位都是 Page。上图是 Buddy 系统的内部组织结构,本篇文章只关心未分配区域Free区域的管理,下篇文章再来分析可回收区域的管理。一个系统的内存总大小动辄几G几十G,不同的内存区域也有不同的特性。Buddy 使用层次化的结构把这些特性给组织起来:1、Node。

2022-12-21 11:34:37 388

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

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

2024-02-29

空空如也

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

TA关注的人

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