写在前面 从按下电源到Linux完全启动,发生的事情有太多太多,细节也太多太多,这里我们不会那么深入细节,但力求理清整体的脉络; 这里暂时只会介绍到 体系结构无关部分的初始化和体系结构相关部分的初始化
作者: OUYANG_LINUX007 来源: http://blog.csdn.net/ouyang_linux007/article/details/7422346 Linux的最大的好处之一就是它的源码公开。同时,公开的核心源码也吸引着无数的电脑爱好者和程序员;他们把解读和分析Linux的核心源码作为自己的最大兴趣,把修改Linux源码和改造Linux系统作为自己对计算机技术追求的最大目标。 Linux内核源码是很具吸引力的,特别是当你弄懂了一个分析了好久都没搞懂的问题;或者是被你修改过了的内核
内存虚拟化是一个很大的话题,最近安全部门发现了一个qemu内存虚拟化的安全漏洞,反馈给云平台让解决,感觉很棘手,引起了我对内存虚拟化的思考,想到什么问题就把思考记录下来。
Bread是一款功能强大的BIOS逆向工程和高级调试工具,该工具也是一个“可注入”的实模式(Real-Mode)x86调试器,可以帮助广大研究人员通过串行线缆从另一台电脑调试任意实模式代码。
保护模式与实模式最本质的区别就是:保护模式使用了全局描述符表,用来保存每一个程序(bootloader,操作系统,应用程序)使用到的每个段信息:开始地址,长度,以及其他一些保护参数。
Android系统完整的启动过程,从系统层次角度可分为Linux系统层、Android系统服务层、Zygote进程模型三个阶段;从开机到启动Home Launcher完成具体的任务细节可分为七个步骤,下面就从具体的细节来解读Android系统完整的初始化过程。
虽然我们程序员不是修电脑的,虽然计算机启动到操作系统启动这个部分其实对工作的意义可能不大,但就是上面说的那句话,不知道启动,总是说不过去的,所以我还是单独把它拿出来,作为我们万里长征的第一步。
操作系统的核心职能是软件治理,而软件治理的一个很重要的部分,就是让多个软件可以共同合理使用计算机的资源,不至于出现争抢的局面。
各位,相信你们都听过Debug这个词,那这个词在我们计算机领域究竟是什么意思呢?今天就在这和大伙简单说道说道,讲的不好不对的地方还请大家批评指正。
以上概念简单了解. 我们要学的是保护模式 而之前 的16位汇编 王爽著作 都是讲的实模式.
正是由于在实模式下直接对物理内存进行读写,非常不安全,所以诞生了新的内存分段的映射方式,其目的就是对物理内存进行保护,而对内存进行保护需要注意的是一下三点: 1.内存的起始地址。 2.内存的长度。 3.内存的权限信息。
---- 保护模式 什么实模式和保护模式 这是CPU的两种工作模式,解析指令的方式不同。 在实模式下,16位寄存器需要通过段:偏移的方法才能达到1MB的寻址能力。 物理地址 = 段值 x 16 + 偏移 此时段值还可以看成地址的一部分,段值为XXXXh表示以XXXX0h开始的一段内存。 在保护模式下,CPU有着巨大的寻址能力,并为操作系统提供了虚拟内存和内存保护。 虽然物理地址的仍然用上面的公式表示,但此时“段”的概念发生了变化,它变成了一个索引,指向一个数据结构的一个表项,表项中详细定义了段的
这是x86的历史包袱。现在的CPU一般都是64位,至少也是32位的,所以需要写一段转换代码。
转自陈莉君一书《深入分析Linux内核源码》http://www.kerneltravel.ne运维
为什么会写这样一篇“无效水文”,我想是由于我的这样一种强迫症,对于任何的学习,在不理解原理,无法把他与我的已知知识架构产生联系的时候,我会本能地拒绝这种知识,所以由于这种偏执,很多情况下拖慢了自己的进度,因为很多时候无法有效收集到有用的资料,软件实训的时候,老师只会丢给一个配置文件,然后在此基础上做一些修改开发,可以除了可以勉强做一个垃圾出来,没有任何意义。就连再去做一个垃圾的能力都没有。这种情况直到毕业我才感觉无法再继续这样的生活了,于是开始大量学习,阅读专业书籍。这次就想对这些原本困扰我的东西进行一次小的抛砖引玉式的总结,当然也是把别人已经写过的一些文章综合一下,让入门的人对此好奇的人产生初步印象。 总之,人生没有白走的路。五年之前你正在梦想你今天的生活。 还有,当我们在经历冬季的时候,新西兰正被春风吹拂。所以做自己认为对的事情吧。
从应用程序或者应用开发者的角度来看,操作系统是计算机系统的核心软件,它为应用程序提供运行环境和基础服务。
饭是一口一口的吃,计算机也是一步一步的发展,例如下面这张英特尔公司的 CPU 型号历史:
既然叫中断, 那我们首先就会想到这个中断是中断谁?想一想计算机最核心的部分是什么?没错, CPU, 计算机上绝大部分的计算都在CPU中完成,因此这个中断也就是中断CPU当前的运行,让CPU转而先处理这个引起中断的事件,通常来说这个中断的事件比较紧急,处理完毕后再继续执行之前被中断的task。比如,我们敲击键盘,CPU就必须立即响应这个操作,不然我们打字就全变成了慢动作~。说白了中断其实就是一种主动通知机制,如果中断源不主动通知,那想知道其发生了什么事情,只能一次次地轮询了,白白耗费CPU。
实模式下的内存访问形式是段基址左移16位+段内偏移地址,实模式下的寄存器是16位,也就是说CPU最大可以放到的地址是0xFFFF0+0xFFFF,即0x10FFEF。
保护模式是在CPU发展过程中相对于实模式的一种模式,实模式在安全和内存访问方面具有以下缺点:
实模式是有很大弊端的,首先,直接操作物理内存,这样的话每次只能运行一个程序,并且不安全;另外,内存最大使用到1M,限制太大。
汇编语言是一种最接近计算机核心的编码语言。不同于任何高级语言,汇编语言几乎可以完全和机器语言一一对应。 汇编语言就是机器语言的一种可以被人读懂的形式,只不过它更容易记忆。
硬盘扇区如上图划分,在系统扇区中,存在分区启动扇区(PBR),在MBR分区中存在主启动扇区。
前面我已经写完了boot程序,搭建好了FAT文件系统,系统的控制权已经移交给了Loader程序。
控制台程序是为了兼容DOS程序而设立的,这种程序的执行就好像在一个DOS窗口中执行一样,没有自己的界面。所谓的控制台应用程序,就是能够运行在MS-DOS环境中的程序。控制台应用程序通常没有可视化的界面,只是通过字符串来显示或者监控程序。控制台程序常常被应用在测试、监控等用途,用户往往只关心数据,不在乎界面。控制台程序是为了兼容DOS程序而设立的,这种程序的执行就好像在一个DOS窗口中执行一样,没有自己的界面。
实模式:程序员可以直接在物理地址上进行编写程序,此时还没有操作系统进行内存的管理。
概述 在这里以x86的处理器为例 机器在启动的时候会执行第一条指令。这条指令会去执行bios,将控制权交给bios。 bios完成硬件的质检,然后将bootloader从硬盘读到内存中,执行boo
作者简介: 王建峰,对于技术方向(主要是嵌入式领域的OS方向的系统应用)感兴趣,最近在学习操作系统基础。同时也是某芯原厂的驱动工程师,主要是gpu领域的驱动软件。https://gitee.com/hinzer/blog 1 概念介绍 1.1 什么是操作系统? 1.2 如何理解中断机制? 1.3 如何理解系统定时? 1.4 如何理解进程控制? 1.5 如何理解内存管理? 1.6 如何理解堆栈概念? 1.7 内核在源码中的体现? 1.8 如何理解系统调用? 1.9 如何理解特权级? 2 流程分析 2.1 引导
CPU的硬件都设计为加电即进入16位实模式状态运行。同时,还有一点非常关键的是,将CPU硬件逻辑设计为加电瞬间强行将CS的值置为0xF000、IP的值置为0xFFF0,这样CS:IP就指向0xFFFF0这个地址位置。
在一个夜黑风高的晚上,我的男同事突然给我发了一条微信,我点开来看,他竟然问我Android从按下开机键到启动到底发生了什么?此刻我的内心如下图:
该代码的功能是在屏幕上打印"hello os",这里不再过多解释这个代码,这段代码主要是为了后文介绍几个基础概念。
这学期学习了汇编,在自己电脑上发现,win7的dos不支持16位实模式。 对编程来说,不能运行程序是致命的。 在经过网上搜集资料后,得到一种解决办法--使用dosbox软件运行 dosbox简单说,就是一个dos模拟程序,支持16位实模式。 1.首先下载一个dosbox安装程序并安装,下面给出地址 http://sourceforge.net/projects/dosbox/files/dosbox/0.73/DOSBox0.73-win32-installer.exe/download 2.在开始中找
寄存器是一种物理存储原件,速度可以跟上CPU的速度,所以CPU内部使用各种类型的寄存器供读取数据来使用。这里可以看出寄存器的主要用途:
前些天群友@Seraph_JACK在整引导,于是我也跟着云了一下。结果发现,我对引导相关的了解着实拉跨。所以趁此机会,正好完整学习一下引导相关的知识。本篇文章大致会涉及MBR、GPT、UEFI等内容,以使用Grub引导Linux为例,来分析启动的具体过程。
版权声明:本文为博主原创文章,转载请注明博客地址: https://blog.csdn.net/zy010101/article/details/83374841
不论是在 x86 平台上,还是在嵌入式平台上,系统的启动一般都经历了 bootloader 到 操作系统,再到应用程序,这样的三级跳过程。
作为一个Android开发者,了解整个系统架构是必须的,所以这篇就总结一下Android手机从按下开机键到启动这一过程发生了什么。
📚 文档目录 合集-数的二进制表示-定点运算-BCD 码-浮点数四则运算-内置存储器-Cache-外存-纠错-RAID-内存管理-总线-指令集: 特征- 指令集:寻址方式和指令格式 过去, 只有操作系统和一个程序在内存中. 现在, 操作系统和多个程序都在内存中. 程序等待 I/O 时, 为了避免处理器等待, 需要进行优化, 使得更多的程序可以加载入内存. 内存管理: 在多程序设计系统中, 内存的 “用户部分” 应该被进一步划分以适应多个程序, 这是由系统动态决定的. 加载更多程序的途径 增大内存
在x86架构的机器中,有一块ROM,里面存放了BIOS程序,BIOS程序就是开机自检程序,初始化内存控制器,中断控制器,设置中断向量等,将系统软硬件带到一个合适的状态,为操作系统内核准备环境。在ARM架构中没有BIOS,但是得自己写bootloader,bootloader一般存放在flash内,起始地址一般为0x00000000。下面看一下x86架构启动方式。
本文涉及的硬件平台是X86,如果是其他平台的话,如ARM,是会使用到MMU,但是没有使用到分段机制; 最近在学习Linux内核,读到《深入理解Linux内核》的内存寻址一章。原本以为自己对分段分页机制已经理解了,结果发现其实是一知半解。于是,查找了很多资料,最终理顺了内存寻址的知识。现在把我的理解记录下来,希望对内核学习者有一定帮助,也希望大家指出错误之处。
一、Linux内核概览 Linux是一个一体化内核(monolithic kernel)系统。 设备驱动程序可以完全访问硬件。 Linux内的设备驱动程序可以方便地以模块化(modularize)的形式设置,并在系统运行期间可直接装载或卸载。 1. linux内核 linux操作系统是一个用来和硬件打交道并为用户程序提供一个有限服务集的低级支撑软件。 一个计算机系统是一个硬件和软件的共生体,它们互相依赖,不可分割。 计算机的硬件,含有外围设备、处理器、内存、硬盘和其他的电子设备组成计算机的发动机。 但是没有软件来操作和控制它,自身是不能工作的。 完成这个控制工作的软件就称为操作系统,在Linux的术语中被称为“内核”,也可以称为“核心”。 Linux内核的主要模块(或组件)分以下几个部分: . 进程管理(process management) . 定时器(timer) . 中断管理(interrupt management) . 内存管理(memory management) . 模块管理(module management) . 虚拟文件系统接口(VFS layer) . 文件系统(file system) . 设备驱动程序(device driver) . 进程间通信(inter-process communication) . 网络管理(network management . 系统启动(system init)等操作系统功能的实现。 2. linux内核版本号 Linux内核使用三种不同的版本编号方式。 . 第一种方式用于1.0版本之前(包括1.0)。 第一个版本是0.01,紧接着是0.02、0.03、0.10、0.11、0.12、0.95、0.96、0.97、0.98、0.99和之后的1.0。 . 第二种方式用于1.0之后到2.6,数字由三部分“A.B.C”,A代表主版本号,B代表次主版本号,C代表较小的末版本号。 只有在内核发生很大变化时(历史上只发生过两次,1994年的1.0,1996年的2.0),A才变化。 可以通过数字B来判断Linux是否稳定,偶数的B代表稳定版,奇数的B代表开发版。C代表一些bug修复,安全更新,新特性和驱动的次数。 以版本2.4.0为例,2代表主版本号,4代表次版本号,0代表改动较小的末版本号。 在版本号中,序号的第二位为偶数的版本表明这是一个可以使用的稳定版本,如2.2.5; 而序号的第二位为奇数的版本一般有一些新的东西加入,是个不一定很稳定的测试版本,如2.3.1。 这样稳定版本来源于上一个测试版升级版本号,而一个稳定版本发展到完全成熟后就不再发展。 . 第三种方式从2004年2.6.0版本开始,使用一种“time-based”的方式。 3.0版本之前,是一种“A.B.C.D”的格式。 七年里,前两个数字A.B即“2.6”保持不变,C随着新版本的发布而增加,D代表一些bug修复,安全更新,添加新特性和驱动的次数。 3.0版本之后是“A.B.C”格式,B随着新版本的发布而增加,C代表一些bug修复,安全更新,新特性和驱动的次数。 第三种方式中不使用偶数代表稳定版,奇数代表开发版这样的命名方式。 举个例子:3.7.0代表的不是开发版,而是稳定版! linux内核升级时间图谱如下:
链接: https://pan.baidu.com/s/1wtec1_UlBA1wxwNeMyFBOw 密码: 7j1l
分段内存段间的内存空间太大(16位64k),碎片太多,段+偏移转换为线性地址后,通过分页管理,映射到新的地址空间,页目录+页表+页内偏移(12位4k),减小内存间隙的大小
硬件逻辑设计为加电瞬间强行设置:CS=0xF000,IP=0xFFF0,CS:IP=0xFFFF0
好的,这似乎是好多人都特别想搞明白的一个问题,有时候非常纳闷,为什么一个看似这么简单的问题,就是搜不到一个直面问题的答案呢?
准备工作:下载ucorelab在的master分支(注意不是main分支),需要用到的资料以及答案都在里面。
最近看到这个github仓库flash-linux0.11-talk,觉得还算是蛮有意思的,加上网络编程的课程又有抄写一段tcp协议实现代码或者交一篇linux内核源码阅读的笔记,还是比较讨厌这种低效率的抄写的所以就想写篇文章记录一下粗浅阅读源码后的大概了解,这个github仓库作者的文章我觉得写的还是不错的对于我这类小白而言,也比较有看得下去的动力。
我见过许多人对进程与线程概念张口就来,问他Linux里进程和线程是怎么实现的,却浑然不知。
今天为大家介绍的是来自Peter K. Koo的一篇关于基因组表示的论文。深度卷积神经网络(CNN)在对调控基因组序列进行训练时,往往以分布式方式构建表示,这使得提取具有生物学意义的学习特征(如序列模体)成为一项挑战。在这里,作者对合成序列进行了全面分析,以研究CNN激活对模型可解释性的影响。作者表明,在第一层过滤器中使用指数激活与其他常用激活相比,始终导致可解释且鲁棒的模体表示。令人惊讶的是,作者证明了具有更好测试性能的CNN并不一定意味着用属性方法提取出更可解释的表示。具有指数激活的CNN显着提高了用属性方法恢复具有生物学意义的表示的效果。
在开机的时候,主板上的 BIOS程序 会把硬盘启动区的512个字节复制到内存里的0x7c00的位置,再跳转到这里运行。
领取专属 10元无门槛券
手把手带您无忧上云