Linux内核源码分析 day01——内存寻址

前言

Linux内核源码分析

Antz系统编写已经开始了内核部分了,在编写时同时也参考学习一点Linux内核知识。

自制Antz操作系统

一个自制的操作系统,Antz 。半图形化半命令式系统,同时嵌入Antzscript脚本语言(写在之后)。

Github地址

博客中相关代码均可在Github上找到

目录

概述

可以参考我的另一篇https://www.cnblogs.com/LexMoon/p/webLinux.html

一 从认识操作系统开始

1.1 操作系统简介

  • 操作系统(Operation System,简称OS)是管理计算机硬件与软件资源的程序,是计算机系统的内核与基石;
  • 操作系统本质上是运行在计算机上的软件程序 ;
  • 为用户提供一个与系统交互的操作界面 ;
  • 操作系统分内核与外壳(我们可以把外壳理解成围绕着内核的应用程序,而内核就是能操作硬件的程序)。

Linux内核源码分析 day01——内存寻址

1.2 操作系统简单分类

  1. Windows: 目前最流行的个人桌面操作系统 ,不做多的介绍,大家都清楚。
  2. Unix: 最早的多用户、多任务操作系统 .按照操作系统的分类,属于分时操作系统。Unix 大多被用在服务器、工作站,现在也有用在个人计算机上。它在创建互联网、计算机网络或客户端/服务器模型方面发挥着非常重要的作用。
    Linux内核源码分析 day01——内存寻址
  3. Linux: Linux是一套免费使用和*传播的类Unix操作系统.Linux存在着许多不同的Linux版本,但它们都使用了 Linux内核 。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。严格来讲,Linux这个词本身只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU 工程各种工具和数据库的操作系统。

Linux内核源码分析 day01——内存寻址

二 初探Linux

2.1 Linux简介

我们上面已经介绍到了Linux,我们这里只强调三点。

  • 类Unix系统: Linux是一种*、开放源码的类似Unix的操作系统
  • Linux内核: 严格来说,Linux这个词本身只表示Linux内核
  • Linux之父: 一个编程领域的传奇式人物。他是Linux内核的最早作者,随后发起了这个开源项目,担任Linux内核的首要架构师与项目协调者,是当今世界最著名的电脑程序员、黑客之一。他还发起了Git这个开源项目,并为主要的开发者。

Linux内核源码分析 day01——内存寻址

2.2 Linux诞生简介

  • 1991年,芬兰的业余计算机爱好者Linus Torvalds编写了一款类似Minix的系统(基于微内核架构的类Unix操作系统)被ftp管理员命名为Linux 加入到*软件基金的GNU计划中;
  • Linux以一只可爱的企鹅作为标志,象征着敢作敢为、热爱生活。

2.3 Linux的分类

Linux根据原生程度,分为两种:

  1. 内核版本: Linux不是一个操作系统,严格来讲,Linux只是一个操作系统中的内核。内核是什么?内核建立了计算机软件与硬件之间通讯的平台,内核提供系统服务,比如文件管理、虚拟内存、设备I/O等;
  2. 发行版本: 一些组织或公司在内核版基础上进行二次开发而重新发行的版本。Linux发行版本有很多种(ubuntu和CentOS用的都很多,初学建议选择CentOS),如下图所示:
    Linux内核源码分析 day01——内存寻址

三 Linux文件系统概览

3.1 Linux文件系统简介

在Linux操作系统中,所有被操作系统管理的资源,例如网络接口卡、磁盘驱动器、打印机、输入输出设备、普通文件或是目录都被看作是一个文件。

也就是说在LINUX系统中有一个重要的概念:一切都是文件。其实这是UNIX哲学的一个体现,而Linux是重写UNIX而来,所以这个概念也就传承了下来。在UNIX系统中,把一切资源都看作是文件,包括硬件设备。UNIX系统把每个硬件都看成是一个文件,通常称为设备文件,这样用户就可以用读写文件的方式实现对硬件的访问。

3.2 文件类型与目录结构

Linux支持5种文件类型 :
Linux内核源码分析 day01——内存寻址

Linux的目录结构如下:

Linux文件系统的结构层次鲜明,就像一棵倒立的树,最顶层是其根目录:
Linux内核源码分析 day01——内存寻址

常见目录说明:

  • /bin: 存放二进制可执行文件(ls,cat,mkdir等),常用命令一般都在这里;
  • /etc: 存放系统管理和配置文件;
  • /home: 存放所有用户文件的根目录,是用户主目录的基点,比如用户user的主目录就是/home/user,可以用~user表示;
  • /usr : 用于存放系统应用程序;
  • /opt: 额外安装的可选应用程序包所放置的位置。一般情况下,我们可以把tomcat等都安装到这里;
  • /proc: 虚拟文件系统目录,是系统内存的映射。可直接访问这个目录来获取系统信息;
  • /root: 超级用户(系统管理员)的主目录(特权阶级^o^);
  • /sbin: 存放二进制可执行文件,只有root才能访问。这里存放的是系统管理员使用的系统级别的管理命令和程序。如ifconfig等;
  • /dev: 用于存放设备文件;
  • /mnt: 系统管理员安装临时文件系统的安装点,系统提供这个目录是让用户临时挂载其他的文件系统;
  • /boot: 存放用于系统引导时使用的各种文件;
  • /lib : 存放着和系统运行相关的库文件 ;
  • /tmp: 用于存放各种临时文件,是公用的临时文件存储点;
  • /var: 用于存放运行时需要改变数据的文件,也是某些大文件的溢出区,比方说各种服务的日志文件(系统启动日志等。)等;
  • /lost+found: 这个目录平时是空的,系统非正常关机而留下“无家可归”的文件(windows下叫什么.chk)就在这里。

内存寻址

四 内存地址

程序员很容易的可以使用内存地址访问内存单元的数据,但是,当使用Intel 80x86微处理器时,我们必须区分三种不同的地址。

4.1 逻辑地址

操作系统把程序分成若干段,每个逻辑地址都是由一个段和一个偏移量组成的,偏移量指明了从段开始的地方到实际地址之间的距离。

4.2 线性地址

是一个32位无符号指数,可以用来表示高达4GB的地址,线性地址通常用16机制表示。

4.3 物理地址

用于芯片级内存单元寻址,它们与从微处理器的地址引脚发送到内存总线上的电信号对应。内存地址由32位无符号整数表示。

CPU控制单元通过一种称为分段单元的硬件电路把一个逻辑地址转换成线性地址,接着利用分页单元的硬件电路把线性地址转换成物理地址

逻辑地址 —[分段单元]—> 线性地址 —[分页单元]—> 物理地址

五 硬件的分段单元

从80386开始,地址转换模式分别称为实模式和保护模式。保留实模式的主要原因是要与早期CPU保持兼容。

5.1 段寄存器

一个逻辑地址由两个部分组成:一个段识别符和一个指定段内相对地址的偏移量。段识别符是一个16位长的域,称为段选择符,偏移量是一个32位长的域。

为了方便找到段选择符,处理器提供段寄存器,目的是存访段选择符。

cs : 代码段寄存器,指向存访程序指令的段

ss : 栈段寄存器,指向存访当前程序栈的段

ds : 数据段寄存器,指向存访静态数据或者外部数据的段

cs寄存器还有一个很重要的功能,它含有一个两位域,用以指明CPU的当前特权级,0为最高,3为最低,在Linux中只有0级和3级,分别称为内核态和用户态。

5.2 段描述符

每个段是由一个8字节的段描述符来表示,它描述了段的特征。段描述符被放在全局描述符表或者局部描述符表中。

系统通常只定义一个全局描述符表(GDT),而每一个进程可以有自己的局部描述符表(LDT)。
GDT在主存中的地址被放在处理器的gdtr寄存器中,当前正被使用的LDT被放在处理器的ldtr寄存器中。

参考 : 关于GDT结构

5.3 段选择符

为了加速逻辑地址到线性地址的转换,Intel处理器提供了一种附加的非编程的寄存器,由相应的寄存器中的段选择符所指定。每当一个段选择符被装入段寄存器,相应的段描述符就由内存装入到相应的非编程的CPU寄存器。

参考

参考 : Linux内核源码

上一篇:Linux内核OOM机制的详细分析(转)


下一篇:C语言回调函数详解