首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

基于Linuxpc启动过程

要了解Android手机启动过程,我们先来了解一下基于linux系统的电脑从按下电源键的那一刻起,发生了什么,这样类比可以更好的理解Android手机的启动过程。...基于Linuxpc启动过程 我们都知道,所有的程序软件包括操作系统都是运行在内存中的,然而我们的操作系统一般是存放在硬盘上的,当我们按下开机键的时候,此时内存中什么程序也没有,因此需要借助某种方式,将操作系统加载到内存中...BIOS:Basic Input/Output System(基本输入输出系统),在IBM PC兼容系统上,是一种业界标准的固件接口(来自维基百科)。...Android手机的启动过程 Android系统虽然也是基于linux系统的,但是由于Android属于嵌入式设备,并没有像pc那样的BIOS程序。取而代之的是Bootloader——系统启动加载器。...我们可以想到,应该跟pc一样,当开机加电的时候,cpu会从cpu制造厂商预设的地址上取指令,这个地址是各厂商约定俗称的,类似于上面80x86架构里的0xFFFF0地址,因此Android手机会将固态存储设备

2K00
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Linux编程--指针的++操作

    elf_phdr; phdr_start_addr < phdr_end_addr; phdr_start_addr++) { // 开始遍历程序头 // 在C中,数组指针的...typedef __u64 Elf64_Addr; typedef __u32 Elf32_Addr; 而elf_file->elf_phdr则是(Elf64_Phdr *),也就是指针类型,而对于指针来说...,+1或者-1都是对于整个结构体而言,所以对于指针的操作,每次加1或者-1都会偏移sizeof(struct)的大小。...,因为在运行的时候会有很多字节对齐的操作,如果没有指定类型的话,无法知道对应的结构体的大小,所以禁止(void *)指针的计算。...结论 对于地址的加减来说,可以正常按数加减,而且加减完后可以赋值给结构体指针。 而对于指针的加减来说,是对于指针对应的结构体大小而言的,每次加减都是计算的N个结构体大小的偏移。

    84430

    linux物理地址,虚拟地址,内存管理,逻辑地址之间的关系

    物理地址: 这里说的物理地址是内存中的内存单元实际地址,不是外部总线连接的其他电子元件的地址!...物理地址属于比较好理解的,物理地址就是内存中每个内存单元的编号,这个编号是顺序排好的,物理地址的大小决定了内存中有多少个内存单元,物理地址的大小由地址总线的位宽决定!...是防止程序对物理地址写数据造成一些不可必要的问题,比如知道了A进程的物理地址,那么向这个地址写入数据就会造成A进程出现问题,在虚拟内存中运行程序永远不知道自己处于内存中那一段的物理地址上!...当我们要对物理地址做操作时比如if语句要根据CPU的状态标志寄存器来做不同的跳转,那么这个时候就要对CPU额状态寄存器做操作了就必须知道它的物理地址,内存中有一个电子元件叫MMU负责从操作系统已经初始化好的内存映射表里查询与虚拟地址对应的物理地址并转换...,并将其转换成真正的实际物理地址,然后在对这个实际的物理地址给CPU,在由CPU去执行对应的命令,相反CPU往内存里读数据时比如A进程要读取内存中某个虚拟地址的数据,A进程里的指令给的是虚拟地址,MMU

    3.2K00

    linux物理地址,虚拟地址,内存管理,逻辑地址之间的关系2

    线性地址: 线性地址是逻辑地址到物理地址之间的一个中间层变换,程序代码会产生逻辑地址,或者说是段中的偏移地址,加上相应段的基地址就生成了一个线性地址,逻辑地址是如何知道自己的段基的址?...如果启用了分页机制,那么MMU内存管理单元会在内存映射表里寻找与线性地址对应的物理地址。若没有启用分页机制,那么线性地址直接就是物理地址。...7.内存中有一个叫MMU(内存管理单元)的电子元件负责从操作系统已经初始化好的内存映射表里查询与虚拟地址对应的物理地址并转换, 8.逻辑地址由两部份组成,段标识符和段内偏移量。...逻辑地址即程序中的段地址,比如说0x1到0x4为一个页面,那么0x1-0x4之间的段地址称为逻辑地址,逻辑地址可以通过内存中的段数组里寻找段选择符+段偏移地址轻易得到物理地址。...线性地址是逻辑地址到物理地址之间的一个中间层变换,程序代码会产生逻辑地址,或者说是段中的偏移地址,加上相应段的基地址就生成了一个线性地址。

    1.9K00

    使用开源工具升级你的 Linux PC 硬件

    在我的文章《使用开源工具识别 Linux 性能瓶颈》中,我解释了一些使用开源的图形用户界面(GUI)工具监测 Linux 性能的简单方法。...我的重点是识别 性能瓶颈,即硬件资源达到极限并阻碍你的 PC 性能的情况。 你会如何解决性能瓶颈问题呢?你可以调整应用程序或系统软件。或者你可以运行更高效的应用程序。...这篇文章概述了一种简单的 PC 硬件升级的方法,其“秘诀”是开源的 GUI 工具。 如何升级内存 几年前,升级内存是不用多想的。增加内存几乎总是能提高性能。 今天,情况不再是这样了。...它在大多数 Linux 软件库中都有。 当你启动系统监视器时,它的“资源”面板会显示这样的输出: image.png 屏幕中间显示了内存的使用情况。...交换空间 是 Linux 在内存不足时使用的磁盘空间。Linux 通过使用交换空间作为内存的一个较慢的扩展来有效地增加内存。

    1.3K00

    Linux用户态进程的内存管理

    但由于Lazy机制,这100M其实并没有获得,这100M全部映射到一个物理地址相同的零页,且在页表中记录的权限为只读的。...如,程序中有野指针飞到了此程序运行时进程的VMA以外的非法区域,硬件就会收到page fault,进程会收到SIGSEGV信号报段错误并终止。...如,代码段在VMA中权限为R+X,如果程序中有野指针飞到此区域去写,则也会发生段错误。(另,malloc堆区在VMA中权限为R+W,如果程序的PC指针飞到此区域去执行,同样发生段错误。)...malloc分配的原理 malloc的过程其实就是把VMA分配到各种段当中,这时候是没有真正分配物理地址的。...物理地址和虚拟地址的分布 Linux内核内存管理算法Buddy和Slab

    2.8K41

    操作系统内存换入-请求调页---14

    ,因此这里需要进行特殊处理: 当MMU发生了缺页异常后,会抛出对应的缺页中断,然后保持pc值不变,这样中断处理程序结束后,回来执行的依旧是load addr指令,对于用户而言,仿佛什么都没有发生,只是当前指令执行的耗时会多一些..., page为物理地址,address为线性地址 //在linux/mm/memory.c中 unsigned long put_page(unsigned long page, //物理地址 unsigned...//这个指针用来得到对应页表的基地址 //再配合address的次10位 //就能寻址到address对应的内存页面基地址了。...竟然还可以当做数组来用···刚开始 // 着实吃了一惊,不过仔细想想page_table本来就是个指针,而1024个页表项也和数组 // 结构一样的,用数组的方式来访问也是可行的(当然我还是觉得用指针+...---- 参考 Linux内存管理之copy_page_tables源码理解

    65120

    【嵌入式开发】 ARM 关闭 MMU ( 存储体系 | ID-Cache | MMU | CP15 寄存器 | C1 控制寄存器 | C7 寄存器 | 关闭 MMU )

    MMU (1) 虚拟地址 与 物理地址 (2) MMU 作用 及 关闭原因 二. 关闭 MMU 和 Cache 1....MMU (1) 虚拟地址 与 物理地址 ---- 虚拟机地址 与 物理地址 : 1.虚拟地址概念 : 程序中使用的地址 是 虚拟地址 ; 2.物理地址概念 : 存储器物理存储单元的实际物理地址 ;...3.虚拟地址的优势 : ① 应用程序可以使用更大的存储空间, ② 解决不同程序之间的地址冲突问题; 如果没有虚拟地址, 程序中直接使用物理地址, 那么程序必须使用指定的物理地址, 会产生冲突; 同时程序中使用的存储空间也被限制...了; 因此程序中直接使用实际的物理地址 是不可行的 ; 4.MMU 作用 : MMU 可以 实现 物理地址 到 虚拟地址 之间的转换 ; ---- (2) MMU 作用 及 关闭原因 ---- MMU..., _undefined_instruction @ 未定义异常, 将 _undefined_instruction 值装载到 pc 指针中 ldr pc, _software_interrupt

    2.4K10

    malloc 背后的系统知识

    我们现在的错觉是应用程序大小都小于物理内存,这主要是因为现在 PC 的物理内存都比较大。实际上只有 1G 物理内存的 PC 是可以运行 2G 的应用程序的。...MMU CPU 将虚拟地址发送给 MMU,然后 MMU 将虚拟地址翻译成物理地址,再寻址物理内存。那么虚拟地址和物理地址具体是怎么映射的呢?...将页面起始地址和偏移量进行拼接得到物理地址,然后完成读写。 2. 进程的段 每个 Linux 程序都有一个运行时内存映像,也就是各个段的布局,简单如下图所示。...int brk(const void *addr); void *sbrk(intptr_t incr); brk 将 brk 指针放置到指定地址处,成功返回 0,否则返回 -1。...请分享给更多人 关注「Linux 爱好者」,提升Linux技能

    1K11

    NULL指针的奇妙之旅

    想必大家在接触计算机时都写过NULL指针的程序,尤其是玩C语言的小伙伴们。比如刚初始化的一个int类型指针,还没给分配内存空间时就往这个指针赋值,然后运行就会出现Segment Fault的错误。...运行旅行 当一切环境都搭建好之后,程序就需要去执行它的使命了,我们可以将NULL指针程序反汇编,反汇编的内容很多,我们只看main函数的反汇编,这里使用的是aarch64-linux-gnu-objdump...CPU首先会将虚拟地址送给MMU,让MMU硬件单元做虚拟地址到物理地址的查表,转化。...同时MMU硬件单元也会做一些虚拟地址权限的检查,查看虚拟地址是否访问越界之类的,以及读写权限等 当MMU硬件单元中已经存在虚拟地址到物理地址的映射关系,则直接返回物理地址让CPU去执行访问 如果MMU硬件单元中没有虚拟地址到物理地址的映射关系...cmp x24, #ESR_ELx_EC_PC_ALIGN // pc alignment exception b.eq el0_sp_pc cmp x24, #ESR_ELx_EC_UNKNOWN

    1.2K21

    通过linux0.11源码理解进程的虚拟地址、线性地址、物理地址

    进程的地址有三种,分别是虚拟地址(逻辑地址)、线性地址、物理地址。在分析之前先讲一下进程执行的时候,地址的解析过程。...然后到页目录吧和页表中找到物理地址基地址,再加线性地址中的偏移部分,得到物理地址。下面我们看看这些内容是怎么设置的,使得执行的时候能正确找到我们想要的地址去执行代码。我们从fork函数开始。...用线性地址的首地址加上ip 中的偏移,得到线性地址,然后再通过页目录和页表得到物理 地址,物理地址还没有分配则进行缺页异常等处理。...接着复制页表,但是不分配物理地址。最后把tss结构和ldt结构挂载到GDT中。fork函数就完成了。下面看看选择子和描述符的格式。 ? ?...这就是linux0.11版本中进程地址管理的实现。下面是fork后的结构图。 ?

    1.5K60

    详解io端口与io内存

    PC机中,一般是把低端物理地址给RAM用,高端物理地址给总线用。 2)总线地址:总线的地址线或在地址周期上产生的信号。外设使用的是总线地址,CPU使用的是物理地址。...PC架构一共有65536个8bit的I/O端口,组成64K个I/O地址空间,编号从0~0xFFFF,有16位,80x86用低16位地址线A0-A15来寻址。...目前,大多数嵌入式微控制器如ARM、PowerPC等并不提供I/O空间,仅有内存空间,可直接用地址、指针访问。...目前,大多数嵌入式微控制器如ARM、PowerPC等并不提供I/O空间,仅有内存空间,可直接用地址、指针访问。...当不再需要这种映射时,需要调用下面的函数来撤消: void ioport_unmap(void *addr); 在设备的物理地址被映射到虚拟地址之后,尽管可以直接通过指针访问这些地址,但是宜使用Linux

    2.6K10

    深入浅出动静态库

    这么说也没错,其实这就是Linux的规定,因为Linux默认不信任用户创建目录的硬链接方式,只有自己分配的才没问题。...虽说是建立映射关系,但是建立的前提是需要获得每行代码所对应的物理地址,这个过程我们并不清楚,其实这步操作是CPU在帮助我们完成的,CPU中存在两个寄存器,分别是pc指针和cr3寄存器: pc指针:保存正在执行指令的下一条指令的地址...有了这两个寄存器,我们就好办多了,要想执行程序,那就必须要有程序main函数的起始地址,而恰好在可执行程序的头部保存了程序起始位置地址,在初始化地址空间时,其也被pc指针读取,于是代码就可以被pc指针与其他寄存器配合正常执行完毕...而cr3指针通过MMU(内存管理单元)和页表来完成虚拟到物理地址之间的映射。   ...pc指针用来读取程序段,而程序段在加载之前都是虚拟地址,也就是说,pc指针负责读取虚拟地址,而cr3指针负责将虚拟地址转化为物理地址

    12610

    Linux】进程地址空间和进程调度队列

    今日更新了Linux进程空间地址和进程调度队列的内容 欢迎大家关注点赞收藏⭐️留言 问题现象 当g_val的值修改后,父子进程各自的g_val地址都是一样的,但是为什么值却不同呢?...物理地址,用户一概看不到,由OS统一管理 页面一边存的是虚拟地址,另一边存的就是对应的物理地址。 子进程会继承父进程的数据,所以最开始指向的虚拟、物理地址也跟父进程一样。...MMU会快速把指定的虚拟地址结合页表转换成物理地址Linux2.6内核进程调度队列 上图是Linux2.6内核中进程队列的数据结构。...active指针永远指向活动队列 expired指针永远指向过期队列 可是活动队列上的进程会越来越少,过期队列上的进程会越来越多,因为进程时间片到期时一直都存在的。...在合适的时候,会交换active指针和expired指针的内容,就有了一批新的活动进程。

    4610

    Linux笔记】pc机_开发板_ubuntu互ping实验

    最近入手了一块百问网imx6ul开发板,一方面想系统性地学一次嵌入式Linux,争取下一份工作往这个方向混一口饭吃,另一方面也想用一用NXP的芯片。...本篇笔记分享的是:pc机_开发板_ubuntu互ping实验,主要是根据教程来走一遍,做个学习记录。 硬件连接 关于网络环境搭建这一块是个难点。...以前在学校我也有学过嵌入式Linux,被这一块搞蒙了好几次。但是,针对这些繁杂的网络问题,百问网的教程对这一块知识做了个很详细的教程文档: ?...(3)设置开发板IP: 如果开发板正在运行 LINUX, 一般来说也不需要设置 IP。...两个教程光是搞环境都要搞很久,遇到各种各样的问题,其中这个网络配置问题就是一大问题,还有就是USB驱动问题(为了这个问题重装多次系统)、装Linux系统的问题(生怕和教程装的不一样)等。

    2.2K21

    嵌入式面试题(一)

    1、linux 上应用程序开发(用户空间)不能使用物理地址这个说法对吧?那么怎么见到有些 c 程序里使用二进制的地址值呢? 物理地址,二进制地址给我绕的有点晕,老师能帮我解答一下么?...C 语言编程里也可以操纵寄存器,那这样用 C 编写的应用程序里面也有寄存器地址啊,这样来讲应用程序里不是就有物理地址了么? 解答:物理地址和二进制没有关系,二进制只是表示数据的方式而已。...c 语言是可以操作地址, 但是在操作系统中有虚拟地址的概念,你在 linux 下编写的程序操作的地址可不是物理地址,是进程的虚拟地址,如果你写裸机程序, c 语言当然可以操作物理地址啦。...平台设备驱动是基于 linux 的设备、总线、驱动模型,总线就是 platform bus,设备通常用于管理平台驱动要使用的资源,比如一些寄存器、和中断,总线部分不需要管,因为内核帮我们做了,设备部分需要根据资源注册平台设备...我们常见的空指针一般指向 0 地址,即空指针的内部用全 0来表示(zero null pointer,零空指针);也有一些系统用一些特殊的地址值或者特殊的方式表示空指针(nonzero null pointer

    74220

    Linux用户态进程的内存管理

    但由于Lazy机制,这100M其实并没有获得,这100M全部映射到一个物理地址相同的零页,且在页表中记录的权限为只读的。...如,程序中有野指针飞到了此程序运行时进程的VMA以外的非法区域,硬件就会收到page fault,进程会收到SIGSEGV信号报段错误并终止。...如,代码段在VMA中权限为R+X,如果程序中有野指针飞到此区域去写,则也会发生段错误。(另,malloc堆区在VMA中权限为R+W,如果程序的PC指针飞到此区域去执行,同样发生段错误。)...malloc分配的原理 malloc的过程其实就是把VMA分配到各种段当中,这时候是没有真正分配物理地址的。...这里我们用工具 procrank先来看下Linux进程的内存占用量 。 ?

    2.9K30
    领券