linux操作系统学习

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


Linux简介

`
Linux 内核采用宏内核架构,即 Linux 大部分功能都会在内核中实现,如进程管理、内存管理、设备管理、文件管理以及中断和异常等功能,它们是运行在内核空间中。
在这里插入图片描述
冯诺依曼体系结构如图所示,包含运算器、存储器、控制器、输入设备和输出设备5大基本类型部件。其特点是数据与代码不做区分。
CPU通过eip寄存器中指向的指令,不断读取下一条指令来执行,CPU负责解释和执行这些指令,它们通过总线连接起来。

一、进程管理

进程管理是操作系统功能的核心功能。
在 Linux 内核中,进程调度控制系统中的多个进程对 CPU 的访问,从宏观上看,系统中的进程在 CPU 中是并发执行的。此外内核通过系统调用提供了应用程序编程接口,例如:创建新进程(fork,exec),结束进程(kill,exit),同步进程和进程间通信的接口。

1、进程的结构:

内核堆栈:有进程专有的系统堆栈空间(也可以称之为内核堆栈空间)。在内核中有一个 task_struct 数据结构,即进程控制块。有了这个数据结构,进程才能被内核调度器识别并参与内核调度,除此之外它还记录着进程所占有的各项资源。
用户堆栈:除上述内核系统堆栈空间外,进程还需要有独立的用户堆栈空间,这就是 mm_struct 数据结构,该数据结构位于 task_struct 结构中,字段名称为 mm。

2、进程的堆栈:

内核在创建一个新的进程(创建进程控制块 task_struct) 时,为进程创建堆栈。
一个进程有 2 个堆栈,即用户堆栈和系统堆栈;用户堆栈的空间指向用户地址空间,内核堆栈的空间指向内核地址空间。
当进程在用户态运行时,CPU 堆栈指针寄存器指向用户堆栈地址,使用用户堆栈。
当进程运行在内核态时,CPU 堆栈指针寄存器指向的是内核堆栈空间地址,使用内核堆栈。

3 、进程与线程的区分:

每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。

二、时间管理

1、两种主要的定时测量:

保存当前的时间和日期,以便能通过time(), ftime()和gettimeofday()系统调用把它们返回给用户程序。

维持定时器,这种机制能够告诉内核或用户程序某一时间间隔已经过去了。

2、Linux的计时体系结构

更新自系统启动以来所经过的时间
更新时间和日期
确定当前进程的执行时间,考虑是否要抢占
更新资源使用统计计数
检查到期的软定时器

3、时钟和定时器电路

时钟电路用于跟踪当前时间和产生精确的时间度量。

定时器电路由内核编程,所以它们以udingde,预先定义的频率发出中断。

时钟电路的分类

用于跟踪当前时间
实时时钟RTC
时间戳计数器TSC
产生周期性的时钟中断,用于计时
可编程间隔定时器PIT

三、中断和异常

1、 中断

中断通常被定义为一个事件,该事件改变处理器执行的指令顺序。

中断通常分为同步中断和异步中断。

同步中断(中断)是当前指令执行时由CPU控制单元产生的,之所以称为同步,是因为只有在一条指令终止执行后CPUT才会发出中断。
异步中断(异常)是由其他硬件设备依照CPU时钟信号随机产生的。

2、异常

异常:处理器探测异常,故障,陷阱,异常中止,编程异常

3、中断向量

向量: 每个中断和异常是由0~255之间的一个数来标识。Intel把这个8位的无符号整数叫做一个向量。非屏蔽中断的向量和异常的向量是固定的,而可屏蔽中断的向量可以通过对中断控制器的编程来改变。

IRQ:每个能够发出中断请求的硬件设备控制器都有一条名为IRQ的输出线。所有现有的IRQ线都与一个名为可编程中断控制器的硬件电路的输入引脚相连。
IRQ线从0开始编号,与IRQn关联的Intel的缺省向量是n+32。

4、中断处理

1、确定与中断或者异常关联的向量i(0~255)

2、读idtr寄存器指向的IDT表中的第i项

3、从gdtr寄存器获得GDT的基地址,并在GDT中查找,以读取IDT表项中的段选择符所标识的段描述符

4、确定中断是由授权的发生源发出的。

5、检查是否发生了特权级的变化,一般指是否由用户态陷入了内核态。

6、若发生的是故障,用引起异常的指令地址修改cs 和eip寄存器的值,以使得这条指令在异常处理结 束后能被再次执行

7、在栈中保存eflags、cs和eip的内容

8、如果异常产生一个硬件出错码,则将它保存在栈中

9、装载cs和eip寄存器,其值分别是IDT表中第i项门描述符的段选择符和偏移量字段。这对寄存器值给出中断或者异常处理程序的第一条指定的逻辑地址

四、设备管理

设备子系统又被称之为设备驱动,如 LCD、摄像头、USB、音频等都是属于设备,且设备的厂商不同其驱动程序也是不同的,但是对于 Linux 来说,不可能去将每个设备都包含到内核,它只能抽象去描述某种设备。

系统调用层是 Linux 内核与应用程序之间的接口,而设备驱动则是 Linux 内核与硬件之间的接口,设备驱动程序为应用程序屏蔽了硬件的细节,在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作(打开、读、写和关闭)。

设备驱动程序是内核的一部分,主要功能:
对设备初始化和释放
把数据从内核传送到硬件和从硬件读取数据
读取应用程序传送给设备文件的数据和回送应用程序请求的数据
检测和处理设备出现的错误

五、Linux内核编译

1、下载内核源码

2、解压内核源文件,命令如下:

tar -xvf  压缩包名称

3、进入解压后的文件夹:
4、配置内核,命令如下:

make menuconfig 

如图:在这里插入图片描述
进入到该图形界面后,进行内核配置,按照默认进行配置就行。

5、使用如下命令,进行编译:

sudo make -j8
sudo make modules_install
sudo make install 
reboot

其中,j8表示分成8个进程运行,以加快速度,建议使用机器的所有CPU核来进行编译以加快速度,但是也要1个多小时的时间。

6、重启系统后,出现选择内核的界面,说明内核编译成功。

六、debug Linux

1、安装qemu

linux 系统的运行需要在一个完整的电脑上运行,而我们在debug时,需要一个硬件模拟软件,所以我选择qemu作为模拟软件,这是一个轻量级的硬件模拟软件。
安装命令如下:

apt-get install qemu
apt-get install qemu-system

2、运行linux

cd /home/openSource/linux-4.15
vim debug.sh

3、用GDB调试

[linux-4.19.172]$ gdb 
(gdb) file vmlinux           # vmlinux 位于目录 linux-4.19.172 中
(gdb) target remote :1234
(gdb) break start_kernel     # break设置断点
(gdb) c                      # 启动调试,则内核会停止在 start_kernel 函数处

结果如图所示:
在这里插入图片描述

7、总结

首先感谢孟老师和李老师的谆谆教导。经过这个学期对于Linux的学习,我加深了对于Linux系统的理解。我印象较深的部分是,对于中断处理的讲解让我受益匪浅,整个中断过程结合代码讲解的很详细,设备产生中断,并通过中断线将中断信号送往中断控制器,如果中断没有被屏蔽则会到达CPU的INTR引脚,CPU立即停止当前工作,根据获得中断向量号从IDT中找出中断描述符,并执行相关中断程序。
总结来说有5个步骤:
1.中断请求 2.中断响应 3.优先级比较 4.提交中断向量 5.中断结束。
本篇文章就是我对于课程的总结,请老师多多指教。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值