Linux内核模块(一)
- 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: ELF 64-bit LSB shared object, AMD x86-64, version 1, 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, version 2.6.32-220.el6.x86_64 (mockbuil, RO-rootFS, root_dev 0x901, swap_dev 0x3, 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, from Unix, last modified: Tue Dec 18 21:15:30 2012, 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, from Unix, last modified: Sat Dec 1 19:19:41 2012, 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=100 mode=0 添加bonding模块选项
- alias scsi_hostadapter1 mptspi 设置SCSI主机卡设备
- alias snd-card-0 snd-hda-intel 设置声卡别名
- options snd-card-0 index=0 设置声卡选项
- options snd-hda-intel index=0
- 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,如需转载请自行联系原作者
Linux内核模块(一)相关推荐
- Linux内核模块编程系列1-极简内核模块编写
1.准备工作 使用如下命令查看自己Linux的内核版本 uname -a 结果如下: Linux VM-73-203-debian 4.9.0-6-amd64 #1 SMP Debian 4.9.88 ...
- linux filesystem_如何使用cgdb + qemu调试linux内核模块
如何使用cgdb + qemu调试linux内核模块 前言 Linux 代码庞大而繁杂,光看代码会使人头晕目眩,如果能通过调试工具对其代码执行流程进行调试,则对学习Linux kernel以及解决平时 ...
- 编写Linux内核模块——第三部分:按键和发光二极管
[编者的话]了解了基本的内核模块开发.内核空间和用户空间交互之后,终于要开始和硬件设备直接交互了.Linux内核提供了对通用输入输出接口.中断请求等的封装,让驱动开发者可以利用中断来控制硬件线路上的设 ...
- Linux内核模块简介
一. 摘要 这篇文章主要介绍了Linux内核模块的相关概念,以及简单的模块开发过程.主要从模块开发中的常用指令.内核模块程序的结构.模块使用计数以及模块的编译等角度对内核模块进行介绍.在Linux系统 ...
- Linux内核模块学习笔记(转载)
Linux内核模块 Linux设备驱动会以内核模块的形式出现,因此学会编写Linux内核模块编程是学习linux设备驱动的先决条件. 1.1linux内核模块简介 Linux内核的整体结构非常庞 ...
- 编写Linux内核模块——第一部分:前言
[编者的话]Linux内核模块作为Linux内核的扩展手段,可以在运行时动态加载和卸载.它是设备和用户应用程序之间的桥梁,可以通过标准系统调用,为应用程序屏蔽设备细节.本文来自Derek Molloy ...
- linux内核微妙时,Linux内核模块时间同步函数汇总
在linux内核模块中能用到的函数比用户空间多,但是它的函数往往被用得很少.当然在内核中叶可以调用用户空间的函数只要直接调用系统调用的封装函数就行,如下: 如调用long gettimeofday(s ...
- 编写函数实现员工信息录入和输出_编写我的第一个Linux 内核模块“hello_module”...
前言: Linux 内 核 模 块 全 称 为 " 动 态 可 加 载 内 核 模 块 (Loadable Kernel Module,LKM)",是系统内核向外部提供的功能插口. ...
- Linux内核模块的概念和基本的编程方法
Linux内核模块的概念和基本的编程方法 标签: Linux内核模块 2013-06-14 18:29 1864人阅读 评论(0) 收藏 举报 分类: linux内核(34) 版权声明:本文为博主原创 ...
- linux 获取模块,get_module - 获取Linux内核模块的详细信息
补充说明 get_module命令 用于获取Linux内核模块的详细信息. 语法 get_module 模块名 实例 使用lsmod命令查看内核模块: lsmod | head -5 Module S ...
最新文章
- Windows 能干而 Linux 干不了的事情,那就是不需要干的事情(转贴)
- python爬虫需要调用什么模块_python爬虫需要调用什么模块
- Dijkstra模板(java)
- Readhat中作安全基线
- boost/container/small_vector.hpp: No such file or directory on Ubuntu 14.04
- Selenium基础篇之5-第一个完整的自动化测试脚本
- 315.计算右侧小于当前元素的个数
- 机器学习的所有资源链接和经验教训(八)深度学习框架
- java 数据可视化_8个可靠的开源数据可视化工具
- 修改dns服务器转发器,域服务器dns设置转发器
- a站、b站、c站、d站、e站、f站、g站、h站、i站、j站、k站、l站、m站、n站…z站?
- 还在用百度找资源?试试这3个顶级资源搜索网站,没有找不到的!
- SSL / TLS协议解析!SNI 识别
- java pdf 转换 word_如何使用Java将pdf文件转换为word文件
- Ubuntu 20.04 安装微信详细教程
- android应用中自动化埋点的实现,Android 自动化埋点方案
- 微信小程序云开发CMS内容管理平台csv上传乱码或失败的解决方法
- java的Map接口
- 软技能:代码之外的生存指南
- 让职场人心惊胆战的职场“黑话大全” 您知多少?
热门文章
- Atitit 订单处理原理与功能设计attilax总结
- atitit。解决 No suitable Log constructor。。NoClassDefFoundError: org/apache/log4j/Category 找不到类的
- Atitit.500 503 404错误处理最佳实践oak
- Atitit.mssql 数据库表记录数and 表体积大小统计
- paip.python错误解决19
- paip.android 手机输入法制造大法
- Dimensional 将 290 亿美元的共同基金转换为 ETF
- 掌门教育微服务体系 Solar
- 毕设题目:Matlab优化覆盖
- 【裂缝识别】基于matlab组合BCOSFIRE过滤器墙体裂缝识别【含Matlab源码 321期】