热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

linux内核模块,Linux内核模块(一)

Linux的模块化配置:将公版部分(常用的)编译到内核中,个性化部分(不常用的驱动程序)独立出来编译成模块在用户空间中进行加载所需的模块到内核中[roo

Linux的模块化配置:将公版部分(常用的)编译到内核中,个性化部分(不常用的/驱动程序)独立出来编译成模块在用户空间中进行加载所需的模块到内核中

[root@rhel6 ~]# ls /lib/modules/$(uname -r)/kernel

arch    crypto  drivers fs      kernel      lib     mm      net     sound

arch    :与硬件平台有关的项目,大部分指的是 CPU 的类别,例如 x86, x86_64, Xen 虚拟支持等;

crypto  :核心所支持的加密的技术,例如 md5 或者是 des 等等;

drivers :一些硬件的驱动程序,例如显卡、网络卡、PCI 相关硬件等等;

fs      :核心所支持的 filesystems ,例如 vfat, reiserfs, nfs 等等;

kernel  :定义核心的程序、核心状态、运行绪、程序的排程 (schedule)、程序的讯号 (signle) 等

lib     :一些函数库;

mm   :与内存单元有关的各项数据,包括 swap 与虚拟内存等;

net     :与网络有关的各项协议数据,还有防火墙模块 (net/ipv4/netfilter/*) 等等;

sound   :与音效有关的各项模块;

●vmlinuz-$(uname -r) 内核引导文件

vmlinuz是可引导的、压缩的内核,在内核编译过程中创建,也可以使用make zImage(小内核)或make bzImage(大内核)来创建。其中vm表示"Virtual Memory".Linux能够使用硬盘空间作为虚拟内存,不像老的操作系统比如DOS有640KB内存的限制。

[root@rhel5 ~]# file /boot/vmlinuz-2.6.18-194.el5

/boot/vmlinuz-2.6.18-194.el5: ELF64-bit LSB shared object, AMD x86-64, version1, stripped

[root@rhel6 ~]# file /boot/vmlinuz-2.6.32-220.el6.x86_64

/boot/vmlinuz-2.6.32-220.el6.x86_64: Linux kernel x86 boot executable bzImage, version2.6.32-220.el6.x86_64 (mockbuil, RO-rootFS, root_dev0x901, swap_dev0x3, Normal VGA

●initrd-$(uname -r).img、initramfs-$(uname -r).img文件

initrd.img是一个内核映像文件,即"initrd RAM Disk".对vmlinuz内核文件解压之后,在真正的rootfs(根文件系统)启动之前被加载到内存中。是在系统引导过程中挂载的一个临时rootfs,用来支持两阶段的引导过程。initrd文件中包含了各种可执行程序和驱动程序,它们可以用来挂载真正的rootfs,然后再将这个 initrd RAM Disk 卸载,并释放内存。在很多嵌入式Linux 系统中,initrd 就是最终的rootfs。

其实装入本地linux系统时可以不用initrd,只要在kernel参数中加入root参数就可以了。

在boot loader加载kernel后, kernel需要执行系统中的/sbin/init, 读取这个文件就必须先mount rootfs。早期是通过启动时在kernel参数中加入root参数就告诉内核rootfs在哪个设备上。但随着硬件和技术的发展,现在rootfs可能位于一个网络存储如NFS上, 可能由于RAID而散布于多个设备上, 可能位于一个加密设备上需要提供用户名和密码,这时root参数就显得不够了。

为了应付这种局面, 先后出现两种机制来作为boot loader装载kernel到真正的/sbin/init执行这个启动过程的桥梁:initrd和initramfs。

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。

dracut 是下一代的 initramfs 系统,是在RHEL6/CentOS6和Fedora11以上的版本才出现的。和前一代 initramfs 系统的不同点在于,dracut 设计上就考虑到了映像尺寸的问题,尽量避免硬编码,以提高生成的 cpio 映像载入内存的速度; 实现上,由于initramfs 的唯一作用就是挂载rootfs(因此不需要把一堆无用的都装进去),它主要依赖 udev 去获取 rootfs 的设备节点,一旦 rootfs 节点出现则立刻切换过去。另外它采用了模块化的方式,使用者可自由在 %{_libdir}/dracut/modules.d 下创建他需要的特殊模块,可扩展性很强。最后它的使用方式和 mkinitrd 非常接近,迁移成本较低。

[root@rhel6 ~]# dracut [--hostonly] initramfs-$(uname -r).img $(uname -r)

--hostonly  :生成的 initramfs 映像只能在本机使用,既不能把硬盘移到別的机器上引导,也不能调整根分区

[root@rhel5 ~]# file /boot/initrd-2.6.18-194.el5.img

/boot/initrd-2.6.18-194.el5.img: gzip compressed data,fromUnix, last modified: Tue Dec1821:15:302012, max compression

[root@rhel6 ~]# file /boot/initramfs-2.6.32-220.el6.x86_64.img

initramfs-2.6.32-220.el6.x86_64.img: gzip compressed data,fromUnix, last modified: Sat Dec119:19:412012, max compression

●config-$(uname -r)

config为当前Linux内核的模块配置文件,即在当前Linux内核中,系统已启动了哪些模块,哪些内容已编译到Linux内核等等,都可通过此文件来查看

在编译内核时,由make menuconfig、make xconfig、make gconfig命令生成".cofig"文件。可将其复制到/boot/目录下,重命名为config-$(uname -r)

[root@rhel6 ~]# cat /boot/config-2.6.32-220.el6.x86_64

# File systems

CONFIG_EXT4_FS=m"m"表示编译为一个模块

CONFIG_EXT4_FS_XATTR=y"y"表示编译到内核

CONFIG_EXT4_FS_POSIX_ACL=y

CONFIG_EXT4_FS_SECURITY=y

# DOS/FAT/NT Filesystems

CONFIG_FAT_FS=m

CONFIG_MSDOS_FS=m

CONFIG_VFAT_FS=m

CONFIG_FAT_DEFAULT_CODEPAGE=437

CONFIG_FAT_DEFAULT_IOCHARSET="ascii"

# CONFIG_NTFS_FS is not set                     "not set"表示没有编译到内核,即内核不支持NTFS文件系统

●System.map-$(uname -r)

在Linux内核编译完成后,一般会在/boot/目录下生成一个以system.map-*的文件

●内核模块参数的配置文件

RHEL5:/etc/modprobe.conf

RHEL6:/etc/modprobe.d/modprobe.conf

[root@rhel5 ~]# cat /etc/modprobe.conf

alias eth0 e1000                                设置网卡驱动模块别名为eth0

alias eth1 e1000                                添加网卡驱动模块别名为eth1

alias bond0 bonding                             添加bonding驱动模块别名为bond0

options bonding miimon=100mode=0添加bonding模块选项

alias scsi_hostadapter1 mptspi                  设置SCSI主机卡设备

alias snd-card-0snd-hda-intel                  设置声卡别名

options snd-card-0index=0设置声卡选项

options snd-hda-intel index=0

remove snd-hda-intel { /usr/sbin/alsactl store0>/dev/null2>&1|| : ; }; /sbin/modprobe -r --ignore-remove snd-hda-intel                      配置声卡选项



推荐阅读
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • Linux下安装免费杀毒软件ClamAV及使用方法
    本文介绍了在Linux系统下安装免费杀毒软件ClamAV的方法,并提供了使用该软件更新病毒库和进行病毒扫描的指令参数。同时还提供了官方安装文档和下载地址。 ... [详细]
  • 本文记录了作者对x265开源代码的实现与框架进行学习与探索的过程,包括x265的下载地址与参考资料,以及在Win7 32 bit PC、VS2010平台上的安装与配置步骤。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 图片复制到服务器 方向变了_双服务器热备更新配置文件步骤问题及解决方法
    本文介绍了在将图片复制到服务器并进行方向变换的过程中,双服务器热备更新配置文件所出现的问题及解决方法。通过停止所有服务、更新配置、重启服务等操作,可以避免数据中断和操作不规范导致的问题。同时还提到了注意事项,如Avimet版本的差异以及配置文件和批处理文件的存放路径等。通过严格执行切换步骤,可以成功进行更新操作。 ... [详细]
  • 本文介绍了2020年计算机二级MSOffice的选择习题及答案,详细解析了操作系统的五大功能模块,包括处理器管理、作业管理、存储器管理、设备管理和文件管理。同时,还解答了算法的有穷性的含义。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 在2022年,随着信息化时代的发展,手机市场上出现了越来越多的机型选择。如何挑选一部适合自己的手机成为了许多人的困扰。本文提供了一些配置及性价比较高的手机推荐,并总结了选择手机时需要考虑的因素,如性能、屏幕素质、拍照水平、充电续航、颜值质感等。不同人的需求不同,因此在预算范围内找到适合自己的手机才是最重要的。通过本文的指南和技巧,希望能够帮助读者节省选购手机的时间。 ... [详细]
  • 本文介绍了PHP常量的定义和使用方法,包括常量的命名规则、大小写敏感性、全局范围和标量数据的限制。同时还提到了应尽量避免定义resource常量,并给出了使用define()函数定义常量的示例。 ... [详细]
  • 本文介绍了5个基本Linux命令行工具的现代化替代品,包括du、top和ncdu。这些替代品在功能上进行了改进,提高了可用性,并且适用于现代化系统。其中,ncdu是du的替代品,它提供了与du类似的结果,但在一个基于curses的交互式界面中,重点关注占用磁盘空间较多的目录。 ... [详细]
author-avatar
AYAKASHIZ
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有