首页 / 小白资源

Linux 内核基础知识一

发布时间:2023-11-20 20:12:12

1、Linux内核源代码的目录结构
arch :包含和硬件体系结构相关的代码,每种平台占一个相应的目录,如i386armarm64powerpcmips等。Linux内核目前已经支持30种左右的体系结构。
block:块设备驱动程序I/O调度
crypto :常用的加密和散列算法
documentation :内核各部分的通用解释和注释
drivers :设备驱动程序,每个不同的驱动占用一个子目录,如char block net mtd i2c
fs :所支持的各种文件系统,如EXTFATNTFSJFFS2
Include :头文件,与系统相关的头文件放置在include/linux子目录下
Init :内核初始化代码,著名的start_kernel()就位于init/main.c文件中
Ipc:进程间通信的代码
Kernel:内核最核心的部分,包括进程调度、定时器等,而和平台相关的一部分代码放在arch/*/kernel目录下
Lib :库文件代码
Mm:内存管理代码,和平台相关的一部分代码放在arch/*/mm目录下;
Net:网络相关代码,实现各种常见的网络协议
Scripts:用于配置内核的脚本文件
Security:主要是一个SELinux的模块;
SoundALSAOSS音频设备的驱动核心代码和常用设备驱动
Usr:实现用于打包和压缩的cpio
Include:内核API级别头文件

2、Linux内核的组成部分
内核主要是由进程调度(SCHED)、内存管理(MM)、虚拟文件系统(VFS)、网络接口(NET)、和进程间通信(IPC)5个子系统组成;
2.1进程调度
进程调度控制系统中的多个进程对CPU的访问,使得多个进程能在CPU中的微观串行,宏观并行执行,进程调度处于系统的中心位置,内核中的其他的子系统都依赖它,因为每个系统都需要挂起或者恢复进程。
进程的状态:
就绪,执行,休眠,暂停,僵死
进程是使用task_struct结构体来描述进程的,包含了内存资源、文件系统资源、文件资源、tty资源、信号资源等指针.
用户空间通过pthread_create() API创建线程的时候,本质上内核只是创建了一个新的task_struct;绝大多数进程都是由用户空间的应用创建的,通过系统调用的方式进入内核空间。内核编程中,需要并发执行的任务时,可以启动内核线程。
2.2内存管理
  内存管理的主要作用是控制多个进程安全地共享内存区域。当CPU提供内存管理单元MMULinux内存管理对于每个进程完成从虚拟内存到物理内存的转换。
  一般而言,32位处理器的linux的每个进程享用4GB的内存空间,0~3G是用户空间,3G~4G是内核空间;
2.3虚拟文件系统
  Linux虚拟文件系统隐藏了各种硬件的具体细节,为所有设备提供了统一的接口,而且独立于各个具体的文件系统,是对各种文件系统的一个抽象,为上层的应用程序提供了统一的vfs_read()vfs_write()等接口,并调用具体底层文件系统或者设备驱动中实现的file_operation结构体的成员函数;
2.4 网络接口
   Linux内核支持的协议栈种类较多,如Internet\UNIX\CAN\NFC\Bluetooth\WiMAX\IrDA等,上层的应用程序统一使用套接字接口;
2.5进程间通信
   Linux支持进程间的多种通信机制,包含信号量、共享内存、消息队列、管道、UNIX域套接字
 
3. Linux内核的编译及加载
 编译内核的时候,需要配置内核,可以使用命令:Make menuconfig 基于文本选择的配置界面,字符终端下推荐使用内核置包含的条目相当多,只需要运行make ARCH=arm__xxx_defconfig就可以为xxx开发板配置内核;Linux内核的配置系统由以下三个部分组成;
1、makefile:分布在Linux内核源代码中,定义了Linux内核的编译规则;
2、配置文件(Kconfig):给用户提供配置选择的功能;
3、配置工具:包含配置命令解释器和配置用户界面
  使用make menuconfig命令后,会生成一个.config配置文件

下面我们来看一下:
1. 每条选项的前面可以看到[ ]< >、( )三种表示方式
[ ] 有两种状态,*代表选中,没有*代表未选中;
选中的意思是对应的选项功能会被编译进内核镜像文件中;
< > 有三种状态,*代表选中,没有*代表未选中,M代表模块;
( ) 存放十进制或十六进制或字符串;
2. mainmenu “字符串描述信息, 它只用一次,我们一般不用修改;
3. menu “Device Drivers”…endmenu,表示Device Drivers是一个子选项菜单,每一个选项是包含在drivers/bus/Kconfig文件中的。

相关推荐