首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux 切换内核版本,切换 Linux 内核版本

大家好,又见面了,我是你们朋友全栈君。 Linux 内核是开源类 Unix 系统宏内核。仅仅一个内核并不是一套完整操作系统。有一套基于 Linux 内核完整操作系统叫作 Linux 操作系统。...Kernel 是 Linux 系统核心,主要负责硬件支持。 Linux 内核提供了安全补丁, bugfix 和新特性。 Linux 内核在 GNU 通用公共许可证第 2 版之下发布。...Linux Kernel 主要提供以下五个基本功能 硬件管理以及硬件抽象 进程和线程管理,以及之间通信 内存管理,包括虚拟内存管理以及内存空间包含 I/O 设备,包括文件系统,网络接口,...Linux 内核版本号意义 Linux 内核版本号由 3 组数字组成:第一个组数字。第二组数字。第三组数字 第一个组数字:目前发布内核主版本。...Linux Mint 那么在 Update Manager 中,选择 View -> Linux Kernels 可以查看当前安装版本和正在使用版本,或者选择安装新版本切换

23.4K20

Linux内核21-Linux内核中断处理过程

为了统一处理这些硬件,Linux内核使用了面向对象编程思想,构建了一个PIC对象,包含PIC名称和7个PIC标准方法。...因此,Linux2.6内核使用一个特定内核线程叫kirqd进行纠正IRQ自动分配(如果有必要的话)。...内核线程使用多APIC系统一个很棒功能,叫做CPUIRQ亲和力:通过修改I/O-APIC中断重定向表,将中断信号指定到新CPU上。...kirqd内核线程周期性地执行do_irq_balance()函数,追踪最近一段时间内,每个CPU上接收到中断次数。...总结 其实内核经过这么多年发展,在实现方式上已经发生了很大变化。但是其基本思想没变。比如我们以Linux4.4.203内核对于中断处理为例,与上面的处理过程进行比较,理解其主要变化。

2.2K20
您找到你想要的搜索结果了吗?
是的
没有找到

Linux内核13-进程切换

1 进程切换 进程切换,又称为任务切换、上下文切换、或者任务调度。本文就研究Linux内核进程切换。我们首先理解几个概念。...但是,优化硬件上下文切换是不可能,因为都是由CPU完成,而Linux是使用软件代替硬件上下文切换,所以有优化空间,以便提高执行时间。 进程切换只能发生在内核态。...1.3 线程域 每当进程切换时,将要被替换掉进程硬件上下文内容都应该被保存到某个地址。显然不能保存在TSS中,因为Linux为每个CPU就建立了一个TSS,而不是为每个进程建立TSS。...2 执行进程切换 进程切换时机: 中断处理程序中直接调用schedule()函数,实现进程调度。 内核线程,是一个特殊进程,只有内核态没有用户态。...switch_to宏处理过程如下: 将新旧进程描述符存放到CPU寄存器中: 保存旧进程内核态栈,比如eflags和ebp寄存器内容。

1.8K20

Linux内核20-Linux内核异常处理过程

异常处理基本过程 当异常发生时,Linux内核给造成异常进程发送一个信号,告知其发生了异常。...但是,除了这些常规异常以外,Linux有时候会特意利用某些CPU异常管理硬件资源。...比如,可以使用Device not available这个异常,结合cr0寄存器中TS标志,强迫内核重新加载CPU浮点寄存器,从而更新最新值。...异常处理程序基本上都是下面这样代码:(所有的异常和中断处理函数都可以在linux\arch\x86\entry\entry_32.S文件中找到) handler_name: pushl $0...如果进程是在用户态,则信号交给进程自身信号处理程序(如果存在的话);如果是在内核态,则内核通常会杀死进程。 最后异常处理程序跳转到ret_from_exception()函数地址处,从异常状态返回。

1.4K70

内核地址空间大冒险4:线程切换

sleep系统调用 我是一个线程,生活在Linux帝国。一直以来辛勤工作,日子过得平平淡淡,可今天早上发生了一件事让我回想起来都后怕。...你告诉我一下,下次来我就知道了” “不相等的话那就说明就绪队列里除了普通线程还有其他优先级更高线程,就得按照优先级从stop_sched_class窗口挨个向后询问,直到找到一个线程。...不过我在这干了这么久,就实时线程所在rt_sched_class窗口和普通线程所在fair_sched_class最常用”,美女耐心给我解释到。...告别了长者,我和小T踏上了这神秘switch_to,跟随着一步一步指令,我把自己线程上下文寄存器都保存到了我内核栈上面,然后将栈指针指向了小T内核栈,最后把小T保存在他内核指令地址加载进指令寄存器...我小心翼翼执行了这里代码,只是简单输出了一行日志,然后来到了一个叫__restore_rt()函数,又一条syscall指令摆在了我面前,我没有犹豫再一次一头扎进了内核空间。

80120

Linux内核编译过程详解

前言 Linux内核Linux操作系统核心,也是整个Linux功能体现核心,就如同发动机 在汽车中重要性。内核主要功能包括进程管理、内存管理、文件管理、设备管理、网络管理等。...Linux内核是单内核设计,但却采用了微内核模块化设计, 支持内核线程以及动态装载内核模块能力。 Linux作为一个自由软件,在广大爱好者支持下,内核版本不断更新。...新内核修订了旧内核 bug,并增加了许多新特性。如果用户想要使用这些新特性,或想根据自己系统定制一个更高效,更稳定内核,就需要手动编译Linux内核。那么如 何编译内核呢?...本文将讲解Linux内核编译详细程。 内核编译之内核获取 编译内核前提是需要有新内核源码包,获取源码包渠道有很多,这里就不详细介绍了,建议直接去官方网站(www.kernel.org)下载。...The end 好了,内核编译过程就是这样了,其中麻烦地方除了需要消耗大量时间,也就是配置内核菜单了(英文伤不起…),想详细了解每个项目的意思请自行查资料。

9.4K100

Linux基础(进线程竞争)

从图中看到,所谓进程就是包含了1条以上线程线程组。 每一条线程都是可以被单独调度实体,因此我们考虑优先级相关问题,就以线程对对象就行了。...该调度策略是Linux系统调度默认策略。...100个静态优先级,对应内核任务管理中100条队列,好比银行排队等到办理业务100个窗口,每一条队列都站着一些等到调度线程。...银行里服务柜员相当于CPU,是一个极快动作业务员,迅速地在各个窗口轮流切换,当然,她会优先处理高优先级客户,比如优先级为90客户是存款500万以上VIP,一般他事务紧急不容怠慢。 ? ?...什么是 动态 优先级 线程动态优先级(dynamic prioriy)是非实时普通线程独有的概念,之所以被称为“动态”,是因为它会随着线程运行,根据线程表现而发生改变。

72540

Linux内核内核模块)加载过程(超详细)

GRUB 加载了内核之后,内核首先会再进行二次系统自检,而不一定使用 BIOS 检测硬件信息。这时内核终于开始替代 BIOS 接管 Linux 启动过程了。...不过,如果没有被内核硬件,要想驱动,就需要手工安装个硬件硬块了。具体安装方法会在后续章节中介绍)。那么,Linux 内核到底放在了哪里呢?...vmlinuz-2.6.32-279.el6.i686#用于启动Linux内核。...这个文件是一个压缩内核镜像我们已经知道,Linux 会把不重要功能编译成内核模块,在需要时再调用,从而保证了内核不会过大。...它们作用类似,可以通过启动引导程序加载到内存中,然后会解压缩并在内存中仿真成一个根目录,并且这个仿真的文件系统能够提供一个可执行程序,通过该程序来加载启动过程中所需内核模块,比如 USB、SATA.

24120

Java线程Linux内核线程映射关系

Java线程Linux内核线程映射关系Linux内核2.6开始使用NPTL (Native POSIX Thread Library)支持,但这时线程本质上还轻量级进程。...Java线程在Windows及Linux平台上实现方式,现在看来,是内核线程实现方式。...**这种方式实现线程,是直接由操作系统内核支持——由内核完成线程切换内核通过操纵调度器(Thread Scheduler)实现线程调度,并将线程任务反映到各个处理器上。...看图: Java线程Linux内核线程映射关系 (说明:KLT即内核线程Kernel Thread,是“内核分身”。...这种线程实现方式也有它缺陷:在程序面上使用内核线程,必然在操作系统上多次来回切换用户态及内核态;另外,因为是一对一线程模型,LWP支持数是有限

2.1K40

Linux内核有没有rootfs,Linux内核rootfs初始化过程

由于在下水平相当有限,不当之处,还望大家批评指正^_^ 在Linux shell中执行mount命令,通常可以看到某个做了文件系统磁盘分区或flash分区或内存文件系统做为所谓根文件系统被mount...实际上内核中最初始根文件系统,并不是来自内核外部,他是由内核自己构建出来。 为了说明这个过程,我们先说说mount过程。...这个过程感觉挺复杂,在下对其代码实现理解得也很有限^_^ 不过,可以通过open系统调用实现,看到内核遍历路径过程中,是如何转向被挂载文件系统内部。...具体过程,就是解压压缩包,根据解压出内容,在初始根文件系统中创建目录、文件,然后将解压出文件内容部分write到创建文件中。...如果ramdisk_execute_command指向init程序不可访问, 就进入prepare_namespace,但是这个过程涉及到内核命令行参数中与rootfs有关内容。

2.1K20

Linux 线程通信和同步

如果 CPU 是单核,同一时只有一个进程在执行,多核 CPU 可以同一时点有多个进程在执行。...多线程无需跨越进程边界,适合大量数据传送。 3、什么时候用进程,什么时候用线程 创建和销毁较频繁使用线程,因为创建进程花销大。 需要大量数据传送使用线程,因为多线程切换速度快,不需要跨越进程边界。...安全稳定选进程;快速频繁选线程; 二、线程通信/同步 上一篇文章我们讲了进程通信六种方式:管道和 FIFO、信号、消息队列、信号量、共享内存、套接字(Socket),今天我们讲一下线程通信/同步方式...线程同步方法:互斥锁、条件变量、自旋锁、读写锁,除此之外,还有信号量、屏障等等,在 Linux 应用开发当中,用最多还是互斥锁和条件变量。 为什么需要线程同步?...使用场景区别:自旋锁在用户态应用程序中使用比较少,通常在内核代码中使用比较多;因为自旋锁可以在中断服务函数中使用,而互斥锁则不行,在执行中断服务函数时要求不能休眠、不能被抢占(内核中使用自旋锁会自动禁止抢占

1.4K10

linux内核启动过程分析

下载内核源代码编译内核 cd ~/LinuxKernel/ wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.6.tar.xz...set_task_stack_end_magic start_kernel是内核启动阶段入口,通过单步调试,可以发现它是linux内核执行第一个init,我们单步进入看看它做了哪些操作: ?...使用高端内存之后,32位系统也可以访问达到64G内存。 linux_banner变量保存着linux内核版本号: ?...-0.11版本内核来看这段代码: Linux-0.11 #set_trap_gate(0,÷_error)//除零错误 …… #define set_trap_gate(n,addr...在窗口输出信息,之前内存分配信息也打印出来了。 rest_init ? 这里具体函数分析见上面的流程图,这里主要是fork了一个新进程,并发生进程调度和切换

4.2K30

linux内核编译过程最终总结版

输入mv linux-2.6.36.tar.gz /usr/src,目的是把下载内核源代码文件移到/usr/src目录。 输入cd /usr/src切换到该目录下。...输入tar zxvf linux-2.6.36.tar.gz,目的是解压内核包,生成源代码放在linux-2.6.36目录下。 输入cd linux-2.6.36,切换到该目录下。...可以发现在启动项中多了两项,分别为Linux2.6.36模式和Linux2.6.36 recovery模式,选择Linux2.6.36模式,进入新内核,若在启动过程中没有跳出错误提示,表示已经成功了。...4、initrd.img是Linux启动过程中很重要一个文件,如果你编译内核时将一部分功能编译为可加载模块。...严格说来,depmod -a命令和编译过程并没有关系,它是生成模块依赖关系,这样你启动新内核之后,使用modprobe命令加载模块时就能正确地定位模块。

1.5K20

linux内核上下文切换解析

linux上下文切换就是进程线程切换,也就是切换struct task_struct结构体,一个任务上下文包括cpu寄存器,内核栈等,由于1个cpu上所有任务共享一套寄存器,所以在任务挂起时候需要保存寄存器...但是Linux为了适用更多cpu架构没使用处理器相关上下文切换技术,而是大部分通过软件实现。linux上下文切换就在schedule()函数里,很多地方都会调用这个函数。...*/ switch_to(prev, next, prev); return prev; } context_switch首先切换进程地址空间,这里面会对内核线程和普通进程线程做区别对待,在将要运行进程是内核线程时...,cputlb会进入懒惰模式,因为内核线程只需要在内核空间运行,它可以借用前一个进程mm,因为每个页表内核态部分都是一样,所以tlb进入懒惰模式可以避免页表cache刷新造成大量cache miss...切换完之后,如果next是用户态进程或线程也会返回到用户态陷入内核态时被打断地址继续执行。

1.1K30

深入理解Linux内核内核线程(下)

虽然讲解完了内核线程创建过程,但是似乎又少点什么,那么下面我们来看两个细节:内核线程执行处理函数和内核线程上下文切换细节: 7.内核线程执行处理函数细节 内核线程执行到处理函数要从fork说起: 7.1...8.内核线程上下文切换细节 现在来说下内核线程进行上下文切换技术细节: 8.1 关于mm_struct借用 我们知道内核线程比较特殊没有用户地址空间概念,共享内核地址空间,而mm_struct结构专门用来描述用户地址空间...我们只关注内核线程切换情况,从Ub->ka->kb->Ub切换过程中,都不需要切换地址空间。...用例1:linux系统中,当内存不足时,会唤醒kswapd内核线程来进行异步内存回收,下面我们来看他创建过程: mm/vmscan.c kswapd_init ->for_each_node_state...9.实践环节 前面我们分析了内核线程创建过程,也分析了很多源代码,最后我们来实战一下,来使用内核api来创建内核线程为我们服务(这里我们创建一个内核线程,然后每隔一秒打印一串字符 :I am kernel

2K30

Linux内核线程

线程通常被定义为一个进程中代码不同执行路线。从实现方式上划分,线程有两种类型:“用户级线程”和“内核线程”。...用户线程指不需要内核支持而在用户程序中实现线程,其不依赖于操作系统核心,应用进程利用线程库提供创建、同步、调度和管理线程函数来控制用户线程。...这种线程甚至在象 DOS 这样操作系统中也可实现,但线程调度需要用户程序完成,这有些类似 Windows 3.x 协作式多任务。另外一种则需要内核参与,由内核完成线程调度。...用户线程不需要额外内核开支 ,并且用户态线程实现方式可以被定制或修改以适应特殊应用要求,但是当一个线程因 I/O 而处于等待状态时,整个进程就会被调度程序切换为等待状态,其他线程得不到运行机会;...Windows NT和OS/2支持内核线程Linux 支持内核线程

4K00

深入理解Linux内核内核线程(上)

1.开场白 环境: 处理器架构:arm64 内核源码:linux-5.11 ubuntu版本:20.04.1 代码阅读工具:vim+ctags+cscope 在linux系统中, 我们接触最多莫过于用户空间任务...,像用户线程或用户进程,因为他们太活跃了,也太耀眼了以至于我们感受不到内核线程存在,但是内核线程却在背后默默地付出着,如内存回收,脏页回写,处理大量软中断等,如果没有内核线程那么linux世界是那么可怕...->active_mm 就不一定了,内核线程在每次进程切换时候都会借用前一个进程tsk->active_mm 赋值到自己tsk->active_mm 上,后面会讲到。...这里需要注意是,有一个内核线程很特殊,特殊到他tsk->active_mm 不是在进程切换时候被赋值而是静态初始化号,他就是上面的idle线程 .active_mm = &init_mm...3. kthreadd内核线程处理流程 上面我们介绍了kthreadd内核线程创建过程,接下来看一下kthreadd做了哪些事情: 代码路径为:kernel/kthread.c kthreadd函数中设置了线程名字和亲和性属性之后

2K20

Linux 内核】进程管理 ( 内核线程概念 | 内核线程、普通进程、用户线程 | 内核线程与普通进程区别 | 内核线程主要用途 | 内核线程创建函数 kernel_thread 源码 )

Linux 内核 启动线程 , 被称为 " 内核线程 " ; " 内核线程 " 是一种 特殊进程 , 独立运行在 " 内核空间 " , 其将 " 内核函数 " 委托给 独立进程 , 该 " 独立进程..." 与 其它进程 ( 包括 普通进程 , 内核自身 , 用户级线程 ) 并行执行 ; " 内核线程 " 也称为 " 守护进程 " ; 二、内核线程、普通进程、用户线程 ---- 在 【Linux 内核...】进程管理 ( 进程特殊形式 | 内核线程 | 用户线程 | C 标准库与 Linux 内核中进程相关概念 | Linux 查看进程命令及输出字段解析 ) 一、进程特殊形式 ( 内核线程 | 用户线程..., mm 指针指向空间就是 " 独立进程地址空间 " ; 在 Linux 内核 中 , " 进程控制块 " 是通过 task_struct 结构体 进行描述 ; Linux 内核中 , 所有 进程管理...*active_mm; 源码地址 : linux-5.6.18\include\linux\sched.h 四、内核线程主要用途 ---- 内核线程主要用途 : 内存同步 : 周期性执行如下同步操作 ,

3.6K20

优雅让一个类在线程安全和线程非安全切换

一个良好的多线程库,不应当一刀切全加锁。因为有些时候,虽然是多线程环境,但可能依照设计一个类只会被一个线程操作,这个时候加锁是多余,纯浪费性能,但另一些场景又需要它是线程安全。...假设有一个类X: class X { public:     void xoo(); }; 这里总结几个常见做法: 1.本身不加锁,由调用者来加锁,坏处是如果多数场景都是加锁,由会产生重复代码 class...,引用一个空锁类CNullLock,它仅提供锁接口,加锁和解锁函数体都是空: class CNullLock { public:     void lock()     {     }     void...unlock()     {     } }; 接下来看新X实现,需要将它变成一个模板类: template class X { public:     void xoo()     {        ...LockHelper lh(_lock); // 这里并不一定真是加锁     } }; 如果需要X是线程安全,可以这样使用: X x; 如果不需要X是线程安全,则可以如下使用: X x; 这样一个

36620
领券