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

    万次阅读 2018-06-14 06:07:51
    内核是操作系统的内部核心程序,它向外部提供了对计算机设备的核心管理调用。 我们将操作系统的代码分成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)
    展开全文
  • 内核概念-内核

    2015-08-11 17:09:52
    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内核之Kernel目录

    2019-06-20 10:38:22
    1、通过asm.s及trap.c的学习可以详细了解带错误码和不带错误码的硬件中断处理流程,以及这个过程中内核堆栈的变化过程; 2、通过system_call.s及sys.c的学习,了解系统调用的过程,知道系统如何设置的72个系统...
  • Linux内核组成部分(一)

    千次阅读 2019-01-11 10:31:38
    内核的任务 在纯技术层面上,内核是硬件与软件之间的一个中间层。其作用是将应用程序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址 从应用程序的视角来看,内核可以被认为是一台增强的...

    内核的任务

    在纯技术层面上,内核是硬件与软件之间的一个中间层。其作用是将应用程序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址

    从应用程序的视角来看,内核可以被认为是一台增强的计算机,将计算机抽象到一个高层次上。例如,在内核寻址硬盘时,它必须确定使用哪个路径来从磁盘向内存复制数据,数据的位置,经由哪个路径向磁盘发送哪一条命令,等等。另一方面,应用程序只需发出传输数据的命令。实际的工作如何完成与应用程序是不相干的,因为内核抽象了相关的细节。应用程序与硬件本身没有联系,只与内核有联系,内核是应用程序所知道的层次结构中的最底层,因此内核是一台增强的计算机

    内核的组成部分

    Linux内核的高层次概述以及完整的Linux系统中的各个层次
    在这里插入图片描述

    进程、进程切换、调度

    传统上, UNIX操作系统下运行的应用程序、服务器及其他程序都称为进程。每个进程都在CPU的虚拟内存中分配地址空间。各个进程的地址空间是完全独立的,因此进程并不会意识到彼此的存在。从进程的角度来看,它会认为自己是系统中唯一的进程。如果进程想要彼此通信(例如交换数据),那么必须使用特定的内核机制

    由于Linux是多任务系统,它支持(看上去)并发执行的若干进程。系统中同时真正在运行的进程数目最多不超过CPU数目,因此内核会按照短的时间间隔在不同的进程之间切换(用户是注意不到的),这样就造成了同时处理多进程的假象

    • 内核借助于CPU的帮助,负责进程切换的技术细节。必须给各个进程造成一种错觉,即CPU总是可用的。通过在撤销进程的CPU资源之前保存进程所有与状态相关的要素,并将进程置于空闲状态,在重新激活进程时,则将保存的状态原样恢复。进程之间的切换称之为进程切换
    • 内核还必须确定如何在现存进程之间共享CPU时间。确定哪个进程运行多长时间的过程称为调度
    UNIX进程

    Linux对进程采用了一种层次系统,每个进程都依赖于一个父进程。内核启动init程序作为第一个进程,该进程负责进一步的系统初始化操作,并显示登录提示符或图形登录界面

    UNIX操作系统中有两种创建新进程的机制,分别是forkexec

    • fork可以创建当前进程的一个副本,父进程和子进程只有PID(进程ID)不同,父进程内存的内容将被复制,至少从程序的角度来看是这样。 Linux使用了写时复制(copy on write),主要的原理是将内存复制操作延迟到父进程或子进程向某内存页面写入数据之前,在只读访问的情况下父进程和子进程可以共用同一内存页
    • exec将一个新程序加载到当前进程的内存中并执行。旧程序的内存页将刷出,其内容将替换为新的数据。然后开始执行新程序

    进程并不是内核支持的唯一一种程序执行形式。除了重量级进程(有时也称为UNIX进程)之外,还有一种形式是线程(有时也称为轻量级进程)。线程也已经出现相当长的一段时间,本质上一个进程可能由若干线程组成,这些线程共享同样的数据和资源,但可能执行程序中不同的代码路径

    由于线程和主程序共享同样的地址空间,主程序自动可以访问接收到的数据。除了为防止线程访问同一内存区而采取的互斥机制外,就不需要什么通信了

    地址空间与特权级别

    由于内存区域是通过指针寻址,因此CPU的字长决定了所能管理的地址空间的最大长度。地址空间的最大长度与实际可用的物理内存数量无关,因此被称为虚拟地址空间。使用该术语的另一个理由是,从系统中每个进程的角度来看,地址空间中只有自身一个进程,而无法感知到其他进程的存在

    Linux将虚拟地址空间划分为两个部分,分别称为内核空间和用户空间
    在这里插入图片描述
    这种划分与可用的内存数量无关。由于地址空间虚拟化的结果, 每个用户进程都认为自身有3 GiB内存。各个系统进程的用户空间是完全彼此分离的,而虚拟地址空间顶部的内核空间总是同样的

    内核把虚拟地址空间划分为两个部分,因此能够保护各个系统进程,使之彼此隔离。所有的现代CPU都提供了几种特权级别,进程可以驻留在某一特权级别

    在用户状态禁止访问内核空间。用户进程不能操作或读取内核空间中的数据,也无法执行内核空间中的代码,从用户状态到核心态的切换通过系统调用的特定转换手段完成

    除了代表用户程序执行代码之外,内核还可以由异步硬件中断激活,然后在中断上下文中运行。与在进程上下文中运行的主要区别是,在中断上下文中运行不能访问虚拟地址空间中的用户空间部分。因为中断可能随机发生,中断发生时可能是任一用户进程处于活动状态,由于该进程基本上与中断的原因无关,因此内核无权访问当前用户空间的内容。在中断上下文中运行时,内核必须比正常情况更加谨慎,例如,不能进入睡眠状态

    在核心态和用户状态执行。 CPU大多数时间都在执行用户空间中的代码。当应用程序执行系统调用时,则切换到核心态,内核将完成其请求。在此期间,内核可以访问虚拟地址空间的用户部分。在系统调用完成之后, CPU切换回用户状态。硬件中断也会使CPU切换到核心态,这种情况下内核不能访问用户空间
    在这里插入图片描述

    大多数情况下,单个虚拟地址空间就比系统中可用的物理内存要大。在每个进程都有自身的虚拟地址空间时,情况也不会有什么改善。因此内核和CPU必须考虑如何将实际可用的物理内存映射到虚拟地址空间的区域。可取的方法是用页表来为物理地址分配虚拟地址。虚拟地址关系到进程的用户空间和内核空间,而物理地址则用来寻址实际可用的内存
    在这里插入图片描述
    例如,进程A的虚拟内存页1映射到物理内存页4,而进程B的虚拟内存页1映射到物理内存页5。由此可见,不同进程的同一虚拟地
    址实际上具有不同的含义

    物理内存页经常称作页帧。相比之下, 页则专指虚拟地址空间中的

    页表

    用来将虚拟地址空间映射到物理地址空间的数据结构称为页表。实现两个地址空间的关联最容易的方法是使用数组,对虚拟地址空间中的每一页,都分配一个数组项。该数组项指向与之关联的页帧,但有一个问题。例如, IA-32体系结构使用4 KiB页,在虚拟地址空间为4 GiB的前提下,则需要包含100万项的数组。在64位体系结构上,情况会更糟糕。每个进程都需要自身的页表,因此系统的所有内存都要用来保存页表,也就是说这个方法是不切实际的

    因为虚拟地址空间的大部分区域都没有使用,因而也没有关联到页帧,那么就可以使用功能相同但内存用量少得多的模型:多级分页
    在这里插入图片描述

    • 虚拟地址的第一部分称为全局页目录(Page Global Directory, PGD)。 PGD用于索引进程中的一个数组(每个进程有且仅有一个),该数组是所谓的全局页目录或PGD。 PGD的数组项指向另一些数组的起始地址,这些数组称为中间页目录(Page Middle Directory, PMD)
    • 虚拟地址中的第二个部分称为PMD,在通过PGD中的数组项找到对应的PMD之后,则使用PMD来索引PMD。 PMD的数组项也是指针,指向下一级数组,称为页表或页目录
    • 虚拟地址的第三个部分称为PTE(Page Table Entry,页表数组),用作页表的索引。虚拟内存页和页帧之间的映射就此完成,因为页表的数组项是指向页帧的
    • 虚拟地址最后的一部分称为偏移量。它指定了页内部的一个字节位置。归根结底,每个地址都指向地址空间中唯一定义的某个字节
    物理内存的分配

    在内核分配内存时,必须记录页帧的已分配或空闲状态,以免两个进程使用同样的内存区域。由于内存分配和释放非常频繁,内核还必须保证相关操作尽快完成。内核可以只分配完整的页帧

    内核中很多时候要求分配连续页。为快速检测内存中的连续区域,内核采用了一种古老而历经检验的技术: 伙伴系统。系统中的空闲内存块总是两两分组,每组中的两个内存块称作伙伴。伙伴的分配可以是彼此独立的。但如果两个伙伴都是空闲的,内核会将其合并为一个更大的内存块,作为下一层次上某个内存块的伙伴
    在这里插入图片描述
    内核对所有大小相同的伙伴(1、 2、 4、 8、 16或其他数目的页),都放置到同一个列表中管理。各有8页的一对伙伴也在相应的列表中

    内核本身经常需要比完整页帧小得多的内存块。由于内核无法使用标准库的函数,因而必须在伙伴系统基础上自行定义额外的内存管理层,将伙伴系统提供的页划分为更小的部分。该方法不仅可以分配内存,还为频繁使用的小对象实现了一个一般性的缓存——slab缓存

    页面交换通过利用磁盘空间作为扩展内存,从而增大了可用的内存。在内核需要更多内存时,不经常使用的页可以写入硬盘。如果再需要访问相关数据,内核会将相应的页切换回内存。通过缺页异
    常机制,这种切换操作对应用程序是透明的

    页面回收用于将内存映射被修改的内容与底层的块设备同步,为此有时也简称为数据回写。数据刷出后,内核即可将页帧用于其他用途(类似于页面交换)

    计时

    内核必须能够测量时间以及不同时间点的时差,进程调度就会用到该功能。 jiffies是一个合适的时间坐标。名为jiffies_64和jiffies(分别是64位和32位)的全局变量,会按恒定的时间间隔递增。每种计算机底层体系结构都提供了一些执行周期性操作的手段,通常的形式是定时器中断

    计时的周期是可以动态改变的。在没有或无需频繁的周期性操作的情况下,周期性地产生定时器中断是没有意义的,这会阻止处理器降低耗电进入睡眠状态。动态改变计时周期对于供电受限的系统
    是很有用的,例如笔记本电脑和嵌入式系统

    系统调用

    系统调用是用户进程与内核交互的经典方法

    • 进程管理:创建新进程,查询信息,调试。
    • 信号:发送信号,定时器以及相关处理机制。
    • 文件:创建、打开和关闭文件,从文件读取和向文件写入,查询信息和状态。
    • 目录和文件系统:创建、删除和重命名目录,查询信息,链接,变更目录。
    • 保护机制:读取和变更UID/GID,命名空间的处理。
    • 定时器函数:定时器函数和统计信息。

    对所有的处理器来说,一个共同点就是:用户进程要从用户状态切换到核心态,并将系统关键任务委派给内核执行,系统调用是必由之路


    【未完待续…】

    展开全文
  • Linux内核简介

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

    大纲:

    理解Linux内核最好预备的知识点
    Linux内核的特点
    Linux内核的任务
    内核的组成部分
    哪些地方用到了内核机制?
    Linux进程
    Linux创建新进程的机制
    Linux线程
    内核线程
    地址空间与特权级别
            虚拟地址与物理地址
            特权级别(Linux的两种状态)
            系统调用
    设备驱动程序、块设备和字符设备
    网络
    文件系统

    模块和热插拔

    注:本文为《深入Linux内核架构》 的学习笔记


    理解Linux内核最好预备的知识点:

    • 懂C语言
    • 懂一点操作系统的知识
    • 熟悉少量相关算法
    • 懂计算机体系结构


    Linux内核的特点:

    结合了unix操作系统的一些基础概念


    Linux内核的任务:

    1.从技术层面讲,内核是硬件与软件之间的一个中间层。作用是将应用层序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。
    2.从应用程序的层面讲,应用程序与硬件没有联系,只与内核有联系,内核是应用程序知道的层次中的最底层。在实际工作中内核抽象了相关细节。
    3.内核是一个资源管理程序。负责将可用的共享资源(CPU时间、磁盘空间、网络连接等)分配得到各个系统进程。

    4.内核就像一个库,提供了一组面向系统的命令。系统调用对于应用程序来说,就像调用普通函数一样。


    内核实现策略:

    1.微内核。最基本的功能由中央内核(微内核)实现。所有其他的功能都委托给一些独立进程,这些进程通过明确定义的通信接口与中心内核通信。

    2.宏内核。内核的所有代码,包括子系统(如内存管理、文件管理、设备驱动程序)都打包到一个文件中。内核中的每一个函数都可以访问到内核中所有其他部分。目前支持模块的动态装卸(裁剪)。Linux内核就是基于这个策略实现的。


    内核的组成部分:

    1.用户空间(在“地址空间与特权级别”小节会详细介绍):
    应用程序:
    C库


    2.内核空间(在“地址空间与特权级别”小节会详细介绍):
    核心内核
    设备驱动程序

    硬件

    详细可参考图1


    图1 Linux内核组成部分


    哪些地方用到了内核机制?

    1.进程(在cpu的虚拟内存中分配地址空间,各个进程的地址空间完全独立;同时执行的进程数最多不超过cpu数目)之间进行通   信,需要使用特定的内核机制。
    2.进程间切换(同时执行的进程数最多不超过cpu数目),也需要用到内核机制。
        进程切换也需要像FreeRTOS任务切换一样保存状态,并将进程置于闲置状态/恢复状态。

    3.进程的调度。确认哪个进程运行多长的时间。


    Linux进程

    1.采用层次结构,每个进程都依赖于一个父进程。内核启动init程序作为第一个进程。该进程负责进一步的系统初始化操作。init进程是进程树的根,所有的进程都直接或者间接起源于该进程。
    2.通过pstree命令查询。实际上得系统第一个进程是systemd,而不是init(这也是疑问点)

    3.系统中每一个进程都有一个唯一标识符(ID),用户(或其他进程)可以使用ID来访问进程。

    • Linux创建新进程的机制;
            1.使用fork函数。
    功能:创建当前进程的一个副本。父进程和子进程只有PID(进程ID)不同。父进程的内容被复制。(写时复制:可以了解下这个概念)


            2.使用exec函数。

    功能:将一个新程序加载到当前进程的内存中并执行。旧程序的内存页将刷出,其内容替换为新的数据。然后开始执行新程序。


    Linux线程

    进程可以看成是一个正在执行的程序,而线程则是与主程序并行运行的程序函数或例程。

    • Linux创建新线程 

            采用clone方法创建线程。

    • 内核线程
            特点:
    1.不与任何特定的用户空间进程相关联。
    2.与中断上下文运转的内核相比,内核线程可以进入睡眠状态,也可以像系统中的普通进程一样被调度器跟踪。

    用途:
    1.从内存和块设备之间的数据同步。
    2.帮助调度器在CPU上分配进程。

    如何查看内核线程:
    命令:ps fax   方括号内的就是内核线程。


    地址空间与特权级别

    在正式介绍之前先介绍几个单位:

    KiB  2^10字节
    MiB  2^20

    GiB  2^30

    • 地址空间

        虚拟地址与物理地址:

            虚拟地址:在计算机的专用术语中是指标识一个虚拟(非物理地址)的实体地址。

            物理地址:切切实实存在的地址。在存储器里以字节为单位存储信息,为正确地存放或取得信息,每一个字节单元给以一个唯一的存储器地址,称为物理地址。

            映射关系:
                用页表为物理地址分配虚拟地址
        注意:未必虚拟地址的所有页都映射到某个页帧。
        原因:
    1.页没有内存可以使用
    2.数据尚不需要使用而没有载入内存。
    3.页已经换出硬盘,需要时再换回内存。


        页帧:物理内存页
        页:专指虚拟地址空间中的页。
        页表:将虚拟地址空间映射到物理地址空间的数据结构。
        多级分页:建立虚拟地址到物理地址映射的一种方法,能有效减少内存用量。


        CPU加速内存的访问过程,方法:
        1.MMU(Memory Management Unit)内存管理单元
        2.TLB(Translation Lookaside Buffer)地址转换后备缓冲器

        IA-32位结构的CPU只需要使用二级页表,Linux内核总是使用四级页表,剩余部分由内核通过控页表对缺少的页表进行仿真。

        概念注意:

        1.CPU的字长决定了所能管理的地址空间的最大长度。对于32位系统是2^32 B = 4GiB
        2.虚拟地址空间:地址空间的最大长度与实际可用的物理内存的数量无关。
    虚拟地址空间划分为两个部分:
    内核空间

    用户空间

                    如图2所示:


    图2 虚拟内存的划分

            有个等价名称值得一提:
    用户层:指应用程序本身。指不属于内核的东西。
    用户空间:不仅可以表示应用程序,还指代应用程序所运行的虚拟地址空间的一部分。与内核空间相对。

    注意:每一个进程都有上述独立的虚拟地址空间。对于图2所示,每个进程有4GiB的内存空间。

    • 特权级别
            Linux有两种状态,两种状态代表两种特权级别:
           核心态:在虚拟地址的内核空间运行的状态。
           用户状态:在虚拟地址的用户空间运行的状态。
        注意:在用户状态禁止访问内核空间


            这两种状态的差别在于:对高于TASK_SIZE的内存区域的访问。

    • 系统调用
            定义:从用户状态到核心态的切换通过系统调用的特定手段完成。
    方法:
    1.内核代表用户程序执行代码
    2.异步硬件中断激活,然后在中断上下文中进行。注意:在中断上下文运行时,内核不能进入睡眠状态。
            注意:

    CPU大多数在执行用户空间中的代码。当应用程序执行系统调用时,则会切换到核心态,内核将完成其请求。在此期间,内核可以访问虚拟地址空间的用户部分。在系统调用完成之后,CPU切换回用户状态。 

            硬件中断也使CPU切换到核心态,但这种情况下内核不能访问用户空间。

            系统调用有哪些:

                    进程管理
    信号
    文件
    目录和文件系统
    保护机制
    定时器函数

    如:在IA-32处理器上,Linux使用一个专用软件中断执行系统调用。

    设备驱动程序、块设备和字符设备
    设备驱动程序的任务:是在于支持应用程序经由设备文件与设备通信。换言之,使得能按恰当的方式在设备上读取/写入数据。
    设备驱动程序的定义:用于与系统连接的输入/输出装置通信。如硬盘、软驱、各种接口、声卡等。


    外设分为两类:
    1.字符设备。提供连续的数据流,数据可以顺序读取,通常不支持随机存取。支持按字节/字符来读写数据。
    典型:调制解调器
    2.块设备。可以随机访问设备数据,程序可以自行确定读取数据的位置。不支持基于字符寻址,数据读写只能以块的倍数进行。
    典型:硬盘。
    复杂性:比字符设备复杂,因为设计到缓存机制。


    网络
    网卡也可以通过设备驱动程序控制。
    但在内核中,网卡不能以设备文件访问。因为网络通信期间数据打包到各种协议层,内存处理数据必须针对协议层处理,才能有效将数据对接应用程序。
            为了支持用文件接口处理网络连接。Linux提供了套接字抽象,套接字可以看成是应用程序、文件接口、内核的网络实现之间的代理。


    文件系统
    文件存储在硬盘或者其他块设备(如光盘等),采用层次式文件系统。
    文件系统使用目录结构主治存储的数据,并将其他原信息(如所有者、访问权限等)关联起来。


    Linux支持许多不同的文件系统:
    如标准的Ext2和Ext3文件系统、ReiserFS、XFS、VFAT等

    注意:软件层(Virtual Filesystem虚拟文件系统)内核必须提供一个额外的软件层,将各种底层的文件系统的具体特征与应用层隔离开。如图3所示。


    图3 文件系统的额外软件层

    参考文献:

    [1]Wolfgang Mauerer.《深入Linux内核架构》 Wolfgang Mauerer著 郭旭译 人民邮电出版社


    展开全文
  • 非常好的Linux编译内核详解 - -

    万次阅读 2018-03-21 15:58:36
    转载: http://blog.chinaunix.net/uid-263488-id-2138150.html非常好的Linux编译内核详解 - -一、内核简介 内核,是一个操作系统的核心。它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统...
  • 操作系统与操作系统内核

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

    千次阅读 2018-08-07 20:20:13
    浏览器内核简要说明 一个完整的浏览器包含浏览器内核和浏览器的外壳(shell)。浏览器内核又可以分为两部分:渲染引擎(Layout Engine或Rendering Engine)和JS引擎。由于JS引擎越来越独立,内核就倾向于只指渲染...
  • 五大主流浏览器及四大内核

    万次阅读 多人点赞 2018-09-20 09:51:15
    只是用户看到浏览器是浏览器,而前端开发工程师看到的是浏览器内核。从第一款浏览器libwww(Library WorldWideWeb)发展至今已经经历了无数竞争与淘汰。现在国内常见的浏览器有:IE、Firefox、QQ浏览器、Safari、...
  • Linux内核的整体架构简介

    万次阅读 多人点赞 2017-10-23 17:46:51
    本文是“Linux内核分析”系列文章的第一篇,会以内核的核心功能为出发点,描述Linux内核的整体架构,以及架构之下主要的软件子系统。之后,会介绍Linux内核源文件的目录结构,并和各个软件子系统对应。 注:本文和...
  • 一开始我并不想写这个笔记,因为太过复杂,我一直想以简单的方式理解内核,只从概念,避免涉及过多的代码。实际上,我写笔记的时候,书已经看到很后面了,因为总要理解更多才能理解之前看似简短实际复杂的内容。但...
  • 虽然内核对象位于独立于进程之外的内核区域,我们在开发中却只能通过调用Win32 API传入HANDLE参数来操作内核对象(如SetEvent等)。然而HANDLE句柄只对当前进程有效,离开了当前进程该句柄就无效了(具体原因参考:...
  • 详解神秘Linux内核

    万次阅读 2016-04-01 15:00:13
    本章要先浏览一下内核发出的启动信息,然后再逐个讲解一些有意思的点。 2.1 启动过程 图2-1显示了基于x86计算机Linux系统的启动顺序。第一步是BIOS从启动设备中导入主引导记录(MBR),接下来MBR中的代码查看分区表...
  • 内核与微内核、Linux内核与Unix内核的区别

    万次阅读 多人点赞 2016-05-25 10:07:56
    操作系统内核可能是微内核,也可能是单内核(后者有时称之为宏内核Macrokernel)。按照类似封装的形式,这些术语定义如下: 单内核:也称为宏内核。将内核从整体上作为一个大过程实现,并同时运行在一个单独的地址...
  • 内核也是程序,也应该具有自己的虚存空间,但是作为一种为用户程序服务的程序,内核空间有它自己的特点。   内核空间与用户空间的关系 在一个32位系统中,一个程序的虚拟空间最大可以是4GB,那么最直接的做法...
  • Linux升级内核的正确姿势

    万次阅读 热门讨论 2018-08-21 11:26:10
    Linux升级内核的正确姿势 很多童鞋在玩耍linux发行版的时候,都会遇到各种各样的问题,比如:网卡不能使用,亮度不能调节,触摸板不能识别,蓝牙不能使用等等,这些关系都和linux的内核有关系。 什么是linux内核...
  • 下面是来自百度统计流量研究院的浏览器市场份额报告(2016年1月至今) ...下面主要总结一下,五大主流浏览器以及国内一些浏览器所使用的内核。 捋一下内核的概念:   浏览器内核又可以分成两部
  • 用户态与内核态的切换与区别

    万次阅读 2017-11-14 16:20:24
    内核态和用户态的区别 当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核状态。此时处理器处于特权级 最高的(0级)内核代码。当进程处于内核态时,执行的内核代码会使用当前的内核栈。每...
  • 360浏览器内核是:IE内核+chromium内核,“内核”究竟是什么意思? 那么问题来了,360浏览器不是使用的IE内核吗?怎么又成了Chromium内核了。 那么360浏览器的内核,究竟是什么? 既然360使用的IE内核,为什么...
  • Linux系统内核性能调优

    万次阅读 2015-08-03 11:01:22
    做过Linux平台性能测试的童鞋平时可能会遇到如下问题: 1、 TCP端口号不够用导致并发上不去(即与...我们可以通过优化系统内核参数来解决上述问题,优化步骤如下: Linux 平台 1、 参考附件1中sysctl.conf文件替换
1 2 3 4 5 ... 20
收藏数 1,028,136
精华内容 411,254
关键字:

内核