我们知道linux内核再启动过程中,主要完成以下几种功能:
1、侦测硬件信息
2、驱动初始化(可能借助intrd文件加载硬件模块)
3、以只读方式挂载根文件系统
4、转载第一支程序init
如果我们的kernel识别不了某些硬件或者实现不了某些功能的话,那么只能将某些功能代码添加在内核当中,或者将这些功能代码做成模块的形式,kernel需要哪些模块就直接调用这些模块即可。通过这两种功能就可以实现相应的功能。
而不同的实现机制和kernel设计有关。
kernel设计分为2种:
一种是单内核:这种内核将某些功能代码直接编译到内核中,因此该内核的容量较大。不过现在的单内
核也借助了微内核的优势,将某些功能做成模块的形式供kernel调用。
另一种是为内核:这种内核是将某些功能的做成模块的形式供kernel调用。
而我们的linux kernel才采用单内核设计。
如何管理模块?
使用lsmod命令可以查看系统上所有的模块
其中第一段为模块的名字。第二段为模块的大小。第三段Used by表示被使用了几次,以及哪些模块使用了该模块。
modprobe MOD_NAME:装在模块,这里接模块名
modprobe -r MOD_NAME:删除某个模块
modinfo MOD_NAME:查看某个模块的详细信息
其中filename为该模块的文件路径
depends:表示该模块安装依赖于哪个模块(相依属性问题)
insmod /PATH/TO/MODULE_FILENAME:装载指定模块,注意这里是文件路径,不是模块名称
rmmod MOD_NAME:删除指定模块,这里接模块名称
depmod /PATH/TO/MODILES_DIR :可以用来生成模块依赖列表
一般用户说来,空间访问内核空间是通过/proc、/sys这两个目录来完成的
在/proc/sys/目录下,大部分文件具有rw权限
而/sys/目录下,只要部分文件具有w权限
而我们修改内核参数一般是通过/proc/sys/,/sys/来完成的。
修改内核参数有3种方法:
1、使用echo VALUE > /proc/sys/TO/SOMEFILE
例如:修改/proc/sys/vm/drop_caches的参数
2、使用sysctl命令来修改。不过该命令只用于修改/proc/sys/目录下的文件
sysctl -w /proc/sys目录下的子目录.FILE=STRING
例如:修改/proc/sys/kernel/hostname为xsl.www.com
3、使用上述两张方法修改的内核参数,只能立即生效,但是不能永久生效。要想永久生效可以修改内核的配置文件/etc/sysctl.conf.
要想修改配置文件立即生效,使用sysctl -p命令可以重读配置文件
使用sysctl -a可以显示所有内核参数和其值
一般来说,内核的核心功是直接在内核里,其他大多数功能具有以下三种选择:
1、不使用该功能
2、将这些功能编译成模块的形式
3、将这些功能直接编译进内核当中
那么该如何手动编译内核呢?
手动编译的方式:
使用make gconfig命令,不过使用该命令适用于Gnome桌面环境,且需要安装图形开发库
使用make kconfig命令,该命令适用于KDE桌面环境,且需要安装图形开发库
不过最常见的方式是使用make menuconfig命令来编译,使用该命令会产生一个窗口界面
在该窗口下有许多参数可以选择
然后选择完成之后执行make modules_install来安装编译的模块
最后执行make、make install来完成整个编译过程
在二次编译前,最好先执行make clean命令来清理上次编译过程中产生的一些配置文件,核心文件(.config)不会被清理掉
如果是第一次编译,也最好执行make mrproper命令来清理一些残留文件,不过该命令也会将核心配置文件(.config)删除掉,所以建议在执行该命令前,最好将 .config文件备份一下
screen命令:
screen -ls: 显示已经建立的屏幕
screen: 直接打开一个新的屏幕
Ctrl+a, d: 拆除屏幕
screen -r ID: 还原回某屏幕
exit: 退出
linux学习之路之模块管理和内核编译