flutterandroidx支持,【工作經驗分享】

基于Linux的pc啟動過程

我們都知道,所有的程序軟件包括操作系統都是運行在內存中的,然而我們的操作系統一般是存放在硬盤上的,當我們按下開機鍵的時候,此時內存中什么程序也沒有,因此需要借助某種方式,將操作系統加載到內存中,而完成這項任務的就是 BIOS

裝過系統的人一定知道BIOS這個東西,那么它究竟是什么呢?

BIOS:Basic Input/Output System(基本輸入輸出系統),在IBM PC兼容系統上,是一種業界標準的固件接口(來自維基百科)。有點難以理解,其實BIOS是我們電腦啟動時加載的第一個程序,這個程序不是由Java語言編寫也不是由C語言編寫,一般是匯編程序。

BIOS程序固化在主板上的一塊芯片上,是連接計算機硬件與操作系統的橋梁,它保存著計算機最重要的基本輸入輸出的程序、開機后自檢程序和系統自啟動程序。

那么問題來了,BIOS程序又是怎么啟動的?BIOS的啟動,是由硬件完成的,Intel 80x86系列的cpu的硬件都設計為加電(即開機瞬間)就進入16位實模式狀態運行,此時將cpu的硬件邏輯設計為強行將CS的值設置為0xFFFF,IP的值設置為0x0000,這樣CS:IP就指向了0xFFFF0這個位置,而這個位置就是BIOS程序的入口地址。

因此這是一個硬件廠商之間的約定,所有的BIOS程序入口地址均為0xFFFF0,這樣在開機的時候,就找到這個地址,如果該地址并沒有代碼段,那么計算機將會死機,如果這個地址處有代碼段,將會執行這個代碼段,并由此執行下去,即BIOS程序開始啟動。

補充:
**CS:**代碼段寄存器,存在于CPU中,指向CPU當前執行代碼在內存中所在的區域。
**IP:**指令寄存器,存在于CPU中,記錄將要執行的指令在代碼段內的偏移地址,與CS組合即為將要執行的指令的內存地址。

當BIOS程序啟動時,就會檢測硬件設備,比如我們的顯卡、內存等信息。BIOS會在內存中建立中斷向量表和中斷服務程序。中斷向量表中有256個中斷向量,每個中斷向量占4個字節,每個中斷向量指向一個中斷服務程序,這些中斷服務程序完成了將操作系統由硬盤加載到內存中的任務.
基于linux的操作系統而言,計算機將分三批逐次加載操作系統的代碼,第一批由BIOS中斷int 0x19將 第一扇區bootsect的內容加載到內存;第二批和第三批在bootsect的指揮下,分別加載后面扇區的內容到內存中。

**經過執行一系列的BIOS代碼后,計算機完成了自檢等操作,**計算機硬件體系會與BIOS聯合操作,讓cpu接收到一個int 0x19中斷,cpu接收到這個中斷后,會立即在中斷向量表中找到int 0x19中斷向量,此時會找到對應的中斷服務程序,并由該中斷服務程序將硬盤中第一個扇區的引導程序加在到內存中的指定位置。

**隨后,在引導程序的作用下,陸續將操作系統的其他程序載入內存,**完成實模式到保護模式的轉變,為執行操作系統的入口函數main做準備,后面就是操作系統的初始化工作了,最后完成計算機的啟動。

Android手機的啟動過程

Android系統雖然也是基于linux系統的,但是由于Android屬于嵌入式設備,并沒有像pc那樣的BIOS程序。

取而代之的是Bootloader ——系統啟動加載器。它類似于BIOS,在系統加載前,用以初始化硬件設備,建立內存空間的映像圖,為最終調用系統內核準備好環境。

在Android里沒有硬盤,而是ROM ,它類似于硬盤存放操作系統,用戶程序等。ROM跟硬盤一樣也會劃分為不同的區域,用于放置不同的程序,在Android中主要劃分為一下幾個分區:

  • /boot:存放引導程序,包括內核和內存操作程序
  • /system:相當于電腦c盤,存放Android系統及系統應用
  • /recovery:恢復分區,可以進入該分區進行系統恢復
  • /data:用戶數據區,包含了用戶的數據:聯系人、短信、設置、用戶安裝的程序
  • /cache:安卓系統緩存區,保存系統最常訪問的數據和應用程序
  • /misc:包含一些雜項內容,如系統設置和系統功能啟用禁用設置
  • /sdcard:用戶自己的存儲區,可以存放照片,音樂,視頻等文件

那么Bootloader是如何被加載的呢?我們可以想到,應該跟pc一樣,當開機加電的時候,cpu會從cpu制造廠商預設的地址上取指令,這個地址是各廠商約定俗稱的,類似于上面80x86架構里的0xFFFF0地址,因此Android手機會將固態存儲設備ROM預先映射到該地址上,當開機加電的時候,cpu就會從該地址執行/boot分區下的Bootloader程序,載入linux內核到RAM中。

當linux內核啟動后會初始化各種軟硬件環境,加載驅動程序,掛載根文件系統,并開始執行根文件系統的init程序,init程序是Android啟動過程中最重要的核心程序。

init進程是Android系統中用戶進程的鼻祖進程。init進程會啟動各種系統本地服務,如:Media Server、S

《安卓學習筆記總結+最新移動架構視頻+大廠安卓面試真題+項目實戰源碼講義》瀏覽器打開

完整開源項目:docs.qq.com/doc/DSkNLaERkbnFoS0ZF

ervice Manager、bootanim(開機動畫)等。init進程會在解析init.rc文件后fork出Zygote,而Zygote是所有Java進程的父進程,我們的App都是由Zygote fork出來的。
Zygote進程主要包含:

  • 加載ZygoteInit類,注冊Zygote Socket服務端套接字;
  • 加載虛擬機;
  • 預加載Android核心類
  • 預加載系統資源

隨后Zygote進程會fork出System Server進程,System Server進程負責啟動和管理整個framework,包括Activity Manager,PowerManager等服務。

當System Server將系統服務啟動就緒后,就會通知ActivityManager啟動首個Android程序Home即我們看到的桌面程序。

至此,從Android手機開機到看到桌面程序所有過程分析完了。

到桌面程序所有過程分析完了。

[外鏈圖片轉存中…(img-ro7lVvHa-1709290459597)]

本文已被CODING開源項目:《Android學習筆記總結+移動架構視頻+大廠面試真題+項目實戰源碼》收錄

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/712061.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/712061.shtml
英文地址,請注明出處:http://en.pswp.cn/news/712061.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

百度SEO工具,自動更新網站的工具

在網站SEO的過程中,不斷更新網站內容是提升排名和吸引流量的關鍵之一。而對于大多數網站管理員來說,頻繁手動更新文章并進行SEO優化可能會是一項繁瑣且耗時的任務。針對這一問題,百度自動更新文章SEO工具應運而生,它能夠幫助網站管…

搭建nginx+keepalived高可用(主備模式)

nginx安裝 1. 前置依賴安裝 yum install gcc gcc-c pcre pcre-devel zlib zlib-devel openssl openssl-devel -y2. 編譯安裝nginx nginx下載地址: https://nginx.org/en/download.html ## 安裝包位置:信息港16.11:/root/shl tar xvf nginx-1.20.2.ta…

chartjs 餅狀圖

之前要把canvas先清除掉&#xff0c;不然刷新數據&#xff0c;還會有前面的圖表 function clearCanvas(){$(#donutChart).remove();$(#chartdiv).append(<canvas id"donutChart" style"min-height: 500px; height: 500px; max-height: 500px; max-width: 70%…

淺談mysql mvcc

目錄 前言 mvcc 是如何工作的&#xff1f; 數據的更新 前言 mvcc 與一個事物的隔離級別有關&#xff0c;未提交讀永遠讀的是當前值&#xff0c;串行化是通過加鎖實現&#xff0c;這兩種隔離級別都與mvcc 沒有任何關系。只要一提到mvcc應該想到的是讀提交以及可重復讀&#…

vue+element ui上傳圖片到七牛云服務器

本來打算做一個全部都是前端完成的資源上傳到七牛云的demo&#xff0c;但是需要獲取token&#xff0c;經歷了九九八十一難&#xff0c;最終還是選擇放棄&#xff0c;token從后端獲取&#xff08;springboot&#xff09;。如果你們有前端直接能解決的麻煩記得私我哦&#xff01;…

『Linux從入門到精通』第 ? 期 - 動靜態庫

文章目錄 &#x1f490;專欄導讀&#x1f490;文章導讀&#x1f427;什么是庫&#xff1f;&#x1f427;為什么要有庫&#xff1f;&#x1f427;寫一個自己的庫&#x1f426;方法一&#x1f426;方法二 靜態庫&#x1f426;標準化&#x1f426;方法三 動態庫&#x1f426;配置動…

python中自定義報錯

class MyError(Exception):def __init__(self,num):#錄入的數Exception.__init__(self)self.numnumdef __str__(self):return 這是我定義的第%d個異常 %(self.num)使用 try:raise MyError(4) except MyError as e:print(e)raise 其作用是指定拋出的異常名稱&#xff0c;以及異常…

題目 1240: 生日日數

題目描述: CCC老師的生日是YY年MM月DD日&#xff0c;他想知道自己出生后第一萬天紀念日的日期&#xff08;出生日算第0天&#xff09;。 代碼: package lanqiao;import java.time.LocalDate; import java.util.*;public class Main {public static void main(String[] args)…

數據結構題目①——數組

前言 本篇文章為博主進行代碼隨想錄——數組練習后的總結會涉及到每一道題目的詳細的思路整理&#xff0c;以及本人的易錯點&#xff0c;希望對大家有所幫助 數組介紹&#xff1a; 數組在C語言中就已經有所涉及&#xff0c;它是一個最基礎的數據結構&#xff0c;而在數據結構中…

Java學習—FileInputStream

在Java編程中&#xff0c;文件操作是日常任務之一。無論是讀取配置文件、處理圖像&#xff0c;還是讀寫日志文件&#xff0c;理解如何有效地進行文件讀取都是非常重要的。Java提供了多種方式來操作文件&#xff0c;而FileInputStream是其中最基礎也是最直接的一種。本文將深入探…

Spring面試系列-01

1. 什么是 Spring 框架? Spring中文翻譯過來是春天的意思,被稱為J2EE的春天,是一個開源的輕量級的Java開發框架, 具有控制反轉(IoC)和面向切面(AOP)兩大核心。Java Spring框架通過聲明式方式靈活地進行事務的管理,提高開發效率和質量。 Spring框架不僅限于服務器端的…

three 層級模型

group.remove(mesh1,mesh2);Vector3與模型位置、縮放屬性 Group層級模型(樹結構) 創建了兩個網格模型mesh1、mesh2&#xff0c;通過THREE.Group類創建一個組對象group,然后通過add方法把網格模型mesh1、mesh2作為設置為組對象group的子對象&#xff0c;然后在通過執行scene.a…

jenkins部署maven項目

流程&#xff1a; jenkins從代碼倉庫讀取代碼&#xff0c;將代碼文件放入jenkins的工作空間&#xff0c;將jenkins工作空間的代碼進行打包&#xff0c;將jar包遠程發送給服務器。 一&#xff1a;所需插件二&#xff1a;Tools 三&#xff1a;System&#xff1a; 配置ssh連接的…

github要求2fa身份驗證

前言 github登陸的時候發現要求2fa驗證, 2fa是啥?咋驗證? 解決 2FA&#xff08;Two-Factor Authentication&#xff0c;雙因素身份驗證&#xff09; 就是在賬戶和密碼的基礎上增加一次驗證碼驗證,這樣即使密碼被竊取,由于黑客沒有你的驗證碼也無法登陸 就像是銀行的u盾一樣…

python63-Python的循環之循環使用else

Python的循環都可以定義else代碼塊&#xff0c;當循環條件為False 時&#xff0c;程序會執行else代碼塊。如下代碼示范了為while循環定義else代碼塊。 # !/usr/bin/env python# -*- coding: utf-8 -*-# Time : 2024/01# Author : Laopicount_i 0while count_i < 5:print(c…

Java集合相關面試題(2024大廠高頻面試題系列)

1、說一說Java提供的常見集合&#xff1f;&#xff08;畫一下集合結構圖&#xff09; 在java中提供了量大類的集合框架&#xff0c;主要分為兩類&#xff1a; 第一個是Collection 屬于單列集合&#xff0c;第二個是Map 屬于雙列集合 在Collection中有兩個子接口List和Set。…

【力扣hot100】刷題筆記Day14

前言 又是新的一周&#xff0c;快樂的周一&#xff0c;快樂地刷題&#xff0c;今天把鏈表搞完再干活&#xff01; 114. 二叉樹展開為鏈表 - 力扣&#xff08;LeetCode&#xff09; 前序遍歷 class Solution:def flatten(self, root: Optional[TreeNode]) -> None:if not r…

回溯 Leetcode 51 N皇后

N皇后 Leetcode 51 學習記錄自代碼隨想錄 按照國際象棋的規則&#xff0c;皇后可以攻擊與之處在同一行或同一列或同一斜線上的棋子。 n 皇后問題 研究的是如何將 n 個皇后放置在 nn 的棋盤上&#xff0c;并且使皇后彼此之間不能相互攻擊。 給你一個整數 n &#xff0c;返回所…

Linux —— 鏈接文件

硬鏈接 一般情況下&#xff0c;文件名和inode號碼是"一一對應"關系&#xff0c;每個inode號碼對應一個文件名。但是&#xff0c;Unix/Linux系統允許&#xff0c;多個文件名指向同一個inode號碼。 這意味著&#xff0c;可以用不同的文件名訪問同樣的內容&#xff1b;對…

軟件開發常見模型解析

軟件開發常見模型解析 摘要&#xff1a;本文將為您詳細介紹軟件開發過程中常見的幾種模型&#xff0c;包括瀑布模型、敏捷開發模型、螺旋模型、迭代模型和原型模型。通過了解這些模型的原理、優缺點&#xff0c;幫助您在不同的軟件項目中選擇最適合的開發模型。 一、引言 在…