内核概述及配置编译

举报
dz小伟 发表于 2022/11/11 14:54:21 2022/11/11
【摘要】 目录一、内核是什么1.1、操作系统是什么1.2、操作系统核心功能二、内核、驱动和根文件系统的关联三、Linux内核的模块化设计四、Linux内核源码目录结构4.1、单个文件4.2、单个文件夹五、内核配置与编译5.1、2步配置的过程5.2、menuconfig的使用5.3、menuconfig的工作原理5.4、Kconfig文件格式5.5、Kconfig和.config文件和Makefile三...

目录

一、内核是什么

1.1、操作系统是什么

1.2、操作系统核心功能

二、内核、驱动和根文件系统的关联

三、Linux内核的模块化设计

四、Linux内核源码目录结构

4.1、单个文件

4.2、单个文件夹

五、内核配置与编译

5.1、2步配置的过程

5.2、menuconfig的使用

5.3、menuconfig的工作原理

5.4、Kconfig文件格式

5.5、Kconfig和.config文件和Makefile三者的关联


一、内核是什么

内核下载地址

  1. 内核是操作系统内核的简称,负责实现操作系统的核心功能(内存管理、调度系统、硬件设备管理、文件系统)
  2. 内核不包括应用程序。只有内核是没法用的,因为做任何事情都是通过相应的应用程序来完成的。所以就需要内核和常用应用程序打包在一起,这就是操作系统的发行版(也就是普通意义上的操作系统) 

1.1、操作系统是什么

  1. linux、windows、android、ucos就是操作系统
  2. 本质上是一个程序,由很多个源文件构成,需要编译链接成操作系统程序(vmlinux、zImage、uImage)
  3. 操作系统的主要作用就是管理计算机硬件,给应用程序提供一个运行环境

1.2、操作系统核心功能

  1. 内存管理:操作系统负责管控所有的内存,所有的应用程序需要使用内存时都要向操作系统去申请和注册,由操作系统的内存管理模块来分配内存给你使用,这样好处是可以保证内存使用不会冲突。避免内存践踏等,段错误
  2. 进程调度:操作系统下支持多个应用程序同时运行,操作系统的进程调度模块负责在各个进程之间进行切换,分时复用机制
  3. 硬件设备管理:操作系统的硬件设备管理模块就是驱动模块
  4. 文件系统:文件系统是管理存储设备的一种方式

二、内核、驱动和根文件系统的关联

  1. 内核和驱动的关联
    驱动属于内核的一部分
    驱动工作在内核态,应用程序工作在用户态
    应用程序通过内核定义的API接口来调用内核工作
  2. 内核和根文件系统的关联
    根文件系统为操作系统启动提供了很多必备的资源:根目录、进程1
    根文件系统提供根目录(/),进程1存放在根文件系统中,内核启动最后会去装载根文件系统

三、Linux内核的模块化设计

  1. 内核中各个功能模块在代码上是彼此独立的
  2. 模块化设计的目的就是实现功能模块的松耦合
  3. 配置时可裁剪,模块化编译和安装
    为了方便,逐渐从静态变成了动态升级
  4. 模块化设计的好处
    功能可裁剪、灵活性
    可扩展性(动态安装卸载、新硬件的支持)
    利于协作

四、Linux内核源码目录结构

源码下载地址

4.1、单个文件

编辑

  • Kbuild:kernel build的意思,就是内核编译的意思。这个文件就是linux内核特有的内核编译体系需要用到的文件
  • Kconfig:内核的配置体系有关的
  • Makefile:总makefile

4.2、单个文件夹

编辑

  • arch:架构,不同架构的CPU的子目录,如arm这种cpu的所有文件都在arch/arm目录下
  • block:块的意思,存储体系中关于块设备管理的代码
  • crypto:加密,这个目录下放了一些各种常见的加密算法,如crc32、md5、sha1等
  • Documentation:里面放了一些文档
  • drivers:驱动目录,列出了内核支持的所有硬件设备的驱动源代码
  • firmware:固件
  • fs:文件系统,里面列出了linux支持的各种文件系统的实现
  • include:头文件目录,公共的(各种CPU架构共用的)头文件都在这里。每种CPU架构特有的一些头文件在arch/arm/include目录及其子目录下
  • init:是初始化的意思,内核启动时初始化内核的代码
  • ipc:进程间通信,里面都是linux支持的IPC的代码实现
  • kernel:内核,内核本身需要的一些代码文件
  • lib:库,这里面都是一些公用的有用的库函数,注意这里的库函数和C语言的库函数不一样。在内核编程中是不能用C语言标准库函数,这里的lib目录下的库函数就是用来替代那些标准库函数的。如在内核中要把字符串转成数字用atoi,但是内核编程中只能用lib目录下的atoi函数,不能用标准C语言库中的atoi。譬如在内核中要打印信息时不能用printf,而要用printk,这个printk就是我们这个lib目录下的
  • mm:内存管理,linux的内存管理代码都在这里
  • net:网络相关的代码,譬如TCP/IP协议栈等都在这里
  • scripts:脚本
  • security:安全相关的代码
  • sound:音频处理相关的
  • tools:linux中用到的一些有用工具
  • usr:目录下是initramfs相关的,和linux内核的启动有关
  • virt:内核虚拟机相关的


五、内核配置与编译

树莓派编译烧录:参考文章

  1. 确定Makefile
    ARCH=arm,主要是为了可以找到arch/arm目录
    CROSS_COMPILE,是编译工具链
  2. make distclean 清除编译生成的文件
  3. make bcm2709_defconfig,生成.config文件
    bcm2709_defconfig是树莓派3b的配置文件
    相当于把bcm2709_defconfig文件拷贝成.config文件
  4. make menuconfig
  5. make 编译内核
  6. 编译完成后得到的内核镜像,在arch/arm/boot这个目录下,得到的镜像名是zImage
    源码目录下vmlinux,是编译生成的源文件,zImage是压缩后的源文件

总结:配置分2步编译分1步

5.1、2步配置的过程

make xxx_defconfig解决的问题是大部分的配置项(这一步结束后99%的配置项就已经正确了),下来就是对个别不同的针对我们的开发板进行细节调整,细节调整就通过make menuconfig来完成。

5.2、menuconfig的使用

编辑

  1. 在menuconfig中操作相关的几个键盘按键
    Enter、ESC、四个方向箭头按键
    ?按键可以显示帮助信息
    /   按键可以输入搜索内容来全局搜索信息
  2. select/exit/help
    选择,退出,帮助
  3. 回车按键选择子菜单,选项后面有 --->的选项是有子菜单的,没有这个标识的没有子菜单
    高亮的字母是热键(快捷键)
    按键Y、N、M三个按键的作用分别是将选中模块编入、去除、模块化
    双击ESC表示退出
    []不可以模块化,<>的才可以模块化
  4. 选项前面的括号里,*表示编入,空白表示去除,M表示模块化
  5. 模块化:内核模块.ko文件,将来linux系统内核启动起来后可以动态的加载或卸载这个模块

5.3、menuconfig的工作原理

  • scripts\kconfig\lxdialog目录下的一些c文件就是用来提供menuconfig的那些程序源代码
  • menuconfig显示的菜单内容(一方面是菜单的目录结构,另一方面是每一个菜单项目的细节)是由内核源码树各个目录下的Kconfig文件来支持的
  • 菜单项的项目内容从Kconfig文件来,菜单项的选择值从.config文件来

5.4、Kconfig文件格式

  • #开头的行是注释行
  • menuconfig或者config后面空格隔开的大写字母表示的类似于 NETDEVICES 的就是这个配置项的配置项名字,这个字符串前面添加CONFIG_后就构成了.config中的配置项名字
    menuconfig NETDEVICES
    
    config NET_CORE
  • 一个menuconfig后面跟着的所有config项就是这个menuconfig的子菜单。这就是Kconfig中表示的目录关系
  • 内核源码目录树中每一个Kconfig都会source引入其所有子目录下的Kconfig,从而保证了所有的Kconfig项目都被包含进menuconfig中

    source "drivers/net/hyperv/Kconfig"
  • tristate意思是三态(对应Y、N、M三种选择方式),bool是要么真要么假(对应Y和N)
    tristate的意思就是这个配置项可以被三种选择
    bool的意思是这个配置项只能被2种选择
    编辑

  •  depends中文意思是“取决于”或者“依赖于”
    本配置项依赖于另一个配置项,如果那个依赖的配置项为Y或者M,则本配置项才有意义
    如果依赖的哪个配置项本身被设置为N,则本配置项根本没有意义。
    depends并不要求依赖的配置项一定是一个,可以是多个,而且还可以有逻辑运算

    config BONDING
    	tristate "Bonding driver support"
    	depends on INET
    	depends on IPV6 || IPV6=n
    	---help---
    	  Say 'Y' or 'M' if you wish to be able to 'bond' multiple Ethernet
    	  Channels together. This is called 'Etherchannel' by Cisco,
    	  'Trunking' by Sun, 802.3ad by the IEEE, and 'Bonding' in Linux.
    
    	  The driver supports multiple bonding modes to allow for both high
    	  performance and high availability operation.
    
    	  Refer to <file:Documentation/networking/bonding.txt> for more
    	  information.
    
    	  To compile this driver as a module, choose M here: the module
    	  will be called bonding.
    
  • help:帮助信息

5.5、Kconfig和.config文件和Makefile三者的关联

  • 配置项被配置成Y、N、M会影响.config文件中的CONFIG_XXX变量的配置值
  • 这个.config中的配置值(=y、=m、没有)会影响最终的编译链接过程。如果=y则会被编入,如果=m会被单独连接成一个ko模块,如果没有则对应的代码不会被编译
  • obj-$(CONFIG_DM9000) += dm9000.o
    如果CONFIG_DM9000变量值为y,则obj += dm9000.o,因此dm9000.c会被编译
    如果CONFIG_DM9000变量未定义,则dm9000.c不会被编译
    如果CONFIG_DM9000变量的值为m则会被连接成ko模块
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。