内核 订阅
内核是操作系统最基本的部分。它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并且内核决定一个程序在什么时候对某部分硬件操作多长时间。内核的分类可分为单内核和双内核以及微内核。严格地说,内核并不是计算机系统中必要的组成部分。 展开全文
内核是操作系统最基本的部分。它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并且内核决定一个程序在什么时候对某部分硬件操作多长时间。内核的分类可分为单内核和双内核以及微内核。严格地说,内核并不是计算机系统中必要的组成部分。
信息
外文名
kernel
发源时间
1991年10月
类    别
软件
种    类
单内核,双内核,微内核
中文名
内核
内核基本简介
内核,是一个操作系统的核心。是基于硬件的第一层软件扩充,提供操作系统的最基本的功能,是操作系统工作的基础,它负责管理系统的进程、内存、 设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。 [2]  现代操作系统设计中,为减少系统本身的开销,往往将一些与硬件紧密相关的(如中断处理程序、设备驱动程序等)、基本的、公共的、运行频率较高的模块(如时钟管理、进程调度等)以及关键性数据结构独立开来,使之常驻内存,并对他们进行保护。通常把这一部分称之为操作系统的内核。 [3]  程序可以直接地被调入计算机中执行,这样的设计说明了设计者不希望提供任何硬件抽象和操作系统的支持,它常见于早期计算机系统的设计中。最终,一些辅助性程序,例如程序加载器和调试器,被设计到机器核心当中,或者固化在只读存储器里。这些变化发生时,操作系统内核的概念就渐渐明晰起来了。 [4]  (概述图片来源:)
收起全文
精华内容
参与话题
问答
  • 什么是内核

    万次阅读 多人点赞 2018-06-14 06:06:38
    内核是操作系统的内部核心程序,它向外部提供了对计算机设备的核心管理调用。 我们将操作系统的代码分成2部分。内核所在的地址空间称作内核空间。而在内核以外的统称为外部管理程序,它们大部分是对外围设备的管理...
            内核是操作系统的内部核心程序,它向外部提供了对计算机设备的核心管理调用。
            我们将操作系统的代码分成2部分。内核所在的地址空间称作内核空间。而在内核以外的统称为外部管理程序,它们大部分是对外围设备的管理和界面操作。外部管理程序与用户进程所占据的地址空间称为外部空间。
            通常,一个程序会跨越两个空间。当执行到内河空间的一段代码时,我们称程序处于内核态,而当程序执行到外部空间代码时,我们称程序处于用户态。    
            从UNIX起,人们开始用高级语言(UNIX上最具有代表性的就是UNIX的系统级语言C语言)编写内核代码,使得内核具有良好的扩展性。单一内核(monolithic kernel)是当时操作系统的主流,操作系统中所有的系统相关功能都被封装在内核中,它们与外部程序处于不同的内存地址空间中,并通过各种方式(在Intel IA-32体系中采用386保护模式)防止 外部程序直接访问内核结构。程序只有通过一套称作系统调用(system call)的界面访问内核结构。
            近些年来,微内核(micro kernel)结构逐渐流行起来,成为操作系统的主要潮流。1986年,Tanenbaum提出Mach kernel,而后,他的minix和GNU的Hurd操作系统更是微内核系统的典范。    
            在微内核结构中,操作系统的内核只需要提供最基本、最核心的一部分操作(比如创建和删除任务、内存管理、中断管理等)即可,而其他的管理程序(如文件系统、网络协议栈等)则尽可能的放在内核之外。这些外部程序可以独立运行,并对外部用户程序提供操作系统服务,服务之间使用进程间通信机制(IPC)进行交互,只在需要内核的协助时,才通过一套接口对内核发出调用请求。    
            微内核系统的优点时操作系统具有良好的灵活性。它使得操作系统内部结构简单清晰。程序代码的维护非常之方便。但是也有不足之处。微内核系统由于核心态只实现了最基本的系统操作,这样内核以外的外部程序之间由于独立运行使得系统难以进行良好的整体优化。另外,进程间互相通信的开销也较单一内核系统要大许多。从整体上看,在当前的硬件条件下,微内核在效率上的损失小于其在结构上获得的收益,故而选取微内核成为操作系统的一大潮流。    
            然而,Linux系统却恰恰使用了单一内核结构。这是由于Linux是一个实用主义的操作系统。Linux Tovarlds以代码执行效率为自己操作系统的第一要务,并没有进行过一个系统的设计工作,而是任由Linux在使用中不断发展。在这样的发展过程中,参与Linux开发的程序员大多为世界各地的黑客们。比起结构的清晰,他们更加注重功能的强大和高效的代码。于是,他们将大量的精力放在优化代码上,而这样的全局性优化必然以丧失结构精简为代价,导致Linux中的每个部件都不能轻易被拆除。否则必然破坏整体效率。    虽然Linux是单一内核体系,但是它与传统的单一内核UNIX操作系统不同。在普通的单一内核系统中,所有的内核代码都是被静态编译联入的,而在Linux中,可以动态装入和卸载内河中的部分代码。Linux将这些代码段称为模块。(module),并对模块给予了强有力的支持。在Linux中,可以在需要时自动装入和卸载模块。    
            Linux不支持用户态线程。在用户态中,Linux认为线程就是共享上下文(Context)的进程。Linux通过LWP(light weight thread)的机制来实现用户态线程的概念。通过系统调用clone()创建新的线程。   
             Linux的内核为非抢占式的。即,Linux不能通过改变优先权来影响内核当前的执行流程。因此,Linux在实现实时操作时就有问题。Linux并不是一个“硬”实时操作系统。   
             在Linux内核中,包括了进程管理(process management)、定时器(timer)、中断管理(interrupt management)、内存管理(memory management)
    展开全文
  • Linux内核的整体架构简介

    万次阅读 多人点赞 2017-10-23 17:44:42
    本文是“Linux内核分析”系列文章的第一篇,会以内核的核心功能为出发点,描述Linux内核的整体架构,以及架构之下主要的软件子系统。之后,会介绍Linux内核源文件的目录结构,并和各个软件子系统对应。 注:本文和...

    1. 前言

    本文是“Linux内核分析”系列文章的第一篇,会以内核的核心功能为出发点,描述Linux内核的整体架构,以及架构之下主要的软件子系统。之后,会介绍Linux内核源文件的目录结构,并和各个软件子系统对应。

    注:本文和其它的“Linux内核分析”文章都基于如下约定:  
    a) 内核版本为Linux 3.10.29(该版本是一个long term的版本,会被Linux社区持续维护至少2年),可以从下面的链接获取:https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.10.29.tar.xz 
    b) 鉴于嵌入式系统大多使用ARM处理器,因此涉及到体系结构部分的内容,都以ARM为分析对象

    2. Linux内核的核心功能

    如下图所示,Linux内核只是Linux操作系统一部分。对下,它管理系统的所有硬件设备;对上,它通过系统调用,向Library Routine(例如C库)或者其它应用程序提供接口。

    image

    因此,其核心功能就是:管理硬件设备,供应用程序使用。而现代计算机(无论是PC还是嵌入式系统)的标准组成,就是CPU、Memory(内存和外存)、输入输出设备、网络设备和其它的外围设备。所以为了管理这些设备,Linux内核提出了如下的架构。

    3. Linux内核的整体架构

    3.1 整体架构和子系统划分

    image

    上图说明了Linux内核的整体架构。根据内核的核心功能,Linux内核提出了5个子系统,分别负责如下的功能:

    1. Process Scheduler,也称作进程管理、进程调度。负责管理CPU资源,以便让各个进程可以以尽量公平的方式访问CPU。

    2. Memory Manager,内存管理。负责管理Memory(内存)资源,以便让各个进程可以安全地共享机器的内存资源。另外,内存管理会提供虚拟内存的机制,该机制可以让进程使用多于系统可用Memory的内存,不用的内存会通过文件系统保存在外部非易失存储器中,需要使用的时候,再取回到内存中。

    3. VFS(Virtual File System),虚拟文件系统。Linux内核将不同功能的外部设备,例如Disk设备(硬盘、磁盘、NAND Flash、Nor Flash等)、输入输出设备、显示设备等等,抽象为可以通过统一的文件操作接口(open、close、read、write等)来访问。这就是Linux系统“一切皆是文件”的体现(其实Linux做的并不彻底,因为CPU、内存、网络等还不是文件,如果真的需要一切皆是文件,还得看贝尔实验室正在开发的"Plan 9”的)。

    4. Network,网络子系统。负责管理系统的网络设备,并实现多种多样的网络标准。

    5. IPC(Inter-Process Communication),进程间通信。IPC不管理任何的硬件,它主要负责Linux系统中进程之间的通信。

    3.2 进程调度(Process Scheduler)

    进程调度是Linux内核中最重要的子系统,它主要提供对CPU的访问控制。因为在计算机中,CPU资源是有限的,而众多的应用程序都要使用CPU资源,所以需要“进程调度子系统”对CPU进行调度管理。

    进程调度子系统包括4个子模块(见下图),它们的功能如下:

    scheduler

    1. Scheduling Policy,实现进程调度的策略,它决定哪个(或哪几个)进程将拥有CPU。

    2. Architecture-specific Schedulers,体系结构相关的部分,用于将对不同CPU的控制,抽象为统一的接口。这些控制主要在suspend和resume进程时使用,牵涉到CPU的寄存器访问、汇编指令操作等。

    3. Architecture-independent Scheduler,体系结构无关的部分。它会和“Scheduling Policy模块”沟通,决定接下来要执行哪个进程,然后通过“Architecture-specific Schedulers模块”resume指定的进程。

    4. System Call Interface,系统调用接口。进程调度子系统通过系统调用接口,将需要提供给用户空间的接口开放出去,同时屏蔽掉不需要用户空间程序关心的细节。

    3.3 内存管理(Memory Manager, MM)

    内存管理同样是Linux内核中最重要的子系统,它主要提供对内存资源的访问控制。Linux系统会在硬件物理内存和进程所使用的内存(称作虚拟内存)之间建立一种映射关系,这种映射是以进程为单位,因而不同的进程可以使用相同的虚拟内存,而这些相同的虚拟内存,可以映射到不同的物理内存上。

    内存管理子系统包括3个子模块(见下图),它们的功能如下:

    mman

    1. Architecture Specific Managers,体系结构相关部分。提供用于访问硬件Memory的虚拟接口。

    2. Architecture Independent Manager,体系结构无关部分。提供所有的内存管理机制,包括:以进程为单位的memory mapping;虚拟内存的Swapping。

    3. System Call Interface,系统调用接口。通过该接口,向用户空间程序应用程序提供内存的分配、释放,文件的map等功能。

    3.4 虚拟文件系统(Virtual Filesystem, VFS)

    传统意义上的文件系统,是一种存储和组织计算机数据的方法。它用易懂、人性化的方法(文件和目录结构),抽象计算机磁盘、硬盘等设备上冰冷的数据块,从而使对它们的查找和访问变得容易。因而文件系统的实质,就是“存储和组织数据的方法”,文件系统的表现形式,就是“从某个设备中读取数据和向某个设备写入数据”。

    随着计算机技术的进步,存储和组织数据的方法也是在不断进步的,从而导致有多种类型的文件系统,例如FAT、FAT32、NTFS、EXT2、EXT3等等。而为了兼容,操作系统或者内核,要以相同的表现形式,同时支持多种类型的文件系统,这就延伸出了虚拟文件系统(VFS)的概念。VFS的功能就是管理各种各样的文件系统,屏蔽它们的差异,以统一的方式,为用户程序提供访问文件的接口。

    我们可以从磁盘、硬盘、NAND Flash等设备中读取或写入数据,因而最初的文件系统都是构建在这些设备之上的。这个概念也可以推广到其它的硬件设备,例如内存、显示器(LCD)、键盘、串口等等。我们对硬件设备的访问控制,也可以归纳为读取或者写入数据,因而可以用统一的文件操作接口访问。Linux内核就是这样做的,除了传统的磁盘文件系统之外,它还抽象出了设备文件系统、内存文件系统等等。这些逻辑,都是由VFS子系统实现。

    VFS子系统包括6个子模块(见下图),它们的功能如下:

    vfs

    1. Device Drivers,设备驱动,用于控制所有的外部设备及控制器。由于存在大量不能相互兼容的硬件设备(特别是嵌入式产品),所以也有非常多的设备驱动。因此,Linux内核中将近一半的Source Code都是设备驱动,大多数的Linux底层工程师(特别是国内的企业)都是在编写或者维护设备驱动,而无暇估计其它内容(它们恰恰是Linux内核的精髓所在)。

    2. Device Independent Interface, 该模块定义了描述硬件设备的统一方式(统一设备模型),所有的设备驱动都遵守这个定义,可以降低开发的难度。同时可以用一致的形势向上提供接口。

    3. Logical Systems,每一种文件系统,都会对应一个Logical System(逻辑文件系统),它会实现具体的文件系统逻辑。

    4. System Independent Interface,该模块负责以统一的接口(快设备和字符设备)表示硬件设备和逻辑文件系统,这样上层软件就不再关心具体的硬件形态了。

    5. System Call Interface,系统调用接口,向用户空间提供访问文件系统和硬件设备的统一的接口。

    3.5 网络子系统(Net)

    网络子系统在Linux内核中主要负责管理各种网络设备,并实现各种网络协议栈,最终实现通过网络连接其它系统的功能。在Linux内核中,网络子系统几乎是自成体系,它包括5个子模块(见下图),它们的功能如下:

    net

    1. Network Device Drivers,网络设备的驱动,和VFS子系统中的设备驱动是一样的。

    2. Device Independent Interface,和VFS子系统中的是一样的。

    3. Network Protocols,实现各种网络传输协议,例如IP, TCP, UDP等等。

    4. Protocol Independent Interface,屏蔽不同的硬件设备和网络协议,以相同的格式提供接口(socket)。

    5. System Call interface,系统调用接口,向用户空间提供访问网络设备的统一的接口。

     

    至于IPC子系统,由于功能比较单纯,这里就不再描述了。

    4. Linux内核源代码的目录结构

    Linux内核源代码包括三个主要部分:

    1. 内核核心代码,包括第3章所描述的各个子系统和子模块,以及其它的支撑子系统,例如电源管理、Linux初始化等

    2. 其它非核心代码,例如库文件(因为Linux内核是一个自包含的内核,即内核不依赖其它的任何软件,自己就可以编译通过)、固件集合、KVM(虚拟机技术)等

    3. 编译脚本、配置文件、帮助文档、版权说明等辅助性文件

    下图示使用ls命令看到的内核源代码的顶层目录结构,具体描述如下。

    kernel_src_tree

    include/ ---- 内核头文件,需要提供给外部模块(例如用户空间代码)使用。

    kernel/ ---- Linux内核的核心代码,包含了3.2小节所描述的进程调度子系统,以及和进程调度相关的模块。

    mm/ ---- 内存管理子系统(3.3小节)。

    fs/ ---- VFS子系统(3.4小节)。

    net/ ---- 不包括网络设备驱动的网络子系统(3.5小节)。

    ipc/ ---- IPC(进程间通信)子系统。

    arch// ---- 体系结构相关的代码,例如arm, x86等等。 
        arch//mach- ---- 具体的machine/board相关的代码。 
        arch//include/asm ---- 体系结构相关的头文件。 
        arch//boot/dts ---- 设备树(Device Tree)文件。

    init/ ---- Linux系统启动初始化相关的代码。 
    block/ ---- 提供块设备的层次。 
    sound/ ---- 音频相关的驱动及子系统,可以看作“音频子系统”。 
    drivers/ ---- 设备驱动(在Linux kernel 3.10中,设备驱动占了49.4的代码量)。

    lib/ ---- 实现需要在内核中使用的库函数,例如CRC、FIFO、list、MD5等。 
    crypto/ ----- 加密、解密相关的库函数。 
    security/ ---- 提供安全特性(SELinux)。 
    virt/ ---- 提供虚拟机技术(KVM等)的支持。 
    usr/ ---- 用于生成initramfs的代码。 
    firmware/ ---- 保存用于驱动第三方设备的固件。

    samples/ ---- 一些示例代码。 
    tools/ ---- 一些常用工具,如性能剖析、自测试等。

    Kconfig, Kbuild, Makefile, scripts/ ---- 用于内核编译的配置文件、脚本等。

    COPYING ---- 版权声明。 
    MAINTAINERS ----维护者名单。 
    CREDITS ---- Linux主要的贡献者名单。 
    REPORTING-BUGS ---- Bug上报的指南。

    Documentation, README ---- 帮助、说明文档。

    5. 附录

    5.1 参考资料

    第3章各个子系统的架构图,拷贝自如下的网页: 
    http://oss.org.cn/ossdocs/linux/kernel/a1/index.html

     

    原创文章,转发请注明出处。蜗窝科技,www.wowotech.net


    展开全文
  • 操作系统与操作系统内核

    万次阅读 多人点赞 2017-07-06 10:39:57
    总的说来,一个操作系统包含了内核(是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件)以及其他计算机系统所必须的组件(如函数库、编译器、调式工具、文本编辑器、网站服务器,以及一个Unix的...

    一、前言

        最近看了一篇将Unix和Linux历史的帖子,虽然有点水,但是还是放个链接吧花了一天时间,终于把unix、linux、ios、android区别大致联系搞清楚,好像很复杂的,这个帖子写的比较口水话,但是对于了解Unix与Linux的发展与历史还是蛮有帮助的,看了这篇帖子之后,尽管知道了Unix与Linux从无到有的过程,但是发现自己对操作系统这个东西的认识更加模糊了,因为前期大致读过《深入理解计算机系统》和《操作系统》两本书,了解过一些操作系统的内容,但由于是非科班出身,有很多本质的概念并不理解,所以这里就回顾了上面两本书中的一些内容,再加上网上的一些资料,对操作系统和操作系统内核这两个概念进行了整理。


    二、操作系统理解

       一句话理解操作系统:操作系统就是为用户(使用计算机的人)提供服务,使用户能在计算机上使用各种应用程序(QQ、浏览器)来操作计算机资源(如QQ需要使用显示器资源、用浏览器下载资料需要硬盘资源,同时所有这些应用程序都需要使用CPU这个最主要的资源)。

        可以从两方面理解上面这句话,一方面从操作系统本身来理解。其实说起操作系统这个概念,作为非科班出身的我们大多都是比较模糊的,同时感觉跟这个东西就很近,因为在每台计算机中都有一个操作系统,你运行的任何应用软件都离不开操作系统,为什么离不开操作系统呢?其实说白了,一台计算机就是一组资源,你运行在计算机上的应用程序本质上是离不开计算机的各种资源(如处理器、内存、I/O设备等),只是为了方便,人们就构造了操作系统这种东西,因为每一台计算机的各种资源都来自不同的厂家,它们有不同的标准,有不同的差别,所以你针对某一类的I/O设备开发的应用程序就不能在另一台装有不同I/O设备的计算机上运行,而操作系统就完美的消除了这种差别与无法扩展的缺点,所以从逻辑上来说,操作系统位于应用程序与计算机资源的中间层


        同时,作为中间层,必须要干好中间层的工作,所以总的来说,操作系统有两个基本功能

            (1)防止硬件被失控的应用程序滥用;

            (2)向应用程序提供简单一致的机制来控制复杂而又通常大相径庭的低级硬件设备

       另一方面,从计算机CPU(处理器)来看,操作系统实际上不过是一组计算机程序(可以理解成很多个应用程序的集合,而这些应用程序基本都是与硬件打交道的),与其他计算机程序类似(不管是你自己写的HelloWord小程序还是像QQ这样的应用程序,以及大型的服务器程序),它们都给处理器提供指令,然后处理器就执行这些指令,完成这些程序的功能,最大的区别在于操作系统和其他程序的意图不同:操作系统程序通过控制处理器使用其他计算机资源,并控制其他程序的执行时机,这促使处理器完成系统任务的调度。但是(刚刚也说明了,操作系统除了和其他程序的意图不同,其他都一样,所以)处理器为了做任何一件这样的事情(指的是执行另一个程序),都必须停止执行操作系统程序,转而去执行其他程序(这其实是进程切换),因为既然操作系统也是一个程序(进程),而任何处理器同时只能处理一个进程,所以操作系统同样和其他程序(进程)一样需要调度,只是操作系统是处于主动调度的位置,而其他程序是被动的由操作系统的控制来实现调度。


    三、操作系统内核

        关于操作系统和操作系统内核这两个概念,很多人尝试去区分与解释,但是发现很难得解释的完全(包括我自己,这里只是把我自己的理解整理出来,有什么不对的地方,希望大家批评指正,共同进步)。

        查看了一些网上和CS系列书籍中的关于操作系统内核的概念解释,总结之后,我的理解是:

            (1)操作系统包括操作系统内核(这是必然的),也就是说内核程序是操作系统所包含的一组计算机程序中的一个子集,所以内核程序也是一组计算机程序,而这些内核程序是操作系统中最常使用基本模块,直接与硬件打交道,主要由用于管理存储器、文件、外设和系统资源的那些部分组成。

            (2)内核程序一直占据内存中的一段内存,这样处理器可以随时调用这些内核程序;

            (3)而操作系统除了内核程序外,还有包括其他一些基本组件,如文本编辑器、编译器、用来与用户进行交互的程序等

        对于第(2)点,可以引入《深入理解计算机系统》这本书中关于“虚拟存储器”(P12)解释的一幅图来说明,如下:


    上图中,关于进程的虚拟地址空间的说明中,最上面的子区域“内核虚拟存储器”就是用来存储内核程序和数据的,这个地址空间是一个固定的结构,所以对于每一个应用程序(进程)来说,都具有同样结构的虚拟地址空间,这就可以保证每个进程都能调用操作系统内核程序来完成自己的功能。

        下面再用一幅图说明操作系统内核是操作系统的一组子程


    上图中,操作系统的内核包围硬件,同时,其外层是系统调用接口,这就是操作系统中除内核以外的其他组件。

        下面整理两个网友关于操作系统与操作系统内核的解释,个人觉得解释的还是比较好的:

            (1)内核,是操作系统的基础模块,用于管理系统资源。例如提供对软件层面的抽象(例如对进程、文件系统、同步、内存、网络协议等对象的操作和权限控制),和对硬件访问的抽象(例如磁盘,显示,网络接口卡(NIC));操作系统,在内核的基础上有延伸,包括了提供基础服务的系统组件。

            (2)内核,就是计算机学科意义上的操作系统,直接与硬件交互,提供CPU时间片管理、中断、内存管理、IO管理等等;一般意义上的操作系统包含的东西要更多一些,至少要有用户交互的基本程序,比如一个命令行界面和基本的指令(文件遍历、进程管理等等),或者图形界面的桌面和文件浏览器。


    四、总结

        总的说来,一个操作系统包含了内核(是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件)以及其他计算机系统所必须的组件(如函数库、编译器、调式工具、文本编辑器、网站服务器,以及一个Unix的使用者接口(Unix shell)等,这些都是操作系统的一部分,而且每一个模块如编译器都是一个单独的进程,运行在操作系统中)。所以一个内核不是一套完整的操作系统,拿Linux来说,Linux这个词本身只表示Linux内核,但现在大家已经默认的把Linux理解成整个Linux系统,这是由于历史原因造成的(具体可以看本文前言中提到的那篇文章),也就是说人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU 工程各种工具和应用程序的操作系统(也被称为GNU/Linux),而基于这些组件的Linux软件被称为Linux发行版。一般来讲,一个Linux发行版本出来包括Linux内核之外,还包含大量的软件(套件),比如软件开发工具,数据库,Web服务器(例如Apache),X Window,桌面环境(比如GNOME和KDE),办公套件(比如OpenOffice、org)等等。

    展开全文
  • 内核概念-内核

    千次阅读 2015-08-11 17:09:51
    1.R3和R0  用户模式和内核模式 当我们开始一个应用层的程序,操作系统惠威改程序分配一个一个私有的虚拟...在内核中运行的代码共享一个虚拟地址空间,这意味着内核驱动并不是与操作系统和其他驱动是相互独立的,当

    1.R3和R0 

    用户模式和内核模式

    当我们开始一个应用层的程序,操作系统惠威改程序分配一个一个私有的虚拟地址空间和私有句柄表。因为地址空间是私有的,所以一个应用程序不能改变其他的应用程序的数据,每个应用程序都是独立的,当一个应用程序crash了,这个崩溃也仅限于这个程序,其他程序不会受影响。

    在内核中运行的代码共享一个虚拟地址空间,这意味着内核驱动并不是与操作系统和其他驱动是相互独立的,当内核驱动崩溃了,整个系统也就崩溃了


    R3和R0的交互

    2.虚拟地址空间

    当一个进程读取或写入一个内存位置,是通过虚拟地址来进行寻址的。在读或写的时候,进程将虚拟地址转为物理地址,优点

    1.程序可以使用一个连续的虚拟地址来访问一个很大的内存区域,但是这个内存区域并不是连续的物理内存

    2.程序使用虚拟地址可以访问远大于可用内存大小的内存缓冲区,随着可用内存的减小,内存管理器保存页面的物理内存到磁盘文件(通常4Kb大小),随着运行的需要,页的数据或代码在物理内存和磁盘间移动。

    3.不同进程上的虚拟地址是独立的,一个进程上的代码不能改变其他进程正在使用的物理内存

    进程的可用虚拟地址范围为该进程的虚拟地址空间,每个应用程序都有其私有的地址空间,对于32位处理 虚拟地址空间为 0x00000000到0x7FFFFFFF的2G大小。而对于64位为从0x000 0000 0000到0x7FF FFFF FFFF 的8T空间,虚拟地址范围被称为虚拟内存大小


    每个进程有自己独立的从0x000 0000 0000到0x7FF FFFF FFFF 的8T虚拟地址空间

    Notepad有三个连续的虚拟地址,但是这三个连续的虚拟地址映射的物理地址并不连续,另不同的进程用了同一块虚拟地址,但这个虚拟地址在不同进程映射的物理地址并不相同。

    3用户空间和系统空间

    Notepad.exe 和 MyApp.exe都运行在用户态。操作系统和许多驱动都运行在更有优先级的内核态

    在32位系统中所有可用的虚拟地址为4G,通常低2G为用户空间 高2G为系统空间


    在32位系统中,再启动的时候你可以定义超过2g的内存空间为用户空间,系统空间的虚拟地址将会变小。增加用户空间大小,使用BCDEdit/increaseuserva设置

    在64位系统中,理论上可用的虚拟地址大小为2·64位,但是仅仅很小的一部分16Eb可用。从0x000 0000 0000到0x7FF FFFF FFFF 的8TB为用户空间,部分从0xFFFF 0800 0000 0000 到0xFFFF FFFF FFFF FFFF的248TB被称为系统空间


    在用户模式下运行的代码可以访问用户空间,但是不能访问系统空间,这个限制能阻止用户模式的代码可以读或者改变被保护的系统数据结构。运行在内核模式的代码可以访问用户空间和系统空间。也就是说,在内核模式运行的代码可以访问系统和当前用户模式进程的虚拟地址空间。

    在内核态的驱动必须十分小心的处理直接读和写到用户态的地址中

    1.一个用户态的程序发起一个请求去某设备读一些数据,该程序必须提供一个接收数据的缓冲区地址。

    2在内核态的设备驱动程序开始读操作并返回给他的调用者一个控制器。

    3.之后不论当前线程是否在处理,设备中断发起读操作已完成,中断是在任意线程上运行内核驱动程序处理的,这个过程是属于任意的进程。

    4同时,驱动程序不能往步骤一的用户态程序提供的起始地址写数据。这个地址在发起请求的进程的虚拟地址空间中,有可能与当前进程的虚拟地址不同

    4.分页池和非页池

    在用户空间中,所有的物理地址页可以根据需要换出到磁盘文件,在系统空间中,一些物理地址页也可以被换出,但其他的不能。系统分配的内存空间有两个区域:分页池和非页池。在64位中 分页池是从0xFFFF A800 0000 0000 到0XFFFF A81F FFFF FFFF的128GB  非页池为0xFFFF AC00 0000 0000 到0XFFFF AC1F FFFF FFFF的128GB




    展开全文
  • Linux内核简介

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

    2019-10-22 19:59:03
    内核 解压缩、打补丁、配置、编译 配置:直接make menuconfig太复杂不用,或者在arch/arm/configs目录下找相似文件s3c2410_defconfig,配置结果保存在.config文件中,或者cp config_厂家 .config,然后在make ...
  • 内核分类

    2018-12-13 17:50:18
    内核分类 单内核 ​ 单内核是个很大的进程。它的内部又能够被分为若干模块(或是层次或其他)。但是在运行的时候,它是个单独的二进制大映象。其模块间的通讯是通过直接调用其他模块中的函数实现的,而不是消息...
  • Linux内核组成部分(一)

    千次阅读 2019-01-11 10:31:38
    内核的任务 在纯技术层面上,内核是硬件与软件之间的一个中间层。其作用是将应用程序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址 从应用程序的视角来看,内核可以被认为是一台增强的...
  • 鸿蒙系统队列的数据结构实现采用的也是双向循环链表 详见代码: kernel_liteos_a/kernel/base/sched/sched_sq/los_priqueue.c 源码出现在 sched_sq模块,说明主要服务于任务的调度功能 typedef struct LOS_DL_...
  • 鉴于此,《Linux内核精髓:精通Linux内核必会的75个绝技》选取了资源管理(CPU、内存、进程等)、文件系统、网络、虚拟化、省电、调试、概要分析、追踪、内核调整等Linux内核的核心主题进行了深入剖析和讲解,总结出...
  • Linux内核修炼之道》 之 高效学习Linux内核

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

    万次下载 热门讨论 2014-03-10 15:21:33
    包含LINUX内核同步、信号、内存、调度、文件系统、网络系统、时钟等部分的源码注释。前后历时三年,算是干货。
  • Linux系统最新内核版本升级

    万次阅读 2020-07-08 15:53:57
    linux内核版本升级 说明:在k8s中由于内核版本太低会出现很多问题,需要在部署k8s集群之前升级系统内核版本。 1、载入公钥 rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org 2、安装ELRepo rpm -Uvh ...
  • Linux内核学习四库全书

    万次阅读 热门讨论 2011-07-05 14:12:34
    关于内核学习我建议不要上来就读内核而是先了解内核的构成和特性,然后通过思考发现疑问这时再去读内核源码。即先了解概貌在读局部细节。... Linux内核设计与实现 Edition 2 2. Linux设备驱动 Edition 3 3. Linux
  • 一开始我并不想写这个笔记,因为太过复杂,我一直想以简单的方式理解内核,只从概念,避免涉及过多的代码。实际上,我写笔记的时候,书已经看到很后面了,因为总要理解更多才能理解之前看似简短实际复杂的内容。但...
  • 操作系统内核可能是微内核,也可能是单内核(后者有时称之为宏内核Macrokernel)。按照类似封装的形式,这些术语定义如下: 单内核:也称为宏内核。将内核从整体上作为一个大过程实现,并同时运行在一个...
  • Linux内核分析及编程高清pdf版(2-1)

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

    万次阅读 2018-04-28 04:36:26
    前言Linux内核是Linux操作系统的核心,也是整个Linux功能体现的核心,就如同发动机在汽车中的重要性。内核主要功能包括进程管理、内存管理、文件管理、设备管理、网络管理等。Linux内核是单内核设计,但却采用了微...
  • LINUX内核目录文件说明

    万次阅读 2018-08-03 09:40:31
    内核空间和用户空间  在下载内核前,我们应该讨论一些重要的术语和事实。首先了解一下内核空间和用户空间 ... Linux内核是一个宏内核,这意味着整个操作系统都运行在内核预留的内存里。 内...
  • 如何参与linux内核开发

    千次阅读 2016-05-02 22:43:05
    如果想评论或更新本文的内容,请直接联系原文档的维护者。如果你使用英文 交流有困难的话,也可以向中文版维护者求助。如果本翻译更新不及时或者翻 译存在问题,请联系中文版维护者。...中文版维护者: 李阳 Li Ya
  • Linux内核定时器

    千次阅读 2019-05-23 20:21:48
    时间系统的工作需要软硬件以及操作系统的互相协作,在上一部分,我们已经看到大多数时间函数都依赖内核系统调用,GlibC 仅仅做了一次请求的转发。因此必须深入内核代码以便了解更多的细节。 内核自身的正常运行也...
  • Linux内核从原理到代码详解 链接: http://pan.baidu.com/s/1sj0Szj3 密码: ywyv 网盘失效的话,请加QQ: 3113533060 课程内容: 第一周 1. 初识Linux内核 1.1 认识操作系统 1.2 开放源代码的UNIX...
  • CentOS 7 升级 Linux 内核

    万次阅读 多人点赞 2018-02-28 16:52:37
    升级 CentOS 内核参考资料 1 ...Linux 内核分两种:官方内核(通常是内核开发人员用)和各大 Linux 发行版内核(一般用户常用)。 1.1 官方内核 在使用 Docker 时,发现其对 Linux 内核版本的最低要求...
  • 我的Linux内核学习之路

    万次阅读 多人点赞 2014-03-02 18:34:28
    现在回首看看,接触Linux已经很长时间了。 在大三的时候开始学习Java, 但是一直学Java的话, 感觉有点腻, 就尝试找点其他东西来学习。 所以当时就选择学习了Linux。 至于为什么要学习Linux, 有以下三个原因。  ...
  • Linux内核精髓:精通Linux内核必会的75个绝技》前言 内核是操作系统的核心,操作系统的基本功能都是由内核提供的。文件生成和数据包传输等也是通过内核的功能实现的。但这些都不是简单的任务。平时可能意识不到...
  • 3.3 Linux内核的组成3.3.1 Linux内核源代码的目录结构Linux内核源代码包含如下目录。arch:包含和硬件体系结构相关的代码,每种平台占一个相应的目录,如i386、arm、arm64、powerpc、mips等。Linux内核目前已经...
  • linux内核启动过程分析

    千次阅读 2018-10-30 09:36:45
    准备工作   Makefile分析 kernel的Makefile写法和规则与uboot的Makefile是一样的,甚至Makefile中的很多内容都是一样的。kernel的Makefile比uboot的Makefile要复杂,在这里不需要一行一行的详细分析,只需要关注...
  • 学习linux内核是需要一步一步循序渐进,掌握正确的linux内核学习路线对学习至关重要,本篇文章就来分享学习linux内核的一些建议吧。 1. 了解操作系统基本概念。如果不会,可以学习《操作系统:设计与实现》Andrew S...
  • 之前在读《APUE》的时候,更多的是从上层去了解如何使用Linux系统的API,那个时候就十分喜欢Linux的...在linux内核方面,目前打算阅读两本书,《Linux内核设计与实现》就是其中一本,另一本是《深入理解linux内核》。
  • Linux内核编译流程(Menuconfig图形化方式)Menuconfig配置内核原理:在Linux里面我们所看到的menuconfig界面是通过配置内核顶层的Kconfig产生的,而当输入make menuconfig命令的时候系统会读取Makefile来解析...

空空如也

1 2 3 4 5 ... 20
收藏数 1,087,829
精华内容 435,131
关键字:

内核