Linux内核
文章平均质量分 73
# Linux内核
lucky tiger
要一直前进,一直静下心来学习。
展开
-
内存虚拟化
1、实地址是没有内存保护的,一个程序可以访问整个1M的地址空间2、最开始的8086地址线有20根数据总线最大宽度是16,正常只能寻址2^16,后面的实模式下的逻辑地址的计算都是基地址加偏移地址来算,深度探索linux系统虚拟化这本书里写了最开始是搞了四个段寄存器 cs ds es ss,个人理解就是最开始你可以选哪个段,物理地址被分成了几段,然后每一段你都可以去寻1M的地址。不过后续都是平坦内存模型了已经不用上面这个了什么是平坦内存模型呢?郭健: Linux内存模型——平坦、非连续与稀疏_L原创 2022-03-20 22:46:42 · 589 阅读 · 0 评论 -
KASLR内核地址随机化
1、内核启动时进入实模式,实模式下初始化一些内核需要的环境然后进入到start开始进入保护模式,保护模式这边才会涉及到kaslr,也就是对于vmlinux的一个随机化,vmlinux是真正的内核elf文件2、实模式寻址方式是段寄存16位段地址和偏移地址的一个计算。保护模式是上面的段寄存器到GDT的一个操作,然后GDT通过mmm到实际的一个物理地址。...原创 2021-11-13 17:56:16 · 838 阅读 · 0 评论 -
Linux 安全缓解机制总结
Linux 安全缓解机制总结_panhewu9919的博客-CSDN博客学习资料: kernel-security-learning linux-kernel-defence-map A Decade of Linux Kernel Vulnerabilities, their Mitigation and Open Problems-2017 The State of Kernel Self Protection-2018 PaX/Grsecurity...转载 2021-09-12 16:40:24 · 1804 阅读 · 0 评论 -
KSPP内核自防护
什么是内核自防护?就是要解决linux内核自身的安全缺陷,你可以提交一整个类型的bug,阻止漏洞利用、检测攻击。内核自防护是针对 Linux 内核对抗自身的安全缺陷的设计与实现。这个领域涉足广泛的问题,包括干掉一整个类型的 bug,阻止漏洞利用的方法和积极的检测攻击行为。这篇文档不讨论所有的议题,但这篇文档是整个内核自防护项目的一个起点和回答一些常见的问题。(欢迎提交补丁)在最糟糕的场景下,我们假设一名没有权限的本地攻击者拥有对内核内存任意读写访问的能力。在很多情况下,被利用的 bug 不会提供转载 2021-09-12 21:57:12 · 848 阅读 · 0 评论 -
Hypervisor
Hypervisor,又称虚拟机监视器(英语:virtual machine monitor,缩写为 VMM)一种运行在基础物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享硬件。也可叫做VMM( virtual machine monitor ),即虚拟机监视器。Hypervisors是一种在虚拟环境中的“元”操作系统。他们可以访问服务器上包括磁盘和内存在内的所有物理设备。Hypervisors不但协调着这些硬件资源的访问,也同时在各个虚拟机之间施加防护。当服务器启动并执行转载 2021-08-24 08:09:16 · 1567 阅读 · 0 评论 -
linux内核调度学习——负载均衡
SMP:对称多处理器Symmetric Multi Processing),对称多处理系统内有许多紧耦合多处理器,在这样的系统中,所有的CPU共享全部资源,如总线,内存和I/O系统等,操作系统或管理数据库的复本只有一个,这种系统有一个最大的特点就是共享所有资源。多个CPU之间没有区别,平等地访问内存、外设、一个操作系统。操作系统管理着一个队列,每个处理器依次处理队列中的进程。如果两个处理器同时请求访问一个资源(例如同一段内存地址),由硬件、软件的锁机制去解决资源争用问题NUMA:非一致存储访问结构原创 2021-07-21 22:40:57 · 248 阅读 · 0 评论 -
进程与CPU之间的绑定关系
1、多核CPU结构中每个核心都有各自的L1、L2缓存,而L3缓存是共用的2、CPU缓存是什么?缓存就是数据交换的缓冲区(称作Cache)。缓存往往都是RAM(断电即掉的非永久储存),它们的作用就是帮助硬件更快地响应。CPU缓存的定义为CPU与内存之间的临时数据交换器,它的出现是为了解决CPU运行处理速度与内存读写速度不匹配的矛盾——缓存的速度比内存的速度快多了。CPU缓存一般直接跟CPU芯片集成或位于主板总线互连的独立芯片上。(现阶段的CPU缓存一般直接集成在CPU上)CPU往往需要重复处理相同转载 2021-06-16 21:58:32 · 1338 阅读 · 0 评论 -
远程过程调用(RPC)学习
分布式框架:IPC进程间通信,RPC就是远程的进程之间的通信RPC(Remote Procedure Call)远程过程调用,简单的理解是一个节点请求另一个节点提供的服务本地过程调用:如果需要将本地student对象的age+1,可以实现一个addAge()方法,将student对象传入,对年龄进行更新之后返回即可,本地方法调用的函数体通过函数指针来指定。远程过程调用:上述操作的过程中,如果addAge()这个方法在服务端,执行函数的函数体在远程机器上,如何告诉机器需要调用这个方法呢?首原创 2021-06-15 23:31:52 · 288 阅读 · 0 评论 -
IO多路复用——epoll
1. select 调用需要传入 fd 数组,需要拷贝一份到内核,高并发场景下这样的拷贝消耗的资源是惊人的。(可优化为不复制)2. select 在内核层仍然是通过遍历的方式检查文件描述符的就绪状态,是个同步过程,只不过无系统调用切换上下文的开销。(内核层可优化为异步事件通知)3. select 仅仅返回可读文件描述符的个数,具体哪个可读还是要用户自己遍历。(可优化为只返回给用户就绪的文件描述符,无需用户做无效的遍历)所以 epoll 主要就是针对这三点进行了改进。1. 内核中保存一份文件描原创 2021-06-13 22:24:48 · 218 阅读 · 0 评论 -
IO多路复用
1、阻塞IO服务器端:bind listen创建套接字bind绑定文件描述符和服务器的ip和端口号listen监听原创 2021-06-13 15:04:54 · 127 阅读 · 0 评论 -
超级块
每一种文件系统都对应自己的超级块 Inode 数据块这三种块inode块(读写权限、数据块的位置)数据块(数据)除了上面这两个数据块,还有一个超级块。超级块指的是文件系统的第一个块,存放文件系统本身的结构信息。超级块的对象除了提供文件系统的关键信息(块长度、最大文件长度等),超级块还包含了读、写操作inode的函数指针。内核建立了一个链表包含所有活动文件系统的超级块实例,之所以使用活动这个术语替代已装载,是因为在某些环境中,有可能使用一个超级块对应几个装载点。(块设备上的一个文件系.原创 2021-04-20 22:13:14 · 5562 阅读 · 0 评论 -
虚拟文件系统——(sys)
虚拟文件系统概念虚拟文件系统:为了支持各种本机文件系统,且在同时允许访问其它操作系统文件,Linux内核在用户进程(或者说C标准库)和文件系统之间引入了一个抽象层,也就是虚拟文件系统VFS虚拟文件系统类型1、基于磁盘的文件系统ext2/3 FAT所有文件系统都使用面向块的介质,这里对底层块设备通信方法不感兴趣,内核中的驱动程序对此提供了统一的接口。从文件系统角度看,底层设备无非是存储块组成的一个列表,文件系统相当于对该列表实施一个适当的组织方案。2、虚拟文件系统(一种伪文件系统)pr原创 2021-04-15 15:47:37 · 1316 阅读 · 1 评论 -
深入linux内核架构1.3.14——Kernel设备模型基础框架kobject
内核中很多地方都需要跟踪记录C语言中结构的实例(借鉴C++对象,内核里面有许多的结构体实例化),尽管这些对象的用法大不相同,但各个不同子系统的某些操作非常相似,例如引用计数,这导致了代码复制。在内核版本2.5开发期间,内核采用了一般性的内核方法来管理内核对象,所引入的框架并不只是为了防止代码复制,同时也为内核不同部分管理的对象提供了一致的视图,在内核的许多部分可以有效地使用相关信息,如电源管理。一般性内核对象机制可用于执行下列对象操作:引用计数 管理对象链表(集合) 集合加锁 将对象属性导原创 2021-04-08 22:30:47 · 338 阅读 · 0 评论 -
块设备驱动之——request_queue, request, bio(二)
bio 代表一个IO 请求request 是bio 提交给IO调度器产生的数据,一个request 中放着顺序排列的bio当设备提交bio 给IO调度器时,IO调度器可能会插入bio,或者生成新的requestrequest_queue代表着一个物理设备,顺序的放着request1、请求处理每个块设备驱动程序的核心是它的请求函数。实际的工作如设备的启动都是在这个函数里完成的。request函数:void request(request_queue_t *queue);req.原创 2021-04-08 12:21:43 · 973 阅读 · 0 评论 -
Linux--IO总结
1.IO概述分析一下写操作:char *buf = malloc(MAX_BUF_SIZE);strncpy(buf, src, , MAX_BUF_SIZE);fwrite(buf, MAX_BUF_SIZE, 1, fp);fclose(fp);以下图为例:分析数据流写入硬盘的过程malloc的buf对于图层中的application buffer,即应用程序的buffer;调用fwrite后,把数据从application buffer 拷贝到了 CLib buff转载 2021-03-25 19:28:33 · 263 阅读 · 0 评论 -
Linux内核定时器
经典定时器:内核最初版本提供,典型分辨率为4ms,但实际取决于计算机时钟中断运行的频率,也叫做低分辨率定时器或时间轮定时器。但是对于面向媒体的应用,几毫秒的定时器分辨率不够用。新的硬件提供了更加精确的计时手段,内核2.6,添加了一个额外的定时器子系统,可以利用高精度定时器资源(也就是新的硬件带来的),通常称为高分辨率定时器。超时类定时器:表示将在一定时间之后发生的事件,但可以且通常都会在发生之前取消。比如网络子系统等待在一定时间内即将到达的分组,设置一个超时定时器,在预定的时间期限结束时到期,由原创 2021-02-08 21:10:23 · 1058 阅读 · 1 评论 -
linux系统的中断机制
中断不能嵌套1、中断过程当前状态会保存在栈上,嵌套会导致栈溢出2、中断应该越快越好,嵌套会导致时间变长对于耗时中断1、分为上半部 下半部上半部分一般为硬件中断按键 网卡中断也就是把整个耗时间的中断分成紧急的上半部分不可以被打断,和不是很重要的下半部分可以被打断。实际实现过程就是把下半部分设置成软件中断2、用内核线程处理中断...原创 2021-02-04 11:33:52 · 389 阅读 · 0 评论 -
【Linux函数】——copy_to_user()和copy_from_user()
copy_to_user()和copy_from_user()由于内核空间与用户空间的内存不能直接互访,因此借助函数 copy_from_user()完成用户空间到内核空间的复制,函数copy_to_user()完成内核空间到用户空间的复制。copy_from_user()和 copy_to_user()的原型如下所示: unsigned long copy_from_user(void *to, const void __user *from, unsigned long原创 2021-02-03 22:13:18 · 832 阅读 · 0 评论 -
字符驱动开发之韦东山视频学习4——APP读取按键值之中断的四种方式
APP 读取按键的 4 种方法① 查询方式② 休眠-唤醒方式③ poll 方式④ 异步通知方式第 2、 3、 4 种方法,都涉及中断服务程序。1、查询方式驱动程序中构造、注册一个 file_operations 结构体,里面提供有对应的 open,read 函数。APP 调用 open 时,导致驱动中对应的 open 函数被调用,在里面配置 GPIO 为输入引脚。APP 调用 read 时,导致驱动中对应的 read 函数被调用,它读取寄存器,把引脚状态直接返回给 APP。.原创 2021-02-03 21:12:42 · 299 阅读 · 0 评论 -
【Linux函数】——Signal 函数
signal设置对某一信号对应动作,signal机制可以被理解成进程的软中断SYNOPSIS #include <signal.h> typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler);DESCRIPTION The behavior of signal() varies across UNIX vers...原创 2021-02-03 20:51:20 · 860 阅读 · 0 评论 -
字符驱动开发之韦东山视频学习3——设备树文件LED模板驱动程序
1、三种驱动模板第一种在修改的时候需要阅读整个文件,后面是吧硬件资源和驱动分离开来,对platform_device plat_driver这两个结构体匹配,然后调用probe函数。第二种在修改的时候需要重新编译加载驱动程序,第三种引入设备树直接加载到设备树里面。DTS DTB(二进制文件)到内核生成platform_device2、实际匹配过程platform_driver里面有of_match_table函数这个结构体里面会对应compatible实现匹配3、匹配成功...原创 2021-02-03 19:07:14 · 221 阅读 · 0 评论 -
字符驱动开发之韦东山视频学习3——设备树文件
内核对于设备树文件,会把他的每一个节点都构造出一个device_node,对于某些个device_node会构造出platform_device,这些platform_device跟platform_driver匹配,回到前面的DEV DRV匹配内核在处理设备树解析时,会先处理根节点(链表头)内核在处理设备树文件每一个节点都会转换为device_node但不是每一个都可以生成platform_device比如下面这个i2c可以对他的子节点都转换为一个结构体直接调用哪些设...原创 2021-02-01 23:00:48 · 182 阅读 · 0 评论 -
字符驱动开发之韦东山视频学习2——总线设备驱动模型实际代码模板
加载顺序leddrv.c+board_A_led.c+chip_demo_gpio.c上层然后设备然后驱动实际代码:上层leddrv.c:#include <linux/module.h>#include <linux/fs.h>#include <linux/errno.h>#include <linux/miscdevice.h>#include <linux/kernel.h>#include <lin原创 2021-02-01 13:08:31 · 154 阅读 · 0 评论 -
字符驱动开发之韦东山视频学习2——总线设备驱动模型probe补充
驱动注册的probe函数probe函数在设备驱动注册最后收尾工作,当设备的device 和其对应的driver 在总线上完成配对之后,系统就调用 platform设备的probe函数完成驱动注册最后工作。资源、 中断调用函数以及其他相关工作。下面是probe被调用的一些程序流程。从driver_register看起: int driver_register(struct device_driver * drv) { klist_init(&drv->..转载 2021-01-31 22:00:22 · 206 阅读 · 0 评论 -
字符驱动开发之韦东山视频学习2——总线设备驱动模型
1、设备和驱动程序是怎么匹配起来的:原创 2021-01-29 22:18:11 · 359 阅读 · 0 评论 -
字符驱动开发之韦东山视频学习2——LED驱动框架的编写
1、普通驱动编写,一般实际操作简单的就可以直接填空,操作的最关键的地方就是init和read write ioctrl。比如字符驱动我如果需要读取外部数据或者写入直接修改自己定义的read write,这是你自己修改的最关键的地方,在init里ioremap然后操作虚拟地址读写。在你入口init函数里面通过register_chardev()和设备号注册,把fileoperation告诉内核,fileoperation里面是实例化的你自己写的read write ioctrl等,虽然很关键,但实际写原创 2021-01-29 17:17:21 · 394 阅读 · 1 评论 -
BIOS和BootLoader uboot
BIOSBIOS是英文"Basic Input Output System"的缩略语,直译过来后中文名称就是"基本输入输出系统"。其实,它是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、系统设置信息、开机后自检程序和系统自启动程序。 其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。BIOS,Basic Input Output System 基本输入输出系统,意思是主板级别的一个小系统。负责系统(主要是主板)的硬件初始化,例如CPU,内存,硬盘,原创 2021-01-22 15:59:49 · 1048 阅读 · 1 评论 -
不同位数下的指针大小的一些思考
1、一个之前觉得好玩的东西,现在回过来看更好玩,记住:这里面有一个寻址位数的东西决定了指针的大小。32位系统,CPU有32根地址总线,逻辑寻址位数是32,指针大小就是4B,4个字节。(补充一下:之前也研究过这个东西32位系统只能最大带的动4G的运行内存,超过了就没办法寻址了,这个是最明显的)(win下与操作系统是这样很正常很简单的来寻址的,但是intel X86用的是内存映射,你的32位操作系统给的4G虚拟内存还要去映射BIOS ROM RAM实际与4G内存条映射的是不到4G的,有点像手机操作系原创 2021-01-16 22:41:14 · 537 阅读 · 0 评论 -
磁盘调度算法
电梯算法主要用于磁盘寻道的优化。第一种是我们最为原始的先到先服务(first come first served)的算法,这个对于我们去下馆子撮一顿比较合适,先来就先吃,不然顾客有意见。不过对于磁盘寻道就不太合适了。如下图:注意这张图并不是解释的先到先服务算法,我们只是借用下而已 :)假设此时我们正在第11道读取数据,然后陆陆续续有其他进程来要求我们提供磁盘内容给他们。这里我们把要读取的柱面(如果你并不是研究磁盘寻道,那么这个词你可以理解为数据块,就是上面的小方块)按照进程提出要求的顺序记录转载 2020-12-03 20:15:19 · 261 阅读 · 0 评论 -
硬盘基本知识(磁头、磁道、扇区、柱面)
1、硬盘中一般会有多个盘片组成,每个盘片包含两个面,每个盘面都对应地有一个读/写磁头。受到硬盘整体体积和生产成本的限制,盘片数量都受到限制,一般都在5片以内。盘片的编号自下向上从0开始,如最下边的盘片有0面和1面,再上一个盘片就编号为2面和3面。下图显示的是一个盘面,盘面中一圈圈灰色同心圆为一条条磁道,从圆心向外画直线,可以将磁道划分为若干个弧段,每个磁道上一个弧段被称之为一个扇区(图践绿色部分)。扇区是磁盘的最小组成单元,通常是512字节。(由于不断提高磁盘的大小,部分厂商设定每个扇.转载 2020-08-19 10:43:38 · 3543 阅读 · 0 评论 -
fork()之 —— 一次调用,两次执行
1、进程在内存中有三部分数据:代码段 堆栈段 数据段代码段在我fork()后是共享的但是堆栈段我就需要去初始化我自己的 #include <unistd.h> #include <stdio.h> int main () {原创 2020-12-03 11:22:17 · 443 阅读 · 0 评论 -
内核管理之——slub分配器
这篇链接说的很好:https://blog.csdn.net/lukuen/article/details/6935068简单来说:一开始伙伴算法申请一块内存块slab分成多个对象,放在营业厅kmem_cache_cpu里面用光了再伙伴申请,上面的slab放到仓库kmem_cache_node里面如果有空的slab则释放这个slab《Linux内核设计与实现》的作者Robert Love提到任何情况下都应该使用SLUB,除非是嵌入式平台,并且应当在评估完性能之后再考虑使用SLUB还是原创 2020-12-02 20:39:29 · 185 阅读 · 0 评论 -
linux内核管理之——伙伴算法
1、页、页面、页框这三个要先搞清楚这个图里面的小框框虚拟地址的叫页,页面物理地址的叫做框 页框 块。虚拟地址(页面) -------------------- 页表 ------------------- 物理地址(页框)页和页面是一个东西(一般是4K)一个4G的虚拟地址空间,每个页大小4K,1M个页,也就是10^6个页,10^3*10^3,1024*10...原创 2020-11-13 16:50:49 · 751 阅读 · 0 评论 -
linux微内核(鸿蒙分析)
1、最近鸿蒙炒的火热,19年就说ipc是谷歌fu的5倍,但他当时没有对比宏内核,正常宏内核的ipc效率肯定很高,我自己觉得微内核确实是体积小了但是外面的那些驱动什么的又需要开发者去开发,鸿蒙独立了跑到国外谷歌全家桶又是一个不可逾越的鸿沟。个人比较喜欢鸿蒙的一些东西,但是取代安卓是不可能的的,不过打破垄断全新开源,重新定义5G万物互联时代,还是开了眼的。2、相对与安卓来说全场景、分布式是鸿蒙OS2.0的最大优势,鸿蒙OS2.0首先在分布式能力上经行了提升分布式软总线、分布式数据管理、并提升了分布式安全原创 2020-11-11 11:37:10 · 7737 阅读 · 1 评论 -
linux的第一个任务(进程)
Linux下有3个特殊的进程,idle进程(PID = 0), init进程(PID = 1)和kthreadd(PID = 2)任务0,0号进程开天辟地的idle进程其pid=0,其前身是系统创建的第一个进程,也是唯一一个没有通过fork或者kernel_thread产生的进程。完成加载系统后,演变为进程调度、交换init进程由idle通过kernel_thread创建,在内核空间完成初始化后, 加载init程序, 并最终用户空间由0进程创建,完成系统的初始化. 是系统中所有其它用户进程.原创 2020-10-13 16:29:03 · 949 阅读 · 1 评论 -
进程上下文和中断上下文
linux0.11系统共使用了四种堆栈一种是系统初始化时临时使用的堆栈一种是供内核程序自己使用的堆栈(内核堆栈),只有一个位于系统地址空间固定的位置,也是后来任务0的用户态堆栈。一种是每个任务通过系统调用,执行内核程序时使用的堆栈,我们称之为任务的内核态堆栈,每个任务都有自己独立的内核态堆栈。一种是任务在用户态执行的堆栈,位于任务(进程)地址空间的末端,称为用户态堆栈。任务的堆栈每个任务都有自己的内核态堆栈,与每个任务的任务数据结构(task_struct)放在同一页中.这是在建原创 2020-10-13 15:22:12 · 207 阅读 · 0 评论 -
进程控制块PCB--------------task_struct
task_struct包含哪些信息:每个进程在内核中都有⼀个进程控制块(PCB)来维护进程相关的信息,Linux内核的进程控制块是task_struct结构体。task_struct是Linux内核的⼀种数据结构,它会被装载到RAM⾥并且包含着进程的信息。每个进程都把它的信息放在 task_struct 这个数据结构⾥,并且可以在 include/linux/sched.h ⾥找到它。所有运⾏在系统⾥的进程都以 task_struct 链表的形式存在内核⾥。<这里我在想不考虑高端内存的话用原创 2020-09-15 09:48:18 · 365 阅读 · 0 评论 -
linux内存管理之高端内存
用户0-3G内核3-4G所谓用户和内核对于CPU来说只是运行的级别不一样,是否处于特权级不管用户还是内核最终都是要通过MMU映射到你的物理上的896M内存对于任何用户进程,0~3G的映射都是不同的,但是所有用户进程3~4G的映射都是相同的高端内存引入原因在于:如果你的物理内存是1G那刚好映射当你的物理内存大于1G时,为了访问到所有的物理内存引入了高端内存,建立一个临时映射表去访问其它地方的内存用完了就释放掉。...原创 2020-08-31 20:30:18 · 300 阅读 · 0 评论 -
页高速缓存
页高速缓存是一种软件机制,它允许系统把通常存放在磁盘上的一些数据保存在RAM中,以便对那些数据的进一步访问不用再访问磁盘而能尽快的到满足。因为对同一磁盘数据的反复访问频繁发生,所以磁盘高速缓存对系统性能至关重要。页高速缓存:一种对完整的数据页进行操作的磁盘高速缓存页高速缓存(page cache),是linux内核所使用的主要磁盘高速缓存。在绝大多数情况下,内核在读写磁盘时都引用页高速缓存。新页被追加到页高速缓存以满足用户态进程的读请求如果页不在高速缓存中,新页就被追加到高速缓存中,然后用从原创 2020-08-28 10:47:26 · 1102 阅读 · 0 评论 -
CFS----------------完全公平调度算法
1、调度器是一个操作系统的核心部分。可以比作是CPU时间的管理员。调度器主要负责选择某些就绪的进程来执行。不同的调度器根据不同的方法挑选出最适合运行的进程。目前Linux支持的调度器就有RT scheduler、Deadline scheduler、CFS scheduler及Idle scheduler等。普通进程的优先级CFS是Completely Fair Scheduler简称,即完全公平调度器。CFS的设计理念是在真实硬件上实现理想的、精确的多任务CPU。CFS调度器和以往的调度器不同原创 2020-08-26 10:08:31 · 4098 阅读 · 1 评论