Linux内核分析与应用
文章平均质量分 83
wdh3837
这个作者很懒,什么都没留下…
展开
-
3.4 进程切换
目录1.进程切换2.硬件上下文3.任务状态段3.1 thread字段1.进程切换为了控制进程的执行,内核必须有能力挂起正在CPU上运行的进程,并恢复以前挂起的某个进程的执行。这种行为被称为进程切换(process switch)、任务切换(task switch)或上下文切换(context switch)。下面几节描述在 Linux 中进行进程切换的主要内容。2.硬件上下文一、尽管每个进程可以拥有属于自己的地址空间,但所有进程必须共享CPU寄存器。因此,在恢复一个进程的执行之前,内核必须确保原创 2021-04-19 02:02:43 · 2156 阅读 · 2 评论 -
3.3 撤销进程
1. 撤销进程很多进程终止了它们本该执行的代码,从这种意义上说,这些进程“死”了。当这种情况发生时,必须通知内核以便内核释放进程所拥有的资源,包括内存、打开文件及其他资源,如信号量。进程终止的一般方式是调用exit()库函数,该函数释放C函数库所分配的资源,执行编程者所注册的每个函数,并结束从系统回收进程的那个系统调用。exit()函数可能由编程者显式地插入。另外,C编译程序总是把exit()函数插入到main()函数的最后一条语句之后。内核可以有选择地强迫整个线程组死掉。这发生在以下两种典型情况下原创 2021-04-15 23:14:04 · 1577 阅读 · 0 评论 -
3.2 进程的创建
1.概述Linux系统中采用了与其他操作系统不同的方式创建进程。Linux将进程的创建的两个步骤分解为fork()和exec()。fork()通过拷贝当前进程创建一个子进程。其与父进程的区别仅仅在于PID(每个进程唯一)、PPID(父进程进程号)和某些资源和统计量(如:挂起的信号,子进程不继承)。exec()函数负责读取可执行文件并将其载入地址空间开始运行。2.写时拷贝(copy-on-write)2.1 背景传统的fork()系统调用直接把所有的资源复制给新创建的进程。这种实现过于简单且原创 2021-04-14 02:38:58 · 1658 阅读 · 0 评论 -
3.1 进程概述
1.从程序到进程从上图可以看到一个程序通过编译器编译成汇编程序,经过汇编器编程目标代码,通过链接器形成可执行文件,最后交给操作系统来执行。从上图可知,从OS看来当程序执行时,程序也摇身一变成为了进程,在OS看来每个进程时没有多大的差异性的。都被封装在ELF的可执行文件格式中。可以通过top命令感知系统中各个进程以及动态变化,如下图。2.进程的家族关系进程是一个动态的实体,它是具有生命周期的。OS中进程的生生死死随时发生,所以操作系统对进程的描述就模仿人类的活动。一个进程不会平白原创 2021-04-07 03:03:51 · 533 阅读 · 0 评论 -
2.4 动手实践,代码级-把虚拟内存地址转换为物理内存地址
paging_lowmem.c#include <linux/kernel.h>#include <linux/init.h>#include <linux/module.h>#include <linux/mm.h>#include <linux/mm_types.h>#include <linux/sched.h>#include <linux/export.h>static unsigned long原创 2021-04-02 01:28:05 · 1044 阅读 · 1 评论 -
2.3 保护模式下的分页机制
1. 分页机制的引入分页机制是分段机制之后进行的,目的是为了将线性地址转换成物理地址。x86架构规定,分页机制是可选的,但众多操作系统采用的都是分页机制。2. 分页机制中的页所谓分页,就是将虚拟地址空间或线性地址空间划分成若干大小相等的片,称为页(Page)对物理地址空间分成与页大小相对的存储块,称为块或页面(Page Frame)在32为系统中页默认为4KB的大小。3. 分页原理分页可以是每个进程拥有自己独立的虚拟地址空间。为了达到这个效果CPU就需要一次地址的变化,也就是原创 2021-03-31 03:01:14 · 581 阅读 · 1 评论 -
2.2 保护模式下的段机制
1.一切从hello world说起#include <stdio.h>int main(void){ printf("hello world!\n"); return 0;}我们通过编译,汇编,链接,装载并执行gcc -S hello.c -o hello.s //编译gcc -c hello.s -o hello.o //汇编gcc -c hello.o -o a.out //链接./a.out //装载并执行图解如下2. 问题由上述编译,汇编原创 2021-03-30 03:05:50 · 349 阅读 · 0 评论 -
2.1 内存管理之内存寻址
1. 内存寻址概述1.1 图灵机内存寻址的历史某种程度上来说就是现代计算机的历史。从最早的图灵机说起。如下图:输入,输出,状态转移函数是图灵机的三要素,图灵机通过纸带完成内存寻址。图灵机是现代计算机的鼻祖。1.2 冯诺依曼体系结构冯诺依曼体系核心思想:数据连续存储和选择读取思想。计算机背后的核心问题之一,就是如何有效的进行内存寻找,因为所以数据运算的前提都是需要从内存中取得数据。冯诺依曼体系给出了一种解决方案。1.3 CPU体系结构关系图1.4 x86架构不同内存寻址的时期原创 2021-03-30 00:34:43 · 1227 阅读 · 0 评论 -
1.3 Linux内核中的双链表结构
1. 双链表1.1 双链表的演化在C语言中,一个基本的双向链表定义如下:struct my_list { void * mydata; struct my_list *next; struct my_list *prev;};图解如下prev称为前驱指针,next称为后继指针。这种结构可以从两个方向遍历链表从而提高效率。为什么要对双链表作为重点介绍? d...原创 2021-03-28 17:57:34 · 149 阅读 · 0 评论 -
1.2 Linux内核结构以及内核模块的编程
1. Linux的单内核与微内核1.1 两者整体框图比较1.2 单内核操作系统的各个子系统,比如说文件系统,内存管理,进程管理,网络系统,进程间通信,互相之间可以直接调用。特点,由于各个子系统可以相互访问,所以性能比较高。但是可维护性比较差。典型的Linux就是单内核1.3 微内核只有一些核心的代码放到了微内核里,比如核心进程间通信,中断,调度程序。而文件系统,内存管理。可能以服务器的形式放在外部。特点,由于各个模块访问是通过通信的方式访问,所以效率比较低,但是每个服务器相对独立,原创 2021-03-28 15:29:10 · 160 阅读 · 1 评论 -
1.1-linux操作系统概述
1. linux系统整体结构2. linux设计理念机制与策略分离3. 系统调用机制系统调用在应用程序和内核中起一个接口的作用把很多操作都隔离起来了。系统调用机制起 一个隔离变化的作用。以应用程序访问文件为例。应用程序不需要关注,访问的是哪种文件系统,hardware不需要关注访问的哪种存储介质。这里system call就起了一个隔离变化的作用。3.参考文献Linux内核设计与实现深入理解Linux内核...原创 2021-03-28 14:14:58 · 147 阅读 · 0 评论