我们知道启动引导程序(Boot Loader,也就是 GRUB)会在启动过程中加载内核,之后内核才能取代 BIOS 接管启动过程。如果没有启动引导程,那么内核是不能被加载的。...本节,我们就来看看启动引导程序加载内核的过程,当然 initramfs 这个虚拟文件系统也是要靠启动引导程序调用的。...在 CentOS 6.x 中,启动引导程序默认是 GRUB,GRUB 是现在最为流行的启动引导程序,我们也用 GRUB 来说明启动引导程序的作用。...早期的 LILO 引导程序已经不是很常见了,GRUB 相比来讲有很多优势,主要有:支持更多的文件系统。GRUB 的主程序可以直接在文件系统中查找内核文件。...GRUB加载内核的过程GRUB 的作用有以下几个:加载操作系统的内核;拥有一个可以让用户选择的的菜单,来选择到底启动哪个系统;可以调用其他的启动引导程序,来实现多系统引导。
我只能重新啃英文原版了. 1 xv6系统的启动过程: 1.1xv6引导器 当x86系列的PC机启动的时候,首先会执行BIOS程序,BIOS程序一般会存放在固定的ROM中,一般在磁盘固定扇区中.BIOS...的作用是在启动时进行硬件的准备工作,接着BIOS程序会把控制权递交给操作系统.具体来说,BIOS会把控制权递交给从引导扇区中的固定的代码中(BIOS会把引导扇区存储的代码加载到内存0x7c00处),接着引导程序会把操作系统内核载入到内存中...在xv6系统,引导程序由汇编引导程序和代码引导程序. 1.2 内核态进入用户态 阅读kernel.asm(内核整体的代码) Disassembly of section .text: 0000000080000000...add sp,sp,a0 80000016: 652050ef jal ra,80005668 我们看到了_entry这个标签,也就是说内核是从...M态的时候,触发中断的PC,当M态回到S态的时候,就继续从断点处执行.当然这个操作还制定了M态比S态更加接近于内核.
Gentoo Linux x86快速安装指南 参考文档如下: http://www.gentoo.org/doc/zh_cn/gentoo-x86-quickinstall.xml#doc_chap2...这时其实数据已经保存在sda硬盘上了,这时我们只需要重启用光盘引导挂上就好了 livecd ~ # mount /dev/sda3 /mnt/gentoo livecd ~ # mount /dev/...sda1 /mnt/gentoo/boot 3,在在mirrors.163.com上下载 livedvd-x86-amd64-32ul-2012.1.iso 在一台机器上引导,我们主要是用这里的/boot...gentoo-r1 100% 5704KB 5.6MB/s 9.3MB/s 00:00 这样我们就可以利用livedvd里的内核文件启动了...emerge安装自己需要的软件了
引言 经过上一篇文章中历史性的一跳,以及堆栈和 GDT 的切换,我们终于进入到了内核: 内核的雏形(上) -- 创建属于 kernel 的堆栈与 GDT 接下来我们要做的当然就是在内核中创建进程并且调度起来...loader.asm 中就是 loader 的源码了,他的工作主要是从软盘读取 kernel,初始化保护模式所需的内存数据结构,跳转进入内核。...、描述符类型、特权级等等宏比较多,就不单独在这里展示了,请参看文末源码 6....添加硬件中断响应函数 经过一系列的设置,我们终于让我们的操作系统内核可以响应 CPU 异常了。 可是我们更加关注的是硬件触发的中断响应,这才是我们设置 8259A 的初衷。...《linux 内核完全注释》。
每一种技术的出现必然是因为某种需求。正因为人的本性是贪婪的,所以科技的创新才能日新月异。 1 简介 从英特尔80486DX开始,算术浮点单元(FPU)就已经被集成到CPU中了。...这样的设计缺点是,内核开发者无法混合使用转义浮点指令和MMX指令;优点是内核开发者可以使用相同的进程切换代码来保存浮点单元和MMX的状态。...SSE2扩展和SSE扩展使用相同的XMM寄存器。 X86微处理器不会自动在TSS中保存FPU、MMX和XMM寄存器。但是,从硬件上,支持内核只保存所需要的寄存器。...假设进程A正在使用协处理器,当进程A切换到进程B的时候,内核设置TS标志,且把浮点寄存器保存到进程A的任务状态段(TSS)中。如果进程B没有使用协处理器,内核不需要恢复浮点寄存器的内容。...基于x86架构的Linux内核使用i387_union类型的变量thread.i387存储这些值,该变量位于进程描述符中。
这是一个类 UNIX 的微内核系统,仅包含 12,000 行 C 代码,支持 x86 架构,学生可通过购买配套教材获取源代码。Minix 的目标是让学生理解操作系统原理,而非用于实际生产环境。...1992 年,在 Stallman 的游说下,Linus 将 Linux 的许可证从禁止商业使用改为GNU GPL v2,允许自由修改和分发代码。...Usenet 讨论:comp.os.linux 新闻组日均数百条消息,讨论内容从驱动开发到内核设计哲学。...到 1994 年 Linux 1.0 发布时,内核已包含 176,250 行代码,支持 TCP/IP、ext2 文件系统和多个硬件架构,标志着 Linux 从 “玩具” 蜕变为可用的操作系统。...RISC-V 与 Rust:适配开源硬件架构,探索内核开发的新范式。 Linux 的成功证明了开源协作的力量:一个由全球志愿者维护的系统,竟能超越商业巨头,统治从手机到超算的全场景。
人工智能技术堆栈中的错误配置会导致数据摄取管理不善、模型训练效率低下和安全漏洞不足。解决这些挑战需要不重复我们从云和 Kubernetes 经验中吸取的教训。...云计算的快速崛起 云计算彻底改变了 IT,强调可扩展性、灵活性及成本效益。企业迅速从昂贵的本地数据中心转向云,重视敏捷性和创新。...AI 技术堆栈中的错误配置会导致数据摄取管道 管理不善、模型训练效率低下和安全措施不足。解决这些挑战需要不重复我们从云和 Kubernetes 经验中吸取的教训。...避免 AI 中配置债务的策略 为了避免 AI 开发中的配置债务,组织可以从 云计算和 Kubernetes 中学习,强调战略规划、自动化和持续学习的文化。 简而言之,AI 配置即平台。...结论:用过去的智慧引领 AI 革命 一个清晰的模式出现了,将云和 Kubernetes 的兴起与人工智能技术的兴起联系起来——快速创新,然后意识到累积的配置技术债务将破坏成功的部署。
结构体 一、引导内存分配器 bootmem 简介 ---- 1、引导内存分配器 bootmem 引入 Linux 内核 初始化 时 , 需要进行内存分配 , 启动阶段的 内存分配 与 运行时的 内存分配...机制不同 ; 此时 Linux 内核 提供了一个 临时的 " 引导内存分配器 bootmem " , 该 内存分配器 只在启动过程中使用 , 启动完成后 , 就会被丢弃 ; 2、引导内存分配器 bootmem...工作机制 " 引导内存分配器 bootmem " 工作机制如下 : Linux 内核初始化过程中 , 临时提供一个 " 引导内存分配器 bootmem " , 引导内存分配器 bootmem 的主要作用是...bootmem 描述 bootmem_data 结构体 ---- 在 Linux 内核中 , 使用 struct bootmem_data 结构体 , 描述 " 引导内存分配器 bootmem " ;...struct bootmem_data 结构体 定义在 Linux 内核源码的 linux-4.12\include\linux\bootmem.h#33 位置 , 源码如下 : /* * node_bootmem_map
---- 我们希望自己的操作系统内核至少应该在Linux下用GCC编译链接。 Loader要做的事有两件:加载内核入内存、跳入保护模式。...---- 把内核加载到内存 加载内核到内存这一步和引导扇区的工作非常相似,只是处理内核时我们需要根据Program header table中的值把内核中相应段放到正确的位置。...DESCRIPTOR) - 1; *p_gdt_base = (u32)&gdt; disp_str("-----\"cstart\" ends-----\n"); } 添加中断处理 从进程本身的角度看...从操作系统角度看,进程必须是可控的,这就涉及到进程和操作系统之间执行的转换。因为CPU只有一个,同一时刻要么是客户进程在运行,要么是操作系统系统在运行。...以一个divide_error为例,它在kernel.asm中是一个导出符号,而exception_handler是在protect.c中定义的一个处理程序,因为在init_prot初始化了,所以当发生
前言:epoll是现代服务器的基石,也是高效处理大量请求的利器,从设计上来看,epoll的设计思想也是非常优秀的,本文介绍epoll的实现,从中我们不仅看到epoll的实现原理和机制,同时也能领略到其中优秀的设计思想...2 判断当前被监听的fd订阅的事件是否触发了,即注册的时候,事件就触发了,是则插入就绪队列。 3 初始化并注册节点到资源对应的队列中。 1,2的逻辑是很自然的,执行完后的架构如下 ?...5.1 poll监听epoll 要被poll监听,就需要实现poll钩子,我们从epoll实现的poll钩子ep_eventpoll_poll开始分析。...是一样的,区别在于插入的时候,poll逻辑的实现。...这里的逻辑看起来似乎可以放到ep_eventpoll_poll里,但是内核开发者没有这样做。这部分就先不深入分析,因为我们主要是要理解epoll的基础原理。
下面我们从内核看一下eventfd的实现。...do_eventfd(count, flags);} SYSCALL_DEFINE1(eventfd, unsigned int, count){ return do_eventfd(count, 0);} 内核支持两个版本的...ssize_t eventfd_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos){ // 从file...,然后通知等待者,剩下的就是条件不满足时的一些处理逻辑。...,并且通过互斥变量实现操作队列的逻辑,但是我们看到操作eventfd是不需要加锁的,因为内核已经帮我们处理了。
下面我从内核角度看看socketpair的实现。...,为了符合虚拟文件系统的设计,socket的设计中,也遵循fd->file->inode的结构,__sys_socketpair就是申请了两份这样的数据结构,然后调用钩子函数socketpair。...PAGE_ALLOC_COSTLY_ORDER); skb->data_len = data_len; skb->len = len; // 把数据从msg...skip = sk_peek_offset(sk, flags); // 从接收队列中获取一个节点 skb = __skb_try_recv_datagram...msg skb_copy_datagram_msg(skb, skip, msg, size);} 数据接收就是从消息队列中逐个返回给用户,每次调用返回一个。
x86:从 16 位到 32 位的辉煌之路 诞生与崛起 1978 年,英特尔(Intel)推出了 8086 处理器,标志着 x86 架构 的诞生。...随后,英特尔不断升级,推出了 80286、80386 等处理器,将 x86 架构从 16 位扩展到 32 位,奠定了个人计算机的基础。...无论是办公、娱乐,还是教育,x86 架构的计算机都发挥了重要作用,改变了人们的生活方式。 特点与优势 复杂指令集计算机(CISC):x86 采用复杂指令集,提供丰富的指令,适应多样化的应用需求。...广泛的生态系统:经过多年发展,x86 拥有庞大的软件和硬件生态,兼容性强。 性能优越:在桌面计算和服务器领域,x86 处理器展现了强大的计算能力。...从 IBM PC 的 x86,到现代桌面电脑的 x64,再到智能手机和 Apple M1 芯片的 ARM64,每一次演变都推动着计算时代的进步。 x86:起步于早期 PC,奠定了计算机的基础。
前言:Unix域是进程间通信的一种方式,他的特点是可以传递文件描述符,在内核中,Unix域是网络的一部分,使用上也遵循网络编程的API。本文分析Unix域的实现。 我们首先看看Unix域的使用。...所以当我们调用 socket(AF_UNIX, xxxx); 就会进入Unix域的逻辑。下面我们从socket函数开始分析。...socket是上层的接口,sock则是不同协议(TCP、Unix域)对应的实现不一样,后续再单独写文章介绍。.../ 关联sock和socket sock_graft(tsk, newsock); unix_state_unlock(tsk); return 0;} unix_accept的逻辑就是从监听...最后返回一个新的fd给调用方。架构图如下。 ? 后记:本文从客户端和服务器的角度分析了Unix域作为进程间通信方式是怎么实现的。相对TCP/IP,Unix域的实现相对简单。
前言:SO_REUSEPORT是提高服务器性能的一个特性,从Linux3.9后支持,本文从内核5.9.9的源码分析SO_REUSEPORT的实现,因为内核源码非常复杂,尽量把自己的思路说一下。...最后我们从内核bind函数开始分析一下TCP中SO_REUSEPORT的实现。...至此,bind的过程就分析完成了。接着我们分析调用listen函数时内核的处理。我们从inet_listen函数开始分析。...接着我们分析收到连接之后,内核是如何分发的,入口函数是tcp_v4_rcv。...接着唤醒阻塞到该socket的进程。 后记:从内核实现的角度我们可以看到,SO_REUSEPORT的实现大概原理是内核会把每个进程的每个socket(设置了SO_REUSEPORT)维护起来。
至于menu.lst文件中的solaris 启动文件,只有x86架构的solaris才有grub引导,solaris的内核文件在/platform下。...创建windows的引导部分。...2、 solaris引导过程(以sparc为例,没有grub引导) 引导PROM(简单理解就是加电硬件自检过程): x86架构为BIOS将运行自检诊断,验证硬件和内存,未发现硬件错误则进入自动引导过程。...引导程序过程 bootlk将ufsboot加载到内存 ufsboot加载内核:有两个内核,genunix是独立于平台的通用内核文件,unix是平台特定的内核文件。...内核文件在:x86 /etc/`uname -m`/kernel x64 /etc/`uname -m`/kernel/sparc9 内核其他目录有:/kernel /usr/
使用 Rust 实现 x86 bootloader KRaBs 是一个内核阅读器和引导器,目前 KRaBs 正在致力于在 32位/64 位 pc 上引导 vmlinux 和其他用 ELF 格式化的内核,...Krabs 还旨在只支持最小的 Linux x86/x86_64 引导协议。这允许您使用内核命令行和 initrd/initramfs。...作者从 Bret Victor 的 Learnable Programming 中获得了很多灵感,后续将继续扩展它以涵盖更多的主题,包括更多可探索的演示。...rust/comments/iuflg1/rust_fullstack_developer_denmark_or_remote/ j4rs项目 j4rs 代表“Java for rust”,允许毫不费力地从...j4rs 只关注于通过允许 JVM 从 Rust 代码创建和操作、无 efortless Java 方法调用、通过 Maven 提供 Java 库等方式,改进 Rust 应用程序调用 Java 代码。
Android的启动过程是怎么样的? 什么是Linux内核? 桌面系统linux内核与Android系统linux内核有什么区别? 什么是引导装载程序? 什么是Zygote?...x86(x86是一系列的基于intel 8086 CPU的计算机微处理器指令集架构)是linux内核部署最常见的系统。...Android启动流程/过程 第一步:启动电源以及系统启动 当电源按下,引导芯片代码开始从预定义的地方(固化在ROM)开始执行。加载引导程序到RAM,然后执行。...这些对于运行内核是必要的,为了达到特殊的目标,引导程序可以根据配置参数或者输入数据设置内核。...更多关于Android引导程序的可以在这里了解。 第三步:内核 Android内核与桌面linux内核启动的方式差不多。内核启动时,设置缓存、被保护存储器、计划列表,加载驱动。
GRUB_多系统引导(简介) 摘要: GRUB是多系统引导管理器,简单的说既能引导Linux,同时也能引导Windows;从讨论区近四年的观察来看,大多初学者并不能在短时间内掌握GRUB的用法,为了解决初学者在最短时间内掌...GRUB都是适用的; 一、什么是多重操作系统引导管理器,什么是GRUB; 1、什么是多重操作系统引导管理器及工作原理; 系统启动引导管理器,是在计算机启动后运行的第一个程序,他是用来负责加载、传输控制到操作系统的内核...,一旦把内核挂载,系统引导管理器的任务就算完成退出,系统引导的其它部份,比如系统的初始化及启动过程则完全由内核来控制完成; Briefly, boot loader is the first software...X86架构的机器仍是主流, 所以目前GRUB和LILO 仍然是我们最常用的多重操作系统引导管理器; 2、什么是GRUB;为什么我要选择GRUB; 1)什么是GRUB; **GNU GRUB 是一个多重操作系统启动管理器...,在最新版本中都默认GRUB引导Slackware 目前仍采用LILO;而Debian发行版目前最新的版本也是采用GRUB; 从目前看来,GRUB有逐渐取代LILO之势,GRUB 2.0正在开发之中;所以我们有理由用
() 系统调用需要传入两个参数,第一个 sockfd 表示监听的 socket 句柄,而 backlog 参数表示接收请求队列的长度。...listen() 系统调用在内核的实现 当我们在程序中调用 listen() 系统调用时,会触发调用内核的 sys_listen() 函数,sys_listen() 函数的实现如下: asmlinkage...步骤2:通过调用 socket 对象的的 listen() 方法来进行监听操作。 对于 TCP协议 来说,socket 对象的 listen() 方法会绑定到 inet_listen() 函数。...其中 max_ack_backlog 字段就是用于保存最大接收连接队列的长度,至此 listen() 函数的工作就完成了,那么内核在哪里限制接收连接队列的呢?...内核限制TCP连接队列 当网卡接收到数据时,会接收到数据包并封装成 sk_buff 对象,如果接收到的数据包是一个 TCP协议 的数据包,那么内核将会把数据包提交给 tcp_v4_rcv() 函数处理。