X86-内核
查看内核版本:
1.uname -r
2.cat /proc/version
系统架构:1.用户空间, 2.内核空间
将其分为两部分空间的原因:ARM系统中有多种使用模式,将 系统架构分为两个空间可以使操作系统得到充分的保护,使用户程序和内核程序在不同的空间上运行,互不干扰。
以串口中断为例
广义内核架构
SCI:实现系统调用函数的接口(open等)
PM:进程管理(进程调度等)
MM:内存管理
ARCH:体系架构相关的代码(与CPU相关的代码)
VFS:虚拟文件管理系统(隐藏各种文件系统的具体细节为文件操作提供统一的接口)
NS:网络协议栈
DD:设备驱动(占绝大部分的内核代码,占内核代码的大约70%)
虚拟文件系统(VFS):
内核源代码
下载地址:www.kernel.org
管理方式:树状管理方式
内核源代码目录解析
arch:内核所支持的每种CPU体系,在该目录下都有对应的子目录
documentation:内核的文档
driver:设备驱动文档
include:内核所需要的头文件,与平台无关的头文件在include/linux子目录下
fs:存放各种文件系统的实现代码,每个子目录对应一种文件系统的实现
net:存放网络协议的实现代码
Linux内核的配置与编译
1.如何配置内核
1.1为什么要配置内核?
答:因为内核源代码过于庞大,只有通过配置内核,选择所需要的功能才能使内核 变小;
make config:基于文本模式的交互式配置,配置过程中一问一答
make menuconfig:基于文本模式的菜单型配置,图像化界面
<*>【运行在内存中的内核】:A -> A.c->A.o->ZImage/bzImage->内存
<M>【内核模块】:A ->A.c->A.o->文件夹【.ko文件】->需要时导入内存,不需要时从内存中删除
<>:不选择该功能
内核的配置文件作为隐藏文件保存着,需使用ls -a
2.如何编译内核
2.1编译内核<*>
a)make zImage (V = 1):在X86平台下,只能用于小于512KB的内核(查看详细的编译选项)
b)make bzImage (V = 1):(查看详细的编译选项)
c)编译好的文件存放在arch/<cpu>/boot目录下
2.2编译内核模块<M>
a)make modules:编译内核模块,编译完的模块散落在内核中的各个部分
b)make modules_install:将散落在内核中各个部分的模块放置到lib/modules中,方便之后的打包
2.3制作init ramdisk(将内核模块打包)
a)mkinitrd initrd-$version(目标文件) $version(源文件/夹)
3.安装内核
1.cp arch/x86<cpu>/boot/bzImage/ /boot/vmlinuz-$version
2.cp initrd-$version /boot/
3.修改/etc/grub.conf(添加linux内核文件,修改linux内核的映像名称,修改内核模块包名称[initrd])
4.清理内核
1. make clean:清理内核源文件中的*.o
2. make distclean:清理内核源文件中*.o和配置文件.config
Tips:
1.修改了内核,其中的文件并不会改变,因为内核中核心的部分是运行在内存中的,修改内核不过是修改内存中的一段程序,并不会改变文件系统(用户空间)的内容。
2./boot/目录是linux启动时去读取的一个文件夹
遇到的问题:
1.在第一次更新完内核后重启,出现Error 13 Invalid or 。。。。,找不到问题出在哪里,重新编译完后,在按上述过程走一遍后,内核正常启动了。