操作系统实验之编写内核 1.1 实验目的 学习和掌握Linux内核编译过程 1.2 实验内容 完成Linux内核编译过程 1.3 实验步骤 实验步骤如下: 1.将U盘挂载到redhat虚拟机如图3- 2.4.22.tar.gz /usr/src并cd /usr/src进入/usr/src路径如图3-7. 7.解压缩这个文件tar xzvf linux*22*并ls查看是否解压成功如图3-8至如图3-9. 8.输入cd *22并输入ls查看如图3-10. 9.输入vi Makefile查看文件源码如图3-11至如图3-12. 10.U盘使用完毕,输入 umount /dev/sdb1如图3-13. 11 3-36. 20.输入cat /proc/version显示为2.4.22版本如图3-37. 1.4 实验过程 图3-1 图3-2 图3-3 图3-4 图3-5 图3-6 图3-7 图3-8 图3-9 在编写内核重启时未命名自己的名字而重新又做了一遍,所以在使用reboot指令在选择内核页面会出现3个内核,在使用make modules编译内核模块以及make modules_install安装内核花了大量时间
1、内核分类 内核(Kernel)在计算机科学中是操作系统最基本的部分,主要负责管理系统资源。 中文版维基百科上将内核分为四大类: 单内核(宏内核); 微内核; 混合内核; 外内核。 这些非常模块化的用户态服务器用于完成操作系统中比较高级的操作,这样的设计使内核中最核心的部分的设计更简单。 然而后来的实验证明,纯微内核的系统实际上也可以是高效率的。大多数现代操作系统遵循这种设计范畴,微软公司开发的Windows操作系统就是一个很好的例子。 外内核 外内核系统,也被称为纵向结构操作系统,是一种比较极端的设计方法。 “老一点的操作系统都是宏内核的,也就是说,整个操作系统是一个运行在核心态的单独的a.out文件, 这个二进制文件包含进程管理,内存管理,文件系统以及其他。
环境 rockylinux 9.2 安装步骤 查看系统现在内核版本 # uname -r 5.14.0-284.11.1.el9_2.x86_64 下载需要的内核版本 网站:http://mirrors.coreix.net _64.rpm 安装内核 # dnf localinstall kernel-lt-modules-6.1.80-1.el9.elrepo.x86_64.rpm kernel-lt-core-6.1.80 -1.el9.elrepo.x86_64.rpm kernel-lt-6.1.80-1.el9.elrepo.x86_64.rpm 设置系统默认内核版本 查看系统中所有的内核 # grubby --info 1.el9.elrepo.x86_64 设置默认内核索引 # grubby --set-default 0 如果第2步查看现在系统默认版本就是新装的版本这一步就不需要执行(执行了也没问题) 最后重启系统查看内核版本 # uname -r 6.1.80-1.el9.elrepo.x86_64 升级内核完成
最近逛开源社区,发现一个开源项目 flash-linux0.11-talk 把学习操作系统源码,写成了一部小说,把内核当小说看,挺爽的。 简介 品读 Linux 0.11 核心代码这个开源项目,作者以写小说的方式进行介绍操作系统核心代码,深入浅出的介绍了操作系统是怎样写出来的。 部分章节标题: 大纲 项目主要分为6大模块: 第一部分:进入内核前的苦力活 第二部分:大战前期的初始化工作 第三部分:一个新进程的诞生 第四部分:shell 程序的到来 第五部分:从一个命令的执行看操作系统各模块的运作 第六部分:操作系统哲学与思想 细节 该开源项目每章的内容都写的简洁明了,就比如第一回,写到的就两行代码: mov ax,0x07c0 mov ds,ax 图文并茂的讲解了具体是什么意思 可见作者是很用心的讲解操作系统源码 小结 想想我们看小说的时候是不是很爽,看这个开源项目也是一样,作者也是想要像写小说一样的把操作系统源码,生动有趣的展现给我们。快看起来像刷小说一样,一口气刷完它。
操作系统实验之编写内核模块 1.1 实验目的 学习和掌握模块加载机制,增加新的内核功能 1.2 实验内容 完成增加新的内核功能 1.3 实验步骤 实验步骤: 1.用记事本打开xxx.c按照实验五PPT . 3.输入命令insmod xxx.o加载这个模块如图5-5. 4.输入命令lsmod查看系统中所有的模块如图5-6至图5-7. 5.输入命令dmesg看系统日志(最后一行)如图5-8至图5-9. 卸载模块并再次输入命令dmesg看系统日志如图5-10至图5-11. 1.4 实验过程 图5-1 图5-2 图5-3 图5-4 图5-5 图5-6 图5-7 图5-8 图5-9 图5-10 图5-11 1.5 心得体会 通过此次实验,我成功编写了操作系统的内核模块,因在核心态下运行故采用printk()函数,输入insmod加载此模块,结果显示loaded表示加载成功,使用 dmesg分别成功查看在自己添加内核模块后的系统日志,这次实验相比实验3和实验4显得较为简单但需有耐心,比如自己在操作规程中应该输入lsmod结果输入lsmode显示错误以及编译时gcc -c -I…这里的大写
limits.conf,添加如下内容(100000替换为自己想要的值) * hard nofile 100000 * soft nofile 100000 编辑文件/etc/sysctl.conf中的相关内核参数 接受缓存区预留内存最大值 默认值 128k # # net.unix.max_dgram_qlen 进程间通信发送数据, 默认10 # # net.ipv4.tcp_syncookies 只有在内核编译选择
文章目录 一、操作系统需要满足的要素 二、宏内核 三、微内核 四、Linux 内核动态加载机制 一、操作系统需要满足的要素 ---- 电脑上运行的 操作系统 , 是一个 软件 ; 设备管理 : 操作系统需要 为 用户 和 应用程序 管理并分配电脑的 硬件资源 , 如 CPU , 磁盘 , 内存 , 网络 等 ; 开发环境 : 操作系统 要为 应用程序 开发 提供配套环境 ; 执行环境 : 操作系统 要为 应用程序 执行 提供配套环境 ; 虚拟性支持 : 支持多进程 , 每个运行的应用程序进程 , 都可以感觉到有专门的处理器提供系统服务 ; 并发性支持 : 操作系统需要有 执行多个线程的能力 , 线程是独立运行 , 独立调度的最基本单位 ; 二、宏内核 ---- 宏内核 : 内核代码 编译成 二进制文件 , 内核 运行在 一个 大内核 地址空间 中 , 可以 直接 访问 , 调用 内核代码 - 微内核 : 将 操作系统 拆分成 多个 独立功能模块 , 这些 独立功能模块 之间通过 " 消息 " 进行通信 , 微内核 效率低 ; 下图中 , 进程 , 文件系统 , 设备驱动 , 与 微内核
微内核操作系统 微内核操作系统,即实现了一个可在其上构建通用 OS 的基础内核,该内核程序运行在核心态,开机常驻内存。 当前微内核操作系统结构仍没有一致公认的定义,但可从以下4方面进行描述: 足够小的内核:微内核并非一个完整的OS。 与此同时,也必然改善系统的灵活性,不仅可在操作系统中增加新的功能,还可修改原有功能,以及删除已过时的功能,以形成一个更为精干有效的操作系统。 3) 可移植强 在微内核结构的操作系统中,所有与特定CPU和I/O设备硬件有关的代码,均放在内核和内核下面的硬件隐藏层中,而操作系统其它绝大部分(即各种服务器)均与硬件平台无关,因而,把操作系统移植到另一个计算机硬件平台上所需作的修改是比较小的 缺点 效率相对较低: 在微内核OS中,由于采用了非常小的内核,以及客户/服务器模式和消息传递机制,这些虽给微内核OS带来了许多优点,但由此也使微内核OS存在着潜在的缺点。
随着 Debian 8 进入 old stable 分支,Debian 9 开始成为了新的稳定版,不过随之而来的是锐速开心版的内核匹配问题。 不过感谢 Vicer 大佬的及时更新,现在 Debian 9 也可以手动更换内核来安装锐速了。 具体来说 Debian 9 上匹配锐速的内核是 4.9.0-4-amd64,下面我们就来手动更换内核安装锐速。 1.下载内核到 VPS: wget http://security.debian.org/debian-security/pool/updates/main/l/linux/linux-image-4.9.0 -4-amd64_4.9.65-3+deb9u1_amd64.deb 2.安装内核: dpkg -i linux-image-4.9.0-4-amd64_4.9.65-3+deb9u1_amd64.deb
1.2 内核程序 在操作系统中,我们可以将其按照功能划分成两部分:内核功能与非内核功能。 ,而这些程序就位于操作系统的内核中。 当我们要运行这些内核程序时,就需要CPU处于内核态。 按照操作系统的内核架构,我们又可以将其进一步划分为:宏内核和微内核。 三、微内核 随着体系结构和应用需求的不断发展,需要操作系统提供的服务越来越复杂,操作系统设计规模急剧增长,操作系统也面临着“软件危机”困境。 那些移出内核的操作系统代码根据分层的原则被划分成若干服务程序,它们的执行相互独立,交互则都借助与微内核进行通信。 微内核结构将操作系统划分为两大部分:微内核和多个服务器。
操作系统内核并不知道它的存在,它完全是在用户空间中创建。 用户级线程有很多优势,比如。 管理开销小:创建、销毁不需要系统调用。 切换成本低:用户空间程序可以自己维护,不需要走操作系统调度。 可以利用多核 CPU 优势:内核拥有较高权限,因此可以在多个 CPU 核心上执行内核线程。 操作系统级优化:内核中的线程操作 I/O 不需要进行系统调用;一个内核线程阻塞了,可以立即让另一个执行。 切换成本较高:切换的时候,也同样存在需要内核操作,需要切换内核态。 用户态线程和内核态线程之间的映射关系 线程简单理解,就是要执行一段程序。程序不会自发的执行,需要操作系统进行调度。 相当于进程主线程的延展,使用的是操作系统分配给进程主线程的时间片段。内核线程由内核维护,由操作系统调度。 内核线程可以独立执行,操作系统会分配时间片段。因此内核态线程更完整,也称作轻量级进程。内核态线程创建成本高,切换成本高,创建太多还会给调度算法增加压力,因此不会太多。
配置WinDbg,调试操作系统(双机调试) PS: 设置双机调试之前,请先安装虚拟机,并且安装好XP系统.这里不做演示.直接设置. 4) 点击完成,再点击确定完成串行端口的添加 三丶虚拟机中的操作系统的设置 1) 启动VM的操作系统,打开C盘,设置文件下选项,设置为不隐藏系统文件,查看所有隐藏文件 ? 6) 设置完保存重新启动操作系统,选择启动调试程序,进入操作系统 ? ? 7) 运行我们刚才创建的Windbg快捷方式,连接成功 ?
OS-操作系统学习笔记-9:调度-0.jpg 1. 处理机调度 ① 定义 调度研究的问题是:面对有限的资源,如何处理任务执行的先后顺序。 进程在操作系统内核程序临界区的时候:注意是内核程序的临界区。普通临界区依然是有可能发生进程调度的。 进行原子操作的时候 3. 先看非抢占式版本: OS-操作系统学习笔记-9:调度-9.png 这里和 HRRN 算法是很像的,进程会正常运行,直到结束之后才发生调度,在调度的时候会选择队列中优先级最高的进程。 再看抢占式版本: OS-操作系统学习笔记-9:调度-9.1.png 这里同样和 HRRN 算法很像。 在 0 时刻,P1 首先到达第一级就绪队列 OS-操作系统学习笔记-9:调度-11.png 然后,它被调度,来到了处理机这里 OS-操作系统学习笔记-9:调度-12.png 在 1 时刻,P1
喜欢折腾的同学,会豪气如何升级 Debian Stretch 的内核到新版。 遗憾的是现在能搜到的升级 Debian Linux 内核的文章多数是使用Ubuntu的deb安装包,其实这样装上去是有问题,常见的问题是,总会提示需要 apt --fix-broken install 这里简单记录一下,如何使用Debian官方源更新到最新的内核;以及如何是用 Kernel.org 的deb源,更新内核到最新的 5.x 版本。 另一种方式,是通过 kernel.org 官方提供的安装包,更新到最新的内核。 最后一步安装后,重启一次,就可以用 dpkg -l | grep linux 看到新安装的 5.0.2 的内核了。
文章目录 一、查看 Linux 操作系统位数 二、查看 Linux 操作系统软硬件信息 一、查看 Linux 操作系统位数 ---- 在 64 位的 Linux 中 , 使用 48 位 表示 " 虚拟地址空间 " ; 使用 45 位 表示 " 物理地址空间 " ; 执行 getconf LONG_BIT 命令 , 可以查看 Linux 操作系统 是 32 位还是 64 位的 ; 得到结果 64 , 说明该系统是 64 位 Ubuntu Linux 操作系统 ; 二、查看 Linux 操作系统软硬件信息 ---- 执行 cat /proc/cpuinfo 命令 , 可以查看 " Linux 内核位数 “ 和 ” 系统的软硬件信息 " ; 输出内容解析 : vendor_id : GenuineIntel CPU 制造商 GenuineIntel cpu family : CPU 中的编号 cpu cores : 1 逻辑核心 所在的 物理核心数 apicid : 0 区分不同的逻辑核心编号 , 该编号不一定连续 ; bogomips : 5807.99 Linux 内核启动时测量的
②简洁紧凑,使用灵活的语法机制,并能直接访问硬件能够直接访问硬件的语言有:汇编和 C语言 汇编属于低级语言,难以完成一些复杂的功能,但是汇编比C语言访问硬件的效率更高。
前言 本文主要记录 Linux 内核网络协议栈的运行原理 数据报文的封装与分用 image.png 封装:当应用程序用 TCP 协议传送数据时,数据首先进入内核网络协议栈中,然后逐一通过 TCP/IP image.png 分用:当目的主机收到一个以太网数据帧时,数据就开始从内核网络协议栈中由底向上升,同时去掉各层协议加上的报文首部。每层协议都会检查报文首部中的协议标识,以确定接收数据的上层协议。 毫无疑问,这是整个内核网络协议栈的核心。这一层主要实现了各种网络协议,最主要的当然是 IP,ICMP,ARP,RARP,TCP,UDP 等。 image.png sock_init() 包含了内核协议栈的初始化工作: sock_init:Initialize sk_buff SLAB cache,注册 SOCKET 文件系统。 在中断服务子程序中,数据会从硬件的缓冲区复制到内核的空间缓冲区,并包装成一个数据结构(sk_buff),然后调用对驱动层的接口函数 netif_rx() 将数据包发送给设备无关层。
②简洁紧凑,使用灵活的语法机制,并能直接访问硬件能够直接访问硬件的语言有:汇编和 C语言 汇编属于低级语言,难以完成一些复杂的功能,但是汇编比C语言访问硬件的效率更高。
引言 上一篇文章中,我们结合此前已经介绍过的一系列知识,成功的将内核载入内存并进入到了保护模式中。 实战操作系统 loader 编写(上) — 进入保护模式 但是,我们马上就遇到了一个十分重要的问题,那就是如何在内存中按照 ELF 文件所需要的方式放置我们的内核,从而让内核能够执行呢? 但是,我们目前的分页机制启动代码是直接将物理地址与虚拟地址一对一映射实现的,因为我们的目标是尽早实现一个可用的操作系统,所以要避免过度深入某一环节。 KERNEL ELF header e_entry 值,起始物理地址 jmp SelectorFlatC : KernelEntryPointPhyAddr ; 跳转进入内核
Linux是一种广泛使用的开源操作系统,其核心组件——Linux内核,承担着系统资源管理与硬件交互的关键任务。 Linux内核是操作系统的核心,它为上层应用提供接口,同时控制硬件资源的分配与使用。简言之,内核是应用程序和硬件之间的桥梁。 在Linux中,内核代码高度模块化,主要包括以下几个关键部分:进程管理内存管理文件系统设备驱动网络子系统内核模块二、Linux内核架构详解1. 内核模块内核模块是可动态加载的程序代码,允许在不重新编译内核的情况下扩展其功能,例如添加新的驱动程序或文件系统支持。 六、结语Linux内核不仅是操作系统的灵魂,更是技术进步的引擎。从进程管理到文件系统,从内存调度到设备驱动,内核的每一部分都体现了计算机科学的深邃智慧。