1.Linux 系统内核概述
2.Linux虚拟网络中的源码macvlan设备源码分析
3.Linux内核|驱动模型initcall和module_init
Linux 系统内核概述
Linux内核是一种开源的类Unix操作系统宏内核。
它是源码Linux操作系统的核心组件,同时也是源码计算机硬件与进程之间的桥梁。内核负责处理两者之间的源码通信,并高效地管理资源。源码内核被称为内核,源码易语言FOR源码是源码因为它在操作系统中扮演着类似种子在果实硬壳中的角色,掌控着硬件的源码主要功能。内核的源码主要用途包括以下四项工作:
在正确实施的情况下,内核对用户来说是源码不可见的,它在自己的源码小世界中(称为内核空间)工作,分配内存并跟踪内容的源码存储位置。用户所看到的源码内容被称为用户空间。这些应用通过系统调用接口(SCI)与内核进行交互。源码
1. 内核简介
Linux内核采用单内核体系设计,源码锐捷源码同时借鉴了微内核设计体系的优点,引入了模块化机制。
2. 内核模块
2.1 uname命令
使用格式:uname [选项]
参数解释:[选项]用于指定命令的功能,如-n显示内核名称。
2.2 lsmod命令
显示由核心已经装载的内核模块。
命令定义:lsmod [-v] [-c] [-s] [-m]
字段含义:[-v]显示详细模式,[-c]显示模块数量,[-s]显示模块大小,[-m]显示模块名称。
2.3 modinfo命令
显示模块的详细描述信息。
命令定义:modinfo [模块名称]
语法:modinfo [-v] [模块名称]
选项:[-v]显示详细模式。
2.4 modprobe命令
装载或卸载内核模块。
命令定义:modprobe [模块名称] [选项]
语法:modprobe [模块名称] [选项]
选项:[模块名称]指定要装载或卸载的模块。
2.5 depmod命令
内核模块依赖关系文件及系统信息映射文件的尺寸表源码生成工具。
语法:depmod [-a] [-F file] [-e] [-n] [-N] [-v]
参数:[-a]生成所有模块的依赖关系,[-F file]指定依赖关系文件,[-e]仅显示错误信息,[-n]不生成依赖关系,[-N]不生成映射文件,[-v]显示详细模式。
2.6 insmod和rmmod命令
装载或卸载内核模块。
insmod命令:insmod [模块名称] [选项]
rmmod命令:rmmod [模块名称] [选项]
3. /proc目录
内核将自己内部状态信息、统计信息以及可配置参数通过proc伪文件系统输出。
3.1 sysctl命令
语法格式:sysctl [-n] [-e] [-f file] [-p] [-a] [-r] [-w] [name [...]]
命令参数:[-n]不打印数值,[-e]退出时显示错误,[-f file]指定配置文件,[-p]打印所有配置,[-a]显示所有参数,驱动安装源码[-r]读取配置,[-w]写入配置,[name [...]]指定要设置的参数。
3.2 修改配置文件
3.3 实战演示
4. /sys目录
sysfs伪文件系统,输出内核识别出的各硬件设备的相关属性信息,以及内核对硬件特性的设定信息。有些参数可以修改,用于调整硬件工作特性。
4.1 udev
4.2 ramdisk文件的制作
方法一:使用dd命令
方法二:使用mkinitramfs命令
4.3 查看ramdisk
5. 编译内核
5.1 前提准备
(1) 准备好开发环境
(2) 获取目标主机上硬件设备的相关信息
(3) 获取到目标主机系统功能的相关信息
(4) 获取内核源代码包
5.2 简易安装内核
简易安装:简单依据模板文件的制作内核
5.3 详解编译内核
(1) 配置内核选项
(2) 编译 - make [-j #]
链接:blog.csdn.net/daocaokaf...
Linux虚拟网络中的macvlan设备源码分析
Linux虚拟网络中的macvlan设备源码分析
macvlan是Linux内核提供的一种新特性,用于在单个物理网卡上创建多个独立的虚拟网卡。支持macvlan的内核版本包括v3.9-3.和4.0+,推荐使用4.0+版本。macvlan通常作为内核模块实现,可通过以下命令检测系统是外贸erp 源码否支持: 1. modprobe macvlan - 加载模块 2. lsmod | grep macvlan - 确认是否已加载 对于学习和资源分享,可以加入Linux内核源码交流群获取相关学习资料,前名成员可免费领取价值的内核资料包。 macvlan的工作原理与VLAN不同,macvlan子接口拥有独立的MAC地址和IP配置,每个子接口可以视为一个独立的网络环境。通过子接口,macvlan可以实现流量隔离,根据包的目的MAC地址决定转发给哪个虚拟网卡。macvlan的网络模式包括private、vepa、bridge和passthru,分别提供不同的通信和隔离策略。 与传统VLAN相比,macvlan在子接口独立性和广播域共享上有所不同。macvlan的子接口使用独立MAC地址,而VLAN共享主接口的MAC。此外,macvlan可以直接接入到VM或network namespace,而VLAN通常通过bridge连接。 总的来说,macvlan是Linux网络配置中的强大工具,理解其源码有助于深入掌握其内部机制。对于网络配置和性能优化的探讨,可以参考以下文章和视频:Linux内核性能优化实战演练(一)
理解网络数据在内核中流转过程
Linux服务器数据恢复案例分析
虚拟文件系统操作指南
Linux共享内存同步方法
最后,关于macvlan与VLAN的详细对比,以及mactap技术,可以参考相关技术社区和文章,如内核技术中文网。Linux内核|驱动模型initcall和module_init
内核版本:Linux-6.1
文章目录汇总:所有文章目录 - 知乎 (zhihu.com)
模块初始化的宏观:module_init
在Linux内核开发和驱动开发中,module_init 是一个常见的宏,定义在 include/linux/module.h 文件中。它的实现会根据是否定义了 MODULE 宏有所不同,这决定了驱动是与内核编译到一起,还是单独编译为.ko文件。
MODULE 的定义通常通过编译时的参数传递,可通过查看 Makefile 文件,如在编译.ko时使用特定的编译选项,而链接到内核时则不会使用这些选项。
未使能 MODULE 情况下,module_init 实际上是作为特殊 initcall,用于声明初始化函数并控制函数调用顺序。initcall 有多个级别,module_init 实际对应于 device_initcall,级别为 6。initcall 会在编译时声明一个 initcall_t 类型的静态变量,并放入内核的 .init.data 段。
initcall 的实现和行为可以通过查看 arch-linux-gnu-nm -n vmlinux 命令的输出进行分析。以 __initcall__kmod_cpuinfo____cpuinfo_regs_init6 为例,这个 initcall_t 类型的静态变量的名称和行为可从 __initcall_name 和 __initcall_id 的输出得出。
rootfs_initcall 在 5 秒后被调用,它在 do_basic_setup 中执行,需要在此之前将存储介质准备好,如读取文件系统镜像。
console_initcall 用于尽早输出日志,其初始化函数在 console_init 中调用,而 console_init 尽量选择较早时机进行。
链接脚本中,initcall 声明的变量放入以 .initcall 开头的段中,每个级别对应一个段,并按顺序放入 .init.data 段。
initcall 的执行时机包括 do_pre_smp_initcalls 和 do_basic_setup,前者在多核处理器和调度系统初始化之前执行,后者按 initcall 级别依次执行指定函数。链接时和多次编译的顺序可能影响同级别 initcall 的执行顺序。
当 MODULE 使能时,Linux 中的某些模块可选择链接到内核或编译为.ko文件。initcall 宏被定义为 module_init 以兼容两者。分析 module_init 实现,可以参考《module_init 源码》。
__inittest:代码中未找到调用地方,但从 v2.6.0 对 module_init 的注释推测,可能是为了防止编译器警告。
init_module 是 initfn 的别名,具有相同的地址,通常为静态函数,而 init_module 为全局函数。在命令行使用 insmod 或 modprobe 安装模块时,系统最终调用 init_module 或 finit_module。
init_module 和 finit_module 用于从用户态加载.ko文件,查看 man 2 init_module 可以了解这两个函数的具体使用。
加载模块的流程最终会调用 load_module,其流程如下。