来源:http://blog.csdn.net/eastmoon502136/article/details/8711104

推荐阅读:linux内核源码最初版linux内核源代码,简单易懂,适合初学者  http://download.csdn.net/download/are2008/2001389

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

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

关于linux内核体系结构

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

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

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

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

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


关于linux内存

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

 

关于linux进程

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

 

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

 

 

 




 

关于linux内核makefile

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

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

 

 

和菜鸟一起学linux内核源码之基础准备篇的更多相关文章

  1. 和菜鸟一起学linux内核源码之基础准备篇 系列 体系结构图

    http://blog.csdn.net/eastmoon502136/article/details/8711104

  2. linux内核源码之基础准备篇

    http://blog.csdn.net/eastmoon502136/article/details/8711104

  3. Linux内核源码详解——命令篇之iostat[zz]

    本文主要分析了Linux的iostat命令的源码,iostat的主要功能见博客:性能测试进阶指南——基础篇之磁盘IO iostat源码共563行,应该算是Linux系统命令代码比较少的了.源代码中主要 ...

  4. [转]Linux内核源码详解--iostat

    Linux内核源码详解——命令篇之iostat 转自:http://www.cnblogs.com/york-hust/p/4846497.html 本文主要分析了Linux的iostat命令的源码, ...

  5. linux内核源码注解

    轻松学习Linux操作系统内核源码的方法 针对好多Linux 爱好者对内核很有兴趣却无从下口,本文旨在介绍一种解读linux内核源码的入门方法,而不是解说linux复杂的内核机制:一.核心源程序的文件 ...

  6. Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3.0 ARMv7)

    http://blog.chinaunix.net/uid-20543672-id-3157283.html Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3 ...

  7. Linux内核源码分析方法

    一.内核源码之我见 Linux内核代码的庞大令不少人“望而生畏”,也正因为如此,使得人们对Linux的了解仅处于泛泛的层次.如果想透析Linux,深入操作系统的本质,阅读内核源码是最有效的途径.我们都 ...

  8. ubuntu下linux内核源码阅读工具和调试方法总结

    http://blog.chinaunix.net/uid-20940095-id-66148.html 一 linux内核源码阅读工具 windows下当然首选source insight, 但是l ...

  9. Linux基础系列—Linux内核源码目录结构

    /** ****************************************************************************** * @author    暴走的小 ...

随机推荐

  1. 《F4+2》β冲刺第二天

    β冲刺第二天 1.每个成员今日完成的任务: 马仲山:系统代码和开发总结文档的完善 马婧(12):完善需求文档 马婧(13):完善设计文档 马世芳:对部分功能实现进行测试 张俊逸:针对测试出现的问题完善 ...

  2. node 工程化 web项目

    1.结构 node_modules   ( ... ) routers     ( main.js  ) views    ( index.html   about.HTML  404.html ) ...

  3. Python -- xlrd,xlwt,xlutils 读写同一个Excel

    最近开始学习python,想做做简单的自动化测试,需要读写excel,然后就找到了xlrd来读取Excel文件,使用xlwt来生成Excel文件(可以控制Excel中单元格的格式),需要注意的是,用x ...

  4. R语言-attach、detach、with

    在R语言中,对于串列,数据框中的数据的进行操作时,为了避免重复地键入对象名称,可使用attach或with. 1.attach() 假设data.frame包含列name,age attach(one ...

  5. 雷林鹏分享:Ruby 字符串(String)

    Ruby 字符串(String) Ruby 中的 String 对象存储并操作一个或多个字节的任意序列,通常表示那些代表人类语言的字符. 最简单的字符串是括在单引号(单引号字符)内.在引号标记内的文本 ...

  6. 多个 CancellationTokenSource 复合(组合) 或 C# 使用 CancellationTokenSource 终止线程

    https://www.cnblogs.com/luohengstudy/p/5623451.html https://www.cnblogs.com/wlzhang/p/4604471.html

  7. English trip -- VC(情景课)5 C It's on Main Street 在主街上

    Grammar focus 语法点: on,   在...上 next to ,   旁边,周围 aross from ,  对面 between  在...之间 in front of  在…前面 ...

  8. Spring web flow的意义

    为什么要使用Spring web flow呢? 这里需要强调的一点就是,但凡一个技术的出现和流行,必有其适用的环境和存在的意义. Spring web flow加强了中央集权,这个该怎么理解呢?以往我 ...

  9. 牛客网暑期ACM多校训练营(第三场)DEncrypted String Matching fft

    题意:给你一个解密后的字符串,给你加密方式,加密过程可能出错,字符可能加减1,然后给你一个字符串,要求匹配个数(其实我也不太懂具体怎么加密解密,反正你把给你的前两个字符串用第三个加密一下,然后搞可以有 ...

  10. linux processes

    So that Linux can manage the processes in the system, each process is represented by a task_struct   ...