首页 > 系统相关 >和菜鸟一起学linux内核源码之基础准备篇

和菜鸟一起学linux内核源码之基础准备篇

时间:2023-01-15 16:05:19浏览次数:31  
标签:操作系统 菜鸟 地址 描述符 源码 内存 linux 内核


       注:以下大部分内容摘自linux内核编程入门篇和linux内核完全注释

 

       在工作的这段时间,发现我的visio画图熟悉了点点,总喜欢把什么源码啊,结构啊之类的就当作流程图来画来理解,因为对于图,有一个很直观的认识,所以接下去也是以图为中心。

 

关于linux内核体系结构

       说到操作系统,我们都会知道windows操作系统,linux操作系统,苹果的ios操作系统,以前很火的塞班操作系统,还有最近消费类电子很火的android操作系统。一个完整的操作系统分为4个部分。

和菜鸟一起学linux内核源码之基础准备篇_页表

       可以把这个理解为我们用的手机。其中的硬件系统就是我们看到的整个手机了,cpu啊,内存啊,这些不拆开来看不到的,和触摸屏啊,按键之类看以看到的。操作系统内核就是我们说的android了,不过他包括了linux的内核了。操作系统服务就是android的一套结构了,给我们直观的就是那个有点炫的界面了。我们可以通过点击来实现我们想要的功能。用户应用就是我们常玩的QQ啊,导航啊,当然少不了各种好玩的游戏了,愤怒的小鸟,涂鸦跳,水果忍者,是不是又想玩一把?唉,还是好好学习吧,虽然手机就在旁边。

对于linux内核的单内核模式的系统,有可以把他分为如下:

和菜鸟一起学linux内核源码之基础准备篇_页表_02

       Linux内核又可分为5个大的模块。

其关系和主要功能可以见下图:

和菜鸟一起学linux内核源码之基础准备篇_页表_03

和菜鸟一起学linux内核源码之基础准备篇_描述符_04

关于linux内存

物理内存可以分为下图所示:

内核占用内存开始部分;接下来是共硬盘,软盘使用的高速缓冲区部分,其中扣除显存和bios的640k到1m;然后是虚拟盘;最后一部分是为所有程序可以使用的主内存区。

和菜鸟一起学linux内核源码之基础准备篇_页表_05

Linux内存管理中,段变换:将一个由段选择符和段内偏移构成的逻辑地址转换为一个线性地址。页变换:将线性地址转换为对应的物理地址。具体可见下图所示:

和菜鸟一起学linux内核源码之基础准备篇_描述符_06

虚拟地址:指的是由程序产生的由段选择符和段内偏移地址两个部分组成的地址。为什么叫它是虚拟的地址呢?因为这两部分组成的地址并没有直接访问物理内存,而是要通过分段地址的变换机构处理或映射后才会对应到相应的物理内存地址。

       段描述符:向CPU提供了将逻辑地址映射为线性地址所必要的信息。描述符是由程序编译器、链接器、加载器或者操作系统创建的。

       描述符表:保存描述符在描述符表中的,有两类

1、 全局描述符表(Global descriptor table---GDT)

2、 局部描述符表(Local descriptor table---LDT)

描述符表是由8字节构成的描述符项的内存中的一个数组。处理器是通过使用GDT和LDTR寄存器来定位GDT表和当前的LDT表。最多可以含有8192(2^13)个描述符。

选择符:逻辑地址的选择部分,用于指定一描述符的,它是通过指定一描述符表并且索引其中的一个描述符项完成的。

段寄存器:处理器将描述符中的信息保存在段寄存器中,因而可以避免在每次访问内存时查询描述符表。

和菜鸟一起学linux内核源码之基础准备篇_页表_07

 

 

和菜鸟一起学linux内核源码之基础准备篇_页表_08

 

线性地址:通过指定一个页表、页表中的某一页以及页中的偏移值,从而间接地指向对应的物理地址。

页表:一个简单的32位页指示器的数组。页表本身也是一页内存,因此它含有4K字节的内存,可容纳1K个32位的项。

 

和菜鸟一起学linux内核源码之基础准备篇_页表_09

Offset = 2^12=4K, table =2^10, directory = 2^10,所以线性地址空间为2^10*2^10*4k=4G。

由于0.11内核把每个进程的最大可用的虚拟内存空间定义为64M,因此每个进程的逻辑地址可以用任务号*64M,就可以转换到线性空间的地址。

和菜鸟一起学linux内核源码之基础准备篇_描述符_10



关于linux进程

       进程可以在内核态或者用户态运行,当资源可用就被唤醒,进入就绪态;当进程处于可中断睡眠状态,收到信号可被唤醒;当处于不可中断睡眠状态,只能被使用wakeup等的唤醒;当进程处于暂停状态,可发送信号使其进入就绪态;当僵死状态,当已经停止运行,父进程还没有调用wait查询状态,一旦父进程调用完wait取得子进程信息后,这个进程任务数据结构就会被释放掉。

 

和菜鸟一起学linux内核源码之基础准备篇_页表_11

 

和菜鸟一起学linux内核源码之基础准备篇_描述符表_12


关于linux文件系统和源码目录

 

和菜鸟一起学linux内核源码之基础准备篇_描述符_13

 

和菜鸟一起学linux内核源码之基础准备篇_描述符_14

 

 

 

和菜鸟一起学linux内核源码之基础准备篇_页表_15

和菜鸟一起学linux内核源码之基础准备篇_页表_16

 

和菜鸟一起学linux内核源码之基础准备篇_描述符表_17

 

和菜鸟一起学linux内核源码之基础准备篇_描述符表_18

 

和菜鸟一起学linux内核源码之基础准备篇_描述符_19

 

 

和菜鸟一起学linux内核源码之基础准备篇_描述符表_20

 

和菜鸟一起学linux内核源码之基础准备篇_页表_21

 

 

和菜鸟一起学linux内核源码之基础准备篇_描述符_22

 

和菜鸟一起学linux内核源码之基础准备篇_描述符表_23

 

和菜鸟一起学linux内核源码之基础准备篇_描述符_24

 

 

和菜鸟一起学linux内核源码之基础准备篇_页表_25

和菜鸟一起学linux内核源码之基础准备篇_描述符表_26

和菜鸟一起学linux内核源码之基础准备篇_描述符_27

和菜鸟一起学linux内核源码之基础准备篇_描述符表_28


关于linux内核makefile

Linux makefile文件是编译辅助工具软件make的参数配置文件。Make工具软件的主要用途是通过识别哪些文件已经被修改过,从而自动地决定在一个含有多个源程序文件的程序系统中哪些文件需要被重新编译。

和菜鸟一起学linux内核源码之基础准备篇_描述符表_29

       这里的makefile主要作用是指示make程序最终使用独立编译连接成的tools/目录中的build执行程序将所有内核编译代码连接和合并成一个可运行的内核映像文件image。具体是对boot/目录中的bootsect.s、setup.s使用8086汇编器进行编译,分别生成各自的执行模块。再对源代码中的其他所有程序使用GNU的编译器gcc/gas进行编译,并连接成模块system。再用build工具将这三块组合成一个内核映像文件image。

 



标签:操作系统,菜鸟,地址,描述符,源码,内存,linux,内核
From: https://blog.51cto.com/u_15940062/6008789

相关文章

  • 和菜鸟一起学android4.0.3源码之wifi的简单分析
     关于wlan的组成 关于wifi应用层的接口的调用    首先从上层androidwifi的应用开始,首先会根据android的wifimanager的类,实例化一个mwifimanager的对象,这个对象处......
  • 和菜鸟一起学OK6410之ADC模块
    android上跑起来时也比较灵敏了,GPIO模拟的SPI也可以工作了,看了会书,修正了会,回到宿舍也已经9点多了。想想,OK6410上还有个AD模块呢。网上找了找资料,发现还是可以去尝试下可不......
  • 和菜鸟一起学算法之三分法求极值问题
    7年,唉,可是他错了,女孩根本不爱他,不过期间他的执着和付出,很让我感动,也许自己不太像他那样,才会让自己有现在的处境吧。也许吧。小感慨下。不过现在也挺好的,上上班,写写文章,然后......
  • Linux DNS --- Bind多域名配置
    一、承上启下https://www.cnblogs.com/eagle6688/p/17026162.html上一篇我们配置了example.com的解析,本文我们尝试添加第二个域名test.com还有它的二级子域名mail.test.c......
  • Linux内核机制—内核热补丁
    一、内核热补丁简介1.热补丁内核实现路径:kernel/livepatch/2.热补丁内核使用demo路径lib/livepatch/,可参考livepatch-sample.c实验也最简单。/*单独测试,使用新函......
  • 在Linux环境下将war包部署到tomcat
    部署前先简单认识几个运维工具:MobaXterm、xshell、WinSCP、CRT。常见压缩格式的压缩与解压命令:ZIP:解压--unzip压缩包名.zip压缩--zip-r压缩包名.zip......
  • Linux后台运行程序
    我们在日常使用脚本中难免会遇到需要一直挂这的脚本,这里就需要用到Linux中如何让脚本后台运行的方法。这里有3种方法供参考。如何后台运行脚本方法1:nohup在执行命令前......
  • 从嵌入式linux到android应用开发
      时间过得很快,转眼之间已经到新公司一个月了。虽然学到了一些移动开发的知识,但是觉得离我的目标还很远,完全没能达到我想要的水平。以前产品都是自己主导的,需要完成什么,计......
  • 初探linux子系统集之i2c子系统(一)
          I2c子系统在进公司来的时候就学习过了,可是那是还不是很熟悉linux中的i2c子系统,就没有细看。记得当初很想熟悉linux中的各种总线驱动,想专门写一个关于总线驱......
  • 初探linux子系统集之led子系统(三)
         世界杯结束了,德国战车夺得了大力神杯,阿根廷最终还是失败了。也许3年,5年,或者10年后,人们就不知道巴西世界杯的亚军是谁,但是总是会记得冠军是谁。就像什么考试,比......