Linux操作系统学习笔记

一、系统内核(kernal)介绍:

是一个建立在硬件和应用之间的中间软件,向上为应用提供调动硬件的接口服务,向下提供对各类硬件的兼容性支持(各种架构的CPU、各种不同原理、不同厂商的内存和设备)。

系统内核可以分为三层:系统调用接口(POXIS)、内核代码(不依赖架构,通用)、BSP板级支持包(依赖架构,具体配置)。

系统的主要组件有:系统调用接口、进程管理、内存管理、虚拟文件系统、网络堆栈、设备驱动程序和架构相关的内核代码(BSP)。

https://zhuanlan.zhihu.com/p/342056802

https://www.cnblogs.com/dy2903/p/8453660.html

1.1 系统调用接口:

系统调用接口是操作系统提供给内核的一组函数,用于对操作系统进行管理(后面的内容)。系统调用接口屏蔽了底层硬件的差异性、向上提供了系统内统一的用户接口,但是不同系统之间的借口是不统一的。POSIX是可移植系统接口,规定了通用的系统调用接口,使得应用程序能在兼容POSIX的不同操作系统中正常运行。

1.2 进程管理:

进程、线程、任务:

进程是一个在执行的程序(执行实例),他由一个或多个线程来实现(e.g.PI的计算)。进程是划分资源的基本单位,一个程序开始运行以后就为其开启了一个独立的空间,包括堆(heap进程期间动态分配的malloc/realloc)、缓冲、栈(stack、存放局部变量)、BSS段、数据段data segment、代码段text segment。

线程是进程执行的实体,是真正在运行的执行实体。线程是CPU调度的基本单位。同一个进程的线程之间共享资源(全局变量相同),又保留有自己的程序计数器、堆、栈(局部变量不同)。

任务笼统的表述为某一目的而执行的程序,在Linux和RTOS中任务指的就是线程。

Linux中不明确的区分进程和线程(使用了相同的结构体task_struct),区别只在于是否拥有资源。因此,线程又叫轻量级进程。

进程建立的过程:

进程间通信:

进程优先级和进程调度:

进程的数据结构:

https://blog.csdn.net/weixin_42462202/article/details/102768721

Linux中的进程由结构体task_struct表示,又叫进程描述符。结构体成员如下:

tasks是一个双向的循环链表,连接了所有的进程。

pid是进程号,不论进程还是线程都拥有内核中唯一的进程号(只是习惯的称为进程号,或许线程号的叫法更加合理)。

tgid是线程组号,可以把进程看做一个主线程,由主线程创建的其他子线程和主线程构成一个线程组。线程组中的子线程的线程组号就是主线程的pid。

group_leader是一个指向主线程的进程描述符(task_struct)。

/信号相关的数据结构/

1.3 内存管理:

虚拟内存:利用cache机制联系内存和硬盘,

分页机制:

1.4 文件系统:

虚拟文件系统VFS

建立了一个文件系统的抽象层,实现对于不同的文件系统的兼容支持:网络文件系统NFS,AFS,GFS等等。

1.5 网络协议栈:

1.6 驱动:

1.7 BSP:

参考文献:

https://zhuanlan.zhihu.com/p/342056802

【计算机原理】程序执行过程 - dy2903 - 博客园

设备树:

Kconfig:

是一种图形化的配置.config文件的工具语言,被广泛的应用于Linux内核。使用一个名为Kconfig的配置脚本,设置了各种配置选项和之间的依赖关系。这样,开发者可以通过make  menuconfig的命令实现图形化的.config文件生成(需要已经安装好了uboot)。

Kconfig的语法为:

config [name] [“option name”]
default     [default_value]
depends on [dependency_config _name]
select [select_config _name]
help [help information]

#