linux内核 订阅
Linux是一种开源电脑操作系统内核。它是一个用C语言写成,符合POSIX标准的类Unix操作系统。 [1]  Linux最早是由芬兰 Linus Torvalds为尝试在英特尔x86架构上提供自由的类Unix操作系统而开发的。该计划开始于1991年,在计划的早期有一些Minix 黑客提供了协助,而今天全球无数程序员正在为该计划无偿提供帮助。 展开全文
Linux是一种开源电脑操作系统内核。它是一个用C语言写成,符合POSIX标准的类Unix操作系统。 [1]  Linux最早是由芬兰 Linus Torvalds为尝试在英特尔x86架构上提供自由的类Unix操作系统而开发的。该计划开始于1991年,在计划的早期有一些Minix 黑客提供了协助,而今天全球无数程序员正在为该计划无偿提供帮助。
信息
软件授权
免费
软件名称
Linux内核
发明者
Linus Torvalds
使用时间
1991年
软件语言
C语言
Linux内核内核结构
操作系统是一个用来和硬件打交道并为用户程序提供一个有限服务集的低级支撑软件。一个计算机系统是一个硬件和软件的共生体,它们互相依赖,不可分割。计算机的硬件,含有外围设备、处理器、内存、硬盘和其他的电子设备组成计算机的发动机。但是没有软件来操作和控制它,自身是不能工作的。完成这个控制工作的软件就称为操作系统,在Linux的术语中被称为“内核”,也可以称为“核心”。Linux内核的主要模块(或组件)分以下几个部分:存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信,以及系统的初始化(引导)、系统调用等。Linux内核使用三种不同的版本编号方式。  第一种方式用于1.0版本之前(包括1.0)。第一个版本是0.01,紧接着是0.02、0.03、0.10、0.11、0.12、0.95、0.96、0.97、0.98、0.99和之后的1.0。第二种方式用于1.0之后到2.6,数字由三部分“A.B.C”,A代表主版本号,B代表次主版本号,C代表较小的末版本号。只有在内核发生很大变化时(历史上只发生过两次,1994年的1.0,1996年的2.0),A才变化。可以通过数字B来判断Linux是否稳定,偶数的B代表稳定版,奇数的B代表开发版。C代表一些bug修复,安全更新,新特性和驱动的次数。以版本2.4.0为例,2代表主版本号,4代表次版本号,0代表改动较小的末版本号。在版本号中,序号的第二位为偶数的版本表明这是一个可以使用的稳定版本,如2.2.5,而序号的第二位为奇数的版本一般有一些新的东西加入,是个不一定很稳定的测试版本,如2.3.1。这样稳定版本来源于上一个测试版升级版本号,而一个稳定版本发展到完全成熟后就不再发展。第三种方式从2004年2.6.0版本开始,使用一种“time-based”的方式。3.0版本之前,是一种“A.B.C.D”的格式。七年里,前两个数字A.B即“2.6”保持不变,C随着新版本的发布而增加,D代表一些bug修复,安全更新,添加新特性和驱动的次数。3.0版本之后是“A.B.C”格式,B随着新版本的发布而增加,C代表一些bug修复,安全更新,新特性和驱动的次数。第三种方式中不再使用偶数代表稳定版,奇数代表开发版这样的命名方式。举个例子:3.7.0代表的不是开发版,而是稳定版!Linux最早是由芬兰人Linus Torvalds设计的。当时由于UNⅨ的 商业化,Andrew Tannebaum教授开发了Minix操作系统以便于不受AT&T许可协议的约束,为教学科研提供一个操作系统。当时发布在Internet上,免费给全世界的学生使用。Minix具有较多UNⅨ的特点,但与UNⅨ不完全兼容。1991年10月5日,Linus为了给Minix用户设计一个比较有效的UNⅨ PC版本,自己动手写了一个“类Minix”的操作系统。整个故事从两个在终端上打印AAAA...和BBBB...的进程开始的,当时最初的内核版本是0.02。Linus Torvalds将它发到了Minix新闻组,很快就得到了反应。Linus Torvalds在这种简单的任务切换机制上进行扩展,并在很多热心支持者的帮助下开发和推出了Linux的第一个稳定的工作版本。1991年11月,Linux0.10版本推出,0.11版本随后在1991年12月推出,当时将它发布在Internet上,免费供人们使用。当Linux非常接近于一种可靠的/稳定的系统时,Linus决定将0.13版本称为0.95版本。1994年3月,正式的Linux 1.0出现了,这差不多是一种正式的独立宣言。截至那时为止,它的用户基数已经发展得很大,而且Linux的核心开发队伍也建立起来了。在讨论大型而复杂的系统的体系结构时,可以从很多角度来审视系统。体系结构分析的一个目标是提供一种方法更好地理解源代码。Linux 内核实现了很多重要的体系结构属性。在或高或低的层次上,内核被划分为多个子系统。Linux 也可以看作是一个整体,因为它会将所有这些基本服务都集成到内核中。这与微内核的体系结构不同,后者会提供一些基本的服务,例如通信、I/O、内存和进程管理,更具体的服务都是插入到微内核层中的。随着时间的流逝,Linux 内核在内存和 CPU 使用方面具有较高的效率,并且非常稳定。但是对于 Linux 来说,最为有趣的是在这种大小和复杂性的前提下,依然具有良好的可移植性。Linux 编译后可在大量处理器和具有不同体系结构约束和需求的平台上运行。一个例子是 Linux 可以在一个具有内存管理单元(MMU)的处理器上运行,也可以在那些不提供MMU的处理器上运行。Linux 内核的uClinux移植提供了对非 MMU 的支持。核心的开发和规范一直是由Linux社区控制着,版本也是唯一的。实际上,操作系统的内核版本指的是在Linus本人领导下的开发小组开发出的系统内核的版本号。自1994年3月14日发布了第一个正式版本Linux 1.0以来,每隔一段时间就有新的版本或其修订版公布。Linux将标准的GNU许可协议改称Copyleft,以便与Copyright相对照。通用的公共许可(GPL)允许用户销售、拷贝和改变具有Copyleft的应用程序。当然这些程序也可以是Copyright的,但是你必须允许进一步的销售、拷贝和对其代码进行改变,同时也必须使他人可以免费得到修改后的源代码。事实证明,GPL对于Linux的成功起到了极大的作用。它启动了一个十分繁荣的商用Linux阶段,还为编程人员提供了一种凝聚力,诱使大家加入这个充满了慈善精神的Linux运动。
收起全文
精华内容
参与话题
问答
  • 鉴于此,《Linux内核精髓:精通Linux内核必会的75个绝技》选取了资源管理(CPU、内存、进程等)、文件系统、网络、虚拟化、省电、调试、概要分析、追踪、内核调整等Linux内核的核心主题进行了深入剖析和讲解,总结出...
  • Linux 内核

    千次阅读 2011-11-30 17:45:00
    Linux内核设计与实现》 《深入理解Linux内核》 《Linux内核完全注释》 《Linux内核源代码情景分析 》

    《Linux内核设计与实现

    《深入理解Linux内核》

    《Linux内核完全注释》

    《Linux内核源代码情景分析 


    展开全文
  • Linux内核

    千次阅读 2009-01-07 17:30:00
    Linux内核一、Linux内核Linux内核的源码树已经有超过20000个文件,超过600万行代码。这还是几年前的数据。需要工具、根文件系统、Linux应用程序共同建立一个可用的系统。1、内核版本当前的Linux内核版本为2.6.28。...
    Linux内核


    一、Linux内核
    Linux内核的源码树已经有超过20000个文件,超过600万行代码。这还是几年前的数据。
    需要工具、根文件系统、Linux应用程序共同建立一个可用的系统。

    1、内核版本
    当前的Linux内核版本为2.6.28。版本命名规则如下:
    VERSION = 2
    PATCHLEVEL = 6
    SUBLEVEL = 28
    EXTRAVERSION = 
    NAME = 
    内核包含的文件:/include/linux/version.h

    2、内核结构
    Linux内核的布局、组织和结构
    (1) 顶层源目录
    顶层内核源目录包含下列子目录:
    arch crypto Documentation drivers fs include init ipc kernel
    lib mm net scripts security sound usr
    这些子目录又包含几级带源码、makefiles和配置文件的子目录。至今为止,Linux内核源码树的最大分支为drivers子目录。drivers子目录包含Linux内核所支持的以太网卡、USB控制器、大量的硬件设备。
    arch子目录是第二大分支,包含了对超过20种的处理器架构的支持。

    顶层目录还包括顶层makefile、隐藏的配置文件、各种信息文件。
    顶层内核源码树还包括两个重要的build target:System.map和vmlinux。

    (2) 编译内核
    Linux内核太大,分析内核是一项令人沮丧的任务。多线程、优先级(preemption)增加了分析的复杂度。实际上,即使是定位入口点,也是一项挑战。理解二进制映像的有效方法是检查其构建组件。

    内核建立系统的输出产生几个普通文件(common files)以及特定架构的二进制模块。
    普通文件与架构无关。System.map和vmlinux是其中的两个普通文件。

    System.map在内核调试期间有用,它包含了易读的内核符号和各自的地址列表。
    vmlinux是特定架构的可执行格式的ELF文件。它由每个架构的顶层内核makefile产生。

    如果内核被编译,且带符号调试信息,那么内核会包含vmlinux映像。
    尽管它是可执行的ELF文件,它还是不会直接引导。

    以ARM XScale架构的Indel IXP425网络处理器为例,使用如下命令:
    make ARCH=arm CROSS_COMPILE=xscale_be- ixp4xx_defconfig
    此命令不建立内核,为XScale架构准备源码树,包括此架构和处理器的初始缺省配置。
    CROSS_COMPILE=xscale_be- 让make强制使用XScale toolchain建立内核映像
    ARCH=arm 让make强制使用内核源码树的arm分支

    (3) 正确的内核——vmlinux
    LD /arch/arm/boot/compressed/vmlinux
    vmlinux文件是实际的正确内核。它是一个完全独立的、巨大的单个映像。在vmlinux二进制文件中,没有未解决的外部引用存在。

    (4) 内核映像组件
    vmlinux映像由几个二进制映像组合而成。
    vmlinux映像组件的描述
    ------------------------------------------
    组件 描述
    ------------------------------------------
    arch/arm/kernel/head.o 指定的内核架构启动代码
    init_task.o 内核所需的初始化线程和任务
    init/built-in.o 主要的内核初始化代码
    usr/built-in.o 内建的initramfs映像
    arch/arm/kernel/built-in.o 指定架构的内核代码
    arch/arm/mm/built-in.o 指定架构的内存管理代码
    arch/arm/common/built-in.o 指定架构的类属(generic)代码
    arch/arm/mach-ixp4xx/built-in.o 指定机器的代码,通常是初始化
    arch/arm/nwfpe/built-in.o 指定架构的浮点仿真代码
    kernel/built-in.o 内核自身的通用组件
    mm/built-in.o 内存管理的通用组件代码
    ipc/built-in.o 进程间通信,例如SysV IPC
    security/built-in.o Linux安全组件
    lib/lib.a 各种帮助函数文档
    arch/arm/lib/lib.a 指定架构的通用工具,随架构而变
    lib/built-in.o 通用内核帮助函数
    drivers/built-in.o 所有内建驱动器可载入模块
    sound/built-in.o 声音驱动器
    net/built-in.o Linux网络
    .tmp_kallsyms2.o 符号表
    ------------------------------------------

    很少直接启动内核映像,内核映像一般是被压缩了的,bootloader负责解压映像。
    Makefile和Kconfig文件驱使内核配置和建立过程。

    二、内核建立系统
    Linux内核配置和建立系统相当复杂。使用Kbuild来建立内核系统。
    Linux 2.6内核使用Kbuild来编译内核模块。

    Kbuild能够编译内核树目录内的内核模块,也能够编译内核树目录外的内核模块。
    Kbuild文件倾向于"Makefile"这个名字,"Kbuild"也是可以用的。但如果"Makefile"和"Kbuild"同时出现的话,使用的将会是"Kbuild"文件。

    1、Dot-config文件
    Dot-config文件是用于建立Linux内核映像的配置“蓝图”。可编辑配置文件,命名为.config,定位在顶层源目录,驱使内核的建立。

    make mrproper 命令会删除配置文件,且无任何提示。因为其目标是返回内核源码树为纯洁的、无配置的状态。它包括从源码树移除所有配置数据,即删除你的.config。
    Linux的“.”+扩展名的文件是Linux的隐藏文件。

    Linux 2.6 的.config 文件片段
    ------------------------------
    ...
    # USB support
    #
    CONFIG_USB=m
    # CONFIG_USB_DEBUG is not set


    # Miscellaneous USB options
    #
    CONFIG_USB_DEVICEFS=y
    # CONFIG_USB_BANDWIDTH is not set
    # CONFIG_USB_DYNAMIC_MINORS is not set

    # USB Host Controller Drivers
    #
    CONFIG_USB_EHCI_HCD=m
    # CONFIG_USB_EHCI_SPLIT_ISO is not set
    # CONFIG_USB_EHCI_ROOT_HUB_TT is not set
    CONFIG_USB_OHCI_HCD=m
    CONFIG_USB_UHCI_HCD=m
    ...
    ------------------------------
    要理解.config文件,需要理解Linux内核的基本面。

    Linux有庞大的结构,整个内核作为一单个静态链接可执行而编译。然而,还可能编译和“增量链接”源集到单个对象模块,动态插入到正在运行的内核。
    一般的设备驱动经常采用此方法。在Linux中,这称为可载入模块,也称为设备驱动器。内核引导后,调用指定的应用程序,插入可载入的模块进正在运行的内核。

    2、配置编辑器
    早期的内核使用一个简单的命令行驱动脚本来配置内核——> 很笨拙
    内核配置子系统使用了几个图形化的前端。新的Linux内核版本包括了10个配置目标。
    概述如下,可从make help看到:
      -config 使用命令行程序更新当前配置
      -menuconfig 使用基于菜单的程序更新当前配置
      -xconfig 使用基于Qt的前端更新当前配置
      -gconfig 使用基于GTK的前端更新当前配置
      -oldconfig 以提供的.config更新当前配置
      -randconfig 用随机回答所有选项的新配置
      -defconfig 使用所有缺省选项的新配置
      -allmodconfig 选择模块的新配置
      -allyesconfig 所有选项均回答yes的新配置
      -allnoconfig 所有选项均回答no的新配置

    使用make gconfig可显示GTK图形的配置编辑窗口。

    大多数内核软件模块也要读.config配置文件。在建立过程期间,.config文件被放入一个C头文件,位于/include/linux目录下,名为:autoconf.h。
    Linux的autoconf.h文件片段:
    ------------------------------
    /*
     * USB support
     */
    #define CONFIG_USB_MODULE 1
    #undef CONFIG_USB_DEBUG

    /*
     * Miscellaneous USB options
     */
    #define CONFIG_USB_DEVICEFS 1
    #undef CONFIG_USB_BANDWIDTH
    #undef CONFIG_USB_DYNAMIC_MINORS

    /*
     * USB Host Controller Drivers
     */
    #define CONFIG_USB_EHCI_HCD_MODULE 1
    #undef CONFIG_USB_EHCI_SPLIT_ISO
    #undef CONFIG_USB_EHCI_ROOT_HUB_TT
    #define CONFIG_USB_OHCI_HCD_MODULE 1
    #define CONFIG_USB_UHCI_HCD_MODULE 1
    ------------------------------


    展开全文
  • Linux内核从原理到代码详解 链接: http://pan.baidu.com/s/1sj0Szj3 密码: ywyv 网盘失效的话,请加QQ: 3113533060 课程内容: 第一周 1. 初识Linux内核 1.1 认识操作系统 1.2 开放源代码的UNIX...
    Linux内核从原理到代码详解


    链接: http://pan.baidu.com/s/1sj0Szj3 密码: ywyv


    网盘失效的话,请加QQ: 3113533060


    课程内容:
    第一周
    1. 初识Linux内核
    1.1 认识操作系统
    1.2 开放源代码的UNIX/Linux操作系统
    1.3 Linux内核
    1.4 Linux内核源代码
    1.5 Linux内核模块编程入门 
    1.6 Linux 内核中链表的实现及应用
    第二周
    2. 内存寻址
    2.1 内存寻址
    2.2 段机制
    2.3 分页机制
    2.4 Linux中的分页机制
    2.5 Linux中的汇编语言
    第三周
    3章 进程
    3.1 进程介绍
    3.2 Linux系统中的进程控制块
    3.3 Linux系统中进程的组织方式
    3.4 进程调度
    3.5 进程的创建
    3.6 与进程相关的系统调用及其应用
    3.7 系统调用及应用
    第四周
    4章 内存管理
    4.1 Linux的内存管理概述
    4.2 进程的用户空间管理
    4.3 请页机制
    4.4 物理内存分配与回收
    4.5 交换机制
    4.6 内存管理实例


    第五周
    5章 中断和异常
    5.1 中断是什么
    5.2 中断描述符表的初始化
    5.3 中断处理
    5.4 中断的下半部处理机制
    5.5 中断应用——时钟中断


    第六周
    6章系统调用
    6.1 系统调用与应用编程接口、系统命令以及内核函数的关系
    6.2 系统调用基本概念
    6.3 系统调用实现
    6.4 封装例程
    6.5 添加新系统调用


    第七周
    7章内核中的同步
    7.1 临界区和竞争状态
    7.2 内核同步措施
    7.3 生产者\消费者并发实例
    7.4 内核多任务并发实例
    第八周
    8章 文件系统
    8.2 虚拟文件系统
    8.3 文件系统的注册、安装与卸载
    8.4 文件的打开与读写
    8.5 编写一个文件系统


    第九周
    9 设备驱动
    9.1 概述
    9.2 设备驱动程序框架
    9.3 I/O空间的管理
    9.4 字符设备驱动程序

    展开全文
  • 深入分析Linux内核源码.chm

    千次下载 热门讨论 2008-10-07 14:30:14
    1.3走进Linux内核 1.4 分析Linux内核的意义 1.5 Linux内核结构 1.6 Linux内核源代码 1.7 Linux内核源代码分析工具 第二章 Linux运行的硬件基础 2.1 i386的寄存器 2.2 内存地址 2.3 段机制和描述符 2.4 分页机制 2.5 ...
  • 安卓编译与开发、Linux内核及驱动

    千人学习 2015-08-17 17:42:48
    安卓编译与开发、Linux内核及驱动视频教程,该课程内容包括一、源码编译:1、常见的ROM种类、谷歌的ROM、第三方的ROM2、区别3、RockChip的ROM、4、编译环境配置、源码下载、编译命令;二、源码开发:源码结构分析、...
  • Linux内核修炼之道》 之 高效学习Linux内核

    万次阅读 热门讨论 2010-07-15 23:10:00
    这本《Linux内核修炼之道》在卓越、当当、china-pub上也已经开卖了,虽然是严肃文学,但为了保证流畅性,大部分文字我还都是斟词灼句,反复的念几遍才写上去的,尽量考虑到写上去的每段话能够让读者产生什么疑惑,...

    世界悲结束了,章鱼哥也退役了,连非诚勿扰中的拜金女也突然的少了很多。这本《Linux内核修炼之道》在卓越当当china-pub上也已经开卖了,虽然是严肃文学,但为了保证流畅性,大部分文字我还都是斟词灼句,反复的念几遍才写上去的,尽量考虑到写上去的每段话能够让读者产生什么疑惑,然后也都会紧接着尽量的去进行解释清楚,中间的很多概念也有反复纠结过怎么解释能够更容易的理解,力求即使对于初学者也可以有很少阻碍的一气读完。同时我也把书中一部分自己的感悟抽出来整理了精华版,share出来。当然水平有限,错漏之处有发现而修订时遗漏的,也有尚没有发现的。这本书如果对您有用,乃我之幸事,如果无用,就在此先诚惶诚恐的向大家拜个不是了。

    在6月份做过一次《高效学习Linux内核》的presentation,下面是前面的一部分内容及讲义,或许对大家有用吧。至于剩余的,因为和之前博客中的部分文章内容差不多,就不贴了。

    **********************************************************************

    既然有高效,相对的就有低效。学习本身就是一件很玄乎的事情,有些人整天潇潇洒洒没见怎么用心就能够获得很好的成绩,而有些人则相反,即使投悬梁锥刺骨也还是成绩平平收获平平。这里面很大一部分的原因就是学习的方法。

    但是学习方法这样的题目并不好讲,因为基于每个人不同的情况,并没有那样一个标准的方法存在,所以讲起来就很容易成为一场大忽悠。就像我们的任志强先生前阵子演讲卖房子 的方法时,就因为太像一场忽悠,从而被听众扔了鞋。

     

    接下来我就通过自己的一些感悟,抛砖引玉来介绍一下如何比较高效的去学习 linux 内核。这些话并不局限于某个部分的内容,很像一句句的口号,我们也可以将它们看作内核学习的大字报。

    首先是第一句话:把内核当朋友。今年笑来老师有本新书,叫把时间当朋友,告诉我们只有把时间当朋友,才能更好的利用自己的时间做些有益的事情。同样,我们只有把内核当朋友,把它放在对等的地位上,而不仅仅是一堆死气沉沉的代码,我们才能够更好的认识和理解到它的精髓。

    然后是第二句话:先会使用它。意思就是我们在学习内核前首先要会用 linux ,依照一个由上至下循序渐进的过程,在能够熟练的使用 Linux 操作系统之后再去研究内核中的实现。这也是 linus 本人的观点。

    第三句是依照四个层次进行内核学习。笛卡儿在 17 世纪的某一天,闲极无聊写了这么一本书,书名就叫《方法论》,在这本目前来说绝大部分人都不知道的书里将方法上升到了理论的高度。笛卡儿在他的这本书里将研究问题的方法归纳为简单的一句话,就是 “ 复杂问题要简单化 ” 。就是说要将复杂的问题分解为很多个简单的小问题,一个个的分开解决。这句话当然可以借鉴运用到内核的学习上,不过需要做些改动,不是分解为多个简单的小问题,而是将内核学习这么一件很复杂的事情划分为由低到高多个不同的层次,每一层次都有自己需要达到的目标和要求。这也是我自己认为比较好的认识学习内核的方法。

    第四句是走出心理误区。 对于学习这种复杂的事情来说,无论是我们在学校的课堂学习,还是这里说的内核学习,它的效果好与坏,最主要取决于两个方面:一个是学习的方法,另一个就是学习时的心理。注意,在这儿我无视了智商的差异,智商这玩意儿太玄了,可以将它归于迷信的范畴。而我们在学习时经常会产生一系列的问题或者说误区,只有走出这些误区,在学习中养成一个坚强的心理,我们才能够真正的做到高效。

    第五句是使用 vim+cscope+ctags 浏览内核源码。其实这句话更主要的意思是说我们需要一个好的工具去浏览内核的代码。在 windows 下面,我们或许可以很容易的找到很多比较好的 IDE 可以用来浏览代码,比如 source insight ,它可以很方便的在代码之间进行关联阅读。但是对于 Linux 新人来说,有没有一个功能类似的浏览代码的工具就成为一个很常见的问题。

    第六句是使用 kernel 地图定位目标代码。应该说学习内核就是学习内核的源代码,但是内核代码千千万,又到处像个迷宫一样,不迷路都很难,又怎么去直面它?这时我们就需要这样的一幅内核地图来帮助我们去定位所要分析的目标代码,并缩小目标代码的范围与代码量。

    接下来是第七句话:分析内核源码,态度决定一切。我们很多人或许有这样的困惑,也分析浏览了很多内核的源码,可总是觉得分析完浏览完脑子里还是空空的,并没有感觉到多大的收获。这个时候我们或许可以去看看是不是自己在分析代码时的态度出现了问题。我们在分析内核源码时,只有遵循严谨的态度,去理解每一段代码的实现,多问多想多记,而不是抱着走马观花,得过且过的态度,最终必然会有很大的收获。

    最后一句是:以内核源码为中心,坚持学习资源建设。在我们内核学习的过程中,内核源码本身就是最好的参考资料,其他任何经典或非经典的书最多只是起到个辅助作用,不能也不应该取代内核代码在我们学习过程中的主导地位。但是这些辅助的作用也是不可忽视的,我们需要以内核源码为中心,坚持各种学习资源的长期建设不动摇。

    除了这里的八句话,其他的可能会对大家有帮助的感悟或者方法还有很多 。

     

    把内核当朋友,就是要把内核看成一个鲜活的生命体,而不是一堆死气沉沉的代码。

    具体一点来说,我们在学习与浏览内核的实现时,可以将它看成是现实世界的映射。内核是由现实中的人写出来的,因此不管是有意还是无意,都会不可避免的包含了一些自己的现实感情,我们研究内核时可以体会下这种脉络,这种隐藏在代码背后的哲学。比如,我们可以认为内核是个大世界,一个个进程就是这个世界中的一个个生命体,进程管理和调度就是这个大世界中的权力机关,内存是进程的家,内核的目标就是要做到使每个进程都居者有其屋。

    既然要把内核看成是一个鲜活的个体,那么我们认识它的第一件事就是了解它的一些基本信息,就像我们人与人之间互相认识首先也是通过个人的基本信息一样。

    首先从名字开始, kernel 在字典中主要有两种定义,一种是 “ 软的,一个坚果可食用的部分 ” ,对 Linux kernel 来说,当然适用的是第二种定义: “ 某个东西的核心部分 ” 。所以从广义上来说, linux kernel 就是 linux 操作系统里最为核心的部分,而从狭义上来说,它不过就是 Linus 那群人人写的那点儿代码。

    当然,这点儿代码是相当复杂的,单单从代码量上来说,早已经突破了千万级。从结构上来说,也早就不是一个人穷自己一己之力就能够全部理解的了。所以,现在强调第二句话:学内核切忌求大求全,选择一点研究的足够深入就很不容易了。

    下面介绍介绍 kernel 的年龄, kernel 又不是一个怀春的少女,所以它的年龄并不需要保密,从 1991 年诞生开始,在去年刚刚举行了它自己的成人礼,进入了成熟发展期。

    就像我们人有自己的青春期、中年期等一样, kernel 相应的也有很多不同的版本号,不过不同的是,我们的青春期一去就不复返了, kernel 不同的版本号却是共存的。

    很多年以来,内核的版本都是以 X.Y.Z 这 3 个数字的形式分配的,中间的偶数 Y 代表稳定版,奇数 Y 代表了不稳定的开发版。所谓的稳定版本是指内核的特性都已经固定,代码运行稳定可靠,不会再增加新的特性,要改进也只是修改代码中的错误。而不稳定版本是指相对于上一个稳定版本增加了新的特性,还处于发展之中,代码的运行不大可靠。

    对于目前来说, 2.6 内核的发布已经持续了很长时间,那么什么时候将会推出 2.7 ? Linus 本人的回答是,不会有 2.7 ,他不会再遵循旧的模式,新采用的模式会更好,不值得重复过去。他表示正在考虑新的编号方式,一种基于时间的版本号。比如用 2008.7 取代 2.6.26 ,中间第二个数字代表年, 2008 年就是 2.8 , 2009 年的第一个版本就是 2.9.1 ,之后 2010 年是 3.0 ,等等。

    最后不得不提到是那些眼花缭乱的发行版,内核与发行版的关系就类似那种双生花,彼此互相依赖互相扶持共同成长。没有那些发行版,内核就只能是束之高阁的一个貌似好看的玩具,并不能真正的走进我们的工作生活,而没有内核,那些发行版就缺少了存在的地基,就只能是个豆腐渣工程。

     

    现在我们了解了内核这个朋友的外表,这个时候我们不能像非诚勿扰中的那些拜金女一样只关心外在的信息,我们还要接着了解内核的内涵,也就是内核的体系结构以及内核是如何工作的。

    首先看第一张图,它向我们传递了这样的信息 —— 内核将应用程序和硬件分离开来。内核一方面负责与计算机硬件进行交互,实现对硬件的控制,调度对硬件资源的访问,另一方面为用户应用程序提供一个高级的执行环境和访问硬件的虚拟接口。

    提供硬件的兼容性是内核的设计目标之一,几乎所有的硬件,只要不是为其他操作系统所定制的,都可以得到 Linux 的支持。

    与硬件兼容性相关的是可移植性,也就是在不同的硬件平台上运行 Linux 的能力。从最初只支持标准 IBM 兼容机上的 Intel X86 架构到现在可以支持 ARM 、 MIPS 、 PowerPC 等几乎所有硬件平台,如此广泛的平台支持之所以能够成功,部分原因在于,内核清晰地划分为了体系相关部分和体系无关部分。因此也就有了第二张图。

    体系无关部分通常会定义与体系相关部分的接口,这样,内核向新的体系结构移植的过程就变成确认这些接口的特性并将它们加以实现的过程。

    同时,用户应用程序和内核之间的联系,一般是通过它和内核的中间层 —— 标准 C 库来实现,而标准 C 库函数本身,则是建立在内核提供的系统调用基础之上。通过标准 C 库,以及内核体系无关部分与体系相关部分的接口,用户应用程序和部分内核都成为可移植的。

    因此更为准确的是第三张图。其中,进程管理部分实现了一个进程世界的抽象,这个进程世界类似于我们的人类世界,只不过我们的世界里的个体是人,而在进程世界里则是一个一个的进程,我们人与人之间通过书信、手机、网络等交通往来,而各个进程之间则是通过不同方式的进程间通信,我们所有人都在分享同一个地球,而所有进程都在分享一个或多个 CPU 。

    在这个进程的世界里,内存是重要的资源之一,就好似我们的土地。因此,管理内存的策略与方式,也就是内存管理是决定系统性能的一个关键因素。

     

    了解了内核的体系结构,我们再来看看内核是如何工作的。

    首先,内核通过系统调用来使得运行在它上面的应用程序可用。系统调用是内核和应用程序之间的桥梁,比如图中的针对文件操作的 open() , close() , read() , write() ,针对进程操作的 fork() , wait() ,还有针对网络操作的 socket() 等等,它们提供了对硬件的抽象,所以有时也被称为 linux 虚拟机。

    内核提供的最接近实际用户的明显抽象是文件系统,我们很容易能够利用 open() 等几个系统调用编写一段程序打开一个文件并将它的内容拷贝到标准输出。内核通过这些系统调用为用户提供了一个文件的 " 错觉 " ,而实际上它不过是一堆数据有了个名字,这样一来就不必去与硬件底层的堆栈、分区和指针等交涉,这也就是我们经常所说的抽象 (abstraction) ,将底层的东西以更易懂的方式表达出来。

    文件系统是内核提供的比较明显的一种抽象,我们可以说它是位于台前的,而相对还有一些是位于幕后的,比如进程调度。在 linux 上,任何 一个时间,都可能有好几个进程或者程序等待着运行。内核的时间调度给每个进程分配 CPU 时间,所以就一段时间内来说,我们会有种错觉:电脑同一时间运行好几个程序。

    再比如另外一个位于幕后的内存管理,幕后到应用开发者都不易察觉的地步。每个程序运行得都好像它有个自己的地址空间来调用一样,实际上它跟其他进程一样共享计算机的物理存储。内存管理的另外一个方面是防止一个进程访问其他进程的地址空间 —— 对于多进程操作系统来说这是很必要的一个防范措施。

    当然位于台前幕后的还有其他的角色,比如网络等。

    我们现在再来简单看下它的物理组成。早期版本的内核是整体式的,也就是说所有的部分都静态地连接成一个很大的执行文件。

    喜欢的话,欢迎扫码关注:)

    展开全文
  • Linux内核分析及编程高清pdf版(2-1)

    千次下载 热门讨论 2010-04-19 09:20:37
    本书作者在整理自己多年研发笔记的基础上,以精心挑选的典型开发实例,向读者详细讲述了Linux内核源代码的各部分结构、原理及组成框架,主要分析了 Linux最新版本(2.6.11)的内核源代码,帮助读者深入理解Linux内核...
  • Linux内核设计与实现_第三版_中文版

    千次下载 热门讨论 2013-08-28 15:35:22
    Linux内核设计与实现》第三版,中文版。基于Linux 2.6.34内核,本书详细介绍了Linux内核系统,覆盖了从核心内核系统的应用到内核设计与实现等各方面内容。
  • 4岁小女孩给Linux内核贡献提交

    万次阅读 多人点赞 2019-12-24 08:44:56
    今天在reddit上看到一个有趣的讨论,一个4岁的小女孩给Linux提交了一个补丁,并且这个补丁合并到了代码中。链接如下:https://www.reddit.com/r/linux/c...
  • [14本经典Android开发教程] 8 Linux内核阅读心得体会 读核感悟 2 读核感悟 Linux内核启动 内核的生成 2 读核感悟 Linux内核启动 从hello world说起 3 读核感悟 Linux内核启动 BIOS 5 读核感悟 Linux内核启动 setup...
  • Linux内核学习四库全书

    万次阅读 热门讨论 2011-07-05 14:12:34
    关于内核学习我建议不要上来就读内核而是先了解内核的构成和特性,然后通过思考发现疑问这时再去读内核源码。即先了解概貌在读局部细节。... Linux内核设计与实现 Edition 2 2. Linux设备驱动 Edition 3 3. Linux
  • Linux内核绪论----Linux内核剖析(二)

    万次阅读 2015-04-09 15:48:15
    什么是内核内核是操作系统最基本的部分。它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并且内核决定一个程序在什么时候对某部分硬件操作多长时间。内核的分类可分为单内核和双内核...
  • 参考 一次实验引发的故事 – kernel build system探索—vmlinux是如何炼成的– kernel ...那么现在我们已经知道如何自己的电脑上去构建、安装一个定制化的Linux内核,但是我们还是要在唠叨一些。 当你在内核源
  • Linux 内核剖析

    千次阅读 2016-01-15 17:56:57
     由于本文的目标是对 Linux 内核进行介绍并探索其体系结构和主要组件,因此首先回顾一下 Linux 的简短历史,然后从较高的层次审视 Linux 内核的体系结构,最后介绍它的主要子系统。Linux 内核具有超过 600 万行的...
  • 学习linux内核是需要一步一步循序渐进,掌握正确的linux内核学习路线对学习至关重要,本篇文章就来分享学习linux内核的一些建议吧。 1. 了解操作系统基本概念。如果不会,可以学习《操作系统:设计与实现》Andrew S...
  • Linux内核编译

    千次阅读 2009-03-16 19:40:00
    如何编译Linux内核? 相信你会得到很多种不同的答案,而我在写此文章之前,总是获得一些编译错误的结果。如何你总是遇到编译错误或者失败,其实很多情况下是你下载的内核版本的问题,就是在高版本GCC中编译低版本的...
  • Linux内核修炼之道》 之 高效学习Linux驱动开发

    万次阅读 热门讨论 2010-07-22 20:52:00
    这本《Linux内核修炼之道》已经开卖(网上的链接为:卓越、当当、china-pub),虽然是严肃文学,但为了保证流畅性,大部分文字我还都是斟词灼句,反复的念几遍才写上去的,尽量考虑到写上去的每段话能够让读者产生...
  • 1.4 Linux内核和传统Unix内核的比较 由于所有的Unix内核都同宗同源,并且提供相同的API,现代的Unix内核存在许多设计上的相似之处。Unix内核几乎毫无例外的都是一个不可分割的静态可执行库。也就是说,Unix必须以...
  • linux内核启动后,会对根文件系统进行加载,但是内核是在哪里对根文件进行加载的? ``` List of all partitions: 1f00 256 mtdblock0 (driver?) 1f01 64 mtdblock1 (driver?) 1f02 6272 mtdblock2 (driver?) 1f03...
  • 之前在读《APUE》的时候,更多的是从上层去了解如何使用Linux系统的API,那个时候就十分喜欢Linux的...在linux内核方面,目前打算阅读两本书,《Linux内核设计与实现》就是其中一本,另一本是《深入理解linux内核》。
  • 本人刚接触linux不久,想在linux内核中加入自己定义的is_accepted_sd()函数。我在sd_ops().h头文件中声明了自定义的函数,并在sd_ops.c源文件中定义和实现。然后在sd.c源文件中的mmc_sd_init_card()函数中调用了这个...
  • linux内核整体架构

    千次阅读 2018-08-02 21:23:54
    本文是“Linux内核分析”系列文章的第一篇,会以内核的核心功能为出发点,描述Linux内核的整体架构,以及架构之下主要的软件子系统。之后,会介绍Linux内核源文件的目录结构,并和各个软件子系统对应。 2.linux内核...
  • linux内核map图

    千次阅读 2010-07-28 10:27:00
    linux内核map图
  • Linux内核模块编译

    千次阅读 2018-07-25 19:12:52
    Linux内核模块是一种可被动态加载和卸载的可执行程序。通过内核模块可以扩展内核功能,内核模块通常用于设备驱动、文件系统等。如果没有内核模块,需要向内核添加功能就需要自发代码、重新编译内核、安装新内核等...
  • Linux内核学习笔记(1)—— 什么是Linux内核? 1. 什么是操作系统? 操作系统是负责完成整个系统中最基本功能和系统管理,包括内核、设备驱动程序、启动引导程序、命令行shell或其它种类的用户界面、基本的文件...
  • Linux内核简介

    万次阅读 多人点赞 2018-06-16 18:56:29
    大纲:理解Linux内核最好预备的知识点Linux内核的特点Linux内核的任务内核的组成部分哪些地方用到了内核机制?Linux进程 Linux创建新进程的机制Linux线程 内核线程地址空间与特权级别 虚拟地址与物理地址 特权级别...
  • Linux内核升级指南

    千次阅读 2012-04-29 14:48:31
    前段时间公司有个项目用到了短信收发的业务,采购了两台16口的Wavecom USB短信猫设备,服务器操作系统是ReadHat5.4,内核2.6.18,插上设备后,操作系统无法自动识别该设备,原因是没有预装该设备USB转串口的驱动程序...

空空如也

1 2 3 4 5 ... 20
收藏数 191,077
精华内容 76,430
关键字:

linux内核

linux 订阅