LINUXLINUX--11ContentsLinux内核简介Linux内核启动流程Linux内核源代码Linux内核配臵与编译Linux内核模块开发ContentsLinux内核简介Linux内核启动流程Linux内核源代码Linux内核配臵与编译Linux内核模块开发LinuxLinuxLinuxLinux从上图获知,Linux由用户空间和内核空间两部份组成。为何Linux系统会被界定为用户空间与内核空间?Linux现代CPU一般实现了不同的工作模式,以ARM为例,实现了7种工作模式:用户模式(usr)、快速中断(fiq)、外部中断(irq)、管理模式(svc)、数据访问终止(abt)、系统模式(sys)、未定义指令异常(und)LinuxX86也实现了4个不同的级别:Ring0—Ring3。Ring0下,可以执行特权指令,可以访问IO设备等,在Ring3则有好多限制。Linux系统借助了CPU的这一特点,使用了其中的两级来分别运行Linux内核与应用程序,这样使操作系统本身得到充分的保护。诸如:假如使用X86,用户代码运行在Ring3,内核代码运行在Ring0。LinuxLinux内核怎么构成的?LinuxSCILinux进程管理的重点是创建进程(fork、exec),停止进程(kill、exit),并控制它们之间的通讯(signal或则POSIX制)。

进程管理还包括控制活动进程怎么共享CPU,即进程调度。LinuxVFSVFS隐藏各类文件系统的具体细节,为文件操作提供统一的插口。虚拟文件系统应用程序Ext2设备文件FATNFSLinuxContentsLinux内核简介Linux内核启动流程Linux内核源代码Linux内核配臵与编译Linux内核模块开发Linux目录arch是architecture的简写。内核所支持的每种CPU体系,在该目录下都有对应的子目录。每位CPU的子目录,又进一步分解为boot,mm,kernel等子目录,分别包含控制系统引导linux内核开发,显存管理,系统调用等。|--boot/*引导程序*/|--compressed/*内核解压缩*/|--tools/*生成压缩内核映像的程序*/|--kernel/*相关内核特点实现方法,如讯号处理、时钟处理*/|--lib/*硬件相关工具函数*/block目录部份块设备驱动程序crypto目录加密、压缩、CRC校验算法documentation内核的文档drivers目录设备驱动程序fs目录储存各类文件系统的实现代码。每位子目录对应一种文件系统的实现,公用的源程序用于实现虚拟文件系统vfs。

|--ext2/*第二扩充文件系统*/|--fat/*MS的fat32文件系统*/|--isofs/*ISO9660光碟cd-rom上的文件系统*/include目录内核所须要的头文件。与平台无关的头文件在include/linux子目录下,与平台相关的头文件则置于相应的子目录中。init目录内核初始化代码ipc目录进程间通讯的实现代码kernel目录Linux大多数关键的核心功能都是在这个目录实现。(调度程序,进程控制,模块化)lib目录库文件代码mm目录mm目录中的文件用于实现显存管理中与体系结构无关的部份(与体系结构相关的部份在那里实|--802/*802无线通信合同核心支持代码*/|--appletalk/*与苹果系统连网的合同*/|--ax25/*AX25无线INTERNET合同*/|--bridge/*桥接设备*/|--ipv4/*IP合同族V4版32位轮询模式*/|--ipv6/*IP合同族V6版*/samples一些内核编程的范例scripts配臵内核的脚本securitySElinux的模块sound音频设备的驱动程序usrcpio命令实现virt内核虚拟机ContentsLinux内核简介Linux内核启动流程Linux内核源代码Linux内核配臵与编译Linux内核模块开发Linux内核具有可订制的优点,具体步骤如下:makecleanremovemostgeneratedfilesmakemrproperremoveallgeneratedfilesconfigfilesmakedistcleanmrproperremoveeditorbackuppatchfiles2、确定目标系统的软硬件配臵情况,例如CPU的类型、网卡的机型,所需支持的网路合同等。

3、使用如下命令之一配臵内核:makeconfig:基于文本模式的交互式配臵。makemenuconfig:基于文本模式的菜单型配臵。(推荐使用)makeoldconfig:使用已有的配臵文件(.config),并且会寻问新增的配臵选项。makexconfig:图形化的配臵(需安装图形化系统)。makemenuconfig是最为常用的内核配臵形式,使用方式如下:1、使用方向键在各选项间联通;2、使用“Enter‖键步入下一层选单;每位选项上的高亮字母是鼠标快捷方法,使用它可以快速地抵达想要设臵的选单项。3、在括弧中按“y‖将这个项目编译进内核中,按“m‖编译为模块,按“n‖为不选择(按空格键也可在编译进内核、编译为模块和不编译两者间进行切换),按“h‖将显示这个选项的帮助信息,按“Esc‖键将返回到下层选单。内核配臵一般在一个已有的配臵文件基础上鸟哥的linux私房菜,通过更改得到新的配臵文件Linux内核提供了一系列可供参考的内核配臵文件,坐落Arch/$cpu/configs4、编译内核:makezImagemakebzImage区别:在X86平台,zImage只能用于大于512K的内核*如需获取详尽编译信息,可使用:makezImagemakebzImage编译好的内核坐落arch/cpu/boot/目录下**5、编译内核模块:makemodules6、安装内核模块makemodules_install**将编译好的内核模块从内核源代码目录copy至/lib/modules下**7、制作initramdiskmkinitrdinitrd-$version$versionmkinitrdinitrd-2.6.292.6.29*$version可以通过查询/lib/modules下的目录得到X86平台1、cparch/x86/boot/bzImage/boot/vmlinuz-$version2、cp$initrd/boot/3、修改/etc/grub.conf或则/etc/lilo.conf$version为所编译的内核版本号**Linux配臵、编译、安装基于PC平台的Linux内核ContentsLinux内核简介Linux内核启动流程Linux内核源代码Linux内核配臵与编译Linux内核模块开发哪些是内核模块?Linux内核的整体结构十分庞大,其包含的组件也十分多,怎么使用须要的组件呢:方式一:把所有的组件都编译进内核文件,即:zImage或bzImage,但这样会造成两个问题:一是生成的内核文件过大;二是假如要添加或删掉某个组件,须要重新编译整个内核。

有没有一种机制能让内核文件(zImage或bzImage)本身并不包含某组件,而是在该组件需要被使用的时侯,动态地添加到正在运行的内核有,Linux提供了一种称作“内核模块”的机制,就可以实现以上疗效。内核模块具有如下特征:模块本身并不被编译进内核文件(zImage或则bzImage)可以依据需求,在内核运行期间动态的安装或卸载。(helloworld)#includelinux/init.h#includelinux/module.hstaticinthello_init(void)printk(KERN_WARNING"Hello,worldstaticvoidhello_exit(void)printk(KERN_INFO"Goodbye,worldn");module_init(hello_init);module_exit(hello_exit);1、模块加载函数(必需)安装模块时被系统手动调用的函数,通过module_init宏来指定,在HelloWorld模块中,模块加载函数为?2、模块卸载函数(必需)卸载模块时被系统手动调用的函数,通过module_exit宏来指定,在HelloWorld模块中,模块卸载函数为?在Linux2.6下编译模块linux关机命令,多使用makefile范例makefile剖析范例多文件makefile剖析加载insmod(insmodhello.ko)卸载rmmod(rmmodhello)查看lsmod加载modprobe(modprobehello)modprobe就像insmod,也是加载一个模块到内核。

它的不同之处在于它会依照文件/lib/modules/$version/modules.dep来查看要加载的模块,看它是否还依赖于其他模块,如果是,modprobe会首先找到这种模块,把它们先加载到内核。对比应用程序,内核模块具有以下不同:应用程序是从头(main)到尾执行任务,执行结束后从显存中消失。内核模块则是先在内核中注册自己便于服务于将来的某个恳求,之后它的初始化函数结束,此时模块依然存在于内核中,直至卸载函数被调用,模块才从内核中消失。1、许可证声明宏MODULE_LICENSE拿来告知内核,该模块带有一个许可证,没有这样的说明,加载模块时内核会责怪。有效的许可证有"GPL―、"GPLv2"、"GPLadditionalrights"、"DualBSD/GPL"、"DualMPL/GPL"和"Proprietary"。2、作者声明(可选)MODULE_AUTHOR(―SimonLi");3、模块描述(可选)MODULE_DESCRIPTION("HelloWorldModule");4、模块版本(可选)MODULE_VERSION("V1.0");5、模块别称(可选)MODULE_ALIAS("asimplemodule");6、模块参数通过宏module_param指定模块参数,模块参数用于在加载模块时传递参数给模块。

module_param(name,type,perm)name是模块参数的名称,type是这个参数的类型linux内核开发,perm是模块参数的访问权限。type常见值:bool:布尔型int:整型charp:字符串型perm常见值:S_IRUGO:任何用户都对/sys/module中出现的该参数具有读权限S_IWUSR:容许root用户更改/sys/module中出现的该参数比如:intchar*st;module_param(a,int,S_IRUGO);module_param(st,charp,S_IRUGO);.koPKBeforeLinux2.6,userspaceprogramwouldinterpretELFobject(.o)filedoall

本文原创地址:https://www.linuxprobe.com/cnhjjlnhqdlc.html编辑:刘遄,审核员:暂无