Linux内核模块(一)

简介:
Linux 内核组件主要包括:
·     文件系统模块 (VFS)
主要负责文件系统的管理,在 2.6 内核中,支持 ext2 ext3 ext4 ocfs2 jfs xfs reiserfs gfs 及网络文件系统 nfs cifs 等。
此类源码文件位于 /usr/src/kernels/$(uname -r)/fs/ 目录下
·     内存管理模块
主要负责物理内存和虚拟内存的资源分配
源码文件位于 /usr/src/kernels/$(uname -r)/mm/ /usr/src/kernels/$(uname -r)/arch/*/mm/ 目录下
·     进程管理模块
主要负责进程的资源分配协调管理
源码文件位于 /usr/src/kernels/$(uname -r)/arch/ /usr/src/kernels/$(uname -r)/include/*/arch/ 目录下
·     进程间通信模块
主要负责协调进程之间的资源分配关系以及进程资源的竞争分配
·     网络接口模块 ( 非必选模块 )
 
内核源码          /usr/src/kernels/$(uname -r)/                                ( 默认不安装 )
内核模块          /lib/modules/$(uname -r)/kernel/
内核引导文件        /boot/vmlinuz-$(uname -r)
RAM Disk         /boot/initrd-$(uname -r).img /boot/initramfs-$(rname -r).img
内核模块配置文件: /boot/config-$(uname -r)
内核符号列表文件: /boot/System.map-$(uname -r)
内核参数配置文件: /etc/modprobe.conf /etc/modprobe.d/modprobe.conf
 
  1. Linux的模块化配置:将公版部分(常用的)编译到内核中,个性化部分(不常用的/驱动程序)独立出来编译成模块在用户空间中进行加载所需的模块到内核中
  2. [root@rhel6 ~]# ls /lib/modules/$(uname -r)/kernel  
  3. arch    crypto  drivers fs      kernel      lib     mm      net     sound  
  4. arch    :与硬件平台有关的项目,大部分指的是 CPU 的类别,例如 x86, x86_64, Xen 虚拟支持等;  
  5. crypto  :核心所支持的加密的技术,例如 md5 或者是 des 等等;  
  6. drivers :一些硬件的驱动程序,例如显卡、网络卡、PCI 相关硬件等等;  
  7. fs      :核心所支持的 filesystems ,例如 vfat, reiserfs, nfs 等等;  
  8. kernel  :定义核心的程序、核心状态、运行绪、程序的排程 (schedule)、程序的讯号 (signle) 等  
  9. lib     :一些函数库;  
  10. mm   :与内存单元有关的各项数据,包括 swap 与虚拟内存等;  
  11. net     :与网络有关的各项协议数据,还有防火墙模块 (net/ipv4/netfilter/*) 等等;  
  12. sound   :与音效有关的各项模块;  
  13.  
  14.  
  15. ●vmlinuz-$(uname -r) 内核引导文件  
  16. vmlinuz是可引导的、压缩的内核,在内核编译过程中创建,也可以使用make zImage(小内核)或make bzImage(大内核)来创建。其中vm表示"Virtual Memory".Linux能够使用硬盘空间作为虚拟内存,不像老的操作系统比如DOS有640KB内存的限制。  
  17. [root@rhel5 ~]# file /boot/vmlinuz-2.6.18-194.el5   
  18. /boot/vmlinuz-2.6.18-194.el5: ELF 64-bit LSB shared object, AMD x86-64, version 1, stripped  
  19. [root@rhel6 ~]# file /boot/vmlinuz-2.6.32-220.el6.x86_64   
  20. /boot/vmlinuz-2.6.32-220.el6.x86_64: Linux kernel x86 boot executable bzImage, version 2.6.32-220.el6.x86_64 (mockbuil, RO-rootFS, root_dev 0x901, swap_dev 0x3, Normal VGA  
  21.  
  22.  
  23. ●initrd-$(uname -r).img、initramfs-$(uname -r).img文件  
  24. initrd.img是一个内核映像文件,即"initrd RAM Disk".对vmlinuz内核文件解压之后,在真正的rootfs(根文件系统)启动之前被加载到内存中。是在系统引导过程中挂载的一个临时rootfs,用来支持两阶段的引导过程。initrd文件中包含了各种可执行程序和驱动程序,它们可以用来挂载真正的rootfs,然后再将这个 initrd RAM Disk 卸载,并释放内存。在很多嵌入式Linux 系统中,initrd 就是最终的rootfs。  
  25.  
  26. 其实装入本地linux系统时可以不用initrd,只要在kernel参数中加入root参数就可以了。  
  27. 在boot loader加载kernel后, kernel需要执行系统中的/sbin/init, 读取这个文件就必须先mount rootfs。早期是通过启动时在kernel参数中加入root参数就告诉内核rootfs在哪个设备上。但随着硬件和技术的发展,现在rootfs可能位于一个网络存储如NFS上, 可能由于RAID而散布于多个设备上, 可能位于一个加密设备上需要提供用户名和密码,这时root参数就显得不够了。  
  28. 为了应付这种局面, 先后出现两种机制来作为boot loader装载kernel到真正的/sbin/init执行这个启动过程的桥梁:initrd和initramfs。  
  29. 2.6版以前除了内核vmlinuz之外还有一个独立的initrd.img映像文件,内核在初始化后会mount initrd.img作为一个临时的rootfs到内存中,而init进程就是在initrd.img里的,然后init进程会挂载真正的rootfs,然后umount initrd.img。但2.6之后采用initramfs,它是一个cpio格式的内存文件系统(可直接通过lsinitrd命令查看).两者有类似的地方,比如都是由内核执行其中的某个程序(initrd是/linuxrc, initramfs是/init)来加载驱动(如rootfs位于U盘上必须先加载U盘的驱动)并加载真正的rootfs。  
  30.  
  31. dracut 是下一代的 initramfs 系统,是在RHEL6/CentOS6和Fedora11以上的版本才出现的。和前一代 initramfs 系统的不同点在于,dracut 设计上就考虑到了映像尺寸的问题,尽量避免硬编码,以提高生成的 cpio 映像载入内存的速度; 实现上,由于initramfs 的唯一作用就是挂载rootfs(因此不需要把一堆无用的都装进去),它主要依赖 udev 去获取 rootfs 的设备节点,一旦 rootfs 节点出现则立刻切换过去。另外它采用了模块化的方式,使用者可自由在 %{_libdir}/dracut/modules.d 下创建他需要的特殊模块,可扩展性很强。最后它的使用方式和 mkinitrd 非常接近,迁移成本较低。  
  32. [root@rhel6 ~]# dracut [--hostonly] initramfs-$(uname -r).img $(uname -r)  
  33. --hostonly  :生成的 initramfs 映像只能在本机使用,既不能把硬盘移到別的机器上引导,也不能调整根分区  
  34.  
  35. [root@rhel5 ~]# file /boot/initrd-2.6.18-194.el5.img   
  36. /boot/initrd-2.6.18-194.el5.img: gzip compressed data, from Unix, last modified: Tue Dec 18 21:15:30 2012, max compression  
  37. [root@rhel6 ~]# file /boot/initramfs-2.6.32-220.el6.x86_64.img   
  38. initramfs-2.6.32-220.el6.x86_64.img: gzip compressed data, from Unix, last modified: Sat Dec  1 19:19:41 2012, max compression  
  39.  
  40.  
  41. ●config-$(uname -r)  
  42. config为当前Linux内核的模块配置文件,即在当前Linux内核中,系统已启动了哪些模块,哪些内容已编译到Linux内核等等,都可通过此文件来查看  
  43. 在编译内核时,由make menuconfig、make xconfig、make gconfig命令生成".cofig"文件。可将其复制到/boot/目录下,重命名为config-$(uname -r)  
  44. [root@rhel6 ~]# cat /boot/config-2.6.32-220.el6.x86_64  
  45. # File systems  
  46. CONFIG_EXT4_FS=m                                "m"表示编译为一个模块  
  47. CONFIG_EXT4_FS_XATTR=y                          "y"表示编译到内核  
  48. CONFIG_EXT4_FS_POSIX_ACL=y  
  49. CONFIG_EXT4_FS_SECURITY=y  
  50. # DOS/FAT/NT Filesystems  
  51. CONFIG_FAT_FS=m  
  52. CONFIG_MSDOS_FS=m  
  53. CONFIG_VFAT_FS=m  
  54. CONFIG_FAT_DEFAULT_CODEPAGE=437 
  55. CONFIG_FAT_DEFAULT_IOCHARSET="ascii" 
  56. # CONFIG_NTFS_FS is not set                     "not set"表示没有编译到内核,即内核不支持NTFS文件系统  
  57.  
  58.  
  59. ●System.map-$(uname -r)  
  60. 在Linux内核编译完成后,一般会在/boot/目录下生成一个以system.map-*的文件  
  61.  
  62.  
  63. ●内核模块参数的配置文件  
  64. RHEL5:/etc/modprobe.conf  
  65. RHEL6:/etc/modprobe.d/modprobe.conf  
  66. [root@rhel5 ~]# cat /etc/modprobe.conf  
  67. alias eth0 e1000                                设置网卡驱动模块别名为eth0  
  68. alias eth1 e1000                                添加网卡驱动模块别名为eth1  
  69. alias bond0 bonding                             添加bonding驱动模块别名为bond0  
  70. options bonding miimon=100 mode=0               添加bonding模块选项  
  71. alias scsi_hostadapter1 mptspi                  设置SCSI主机卡设备  
  72. alias snd-card-0 snd-hda-intel                  设置声卡别名  
  73. options snd-card-0 index=0                      设置声卡选项  
  74. options snd-hda-intel index=0                                 
  75. remove snd-hda-intel { /usr/sbin/alsactl store 0 >/dev/null 2>&1 || : ; }; /sbin/modprobe -r --ignore-remove snd-hda-intel                      配置声卡选项  

 




     本文转自Vnimos51CTO博客,原文链接:http://blog.51cto.com/vnimos/1101694,如需转载请自行联系原作者



相关文章
|
6天前
|
Linux C语言
Linux内核队列queue.h
Linux内核队列queue.h
|
25天前
|
Shell Linux C语言
【Shell 命令集合 系统设置 】⭐Linux 卸载已加载的内核模块rmmod命令 使用指南
【Shell 命令集合 系统设置 】⭐Linux 卸载已加载的内核模块rmmod命令 使用指南
29 1
|
25天前
|
存储 Linux Shell
【Shell 命令集合 系统设置 】Linux 获取指定模块的元信息 minfo命令 使用指南
【Shell 命令集合 系统设置 】Linux 获取指定模块的元信息 minfo命令 使用指南
27 0
|
25天前
|
Linux Shell 文件存储
【Shell 命令集合 系统设置 】Linux 加载和卸载内核模块 modprobe命令 使用指南
【Shell 命令集合 系统设置 】Linux 加载和卸载内核模块 modprobe命令 使用指南
36 1
|
4天前
|
算法 Linux 调度
深度解析:Linux内核的进程调度机制
【4月更文挑战第12天】 在多任务操作系统如Linux中,进程调度机制是系统的核心组成部分之一,它决定了处理器资源如何分配给多个竞争的进程。本文深入探讨了Linux内核中的进程调度策略和相关算法,包括其设计哲学、实现原理及对系统性能的影响。通过分析进程调度器的工作原理,我们能够理解操作系统如何平衡效率、公平性和响应性,进而优化系统表现和用户体验。
14 3
|
11天前
|
负载均衡 算法 Linux
深度解析:Linux内核调度器的演变与优化策略
【4月更文挑战第5天】 在本文中,我们将深入探讨Linux操作系统的核心组成部分——内核调度器。文章将首先回顾Linux内核调度器的发展历程,从早期的简单轮转调度(Round Robin)到现代的完全公平调度器(Completely Fair Scheduler, CFS)。接着,分析当前CFS面临的挑战以及社区提出的各种优化方案,最后提出未来可能的发展趋势和研究方向。通过本文,读者将对Linux调度器的原理、实现及其优化有一个全面的认识。
|
14天前
|
Linux 内存技术
Linux内核读取spi-nor flash sn
Linux内核读取spi-nor flash sn
11 1
|
21天前
|
存储 网络协议 Linux
【Linux 解惑 】谈谈你对linux内核的理解
【Linux 解惑 】谈谈你对linux内核的理解
21 0
|
25天前
|
存储 Linux Shell
【Shell 命令集合 系统设置 】Linux 显示Linux内核模块的详细信息 modinfo命令 使用指南
【Shell 命令集合 系统设置 】Linux 显示Linux内核模块的详细信息 modinfo命令 使用指南
24 0
|
25天前
|
Shell Linux C语言
【Shell 命令集合 系统设置 】⭐Linux 向内核中加载指定的模块 insmod命令 使用指南
【Shell 命令集合 系统设置 】⭐Linux 向内核中加载指定的模块 insmod命令 使用指南
29 0