我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Linux内核设计与实现的方法是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Linux内核设计与实现的方法是什么

今天小编给大家分享一下Linux内核设计与实现的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

 

Unix强大的根本原因:

  1. Unix简洁, 提供几百个系统调用, 设计目的明确

  2. Unix中 所有东西都被当做文件对待

  3. Unix内核和相关系统工具是用C语言开发的, 移植能力强大

  4. Unix进程创建迅速, 有独特的fork机制

  5. Unix提供简单稳定的进程间通信元语

Linux是类Unix系统, 借鉴了Unix设计并实现了Unix的API.

应用程序通常调用库函数(如C库函数)再由库函数通过系统调用界面, 让内核代其完成各种任务.

  • Linux支持动态加载内核模块

  • Linux支持对称多处理(SMP)机制

  • Linux为 抢占式内核

  • Linux并不区分线程和其他的一般进程

  • Linux提供具有设备类的面向对象的设备模型, 热插拔事件, 以及用户控件的设备文件系统

中断和中断处理

中断是一种解决处理器和速度差异的方案, 只有在硬件需要的时候再向内核发出信号. 中断本质上是一种特殊的电信号.

  • 内核响应特定中断, 然后 内核 调用特定的 中断处理程序 , 终端处理程序是设备驱动程序的一部分

  • Linux中的终端处理程序是不可重入的, 同一个中断处理程序不会被同时调用

  • 中断上下文不可以睡眠(我理解当前被中断的程序再中断处理结束后需要继续执行)

  • 中断处理程序不在进程上下文中进行, 他们不能阻塞

  • 中断处理分为两部分, 上半部为中断处理程序, 要求尽可能快的执行, 下半部( 用于减少中断处理程序的工作量  )执行与中断处理密切相关但中断处理程序本身不执行的工作

  • 下半部的实现方法 软中断、tasklet、工作队列 ,

中断机制的实现:设置产生中断, 通过电信号给处理器的特定管脚发送一个信号, 处理器听着当前处理工作, 关闭中断系统 ,  然后调到内存中预定义的位置(中断处理程序的入口点)开始执行.计算终端号, do_IRQ() 对接收的中断进行应答, 禁止这条线上的中断传递.

内核同步

对于共享资源, 如果同时被多个线程访问和操作, 就可能发生各线程之间相互覆盖共享数据, 造成访问数据不一致.

同步实现通过主要 锁机制 对共享资源进行加锁, 只有持有锁的线程才能操作共享资源, 其他线程睡眠(或者轮询). 资源操作完成后, 持有锁的线程释放锁,  由等待线程抢锁.

内核同步方法:

  1. 原子操作

  2. 自旋锁 , 特性是当线程无法获取锁, 会一直忙循环( 忙等 )等待锁重新可以, 适用于短期轻量级加锁

  3. 读/写自旋锁 (共享/排它锁), 一个或多个任务可以并发的持有读者锁, 写者锁只能被一个写任务持有.

  4. 信号量 (睡眠锁), 如果一个任务试图获得一个被占用的信用量时, 信号量会将其推进一个等待队列, 然后让其睡眠. 当信号量可用后,  等待队列中的任务会被唤醒. 适用于锁被长期占用的时候.

  5. mutex(计数为1的信号量), 这个是编程中最常见的.

  6. 顺序锁

  7. 屏障 (barriers), 用于确保指令序列和读写的执行顺序

内核中造成并发的原因:

  • 中断, 几乎可以再任何时刻异步发生, 可能随时打断当前正在执行的代码

  • 软中断和tasklet, 内核能在任何时刻唤醒或调度软中断或tasklet, 打断当前正在执行的代码

  • 内核抢占

  • 睡眠及与用户空间的同步

  • 对称多处理, 多个处理器同时执行代码

内存管理

内核把物理页作为内存管理的基本单位, 内存管理单元(MMU, 管理内存并将虚拟地址转换为物理地址) 通常以页为单位来管理系统中的页表.

内核把也划分为不同的区( zone ), 使用区对具有相似特性的页进行分组

// <linux/gfp.h> 该函数分配2的order次方个连续`物理页`, 返回指针指向***个页的page结构体  staticinlinestructpage *  alloc_pages(gfp_tgfp_mask,unsignedintorder)  // 释放物理页  externvoidfree_pages(unsignedlongaddr,unsignedintorder);  //<linux/slab.h>以字节为单位分配一块内核内存(物理上连续)  static__always_inlinevoid*kmalloc(size_tsize,gfp_tflags)  //释放kmalloc分配的内存块  voidkfree(constvoid*);

虚拟文件系统

虚拟文件系统为用户控件程序提供了文件和文件系统相关接口.

文件的元数据, 被存储在一个单独的数据结构中, 被称为 inode (索引节点)

虚拟文件系统(VFS)有四个主要的对象模型:

  • 超级块对象, 代表一个具体的已安装文件系统, 存储特定文件系统的信息

  • 索引节点对象, 代表一个具体文件, 包含内核在操作文件或目录时需要的全部信息, 一个索引节点代表文件系统中的一个文件,

  • 目录项对象, 代表一个目录项, 是路径的一个组成部分, VFS把目录当做文件处理 , 目录项对象没有对应的磁盘数据结构

  • 文件对象, 代表进程打开的文件, 进程直接处理的是文件

// <linux/fs.h> 文件对象的数据结构 structfile { union{ structllist_node fu_llist; structrcu_head fu_rcuhead;  } f_u; structpath f_path; structinode *f_inode; conststructfile_operations *f_op;   spinlock_tf_lock; atomic_long_tf_count; unsignedintf_flags; fmode_tf_mode; structmutex f_pos_lock; loff_tf_pos; structfown_struct f_owner; conststructcred *f_cred; structfile_ra_state f_ra;   u64 f_version; #ifdefCONFIG_SECURITY void*f_security; #endif  void*private_data;  #ifdefCONFIG_EPOLL  structlist_head f_ep_links; structlist_head f_tfile_llink; #endif structaddress_space *f_mapping; } __attribute__((aligned(4)));

块I/O层

系统中能够 随机访问 固定大小数据片(chunks)的硬件设备称作块设备, 如硬盘. 按照字符流的方式被 有序访问 的硬件设备称为字符设备,  如键盘

# <linux/bio.h>I/O设备基本容器由bio结构体表示
  • I/O调度程序 用于管理块设备的请求队列, 决定队列中的请求排列顺序以及什么时刻派发请求到挂设备. 这样有利于减少磁盘的寻址时间,  从而提高全局的吞吐量

  • linux实际使用的I/O调度程序有 linux电梯, 最终期限I/O调度, 预测I/O调度程序, 空操作的I/O调度程序

进程地址空间

内核需要管理用户空间中进程的内存, 这个内存称为 进程地址空间 , 系统中所有进程之间以虚拟方式共享内存.

进程地址空间由进程可寻址的虚拟内存组成, 每个进程有32位或64位地址空间.

虚拟地址空间, 可被访问的合法地址空间称为 内存区域 :

  • 可执行文件代码的内存映射, 称为代码段

  • 可执行文件的已初始化全局变量的内存映射, 称为数据段

  • 包含未初始化全局变量,bss(block started by symbol)段的零页的内存映射

  • 用于进程用户空间栈的零页内存映射

  • 每一个如C库或动态链接程序等共享库的代码段、数据段和bss会被载入进程的地址空间

  • 任何内存映射文件

  • 任何共享内存段

  • 任何匿名的内存映射, 如malloc分配的内存

内核使用内存描述符结构体表示进程的地址空间, 内存描述符由mm_struct( <linux/sched.h> )结构体表示.  内核线程没有进程地址空间, 也没有相关的内存描述符, 所有内核线程没有用户上下文

应用程序操作的对象是 映射到物理内存上的虚拟内存 , 而处理器操作的是物理内存, Linux使用三级页表完成地址转换, 每个虚拟地址作为索引指向页表,  页表项则指向下一级的页表. 在多级页表中通过TLB(translate lookaside buffer)作为一个虚拟地址映射到物理地址的缓存

以上就是“Linux内核设计与实现的方法是什么”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Linux内核设计与实现的方法是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Linux内核设计与实现的方法是什么

今天小编给大家分享一下Linux内核设计与实现的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。 Unix强大的根本
2023-06-16

《Linux内核设计与实现》第3版

《Linux内核设计与实现》第3版,英文版已经出版,中文版即将出版。本书基于linux 2.6介绍了linux内核的设计与实现,涵盖了从核心内核系统的应用到内核设计与实现等各方面内容,主要内容包括:进程管理、调度、时间管理和定时器、系统调用
2023-01-31

基于Linux内核新特性的网关设计方法是什么

今天小编给大家分享一下基于Linux内核新特性的网关设计方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。UCloud
2023-06-16

Linux内核升级的方法是什么

本篇内容介绍了“Linux内核升级的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Linux内核简介:1.从技术层面讲,内核是硬件
2023-06-28

linux内核锁的实现原理是什么

Linux内核锁的实现原理是通过硬件的原子操作指令或者特殊的指令序列来保证对共享资源的原子操作,从而实现线程之间的同步和互斥。Linux内核提供了多种锁机制,包括自旋锁、互斥锁、读写锁等。自旋锁是一种忙等待的锁,当一个线程尝试获取自旋锁失败
2023-10-21

Go连接池设计与实现的方法是什么

这篇“Go连接池设计与实现的方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Go连接池设计与实现的方法是什么”文章吧
2023-07-06

BufferQueue的设计思想和内部实现方法是什么

这篇文章主要介绍“BufferQueue的设计思想和内部实现方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“BufferQueue的设计思想和内部实现方法是什么”文章能帮助大家解决问题。1.
2023-06-05

linux内核编译安装的方法是什么

Linux内核编译安装的方法如下:1. 下载内核源代码:在Linux官方网站(https://www.kernel.org/)或其他来源下载最新版本的内核源代码。2. 解压源代码:使用tar命令解压下载的内核源代码压缩包。3. 配置内核选项
2023-09-25

linux内核版本查看的方法是什么

有多种方法可以查看Linux内核版本,以下是其中一些常用的方法:使用命令行查看:可以通过在终端中输入以下命令来查看Linux内核版本:uname -r查看/proc/version文件:可以通过查看/proc/version文件的内容来获取
linux内核版本查看的方法是什么
2024-03-04

linux查看内核版本的方法是什么

在Linux系统中,可以使用以下命令来查看内核版本:使用uname命令:uname -a使用cat命令查看/proc/version文件内容:cat /proc/version使用uname命令仅查看内核版本号:uname -r以上命令可以
linux查看内核版本的方法是什么
2024-03-11

linux内核版本号查看的方法是什么

要查看Linux内核版本号,可以使用以下命令:1. 使用uname命令:uname -r2. 使用cat命令查看/proc/version文件:cat /proc/version3. 使用lsb_release命令:lsb_release
2023-10-18

linux调用系统内核函数的方法是什么

在Linux中,调用系统内核函数的方法主要有以下几种:1. 使用系统调用(system call):系统调用是用户程序通过软中断(软中断号为0x80)请求操作系统内核提供的服务。用户程序通过执行int 0x80指令触发软中断,将要调用的系统
2023-10-18

不同版本的Linux内核查看方法是什么

不同版本的Linux内核查看方法是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Linux内核是Linux当中非常强大的一部分,也是非常重要的一部分,有时候
2023-06-28

linux内核快速重新引导的方法是什么

在Linux系统中,可以使用kexec工具来实现快速重新引导。kexec是一个用于加载和执行内核镜像的工具,它可以绕过传统的BIOS或UEFI引导过程,直接在已经运行的内核中加载新的内核镜像。这样可以大大减少重新引导所需的时间。使用kexe
2023-09-29

ubuntu编译内核的方法是什么

要编译Ubuntu内核,可以按照以下步骤进行操作:1. 安装编译所需的依赖项:```sudo apt-get install git fakeroot build-essential ncurses-dev xz-utils libssl-
2023-10-08

ubuntu内核管理的方法是什么

在Ubuntu中,内核管理的方法有以下几种:使用apt命令进行更新和安装:Ubuntu使用apt(Advanced Package Tool)作为包管理器,默认情况下,它会自动管理内核的更新和安装。可以使用以下命令来更新内核:sudo a
2023-10-24

Linux deepin 删除多余内核的实现方法

前一篇写了deepin linux手动安装新内核,本篇记录如何删除不用的内核 使用命令 dpkg --get-selections| grep linux 列出当前安装的内核比如要卸载Linux5.1.9 则执行
2022-06-04

PouchContainer CRI的设计与实现方法是怎样的

PouchContainer CRI的设计与实现方法是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。  1. CRI简介  在每个Kubernetes节点
2023-06-03

编程热搜

目录