首页
学习
活动
专区
工具
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手机会将固态存储设备

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

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

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

3K00

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个结构体大小的偏移。

81330

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.2K00

Linux用户态进程的内存管理

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

2.7K41

操作系统内存换入-请求调页---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源码理解

58420

【嵌入式开发】 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.2K10

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技能

95611

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.1K20

详解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.3K10

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

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

1.4K60

嵌入式面试题(一)

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

72020

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

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

2.1K21

Linux】进程理解与学习Ⅳ-进程地址空间

环境:centos7.6,腾讯云服务器 Linux文章都放在了专栏:【 Linux 】欢迎支持订阅 相关文章推荐: 【Linux】冯.诺依曼体系结构与操作系统 【Linux...】进程理解与学习Ⅰ-进程概念 浅谈Linux下的shell--BASH 【Linux】进程理解与学习Ⅱ-进程状态 【Linux】进程理解与学习Ⅲ-环境变量 ---- 前言...而我们所说的指针就是这一个个的编号,即指针就是地址。不过这里的地址真的是物理意义上的地址吗?...,并不是真正意义上的物理地址(因为假如是物理地址,就不会出现同一个地址却有不同的值)。 那么这种非物理的地址叫什么呢?在Linux中我们称之为虚拟地址/线性地址。...但是可能会存在野指针问题: 假如我们写的程序中存在野指针,这就造成了对物理内存越界访问,就有可能会影响到其它进程。

1.1K20

Linux用户态进程的内存管理

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

2.8K30

Linux 内核 内存管理】内存映射原理 ① ( 物理地址空间 | 外围设备寄存器 | 外围设备寄存器的物理地址 映射到 虚拟地址空间 )

文章目录 一、物理地址空间 二、外围设备寄存器 三、外围设备寄存器物理地址 映射到 虚拟地址空间 一、物理地址空间 ---- " 物理地址空间 “ 是 CPU 处理器 在 ” 总线 " 上 访问内存的地址..., RISC 处理器 只能访问 物理地址空间 , 系统的 外围设备 与 物理内存 都使用 统一的物理地址空间 访问 ; RISC 全称 " Reduced Instruction Set Computer..., 参考 【Linux 内核 内存管理】Linux 内核内存布局 ④ ( ARM64 架构体系内存分布 | 内核启动源码 start_kernel | 内存初始化 mm_init | mem_init...映射到 虚拟地址空间 用户空间 的 应用进程 , 访问 " 外围设备寄存器 " 只能通过 " 虚拟地址 " 实现 , Linux 内核 提供了 相关 API 函数 , 将 " 外围设备寄存器 “ 对应的...” 物理地址 “ 映射到了 ” 虚拟地址空间 " 中 ;

3.1K20
领券