内核_内核中断 - 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内核的整体架构简介

    万次阅读 多人点赞 2017-10-23 17:46:51
    本文是“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


    展开全文
  • 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著 郭旭译 人民邮电出版社


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

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

    千次阅读 2018-12-02 13:30:18
    目前最为主流的浏览器有5大款,分别是IE,火狐,谷歌,safari,opera ...浏览器内核可以分为两部分,一部分是渲染引擎(render engineer或layout engineer),方负责生成DOM树,负责渲染和重绘,这些工作;另一部分是...
  • 五大主流浏览器及四大内核

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

    万次阅读 2018-06-10 16:58:51
    浏览器最重要或者说核心的部分是“Rendering Engine”,可大概译为“渲染引擎”,不过我们一般习惯将之称为“浏览器内核”。负责对网页语法的解释(如标准通用标记语言下的一个应用HTML、JavaScript)并渲染(显示)...
  • Linux内核组成部分(一)

    千次阅读 2019-01-11 10:31:38
    内核的任务 在纯技术层面上,内核是硬件与软件之间的一个中间层。其作用是将应用程序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址 从应用程序的视角来看,内核可以被认为是一台增强的...
  • ubuntu16.04 查看内核,升级内核,删除内核,切换内核 1:查看内核列表 sudo dpkg --get-selections |grep linux-image linux-image-4.4.0-21-generic install linux-image-4.4.0-66-generic deinstall ...
  • 360浏览器内核是:IE内核+chromium内核,“内核”究竟是什么意思? 那么问题来了,360浏览器不是使用的IE内核吗?怎么又成了Chromium内核了。 那么360浏览器的内核,究竟是什么? 既然360使用的IE内核,为什么...
  • 删除Ubuntu中不用的内核

    万次阅读 2018-03-20 19:42:37
    最近在学习Linux相关的知识,免不了查看Linux源代码和修改源代码,并且编译Linux内核。下面简单介绍一下如何删除Ubuntu中不用的内核。1、查看Linux中当前使用的内核:使用 uname -a 或者 uname -r 命令2、查看Linux...
  • 查看Linux内核版本的命令

    万次阅读 2008-08-07 22:23:00
    方法一: 命令: uname -a作用: 查看系统内核版本号及系统名称方法二:命令: cat /proc/version作用: 查看目录"/proc"下version的信息,也可以得到当前系统的内核版本号及系统名称补充说明: /proc文件系统,它...
  • Ubuntu 16.04 Linux系统内核升级方法

    万次阅读 2017-08-29 10:08:23
    本文介绍如何查看Ubuntu 操作系统的系统版本及内核版本,并介绍了内核升级的方法,通过实验验证了整个内核升级的过程。
  • 查看Linux内核版本命令

    万次阅读 2020-08-17 16:35:55
    1.umane -a 2.cat /proc/version 3.lsb_release -a
  • 内核:提供操作系统核心功能的内核的精简版本,它设计成在很小的内存空间内增加移植性,提供模块化设计,以使用户安装不同的接口与,如DOS、Workplace OS、Workplace Unix等。IBM、Microsoft等操作系统都采用了这...
  • 操作系统单体内核和微内核的区别

    万次阅读 2017-02-18 14:52:15
    单体内核:大内核,将OS的全部功能都做进内核中,包括调度、文件系统、网络、设备驱动器、存储管理。比如设备驱动管理、资源分配、进程间通信、进程间切换管理、文件系统、存储管理、网络等。单体内核是指在一大块...
  • php内核探索方法与资源

    千次阅读 2012-11-18 21:39:26
    PHP内核探索TIPI深入理解PHP内核风雪之隅PHP源码分析《php扩展开发及内核应用》百度XLQGod's blogcodinglabsPHP内核探索:从SAPI接口开始PHP内核探索:一次请求的开始与结束PHP内核探索:一次请求生命周期PHP内核...
  • 《PHP内核探索系列文章》系列分享专栏 《PHP内核探索系列文章》已整理成PDF文档,点击可直接下载至本地查阅https://www.webfalse.com/read/201817.html 简介 PHP内核探索系列文章收藏夹收藏有关PHP内核方面的知识...
  • 起因基于不可告人之原因,国内很多厂商喜欢二次定制,系统就不说了,腾讯团队愣是高出个X5内核内核都干了什么我们就不去追究了,关键是网页载入速度变慢了,这能忍……emmmm强改原理利用腾讯提供的TBS调试页面,...
1 2 3 4 5 ... 20
收藏数 1,037,886
精华内容 415,154
关键字:

内核