- 博客(182)
- 资源 (34)
- 问答 (1)
- 收藏
- 关注
原创 mount:从应用软件到内核函数执行的过程
在linux内核中,不同的文件系统以文件系统类型结构(struct file_system_type)保存在静态指针file_systems(static struct file_system_type *file_systems;),如ext4文件系统,它通过ext4_fs_type结构对象完成内核中的文件系统类型注册。如mount在装载ext4文件系统类型时,基本首先要做的就是分配文件系统上下文,为各种成员赋值,包括文件系统类型结构,之后执行ext4_init_fs_context 初始化上下文函数关联
2023-01-12 23:50:35
1658
原创 grub2: autogen.sh执行过程
GNU GRUB是一个Multiboot引导加载程序。它源自GRUB,GRand Unified Bootloader,最初由Erich Stefan Boleyn设计和实现。简而言之,引导加载程序是计算机启动时运行的第一个软件程序。它负责加载并将控制转移到操作系统内核软件 (如Hurd或Linux)。内核反过来初始化操作系统的其余部分 (例如GNU)。GRUB2取代了以前称为 GRUB 的内容 (即 0.9x 版),保留为GRUB Legacy模块。
2022-12-12 00:42:28
734
3
原创 linux设备模型:pci驱动程序注册过程
MANF_ID 表示厂商ID 是一个数字ID,如0xfead 或 PCI_ANY_ID(表示通用),如果有真实硬件应与硬件ID一致MODEL_CODE 表示厂商设备 是一个数字ID,如0x1234 或 PCI_ANY_ID(表示通用),如上默认情况下,子系统的厂商ID和厂商设备ID不用设置,它们采用PCI_ANY_ID(表示通用),class、class_mask等成员默认也不需要指定,在设备创建后,创建相关对象关联设备节点即可(或创建时指定父级)pci_probe: 驱动探测函数,可在函数内
2022-11-28 01:32:51
2403
原创 linux虚拟化: svm: 初始化及重要函数分析
svm是一种虚拟机环境,可用于AMD64、海光64或Intel EM64T CPU。这种新型的虚拟机技术可以提高性能和节能,但您需要在使用任何使用它的软件之前启用它。“支持向量机模式”是允许AMD处理器使用支持向量机指令集的功能。这对于需要同时兼容Intel、AMD和海光处理器的应用程序很有帮助。svm通过创建kvm,注册svm_init_ops初始操作结构,完成硬件的一系列初始化及包含功能操作结构的访问方式。
2022-11-25 00:20:01
1070
原创 linux虚拟化: kvm: 初始化及创建用户过程
基于内核的虚拟机(KVM)是一种内建于Linux的开源虚拟化技术。具体而言,KVM可帮助您将Linux转变为虚拟机监控程序,使主机计算机能够运行多个隔离的虚拟环境,即虚拟客户机或虚拟机(VM)。Linux自内核版本号2.6.20起,植入KVM内核源码,因此KVM能享受每一项新的Linux功能、修复和发展,无需进行额外工程。KVM全称为Kernel-based Virtual Machine,基于内核的虚拟机,它主要起到内核层的虚拟资源分配、管理,然后由用户层软件模拟出我们使用的虚拟机客户
2022-11-20 01:19:06
1547
原创 linux设备模型:固件设备及efi固件(平台)设备节点创建过程分析
本篇分析固件系列(以efi为例),固件可以分为(系统)引导阶段(efi stub启动模式)、固件内存映射(物理地址映射到虚拟地址等等)、固件注册到平台设备、平台设备运行等等。固件设备具有更广泛的意义,当然复杂度也更高一些。 固件系列更偏向于开发板,通常由内核模块(服务)与应用程序完成一些硬件级上电/下电及设备形式控制(如更新固件)等等。参考Documentation中一些文章内容
2022-11-17 23:23:05
1183
原创 linux设备模型:设备及设备节点创建过程分析
本篇分析设备的初始化及注册过程,包括设备与驱动绑定,设备与电源管理之间的联系、中断域的储存及物理设备之间的关系等等。这一篇内容较多,结合kobject、kset、class、bus等众多概念,也是从理论阶段转换为实际使用阶段的重要过程。 设备初始化阶段,创建kset容器结构对象devices_kset,用于设备的uevent(用户事件通知)操作。dev_kobj表示设备根对象,在它的基础上扩展(延伸)sysfs_dev_block_kobj("block") 块设备根对象和sysfs_dev_ch
2022-11-13 21:38:01
863
原创 linux设备模型:devtmpfs虚拟文件系统分析
devtmpfs是一个设备文件系统,它将其所有文件保存在虚拟内存中。devtmpfs中的所有内容都是临时的,因为不会在您的硬盘驱动器上创建任何文件。如果卸载devtmpfs实例,其中存储的所有内容都将丢失。 devtmpfs的根路径在/dev,它通过文件系统上下文创建mount(挂载)对象,使得用户层可以访问。 devtmpfs通过devtmpfsd线程函数,分配新的命名空间代理(nsproxy)对象,并分配、关联多类命名空间,如mnt、uts、ipc、pid、cgroup、n
2022-11-10 01:00:29
3758
1
原创 linux设备模型:bus概念及pci_bus分析
bus(总线)是一种特殊的抽象框架,与class有着本质上的不同,class感觉上只是把一些核心组件聚集在一起,它主要为访问组件提供便利(如提供组件地址),而bus则是实实在在的功能性框架,它即可负责管理、维护驱动与设备之间的关系,也可作为主桥设备与硬件之间的访问通道等等。如pci总线,当pci硬件设备插入卡槽后,首先通过pci_bus_type(pci总线操作结构) 中的 pm(电源操作结构)操作相关函数唤醒设备,然后通过pci_bus_match函数查找硬件设备是否被注册到驱动(通过pc
2022-11-06 14:40:26
1389
原创 linux设备模型:kset及设备驱动抽象类(class)分析
kset属于kobject属于特定子系统的一组特定类型的kobject,与其说是一组特定类型,倒不如说用kset表示一组特定类型的kobject更方便与管理、遍历等操作,实际场景中如果需要以某个根为目标的多组特定类型的kobject,可以编写复合型kset容器,以根kset容器为基础(实际还是根kobject),在它之后继续关联多个不同的kset容器,当然,这也是linux内核中设备驱动的现状。kset容器相对于kobject来说,主要多了kobjs的uevent操作,用于记录
2022-11-05 00:50:36
864
原创 linux控制组: cpuset解析
cpuset提供了一种机制,用于将一组CPU和内存节点分配给一组任务。在这里,“内存节点”是指包含内存的在线节点。CPU集将任务的CPU和内存放置限制为仅任务当前cpuset中的资源。它们形成虚拟文件系统中可见的嵌套层次结构。这些是管理大型系统上动态作业放置所需的基本钩子,超出了已经存在的钩子。cpuset使用控制组中描述的通用cgroup子系统。任务的请求,使用sched_setaffinity系统调用将CPU包含在CPU
2022-11-03 21:09:52
4298
原创 linux设备模型:sysfs(kobject)解析
sysfs 是一个最初基于 ramfs 且位于内存的文件系统。它提供导出内核数据结构及其属性,以及它们之间的关联到用户空间的方法。任何 kobject 在系统中注册,就会有一个目录在 sysfs 中被创建。这个目录是作为该 kobject 的父对象所在目录的子目录创建的,以准确地传递内核的对象层次到用户空间。sysfs中的顶层目录代表着内核对象层次的共同祖先;例如:某些对象属于某个子系统。 在与其目录关联的 kernfs_node 对象中内部保存一个指向实现目录的
2022-10-30 13:04:25
1586
原创 linux审计子系统:内核层执行原理
linux审计子系统用于记录内核部分子模块及应用层(应用程序)的运行状态,如文件系统、进程、systemd应用的执行进展、遇到的问题等信息。审计子系统通过netlink与auditd应用建立kernel audit直接的通信,并通过auditd把信息写入/var/log/audit/audit.log文件(默认地址,可以设置)。 linux审计子系统内核部分设计相对较为简单,甚至内核文档都没有找到关于它的单独描述(只找到了它的函数定义描述)。
2022-10-27 21:50:20
1959
原创 linux终端设备:pty设备初始化、创建过程
上一篇[](https://lkyof.blog.csdn.net/article/details/127456330?spm=1001.2014.3001.5502)分析了tty子系统、tty设备、console设备的初始化及创建过程。默认情况console终端的启动程序为agetty,它访问的是/dev/console inode,执行的console_fops操作结构中的函数,而由类Xwindow中的终端或远程ssh访问的是/dev/ptmx (pt
2022-10-23 19:38:13
1295
原创 linux终端设备:tty子系统相关的初始化
> linux类系统相较于windos类系统用“魔幻”也不为过,神奇的控制台终端如ctrl+alt+F1至F6、UI桌面打开终端、远程ssh登录等等,在神奇的命令行协助下总能随时随地完成手中的工作。> 当然,这些功能虽不算复杂,但庞大的架构及繁多的代码让人有一种深不测的感觉。经过一段时间对终端相关代码的分析对它们有了初步的了解。它们采用较为一致的思路方式实现,代码难度也不算太高,具备字符驱动相关的知识加上足够的耐心便可以解开这个“庞然大物”。> linux终端子
2022-10-22 21:46:58
1508
原创 分布式块设备复制(DRBD)分析
DRBD由客户端(drbdadm、drbdsetup、drbdmeta)、内核模块(drbd.ko、drbd_transport_tcp.ko)和相关脚本而构成,用以构建高可用性的集群,其实现方式是通过网络来镜像整个设备。DRBD负责接收数据,把数据写到本地磁盘,然后发送给另一个主机。另一个主机再将数据存到自己的磁盘中,参考图1。
2022-10-04 22:58:02
1338
原创 proc: 虚拟文件系统初始化
linux内核中经常使用一种虚拟文件系统,它在内核启动后创建,并结合文件操作特性运行在缓存中,也就是说它具有文件操作的功能(函数调用、文件属性变更等),数据不会写入到磁盘,这里简称为proc系统。proc系统初始化并创建/proc/self/fs、/proc/sys等目录,在4.15之前的内核版本,它结合ctl_table结构,完成虚拟读写、文件属性的变更、内核运行时参数修改等操作,而4.15之后的内核版本,ctl_table移除了proc_dir_entry结构,相当于虚拟文件的读写、文件属性的变更等操作
2022-09-25 22:47:15
718
原创 x86: perf_events内核初始化
Linux性能计数器的使用(perf_events)可能会带来泄露受监控进程访问的敏感数据的巨大风险。在直接使用perf_events系统调用API的情况下,数据泄露都是可能的以及由perf工具用户模式实用程序(perf)生成的数据文件风险取决于perf_events性能监控单元(PMU)的数据的性质和perf收集并公开以进行性能分析。收集的系统和性能数据可分为以下几类尔“架构性能监控”CPUID检测/枚举详细信息struct {} split;};cpu_hw_events CPU硬件事件/**//*
2022-08-20 21:16:29
1556
原创 send_sig: 内核执行流程
当一个信号从内核或另一个进程发送到一个进程时,内核通过调用 send_sig()、send_sig_info()、force_sig() 或 force_sig_info() 函数来传递它。 调用关系如下: send_sig() -> send_sig_info() ... send_signal_locked() ... force_sig() -> force_sig_info() ... send_signal_locked() ......
2022-08-10 21:22:56
2230
原创 bpftrace:简便输出调试信息
bpftrace是一种用于Linux增强型伯克利包过滤器(eBPF)的高级跟踪语言,使用LLVM作为后端将脚本编译为BPF字节码,并利用BCC与Linux BPF系统进行交互,以及现有的Linux跟踪功能:内核动态跟踪(kprobes)、用户级动态跟踪(uprobes)、和跟踪点(tracepoint)。bpftrace语言的灵感来自awkh、C、DTrace和SystemTap等前身跟踪器。上一篇实现了tracepoint定义及函数调用,本篇也以这个示例和官方提供示例为基础讲述。...
2022-08-07 22:37:30
978
原创 tracepoint: 定义函数及调用示例
放置在代码中的跟踪点(tracepoint)提供了一个挂钩来调用您可以在运行时提供的函数(探针)。 跟踪点可以是“on”(一个探针连接到它)或“off”(没有连接探针)。 当跟踪点“关闭”时,它没有任何效果,除了添加微小的时间损失(检查分支条件)和空间损失(在检测函数的末尾为函数调用添加几个字节并添加数据 结构在一个单独的部分)。 当跟踪点“打开”时,每次执行跟踪点时都会在调用者的执行上下文中调用您提供的函数。 当提供的函数结束执行时,它返回给调用者(从跟踪点站点继续)...
2022-08-07 13:51:13
1015
原创 进程:execve加载流程
execve函数用于装载一个可执行文件以进程为单位加载到内存中,execve在内核空间中的调用可以追溯到kernel_execve -> run_init_process函数,而用户空间通过SYSCALL_DEFINE3(execve...)->do_execve进入函数
2022-08-06 18:50:50
471
原创 ipv4: inet初始化过程
Internet Protocol version 4,简称ipv4。ipv4模块从网络碎片队列初始化开始启动,然后执行cipso初始化,inet初始化等等。
2022-08-04 19:34:21
771
原创 ELF:加载过程
Executable and Linkable Format,中文名称“可执行可链接格式”,简称为ELF。ELF是Linux类系统的主要可执行文件,参数格式对应架构Application Binary Interface(ABI)文档
2022-07-30 19:17:41
1266
原创 socket:内核初始化及创建流(文件)详细过程
socket中文名称为套接字,属于传输协议及功能接口的封装。socket首先初始化注册(socket)文件系统,然后由使用它的模块传入具体的地址族(类型)family,如ipv4模块中的(void)sock_register(&inet_family_ops); 当调用者执行socket()函数时,会触发__sys_socket函数,完成socket文件的创建、修改模式为流模式、提供文件系统操作结构的功能接口、SELINUX策略绑定等等。...
2022-07-30 18:12:23
2356
原创 AMD64(x86_64)架构abi文档:
由于外部函数是通过GOT插槽直接调用的,所以在第一次调用时,不需要调用动态连接器来查找函数符号,传递参数的方式可以与本文中指定的不同。
2022-07-25 00:28:57
1702
5
原创 AMD64(x86_64)架构abi文档:上
本节为AMD64处理器系列定义了带有任意记录格式的调试(DWARF)调试格式。AMD64ABI没有定义调试格式。然而,所有在AMD64上实现DWARF的系统应使用以下定义。DWARF是一个用于符号级、源代码级调试的规范。调试信息格式不适合任何编译器或调试器的设计。有关DWARF的更多信息,请参见DWARF调试格式标准,可在以下网站获得http。...
2022-07-23 19:32:37
1598
原创 baddy:核心函数入口
上一篇分析了内存域的初始化过程,及扩展内容cpu热插拔函数的注册及热插拔线程的作用等等。UMA下只有一个pglist_data对象也就是对应一个内存域,而NUMA下最多拥有5个内存域(zone),ZONE_DMA、ZONE_DMA32、ZONE_NORMAL、ZONE_HIGHMEM、ZONE_MOVABLE等等,内存域类型根据具体硬件来决定。baddy系统的入口(核心)函数为__alloc_pages,经典调用可以追溯到slub分配器的kmalloc函数,参考。...
2022-07-21 21:58:43
458
原创 baddy:初始化内存域
由于硬件的限制,内核并不能对所有的页一视同仁。有些页位于内存中特定的物理地址上,所以不能将其用于一些特定的任务。由于存在这种限制,所以内核把页划分为不同的区域(zone)。内核使用区域对具有相似特性的页进行分组。...
2022-07-16 23:29:08
481
原创 slub构建过程
90年代初期,Mark Hemment提交了slab分配器系统的缓冲区分配和管理的相关补丁,用于减缓Linux物理内存(以页为单位)由分配频繁、分配过剩带来的性能损耗问题。之后,随着大规模多处理器系统和 NUMA系统的广泛应用,slab分配器逐渐暴露出自身的不足,Christoph Lameter在2.6.22中引入slub分配器。slub分配器简化kmem_cache、slab等相关的数据结构,并且保留了slab分配的所有接口函数。 x86架构下,默认配置文件只打开slub相关宏定义,分析mm/slu
2022-07-08 23:33:59
280
原创 kmalloc执行过程
首先看下KMALLOC_MAX_CACHE_SIZE值: 在x86架构下KMALLOC_MAX_CACHE_SIZE为4MB,: 进入kmalloc_order_trace函数: 继续分析kmalloc:
2022-07-03 22:18:08
559
原创 linux memblock执行过程
x86系列架构中,memblock_reserve函数最早在early_reserve_memory函数中调用,执行顺序为: start_kernel -> setup_arch -> early_reserve_memory -> memblock_reserve。 memblock_add_range函数包含五个参数:memblock_type对象;内存区域的物理基地址;内存区域的大小;最大 NUMA 节点数;标志参数。先看memblock定义: 进入memblock_add_range:
2022-07-02 18:10:25
540
原创 linux开源软件代码提交流程
1. 注册帐号登录https://github.com/,点击Sign up,参考下图:2. 生成key登录成功后,点击右上角头像,选择Settings,参考下图:然后选择左下角Developer settings,参考下图:点击左侧Personal access tokens,可以看到Generate new token,参考下图:点击Generate new token,Note编辑框中随便输入,下面的选项信息中除了delete:相关字样不选,别的全部选上,防止push时权限不足,参
2022-05-22 12:21:11
827
1
原创 linux调度(smp)函数分析
sched_initvoid __init sched_init(void){ unsigned long ptr = 0; int i; /* Make sure the linker didn't screw up */ BUG_ON(&idle_sched_class + 1 != &fair_sched_class || &fair_sched_class + 1 != &am
2022-04-17 20:19:52
1178
原创 linux kernel_thread执行过程
kernel_thread kernel_thread定义(kernel/fork.c):/* * Create a kernel thread. */pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags){ struct kernel_clone_args args = { .flags = ((lower_32_bits(flag
2022-03-17 00:28:32
2731
原创 linux内核启动过程5:启动用户空间
上一篇<<linux内核启动过程4:内核运行时>>分析到了内核进入运行时状态(不退出),本篇分析用户空间(用户层)的加载过程。启动应用空间 进入kernel_init函数,在这里做了用户空间的初始化及启动(pid)1进程工作:static int __ref kernel_init(void *unused){ int ret; kernel_init_freeable(); 进入kernel_init_fre.
2022-03-01 22:20:15
813
原创 linux内核启动过程4:内核运行时
上一篇<<linux内核启动过程3:内核初始化阶段>>分析到了start_kernel执行流程,本篇继续内核切换到运行时状态。内核运行时状态 内核初始化流程已经分析完成,如何保持内核进入运行时状态(不退出),接下来分析跳过的函数arch_call_rest_init:/* Do the rest non-__init'ed, we're now alive */ arch_call_rest_init(); 进入arch_call.
2022-02-26 13:23:02
529
tensorflow_install.zip
2020-10-06
DataOperation_20200304.zip
2020-03-04
MFC内部调用matlab函数(32位/64位)
2018-08-18
MFC按USB插口顺序显示所有USB设备(包括安卓)
2018-03-18
thinking c++
2017-03-21
linux 汇编完整语法介绍
2017-03-06
TA创建的收藏夹 TA关注的收藏夹
TA关注的人