深入理解linux内核架构Linux内核是一种开源的类Unix操作系统宏内核。Linux内核是Linux操作系统的主要组件,也是计算机硬件与其进程之间的核心接口。它负责两者之间的通信,还要尽可能高效地管理资源。之所以称为内核,是因为它在操作系统中就像果实硬壳中的种子一样,并且控制着硬件的所有主要功能。用户所看到的内容则被称为用户空间。modinfo能够查询系统中未安装的模块信息。modinfo默认情况下,为了便于阅读,以下面的格式列出模块的每个属性:fieldname:value。

深入理解linux内核架构?Linux 内核是一种开源的类 Unix 操作系统宏内核,我来为大家讲解一下关于深入理解linux内核架构?跟着小编一起来看一看吧!
深入理解linux内核架构
Linux 内核是一种开源的类 Unix 操作系统宏内核。
Linux 内核是 Linux 操作系统的主要组件,也是计算机硬件与其进程之间的核心接口。它负责两者之间的通信,还要尽可能高效地管理资源。之所以称为内核,是因为它在操作系统中就像果实硬壳中的种子一样,并且控制着硬件的所有主要功能。内核的用途主要有以下 4 项工作:
在正确实施的情况下,内核对于用户是不可见的,它在自己的小世界(称为内核空间)中工作,并从中分配内存和跟踪所有内容的存储位置。用户所看到的内容则被称为用户空间。这些应用通过系统调用接口(SCI)与内核进行交互。
Linux系统内核概述
1. 内核简介
单内核体系设计、但充分借鉴了微内核设计体系的优点,为内核引入模块化机制。
Linux 内核的重要组成部分,主要有以下几部分:
2. 内核模块2.1 uname 命令
使用格式
参数解释
# uname -mi686# uname -r2.6.32-573.22.1.el6.i686# uname -aLinux MyServer 2.6.32-573.22.1.el6.i686 ... i686 i386 GNU/Linux
2.2 lsmod 命令
显示由核心已经装载的内核模块
命令定义
# cat /proc/modulesiptable_filter 2173 0 - Live 0xed9b2000ip_tables 9567 1 iptable_filter, Live 0xed9a9000ext3 203718 1 - Live 0xed962000jbd 65315 1 ext3, Live 0xed904000xenfs 4360 1 - Live 0xed8e6000ipv6 271097 14 - Live 0xed88e000xen_netfront 15871 0 - Live 0xed7d9000ext4 339812 2 - Live 0xed764000jbd2 75927 1 ext4, Live 0xed6d9000mbcache 6017 2 ext3,ext4, Live 0xed6b7000xen_blkfront 19209 5 - Live 0xed69f000dm_mirror 11969 0 - Live 0xed68d000dm_region_hash 9644 1 dm_mirror, Live 0xed67e000dm_log 8322 2 dm_mirror,dm_region_hash, Live 0xed672000dm_mod 84711 11 dm_mirror,dm_log, Live 0xed64e000
# lsmod | grep ext4ext43398122jbd2759271 ext4mbcache60172 ext3,ext4
字段含义
# lsmodModuleSizeUsed byiptable_filter21730ip_tables95671 iptable_filterext32037181jbd653151 ext3xenfs43601ipv627109714xen_netfront 158710ext43398122jbd2759271 ext4mbcache60172 ext3,ext4xen_blkfront 192095dm_mirror119690dm_region_hash96441 dm_mirrordm_log83222 dm_mirror,dm_region_hashdm_mod8471111 dm_mirror,dm_log
2.3 modinfo 命令
显示模块的详细描述信息
命令定义
语法
选项
实战演示
# modinfo ext4filename:/lib/modules/2.6.32-573.22.1.el6.i686/kernel/fs/ext4/ext4.kolicense:GPLdescription:Fourth Extended Filesystemauthor:Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore and otherssrcversion:CB1B990F5A758DFB0FB12F1depends:mbcache,jbd2vermagic:2.6.32-573.22.1.el6.i686 SMP mod_unload modversions 686# modinfo btrfsfilename:/lib/modules/2.6.32-573.22.1.el6.i686/kernel/fs/btrfs/btrfs.kolicense:GPLalias:devname:btrfs-controlalias:char-major-10-234srcversion:B412C18B0F5BF7F1B3C941Adepends:libcrc32c,zlib_deflate,lzo_compress,lzo_decompressvermagic:2.6.32-573.22.1.el6.i686 SMP mod_unload modversions 686
2.4 modprobe 命令
装载或卸载内核模块
命令定义
bash
# modules.dep为解决依赖的配置文件,modules.dep.bin二进制文件运行# ls /lib/modules/2.6.32-358.6.1.el6.i686/buildmodules.blockmodules.ieee1394mapmodules.ofmapmodules.symbols.binweak-updatesextramodules.ccwmapmodules.inputmapmodules.ordermodules.usbmapkernelmodules.depmodules.isapnpmapmodules.pcimapsourcemodules.aliasmodules.dep.binmodules.modesettingmodules.seriomapupdatesmodules.alias.binmodules.drmmodules.networkingmodules.symbolsvdso
语法
选项
2.5 depmod 命令
内核模块依赖关系文件及系统信息映射文件的生成工具
语法
参数
2.6 insmod 和 rmmod 命令
装载或卸载内核模块
不解决依赖关系,需要自己手动卸载
insmod命令
rmmod命令
3. /proc 目录
内核把自己内部状态信息及统计信息,以及可配置参数通过 proc 伪文件系统加以输出。
# ls /proc/111732229855354760973filesystemsloadavgscsi version10122333648600buddyinfofs locksself vmallocinfo10711323230374961businterruptsmdstatslabinfovmstat1082142343138562cgroupsiomemmeminfosoftirqsxen1085152431314395287cmdlineioportsmiscstat zoneinfo1116253174531739cpuinfoirqmodulesswaps115017252318405438cryptokallsymsmountssys116218253324156808deviceskcoremtd sysrq-trigger1163192632042566830diskstatskeysnet sysvipc11651908273343567853dmakey-userspagetypeinfotimer_list116722833044579driverkmsgpartitionstimer_stats11692029334455994execdomainskpagecountsched_debugtty117121298533446695fb kpageflagsschedstatuptime
3.1 sysctl 命令
语法格式
命令参数
默认配置文件
命令使用方式
参数说明
两种修改方式
配置文件中常用的几个参数
3.2 修改配置文件
# cat /etc/sysctl.conf# Kernel sysctl configuration file for Red Hat Linux# Controls IP packet forwardingnet.ipv4.ip_forward = 0# Controls source route verificationnet.ipv4.conf.default.rp_filter = 1# Do not accept source routingnet.ipv4.conf.default.accept_source_route = 0# Controls the System Request debugging functionality of the kernelkernel.sysrq = 0# Controls whether core dumps will append the PID to the core filename.# Useful for debugging multi-threaded applications.kernel.core_uses_pid = 1# Controls the use of TCP syncookiesnet.ipv4.tcp_syncookies = 1# Disable netfilter on bridges.net.bridge.bridge-nf-call-ip6tables = 0net.bridge.bridge-nf-call-iptables = 0net.bridge.bridge-nf-call-arptables = 0# Controls the default maxmimum size of a mesage queuekernel.msgmnb = 65536# Controls the maximum size of a message, in byteskernel.msgmax = 65536# Controls the maximum shared segment size, in byteskernel.shmmax = 4294967295# Controls the maximum number of shared memory segments, in pageskernel.shmall = 268435456# Auto-enabled by xs-tools:install.shnet.ipv4.conf.all.arp_notify = 1
3.3 实战演示
# 查看所有可读变量sysctl -a# 修改对应参数sysctl -w kernel.sysrq=0sysctl -w kernel.core_uses_pid=1sysctl -w net.ipv4.conf.default.accept_redirects=0# 如果希望屏蔽别人 ping 你的主机,配置文件修改net.ipv4.icmp_echo_ignore_all = 1# 编辑完成后,请执行以下命令使变动立即生效/sbin/sysctl -p/sbin/sysctl -w net.ipv4.route.flush=1
4. /sys 目录
4.1 udevsysfs 伪文件系统,输出内核识别出的各硬件设备的相关属性信息,也有内核对硬件特性的设定信息。有些参数是可以修改的,用于调整硬件工作特性。
点击这里查看 ==> Arch Wiki udev
4.2 ramdisk 文件的制作
方法一
# 移动ramdisk文件到/root目录下mv /boot/initramfs-2.6.32...img /root# 为当前正在使用的内核重新制作ramdisk文件mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
方法二
# 移动ramdisk文件到/root目录下mv /boot/initramfs-2.6.32...img /root# 为当前正在使用的内核重新制作ramdisk文件dracut /boot/initramfs-$(uname -r).img $(uname -r)
4.3 查看 ramdisk
# 使用file命令查看ramdisk文件发现是以gz压缩存放的file /boot/initramfs-2.6.32-504.el6.x86_64.img# 改名称,解压cd /boot/mv initramfs-2.6.32-504.el6.x86_64.img initramfs-2.6.32-504.el6.x86_64.img.gzgzip -d initramfs-2.6.32-504.el6.x86_64.img.gz# 使用file命令查看发现是以cpio存放的文本文件file initramfs-2.6.32-504.el6.x86_64.img# 解压这个文本文件# 之后会在initrd目录下生成相应的文件,一个微型的/rootmkdir initrdcd initrdcpio -id < ./initramfs-2.6.32-504.el6.x86_64.img# 这个时候就可以查看init脚本文件了cat init# 在sbin文件中存放着相关的命令ls sbin
5. 编译内核5.1 前提准备
(1) 准备好开发环境
(2) 获取目标主机上硬件设备的相关信息
(3) 获取到目标主机系统功能的相关信息
(4) 获取内核源代码包
5.2 简易安装内核
简易安装
简单依据模板文件的制作内核
# 下载对应的Linux内核版本进行解压缩# 会在/usr/src目录下创建debug、kernels和linux-3.10.67目录tar xf linux-3.10.67.tar.xz -C /usr/src# 为了方便多内核共存,使用连接指向# 会在当前目录下创建一个链接文件 linux -> linux-3.10.67cd /usr/srcln -sv linux-3.10.67 linux# 创建模板cd linux# 查看链接指向的文件内容ls# 拷贝系统自带的模板文件cp /boot/config-$(uname -r) .config# 打开图形界面配置内核选项,选择添加、删除内核模块# 添加的默认选项来自.config配置文件make menuconfig# 使用screen来不中断安装screen# 采用几个线程进行编译make -j n# 安装内核make modules_install# make install中将会安装内容# 安装bzImage为/boot/vmlinuz-VERSION-RELEASE# 生成initramfs文件# 编辑grub的配置文件make install# 重启系统,并测试使用新内核,不是默认启动内核init 6
5.3 详解编译内核
(1) 配置内核选项
(2) 编译 - make [-j #]
# (a)只编译某子目录中的相关代码cd /usr/src/linuxmake dir/# (b)只编译一个特定的模块cd /usr/src/linuxmake dir/file.ko# 例如:只为e1000编译驱动make drivers/net/ethernet/intel/e1000/e1000.ko
# 编译的目标平台与当前平台不相同;make ARCH=arch_name# 要获取特定目标平台的使用帮助make ARCH=arch_name help
# 事先清理操作# 清理大多数编译生成的文件,但会保留config文件等make clean# 清理所有编译生成的文件、config及某些备份文件make mrproper# mrproper、patches以及编辑器备份文件make distclean
文章作者: Escape
文章链接: http://www.escapelife.site/posts/3acaa44c.html
