Linux内核
文章平均质量分 94
学习路线+项目实战
简说Linux内核
这个作者很懒,什么都没留下…
展开
-
Linux内核源码分析(强烈推荐收藏!)
Linux内核是由林纳斯·托瓦兹(Linus Torvalds)在1991年开始开发的。当时他为了得到一个可以运行UNIX操作系统的个人计算机,开始编写一个操作系统内核,并将其命名为Linux。随后,越来越多的开发者加入到项目中,共同完善和扩展Linux内核。如今,Linux已经成为最流行和广泛使用的开源操作系统内核之一,驱动着许多不同类型的设备和服务器。原创 2024-01-11 15:04:12 · 2393 阅读 · 0 评论 -
程序员性能之道,从使用perf开始!
从2.6.31内核开始,Linux内核自带了一个性能分析工具perf,能够进行函数级与指令级的热点查找。通过它,应用程序可以利用 PMU,tracepoint 和内核中的特殊计数器来进行性能统计。它不但可以分析指定应用程序的性能问题 (per thread),也可以用来分析内核的性能问题,当然也可以同时分析应用代码和内核,从而全面理解应用程序中的性能瓶颈。Perf是内置于Linux内核源码树中的性能剖析(profiling)工具。它基于事件采样原理,以性能事件。原创 2023-06-30 21:42:45 · 1176 阅读 · 0 评论 -
牛客网论坛最具争议的Linux内核成神笔记,GitHub已下载量已过百万
Linux内核是一个操作系统(OS)内核,本质上定义为类Unix。它用于不同的操作系统,主要是以不同的Linux发行版的形式。Linux内核是第一个真正完整且突出的免费和开源软件示例。Linux 内核是第一个真正完整且突出的免费和开源软件示例,促使其广泛采用并得到了数千名开发人员的贡献。Linux 内核由芬兰赫尔辛基大学的学生 Linus Torvalds 于 1991 年创建。随着程序员调整其他自由软件项目的源代码以扩展内核的功能,它迅速取得了进展。原创 2023-06-09 20:36:47 · 797 阅读 · 1 评论 -
Linux内核阅读自学精简教程目录(必读)
学习Linux内核需要一定的计算机基础知识,包括操作系统,计算机网络等。以下是学习Linux内核的步骤:大部分程序员可能永远没有机会开发Linux内核或者驱动Linux,那么我们为什么还需要学习Linux内核呢?Linux的源代码和架构都是开放的,我们可以学到很多操作系统的概念和实现原理。Linux的设计哲学体系继承了UNIX,现在整个设计体系相当稳定和简化,这是大部分服务器使用Linux的重要原因。那学习Linux内核的原因就在于此。进一步了解内核的原理,有助于你更好地使用命令和程序设计,让你的面试和开发原创 2023-04-27 21:37:18 · 1086 阅读 · 1 评论 -
Linux内核网络协议栈套接字缓冲区原理
对于skb数据结构的其他操作主要放在skbuff.h文件中,主要有skb_reserve()、skb_put()、skb_push()、skb_pull()、skb_trim()等等,都是对skb的head、data、tail、end、len等字段进行操作。需要指出的是,内核编译之后,由某些选项所控制的数据结构是固定的而不是动态变化的。Alloc_skb()用来分配SKB,数据缓存区描述符是两个不同的实体,这就意味着,在分配一个SKB时,需要分配两块内存,一块是数据缓存区,一块是SKB描述符。原创 2023-02-24 22:16:59 · 683 阅读 · 0 评论 -
Linux内核的虚拟内存(MMU、页表结构)
如果不在,则意味着该虚存页面还没有被载入内存,这时MMU就会通知操作系统:发生了一个页面访问错误(页面错误),接下来系统会启动所谓的“请页”机制,即调用相应的系统操作函数,判断该虚拟地址是否为有效地址。如果是有效的地址,就从虚拟内存中将该地址指向的页面读入到内存中的一个空闲页框中,并在页表中添加上相对应的表项,最后处理器将从发生页面错误的地方重新开始运行;在映射工作中,为了记录程序段占用物理内存的情况,操作系统的内存管理模块需要建立一个表格,该表格以虚拟地址为索引,记录了程序段所占用的物理内存的物理地址。原创 2023-02-24 22:08:45 · 815 阅读 · 0 评论 -
Linux内核进程地址空间与进程内存布局
由于栈中数据严格的遵守FIFO的顺序,这个简单的设计意味着不必使用复杂的数据结构来追踪栈中的内容,只需要一个简单的指针指向栈的顶端即可,因此压栈(pushing)和退栈(popping)过程非常迅速、准确。内核空间中存放的是内核代码和数据,而进程的用户空间中存放的是用户程序的代码和数据。Linux使用两级保护机制:0级供内核使用,3级供用户程序使用,每个进程有各自的私有用户空间(0~3G),这个空间对系统中的其他进程是不可见的,最高的1GB字节虚拟内核空间则为所有进程以及内核所共享。原创 2023-02-24 22:24:25 · 1687 阅读 · 0 评论 -
玩转Linux内核进程调度,这一篇就够(所有的知识点)
其中 x19-x28 是 arm64 架构规定需要调用保存的寄存器,可以看到处理器状态切换的时候将前一个进程(prev)的 x19-x28,fp,sp,pc 保存到了进程描述符的 cpu_contex 中,然后将即将执行的进程 (next) 描述符的 cpu_contex 的 x19-x28,fp,sp,pc 恢复到相应寄存器中,而且将 next 进程的进程描述符 task_struct 地址存放在 sp_el0 中,用于通过 current 找到当前进程,这样就完成了处理器的状态切换。原创 2023-02-25 21:53:23 · 2422 阅读 · 0 评论 -
Linux内核内存相关问题,这一篇让你彻底了解
直接内存访问是一种硬件机制,它允许外围设备和主内存之间直接传输它们的 I/O 数据,而不需要系统处理器的参与2) DMA 控制器的功能能向 CPU 发出系统保持(HOLD)信号,提出总线接管请求当 CPU 发出允许接管信号后,负责对总线的控制,进入 DMA 方式能对存储器寻址及能修改地址指针,实现对内存的读写操作能决定本次 DMA 传送的字节数,判断 DMA 传送是否结束发出 DMA 结束信号,使 CPU 恢复正常工作状态。原创 2023-02-25 21:44:39 · 755 阅读 · 0 评论 -
一文搞懂Linux内核进程CPU调度基本原理
对于操作系统中的任务是不同的,例如,系统进程和用户进程、前台进程和后台进程,如果不加以区分,那么系统中关键的任务无法及时处理,后台运算导致视频播放卡顿,所以基于此,重要的任务需要被优先调度,就产生了优先级的概念。依据进程进入就绪队列的先后顺序排列,进程进入等待或者结束状态时,就绪队列中的下一个进程占用CPU,3个进程,计算时间分别为12,3,3,FCFS算法的周转时间,根据任务到达的顺序不同,周转时间不同。知道了进程的分类,那就可以知道哪些场景需要调度来协调,如IO消耗性的,例如磁盘,打印机,网络等场景。原创 2023-02-18 15:51:10 · 953 阅读 · 0 评论 -
一文让你彻底了解Linux内核文件系统
这个时候就需要用到块组,数据结构为ext4_group_desc,这里面对于一个块组里的inode位图bg_inode_bitmap_lo、块位图bg_block_bitmap_lo、inode列表bg_inode_table_lo,都有相应的成员变量。如果在写的逻辑__generic_file_write_iter里面,发现设置了IOCB_DIRECT,则调用generic_file_direct_write,里面同样会调用address_space的direct_IO的函数,将数据直接写入硬盘。原创 2023-02-25 20:39:41 · 880 阅读 · 0 评论 -
QEMU调试Linux内核环境搭建
一个最小可运行Linux操作系统需要内核镜像bzImage和rootfs,本文整理了其制作、安装过程,调试命令,以及如何添加共享磁盘。原创 2023-03-16 16:03:22 · 889 阅读 · 0 评论 -
Linux内核进程上下文的切换
进程管理中最重要的一步要进行进程上下文切换,其中主要有两大步骤:地址空间切换和处理器状态切换(硬件上下文切换),前者保证了进程回到用户空间之后能够访问到自己的指令和数据(其中包括减小tlb清空的ASID机制),后者保证了进程内核栈和执行流的切换,会将当前进程的硬件上下文保存在进程所管理的一块内存,然后将即将执行的进程的硬件上下文从内存中恢复到寄存器,有了这两步的切换过程保证了进程运行的有条不紊,当然切换的过程是在内核空间完成,这对于进程来说是透明的。原创 2023-02-25 20:21:35 · 744 阅读 · 0 评论 -
Linux内核段页式内存管理技术
内存是通过指针寻址的,因而CPU的字长决定了CPU所能管理的地址空间的大小,该地址空间就被称为虚拟地址空间,因此32位CPU的虚拟地址空间大小为4G,这和实际的物理内存数量无关。一部分是用户进程可用的,这部分地址是地址空间的低地址部分,从0到TASK_SIZE,称为用户空间一部分是由内核保留使用的,这部分地址是地址空间的高地址部分,从KERNELBASE到结束,称为内核空间KERNELBASE:内核虚拟地址空间的起始地址,一般和PAGE_OFFSET相同,但是也可能不同。原创 2023-02-24 22:20:04 · 749 阅读 · 0 评论 -
Linux内核CPU可运行进程队列的负载均衡
提到负载,我们首先会想到命令uptime或者top命令输出系统的平均负载(load average),例如uptime的输出结果uptimeload average的三个值分别代表过去1分钟、5分钟、15分钟的系统平均负载,这三个值实际上来自于 /proc/loadavg, Linux的系统平均负载是系统中处于 runnable 与 uninterruptible 两个状态的任务总数与CPU数量的比值。CPU负载(cpu load)指的是某个时间点进程对系统产生的压力。原创 2023-02-18 16:00:51 · 1561 阅读 · 0 评论