一.Linux内核简介
linuxkernelmap:
linux系统体系结构:
linuxkernel体系结构:
arm有7种工作模式,x86也实现了4个不同级别RING0-RING3,RING0级别最高,
这样linux用户代码运行在RING3下查看linux内核版本命令,内核运行在RING0,这样系统本身就得到了
充分的保护
用户空间(用户模式)转入内核空间(系统模式)方式:
·系统调用
·硬件中断
linuxkernel体系结构:
虚拟文件系统VFS:
VFS(虚拟文件系统)隐藏各类文件系统的具体细节,为文件操作提供统一的插口
二.Linux内核源代码
linux内核下载
目录结构:
解压linuxkerneltar后目录
·arch:按照cpu体系结构不同而分的代码
·block:部份块设备驱动程序
·crypto:加密,压缩查看linux内核版本命令,CRC校验算法
·documentation:内核文档
·drivers:设备驱动程序
·fs(虚拟文件系统vfs):文件系统
·include:内核所需的头文件linux find,(与平台无关的头文件在include/linux中)
·lib:库文件代码(与平台相关的)
·mm:实现显存管理,与硬件体系结构无关的(与硬件体系结构相关的在arch中)
·net:网路合同的代码
·samples:一些内核编程的范例
·scripts:配置内核的脚本
·security:SElinux的模块
·sound:音频设备的驱动程序
·usr:cpio命令实现,用于制做根文件系统的命令(文件系统与内核放在一块的命令)
·virt:内核虚拟机
linuxDOC编译生成:
linux源根目录/Documentation/00-INDEX:目录索引
linux源根目录/Documentation/HOWTO:手册
·生成linux内核帮助文档:在linux源根目录(Documentation)执行makehtmldocs
ubuntu16下须要执行sudoapt-getinstallxmlto安装插件才可生成doc文档
前面开发中常常要改的是arch,drivers中的代码
三.Linux内核配置与编译
清除文件(在linux源码根目录):
·makeclean:只清除所有形成的文件
·makemrproper:清除所有形成的文件与config配置文件
·makedistclean:清除所有形成的文件与config配置文件,但是编辑过的与补丁文件
↓
配置(搜集硬件信息如cpu机型linux服务器代维,网卡等...):
·makeconfig:基于文本模式的交互配置
·makemenuconfig:基于文本模式的菜单模式(推荐使用)
·makeoldconfig:使用已有的.config,但会寻问新增的配置项
·makexconfig:图形化的配置(须要安装图形化系统)
配置方式:
1)使用makemenuconfig操作方式:
1>按y:编译>联接>镜像文件
2>按m:编译
3>按n:哪些都不做
4>按"空格键":y,n轮换
配置完并保存后会在linux源码根目录下生成一个.config文件
注意:在ubuntu11上要执行apt-getinstalllibncurses5-dev来安装支持包
2)借助已有的配置文件模板(.config)
1>linux源码根目录/arch//configs/,把上面对应的文件copy并更名为.config至linux源码根目录下
2>借助当前运行已有的文件(要用ls/boot/-a查看)把/boot/config-2.6.18-53.e15拷贝并更名为.config至linux源码根目录下执行以上操作就可以用makemenuconfig在拷贝
.config文件里面更改文件了
↓
编译内核:
1)makezImage
2)makebzImage
区别:在X86平台上,zimage只能用于大于512k的内核
获取详尽编译信息:makezimageV=1或makebzimageV=1
编译好的内核在:arch//boot/目录下
注意:在把.config配置文件cp到根目录编译内核前,必须步入makemenuconfig并保存退出(否则生不了效)
↓
编译并安装模块:
1)编译内核模块:makemodules
2)安装内核模块:makemodules_installINSTALL_MOD_PATH=/lib/modules
更换本机器内核:将编译好的内核模块从内核源码目录copy至/lib/modules下
制做initramdisk():输入执行命令mkinitrdinitrd-2.6.39(任意)2.6.39(可通过查询/lib/modules下的目录得到)
注意:
mkinitrd命令为redhat上面的,ubuntu的命令为:mkinitramfs-k/lib/modules/模块安装位置-oinitrd-2.6.39(任意)2.6.39(可通过查询/lib/modules下的目录得到)
假如ubuntu上面没有mkinitramfs命令可以用apt-getinstallinitrd-tools进行安装
↓
安装内核模块:
1)自动
1>cplinux根目录/arch/x86/boot/bzImage/boot/mylinux-2.6.39
2>cplinux根目录/initrd-2.6.39/boot/initrd-2.6.39
最后更改/etc/grub.conf或/etc/lilo.conf文件
2)手动
1>makeinstall:这个命令会手动完成前面的操作(查看当前内核版本:uname-r)
-----------------------------------------------------------------------------
四.linux内核模块开发
描述:
linux内核组件十分庞大,内核ximage并不包含某组件,而是在该组件须要被使用的时侯,动态的添加到正在运行的内核中(也可以卸载),这些机制称作“内核模块”的机制。内核模块一般通过使用makefile文件对模块进行编译
模块安装与卸载:
1)加载:insmodhello.ko
2)卸载:rmmodhello