内核

简介: 内核

一、内核是什么

内核是操作系统内核的简称,负责实现操作系统的核心功能(内存管理、调度系统、硬件设备管理、文件系统)
内核不包括应用程序。只有内核是没法用的,因为做任何事情都是通过相应的应用程序来完成的。所以就需要内核和常用应用程序打包在一起,这就是操作系统的发行版(也就是普通意义上的操作系统) 
1.1、操作系统是什么
linux、windows、android、ucos就是操作系统
本质上是一个程序,由很多个源文件构成,需要编译链接成操作系统程序(vmlinux、zImage、uImage)
操作系统的主要作用就是管理计算机硬件,给应用程序提供一个运行环境
1.2、操作系统核心功能
内存管理:操作系统负责管控所有的内存,所有的应用程序需要使用内存时都要向操作系统去申请和注册,由操作系统的内存管理模块来分配内存给你使用,这样好处是可以保证内存使用不会冲突。避免内存践踏等,段错误
进程调度:操作系统下支持多个应用程序同时运行,操作系统的进程调度模块负责在各个进程之间进行切换,分时复用机制
硬件设备管理:操作系统的硬件设备管理模块就是驱动模块
文件系统:文件系统是管理存储设备的一种方式

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

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

三、Linux内核的模块化设计

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

四、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:内核虚拟机相关的

五、内核配置与编译

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

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

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

5.2、menuconfig的使用

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

source "drivers/net/hyperv/Kconfig"

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模块

目录
相关文章
|
7月前
|
存储 缓存 调度
深入理解操作系统:从内核到用户空间
【5月更文挑战第31天】本文将探讨操作系统的核心概念,包括内核、进程管理、内存管理和文件系统。我们将深入了解这些组件如何协同工作,以提供稳定、高效的计算环境。此外,我们还将讨论操作系统如何与硬件交互,以及如何在用户空间中运行应用程序。通过阅读本文,您将获得对操作系统工作原理的全面了解。
|
Linux 调度
Linux内核15-内核如何创建进程
Linux内核15-内核如何创建进程
O0的内核
新手来说, 调试内核c代码经常上下乱跳, 但是O0又无法通过编译, 做了一个实验, 对于所有的c文件, 先尝试O0, 如果错误的话, 用O1来编译, 但是最后有一些符号找不到, 因为O0会多调用一些函数, 在这些问题都解决了之后, 最后居然报出, 某个section太大了, 看来这个问题很复杂 下面是一个简单得方法, 不要一口气把所有的文件都O0, 需要调试哪个, 把具体文件O0就行了
1332 0