操作系统实验之编写内核 1.1 实验目的 学习和掌握Linux内核编译过程 1.2 实验内容 完成Linux内核编译过程 1.3 实验步骤 实验步骤如下: 1.将U盘挂载到redhat虚拟机如图3- 1至图3-2. 2.使用cd进入usr/src目录,使用ls查看其下辖文件如图3-3. 3.输入fdisk -l查看u盘信息显示信息U盘名字:/dev/sdb1,文件格式: HPFS/NTFS如图3 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安装内核花了大量时间 2. 致读者 纸上得来终觉浅,绝知此事要躬行
1、内核分类 内核(Kernel)在计算机科学中是操作系统最基本的部分,主要负责管理系统资源。 中文版维基百科上将内核分为四大类: 单内核(宏内核); 微内核; 混合内核; 外内核。 然而后来的实验证明,纯微内核的系统实际上也可以是高效率的。大多数现代操作系统遵循这种设计范畴,微软公司开发的Windows操作系统就是一个很好的例子。 外内核 外内核系统,也被称为纵向结构操作系统,是一种比较极端的设计方法。 2、宏内核和微内核的著名的争论 混合内核实质上也是微内核,而外内核是一种比较极端的设计方法,目前还处于研究阶段,所以我们就着重讨论宏内核与微内核两种内核。 “老一点的操作系统都是宏内核的,也就是说,整个操作系统是一个运行在核心态的单独的a.out文件, 这个二进制文件包含进程管理,内存管理,文件系统以及其他。
最近逛开源社区,发现一个开源项目 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 输入源代码如图5-1至图5-2. 2.输入命令:gcc –c –I/usr/src/linux-2.4/include –Wall xxx.c编译并输入ls查看是否编译成功如图5-3至图5-4. 看系统日志(最后一行)如图5-8至图5-9. 6.输入命令rmmod hello卸载模块并再次输入命令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 心得体会 通过此次实验,我成功编写了操作系统的内核模块,因在核心态下运行故采用 2. 致读者 时人不识凌云木,直待凌云始道高
limits.conf,添加如下内容(100000替换为自己想要的值) * hard nofile 100000 * soft nofile 100000 编辑文件/etc/sysctl.conf中的相关内核参数 接受缓存区预留内存最大值 默认值 128k # # net.unix.max_dgram_qlen 进程间通信发送数据, 默认10 # # net.ipv4.tcp_syncookies 只有在内核编译选择 tcp_synack_retries # net.ipv4.syn_retries # net.ipv4.tcp_fin_timeout 如果socket连接由本端关闭,则保持在FIN-WAIT-2状态的时间 # net.ipv4.tcp_keepalive_time 当keepalive起作用的时候,tcp发送keepalive消息的频度,默认2小时 # net.ipv4.tcp_tw_reuse 开启重用
文章目录 一、操作系统需要满足的要素 二、宏内核 三、微内核 四、Linux 内核动态加载机制 一、操作系统需要满足的要素 ---- 电脑上运行的 操作系统 , 是一个 软件 ; 设备管理 : 操作系统需要 为 用户 和 应用程序 管理并分配电脑的 硬件资源 , 如 CPU , 磁盘 , 内存 , 网络 等 ; 开发环境 : 操作系统 要为 应用程序 开发 提供配套环境 ; 执行环境 : 操作系统 要为 应用程序 执行 提供配套环境 ; 虚拟性支持 : 支持多进程 , 每个运行的应用程序进程 , 都可以感觉到有专门的处理器提供系统服务 ; 并发性支持 : 操作系统需要有 执行多个线程的能力 , 线程是独立运行 , 独立调度的最基本单位 ; 二、宏内核 ---- 宏内核 : 内核代码 编译成 二进制文件 , 内核 运行在 一个 大内核 地址空间 中 , 可以 直接 访问 , 调用 内核代码 - 微内核 : 将 操作系统 拆分成 多个 独立功能模块 , 这些 独立功能模块 之间通过 " 消息 " 进行通信 , 微内核 效率低 ; 下图中 , 进程 , 文件系统 , 设备驱动 , 与 微内核
微内核操作系统 微内核操作系统,即实现了一个可在其上构建通用 OS 的基础内核,该内核程序运行在核心态,开机常驻内存。 当前微内核操作系统结构仍没有一致公认的定义,但可从以下4方面进行描述: 足够小的内核:微内核并非一个完整的OS。 与此同时,也必然改善系统的灵活性,不仅可在操作系统中增加新的功能,还可修改原有功能,以及删除已过时的功能,以形成一个更为精干有效的操作系统。 2) 可靠性强 由于所有服务器都是运行在用户态,服务器与服务器之间采用的是消息传递通信机制,因此,当某个服务器出现错误时,不会影响内核,也不会影响其它服务器。 3) 可移植强 在微内核结构的操作系统中,所有与特定CPU和I/O设备硬件有关的代码,均放在内核和内核下面的硬件隐藏层中,而操作系统其它绝大部分(即各种服务器)均与硬件平台无关,因而,把操作系统移植到另一个计算机硬件平台上所需作的修改是比较小的
1.2 内核程序 在操作系统中,我们可以将其按照功能划分成两部分:内核功能与非内核功能。 ,而这些程序就位于操作系统的内核中。 当我们要运行这些内核程序时,就需要CPU处于内核态。 按照操作系统的内核架构,我们又可以将其进一步划分为:宏内核和微内核。 三、微内核 随着体系结构和应用需求的不断发展,需要操作系统提供的服务越来越复杂,操作系统设计规模急剧增长,操作系统也面临着“软件危机”困境。 那些移出内核的操作系统代码根据分层的原则被划分成若干服务程序,它们的执行相互独立,交互则都借助与微内核进行通信。 微内核结构将操作系统划分为两大部分:微内核和多个服务器。
操作系统内核并不知道它的存在,它完全是在用户空间中创建。 用户级线程有很多优势,比如。 管理开销小:创建、销毁不需要系统调用。 切换成本低:用户空间程序可以自己维护,不需要走操作系统调度。 可以利用多核 CPU 优势:内核拥有较高权限,因此可以在多个 CPU 核心上执行内核线程。 操作系统级优化:内核中的线程操作 I/O 不需要进行系统调用;一个内核线程阻塞了,可以立即让另一个执行。 切换成本较高:切换的时候,也同样存在需要内核操作,需要切换内核态。 用户态线程和内核态线程之间的映射关系 线程简单理解,就是要执行一段程序。程序不会自发的执行,需要操作系统进行调度。 相当于进程主线程的延展,使用的是操作系统分配给进程主线程的时间片段。内核线程由内核维护,由操作系统调度。 内核线程可以独立执行,操作系统会分配时间片段。因此内核态线程更完整,也称作轻量级进程。内核态线程创建成本高,切换成本高,创建太多还会给调度算法增加压力,因此不会太多。
从零开始学习UCOSII操作系统2–UCOSII的内核实现 参考书籍:《嵌入式实时操作系统μCOS-II原理及应用》、《嵌入式实时操作系统uCOS-II 邵贝贝(第二版)》 1、任务的结构–任务控制块 (2)里面涉及到一个重要的概念,每一种CPU中都有一些对应的CPU的寄存器。里面 有一个十分关键的程序指针,是用来跳转到相应的程序里面的。 (3)此时通过刚刚的就绪表的机制,可以从程序中得到最高优先级的任务,也就是2过程 (4)最后的过程3就是把刚刚的高优先级任务的堆栈指针复制到CPU的程序寄存器当中,实现任务的切换。 (1)根据上面的过程是实现可剥夺型内核的基础,但是有些是可以进行时间片轮询的方式的。 (2)刚刚的位图是指向某一个任务的,但是UCOSIII的位图是指向一个队列,在同一个队列中优先级 相同,也就是说,同一优先级的任务应该是按时间片轮询的方式的。
从零开始学习UCOSII操作系统2–UCOSII的内核实现 参考书籍:《嵌入式实时操作系统μCOS-II原理及应用》、《嵌入式实时操作系统uCOS-II 邵贝贝(第二版)》 1、任务的结构–任务控制块 (2)里面涉及到一个重要的概念,每一种CPU中都有一些对应的CPU的寄存器。里面 有一个十分关键的程序指针,是用来跳转到相应的程序里面的。 (3)此时通过刚刚的就绪表的机制,可以从程序中得到最高优先级的任务,也就是2过程 (4)最后的过程3就是把刚刚的高优先级任务的堆栈指针复制到CPU的程序寄存器当中,实现任务的切换。 (1)根据上面的过程是实现可剥夺型内核的基础,但是有些是可以进行时间片轮询的方式的。 (2)刚刚的位图是指向某一个任务的,但是UCOSIII的位图是指向一个队列,在同一个队列中优先级 相同,也就是说,同一优先级的任务应该是按时间片轮询的方式的。
2) 在环境变量里新建一个变量名称为_NT_SYMBOL_PATH,变量值为SRV*e:\symbol*http://msdl.microsoft.com/download/symbols,其中e:\symbol 2) 选择输出到命名管道,点下一步 ? 3) 下一步设置如下,这里要注意要设置成//./pipe/com_1,如果设置成了\\. 4) 点击完成,再点击确定完成串行端口的添加 三丶虚拟机中的操作系统的设置 1) 启动VM的操作系统,打开C盘,设置文件下选项,设置为不隐藏系统文件,查看所有隐藏文件 ? 2) 打开C盘目录下的boot文件 ? 3) 去掉boot的只读属性 ? 4) 打开boot文件 ? 5.)Boot文件后面添加内容,内容如下. 6) 设置完保存重新启动操作系统,选择启动调试程序,进入操作系统 ? ? 7) 运行我们刚才创建的Windbg快捷方式,连接成功 ?
文章目录 一、查看 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 内核启动时测量的
2.嵌入式开发中的地位——开发工具 3.高级语言中的低级语言:面向过程VS面向对象 面向过程: “面向过程”(Procedure Oriented)是一种以过程为中心的编程思想。
前言 本文主要记录 Linux 内核网络协议栈的运行原理 数据报文的封装与分用 image.png 封装:当应用程序用 TCP 协议传送数据时,数据首先进入内核网络协议栈中,然后逐一通过 TCP/IP image.png 分用:当目的主机收到一个以太网数据帧时,数据就开始从内核网络协议栈中由底向上升,同时去掉各层协议加上的报文首部。每层协议都会检查报文首部中的协议标识,以确定接收数据的上层协议。 毫无疑问,这是整个内核网络协议栈的核心。这一层主要实现了各种网络协议,最主要的当然是 IP,ICMP,ARP,RARP,TCP,UDP 等。 在中断服务子程序中,数据会从硬件的缓冲区复制到内核的空间缓冲区,并包装成一个数据结构(sk_buff),然后调用对驱动层的接口函数 netif_rx() 将数据包发送给设备无关层。 2、在传输层 udp_write() 调用本层的 udp_sendto() 完成功能。
2.嵌入式开发中的地位——开发工具 3.高级语言中的低级语言:面向过程VS面向对象 ? 面向过程: “面向过程”(Procedure Oriented)是一种以过程为中心的编程思想。
引言 上一篇文章中,我们结合此前已经介绍过的一系列知识,成功的将内核载入内存并进入到了保护模式中。 实战操作系统 loader 编写(上) — 进入保护模式 但是,我们马上就遇到了一个十分重要的问题,那就是如何在内存中按照 ELF 文件所需要的方式放置我们的内核,从而让内核能够执行呢? 但是,我们目前的分页机制启动代码是直接将物理地址与虚拟地址一对一映射实现的,因为我们的目标是尽早实现一个可用的操作系统,所以要避免过度深入某一环节。 KERNEL ELF header e_entry 值,起始物理地址 jmp SelectorFlatC : KernelEntryPointPhyAddr ; 跳转进入内核 ax add edi, 2 jmp .1 .2: pop edi pop esi pop ebx
Linux是一种广泛使用的开源操作系统,其核心组件——Linux内核,承担着系统资源管理与硬件交互的关键任务。 Linux内核是操作系统的核心,它为上层应用提供接口,同时控制硬件资源的分配与使用。简言之,内核是应用程序和硬件之间的桥梁。 代码示例:查看当前运行进程ps -aux2. 内存管理内存管理负责高效分配和回收系统内存,并提供虚拟内存支持。Linux内存管理通过分区、分页、缓存等机制,实现了对物理内存的优化利用。 内核模块内核模块是可动态加载的程序代码,允许在不重新编译内核的情况下扩展其功能,例如添加新的驱动程序或文件系统支持。 六、结语Linux内核不仅是操作系统的灵魂,更是技术进步的引擎。从进程管理到文件系统,从内存调度到设备驱动,内核的每一部分都体现了计算机科学的深邃智慧。
只要服务器收到这个“有魔力的字符串”,就知道客户端在 TLS 上想要的是 HTTP/2 协议,而不是其他别的协议,后面就会都使用 HTTP/2 的数据格式。 二进制帧 头部数据压缩之后,HTTP/2 就要把报文拆成二进制的帧准备发送。 报头很小,只有 9 字节: 长度: 默认上限是 2^14,最大是 2^24, 也就是说 HTTP/2 的帧通常不超过 16K,最大是 16M 帧类型: 10种 数据帧: HEADERS 帧和 DATA HTTP/2 的流有哪些特点呢? 流状态转换 HTTP/2 的流也有一个状态转换图 (简化): 总结 HTTP/2 必须先发送一个“连接前言”字符串,然后才能建立正式连接; HTTP/2 废除了起始行,统一使用头字段,在两端维护字段“
MBR引导扇区的内容是: 446字节的引导程序及参数 64字节的分区表(每个分区表项16字节,因此只能有4个主分区) 2字节的结束标志0x55和0xaa MBR只是操作系统引导的其中一个环节,并不是最直接的引导代码 ,MBR的主要作用是加载操作系统提供的bootloader。 为了方便MBR找到内核加载器,约定好加载器就存储在各分区的开始扇区,这个扇区被称为操作系统引导扇区也称为OBR(OS Boot Record), 扇区里面的程序便是内核加载器,比如我们常见的x86平台上的 bzImage bzImage 不是用 bzip2 压缩的,bz 表示 big zImage,其格式与 zImage 类似,但采用了不同的压缩算法,注意,bzImage 的压缩率更高是压缩的内核映像 实例 [root@xxx /boot]# file vmlinuz-3.10.104-1-tlinux2_kvm_guest-0021.tl1 vmlinuz-3.10.104-1-tlinux2_kvm_guest