一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

linux內(nèi)核啟動(dòng)過(guò)程會(huì)執(zhí)行用戶空間的init進(jìn)程

嵌入式小生 ? 來(lái)源:嵌入式小生 ? 作者:iriczhao ? 2022-10-14 09:12 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

linux內(nèi)核啟動(dòng)過(guò)程的后期,在kernel_init()函數(shù)代表的init線程中,會(huì)嘗試執(zhí)行用戶空間的init進(jìn)程:

a9272532-4b57-11ed-a3b6-dac502259ad0.png

從上述代碼可見(jiàn),會(huì)嘗試執(zhí)行/sbin/、/etc、/bin三個(gè)目錄中的init。從《busybox源碼分析筆記(一)》一文可以知道,在busybox編譯構(gòu)建完成并安裝后,會(huì)生成對(duì)應(yīng)的目錄(注:/etc目錄不存在)。在/sbin目錄中,則會(huì)存在一個(gè)init鏈接:

a955e37c-4b57-11ed-a3b6-dac502259ad0.png

查看其屬性,其本質(zhì)則是鏈接到了../bin/busybox:

a975872c-4b57-11ed-a3b6-dac502259ad0.png

綜上所述,證明linux內(nèi)核啟動(dòng)后期,運(yùn)行的第一個(gè)用戶空間程序是init,在busybox源碼中,init程序則由位于/init目錄中的init.c編譯構(gòu)建而成,程序入口是:init_main(),小生在該函數(shù)中添加一行標(biāo)識(shí)代碼:

a9913efe-4b57-11ed-a3b6-dac502259ad0.png

linux內(nèi)核運(yùn)行后期的結(jié)果如下:

a9b277a4-4b57-11ed-a3b6-dac502259ad0.gif

可見(jiàn),linux內(nèi)核后期加載的就是busybox下的init程序。

init_main分析

貼上該函數(shù)的完整代碼,下文將分段描述:

intinit_main(intargcUNUSED_PARAM,char**argv)
{
structsigactionsa;

INIT_G();

/*SomeuserssendpoweroffsignalstoinitVERYearly.
*Tohandlethis,masksignalsearly.
*/
/*sigemptyset(&G.delayed_sigset);-donebyINIT_G()*/
sigaddset(&G.delayed_sigset,SIGINT);/*Ctrl-Alt-Del*/
sigaddset(&G.delayed_sigset,SIGQUIT);/*re-execanotherinit*/
#ifdefSIGPWR
sigaddset(&G.delayed_sigset,SIGPWR);/*halt*/
#endif
sigaddset(&G.delayed_sigset,SIGUSR1);/*halt*/
sigaddset(&G.delayed_sigset,SIGTERM);/*reboot*/
sigaddset(&G.delayed_sigset,SIGUSR2);/*poweroff*/
#ifENABLE_FEATURE_USE_INITTAB
sigaddset(&G.delayed_sigset,SIGHUP);/*reread/etc/inittab*/
#endif
sigaddset(&G.delayed_sigset,SIGCHLD);/*makesigtimedwait()exitonSIGCHLD*/
sigprocmask(SIG_BLOCK,&G.delayed_sigset,NULL);

#ifDEBUG_SEGV_HANDLER
memset(&sa,0,sizeof(sa));
sa.sa_sigaction=handle_sigsegv;
sa.sa_flags=SA_SIGINFO;
sigaction_set(SIGSEGV,&sa);
sigaction_set(SIGILL,&sa);
sigaction_set(SIGFPE,&sa);
sigaction_set(SIGBUS,&sa);
#endif

if(argv[1]&&strcmp(argv[1],"-q")==0){
returnkill(1,SIGHUP);
}

#if!DEBUG_INIT
/*ExpecttobeinvokedasinitwithPID=1orbeinvokedaslinuxrc*/
if(getpid()!=1
&&(!ENABLE_LINUXRC||applet_name[0]!='l')/*notlinuxrc?*/
){
bb_simple_error_msg_and_die("mustberunasPID1");
}

#ifdefRB_DISABLE_CAD
/*TurnoffrebootingviaCTL-ALT-DEL-wegeta
*SIGINTonCADsowecanshutthingsdowngracefully...*/
reboot(RB_DISABLE_CAD);/*misnomer*/
#endif
#endif

/*If,say,xmallocwouldeverdie,wedon'twanttooopskernel
*byexiting.
*NB:wesetdie_func*after*PID1checkandbb_show_usage.
*Otherwise,forexample,"initu"("pleaserexecyourself"
*commandforsysvinit)willshowhelptext(whichisn'ttoobad),
**andsleepforever*(whichisbad!)
*/
die_func=sleep_much;

/*Figureoutwherethedefaultconsoleshouldbe*/
console_init();
set_sane_term();
xchdir("/");
setsid();

/*Makesureenvironsissettosomethingsane*/
putenv((char*)"HOME=/");
putenv((char*)bb_PATH_root_path);
putenv((char*)"SHELL=/bin/sh");
putenv((char*)"USER=root");/*needed?why?*/

if(argv[1])
xsetenv("RUNLEVEL",argv[1]);

#if!ENABLE_FEATURE_INIT_QUIET
/*Helloworld*/
message(L_CONSOLE|L_LOG,"initstarted:%s",bb_banner);
#endif

/*Checkifwearesupposedtobeinsingleusermode*/
if(argv[1]
&&(strcmp(argv[1],"single")==0||strcmp(argv[1],"-s")==0||LONE_CHAR(argv[1],'1'))
){
/*???shouldn'twesetRUNLEVEL="b"here?*/
/*Startashellonconsole*/
new_init_action(RESPAWN,bb_default_login_shell,"");
}else{
/*Notinsingleusermode-seewhatinittabsays*/

/*NOTEthatifCONFIG_FEATURE_USE_INITTABisNOTdefined,
*thenparse_inittab()simplyaddsinsomedefault
*actions(i.e.,INIT_SCRIPTandapair
*of"askfirst"shells)*/
parse_inittab();
}

#ifENABLE_SELINUX
if(getenv("SELINUX_INIT")==NULL){
intenforce=0;

putenv((char*)"SELINUX_INIT=YES");
if(selinux_init_load_policy(&enforce)==0){
BB_EXECVP(argv[0],argv);
}elseif(enforce>0){
/*SELinuxinenforcingmodebutload_policyfailed*/
message(L_CONSOLE,"can'tloadSELinuxPolicy."
"Machineisinenforcingmode.Haltingnow.");
returnEXIT_FAILURE;
}
}
#endif

#ifENABLE_FEATURE_INIT_MODIFY_CMDLINE
/*Makethecommandlinejustsay"init"-that'sall,nothingelse*/
strncpy(argv[0],"init",strlen(argv[0]));
/*Wipeargv[1]-argv[N]sotheydon'tclutterthepslisting*/
while(*++argv)
nuke_str(*argv);
#endif

/*SetupSTOPsignalhandlers*/
/*StophandlermustallowonlySIGCONTinsideitself*/
memset(&sa,0,sizeof(sa));
sigfillset(&sa.sa_mask);
sigdelset(&sa.sa_mask,SIGCONT);
sa.sa_handler=stop_handler;
sa.sa_flags=SA_RESTART;
sigaction_set(SIGTSTP,&sa);/*pause*/
/*Doesnotworkasintended,atleastin2.6.20.
*SIGSTOPissimplyignoredbyinit
*(NB:behaviormightdifferunderstrace):
*/
sigaction_set(SIGSTOP,&sa);/*pause*/

/*Nowruneverythingthatneedstoberun*/
/*Firstrunthesysinitcommand*/
run_actions(SYSINIT);
check_delayed_sigs(&G.zero_ts);
/*Nextrunanythingthatwantstoblock*/
run_actions(WAIT);
check_delayed_sigs(&G.zero_ts);
/*Nextrunanythingtoberunonlyonce*/
run_actions(ONCE);

/*Nowruntheloopingstufffortherestofforever*/
while(1){
/*(Re)runtherespawn/askfirststuff*/
run_actions(RESPAWN|ASKFIRST);

/*Waitforanysignal(typicallyit'sSIGCHLD)*/
check_delayed_sigs(NULL);/*NULLtimespecmakesitwait*/

/*Waitforanychildprocess(es)toexit*/
while(1){
pid_twpid;
structinit_action*a;

wpid=waitpid(-1,NULL,WNOHANG);
if(wpid<=?0)
????break;

???a?=?mark_terminated(wpid);
???if?(a)?{
????message(L_LOG,?"process?'%s'?(pid?%u)?exited.?"
??????"Scheduling?for?restart.",
??????a->command,(unsigned)wpid);
}
}

/*Don'tconsumeallCPUtime-sleepabit*/
sleep1();
}/*while(1)*/
}

跳過(guò)條件宏定義下的編譯分支,主要分析其通用的代碼部分:

(1)首先使用sigaddset()將信號(hào)添加到信號(hào)集合,添加的信號(hào)有:Ctrl-Alt-Del、SIGQUIT、SIGPWR、SIGUSR1、SIGTERM、SIGUSR2、SIGUSR2。

(2)然后找出系統(tǒng)默認(rèn)的控制臺(tái),并將路徑切換到/,接著重新創(chuàng)建一個(gè)新的會(huì)話:

console_init();
set_sane_term();
xchdir("/");
setsid();

(3)設(shè)置默認(rèn)的環(huán)境變量:

putenv((char*)"HOME=/");
putenv((char*)bb_PATH_root_path);
putenv((char*)"SHELL=/bin/sh");
putenv((char*)"USER=root");/*needed?why?*/

(4)如果是單用戶模式,則會(huì)調(diào)用new_init_action(RESPAWN, bb_default_login_shell, "");在控制臺(tái)啟動(dòng)一個(gè)shell;否則,則會(huì)調(diào)用parse_inittab()函數(shù)。

parse_inittab()函數(shù)定義如下:

staticvoidparse_inittab(void)
{
#ifENABLE_FEATURE_USE_INITTAB
char*token[4];
parser_t*parser=config_open2("/etc/inittab",fopen_for_read);

if(parser==NULL)
#endif
{
/*Noinittabfile-setupsomedefaultbehavior*/
/*Sysinit*/
new_init_action(SYSINIT,INIT_SCRIPT,"");
/*Askfirstshellontty1-4*/
new_init_action(ASKFIRST,bb_default_login_shell,"");
//TODO:VC_1insteadof""?""isconsole->cttyproblems->angryusers
new_init_action(ASKFIRST,bb_default_login_shell,VC_2);
new_init_action(ASKFIRST,bb_default_login_shell,VC_3);
new_init_action(ASKFIRST,bb_default_login_shell,VC_4);
/*RebootonCtrl-Alt-Del*/
new_init_action(CTRLALTDEL,"reboot","");
/*Umountallfilesystemsonhalt/reboot*/
new_init_action(SHUTDOWN,"umount-a-r","");
/*Swapoffonhalt/reboot*/
new_init_action(SHUTDOWN,"swapoff-a","");
/*RestartinitwhenaQUITisreceived*/
new_init_action(RESTART,"init","");
return;
}

#ifENABLE_FEATURE_USE_INITTAB
/*optional_ttyaction:command
*Delimsarenottobecollapsedandneedexactly4tokens
*/
while(config_read(parser,token,4,0,"#:",
PARSE_NORMAL&~(PARSE_TRIM|PARSE_COLLAPSE))){
/*ordermustcorrespondtoSYSINIT..RESTARTconstants*/
staticconstcharactions[]ALIGN1=
"sysinit?""wait?""once?""respawn?""askfirst?"
"ctrlaltdel?""shutdown?""restart?";
intaction;
char*tty=token[0];

if(!token[3])/*lessthan4tokens*/
gotobad_entry;
action=index_in_strings(actions,token[2]);
if(action/dev/TTY*/
if(tty[0]){
tty=concat_path_file("/dev/",skip_dev_pfx(tty));
}
new_init_action(1<lineno);
}
config_close(parser);
#endif
}

如果定義了CONFIG_FEATURE_USE_INITTAB,則會(huì)使用/etc/inittab文件中的action;如果CONFIG_FEATURE_USE_INITTAB沒(méi)有定義,parse_inittab()則會(huì)簡(jiǎn)單添加一些默認(rèn)actions(例如,運(yùn)行INIT_SCRIPT,然后啟動(dòng)一個(gè)“askfirst”shell)。如果ENABLE_FEATURE_USE_INITTAB已定義,但是/etc/inittab文件缺失也會(huì)使用相同的默認(rèn)行為集合。

(5)設(shè)置STOP信號(hào)處理程序:

memset(&sa,0,sizeof(sa));
sigfillset(&sa.sa_mask);
sigdelset(&sa.sa_mask,SIGCONT);
sa.sa_handler=stop_handler;
sa.sa_flags=SA_RESTART;
sigaction_set(SIGTSTP,&sa);/*pause*/

sigaction_set(SIGSTOP,&sa);/*pause*/

(6)接下來(lái)運(yùn)行想要運(yùn)行的命令,依次運(yùn)行:SYSINIT、WAIT、ONCE:

run_actions(SYSINIT);
check_delayed_sigs(&G.zero_ts);

run_actions(WAIT);
check_delayed_sigs(&G.zero_ts);

run_actions(ONCE);

(7)在最后,則是一個(gè)while(1)的死循環(huán),用于處理我們?cè)诿钚邢螺斎氲拿睿?/p>

while(1){
/*重新運(yùn)行respawn/askfisrt*/
run_actions(RESPAWN|ASKFIRST);

/*等待信號(hào)*/
check_delayed_sigs(NULL);/*NULLtimespecmakesitwait*/

/*等待所有的子進(jìn)程退出*/
while(1){
pid_twpid;
structinit_action*a;

wpid=waitpid(-1,NULL,WNOHANG);
if(wpid<=?0)
????break;

???a?=?mark_terminated(wpid);
???if?(a)?{
????message(L_LOG,?"process?'%s'?(pid?%u)?exited.?"
??????"Scheduling?for?restart.",
??????a->command,(unsigned)wpid);
}
}

/*短暫讓出CPU,不要消耗所有的CPU時(shí)間*/
sleep1();
}/*while(1)*/

補(bǔ)充

BusyBox的init不支持運(yùn)行級(jí)別。runlevels字段在BusyBox init中將會(huì)被完全忽略。

所以如果想要使用運(yùn)行級(jí)別的系統(tǒng),需使用sysvinit作為啟動(dòng)進(jìn)程。

一、7個(gè)運(yùn)行級(jí)別

(1)運(yùn)行級(jí)別0:系統(tǒng)停機(jī)狀態(tài),系統(tǒng)默認(rèn)運(yùn)行級(jí)別不能設(shè)為0,否則不能正常啟動(dòng)。其實(shí)就是關(guān)機(jī)。

(2)運(yùn)行級(jí)別1:?jiǎn)斡脩艄ぷ鳡顟B(tài),root權(quán)限,用于系統(tǒng)維護(hù),禁止遠(yuǎn)程登陸。在忘記root密碼時(shí)一般用這個(gè)運(yùn)行級(jí)別,進(jìn)去修改root密碼。

(3)運(yùn)行級(jí)別2:多用戶狀態(tài)(沒(méi)有NFS),沒(méi)有網(wǎng)絡(luò)連接。

(4)運(yùn)行級(jí)別3:完全的多用戶狀態(tài)(有NFS),登陸后進(jìn)入控制臺(tái)命令行模式。linux很常見(jiàn)的運(yùn)行級(jí)別

(5)運(yùn)行級(jí)別4:系統(tǒng)未使用,保留。

(6)運(yùn)行級(jí)別5:X11控制臺(tái),登陸后進(jìn)入圖形GUI模式。就是圖形模式。

(7)運(yùn)行級(jí)別6:系統(tǒng)正常關(guān)閉并重啟,默認(rèn)運(yùn)行級(jí)別不能設(shè)為6,否則不能正常啟動(dòng)。

二、查看運(yùn)行級(jí)別

1、runlevel命令:打印系統(tǒng)的上一個(gè)和當(dāng)前運(yùn)行級(jí)別:

aa1518dc-4b57-11ed-a3b6-dac502259ad0.png

N:“N”表示自系統(tǒng)啟動(dòng)后運(yùn)行級(jí)別尚未更改。從上圖可見(jiàn),小生的Ubuntu系統(tǒng)的運(yùn)行級(jí)別為5。





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • busybox
    +關(guān)注

    關(guān)注

    0

    文章

    22

    瀏覽量

    11505
  • GUI
    GUI
    +關(guān)注

    關(guān)注

    3

    文章

    679

    瀏覽量

    41272
  • LINUX內(nèi)核
    +關(guān)注

    關(guān)注

    1

    文章

    317

    瀏覽量

    22424
  • NFS
    NFS
    +關(guān)注

    關(guān)注

    1

    文章

    56

    瀏覽量

    26546
  • Ubuntu系統(tǒng)
    +關(guān)注

    關(guān)注

    0

    文章

    92

    瀏覽量

    4310

原文標(biāo)題:busybox源碼分析筆記(二) | init程序

文章出處:【微信號(hào):嵌入式小生,微信公眾號(hào):嵌入式小生】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Linux內(nèi)核啟動(dòng)過(guò)程和Bootloader(總述)

    函數(shù),它主要完成剩余的與硬件平臺(tái)相關(guān)的初始化工作,在進(jìn)行一系列與內(nèi)核相關(guān)的初始化后,調(diào)用第一個(gè)用戶進(jìn)程init 進(jìn)程并等待
    發(fā)表于 08-18 17:35

    android--系統(tǒng)啟動(dòng)--init進(jìn)程啟動(dòng)過(guò)程如何

    android--系統(tǒng)啟動(dòng)--init進(jìn)程啟動(dòng)過(guò)程
    發(fā)表于 05-29 10:35

    【HarmonyOS HiSpark IPC DIY Camera試用連載 】鴻蒙OS內(nèi)核如何啟動(dòng)第一個(gè)用戶進(jìn)程init_lite

    ,當(dāng)前包括:Hi3516DV300平臺(tái)和Hi3518EV300平臺(tái)。 負(fù)責(zé)處理從內(nèi)核加載第一個(gè)用戶態(tài)進(jìn)程開(kāi)始,到第一個(gè)應(yīng)用程序啟動(dòng)之間的系統(tǒng)服務(wù)進(jìn)程
    發(fā)表于 11-20 10:27

    [文章] 【HarmonyOS HiSpark IPC DIY Camera試用連載 】鴻蒙OS內(nèi)核如何啟動(dòng)第一個(gè)用戶進(jìn)程init_lite

    :Hi3516DV300平臺(tái)和Hi3518EV300平臺(tái)。負(fù)責(zé)處理從內(nèi)核加載第一個(gè)用戶態(tài)進(jìn)程開(kāi)始,到第一個(gè)應(yīng)用程序啟動(dòng)之間的系統(tǒng)服務(wù)進(jìn)程
    發(fā)表于 11-20 16:44

    Linux內(nèi)核啟動(dòng)過(guò)程解析

    Uart驅(qū)動(dòng)卻把串口設(shè)備名寫(xiě)死了,如本例中linux2.6.37串口設(shè)備名為ttyO0,而不是常用的ttyS0。有了控制臺(tái)內(nèi)核啟動(dòng)過(guò)程中就可以通過(guò)串口輸出信息以便開(kāi)發(fā)者或用戶了解系統(tǒng)
    發(fā)表于 10-26 17:20

    嵌入式uCLinux內(nèi)核啟動(dòng)過(guò)程分析

    分析uCLinux的啟動(dòng)過(guò)程,可以加快系統(tǒng)啟動(dòng)速度、正確建立應(yīng)用環(huán)境。本文要研究的就是uCLinux操作系統(tǒng)內(nèi)核啟動(dòng)過(guò)程。
    發(fā)表于 08-15 16:51 ?857次閱讀

    init函數(shù)和init進(jìn)程的區(qū)別

    由于執(zhí)行init()函數(shù)的內(nèi)核線程和init進(jìn)程進(jìn)程標(biāo)識(shí)符都是1,它們又都叫
    發(fā)表于 01-05 10:49 ?1782次閱讀

    Linux基礎(chǔ)命令之Linux啟動(dòng)過(guò)程詳解

    。 2.2.1 概述 用戶開(kāi)機(jī)啟動(dòng)Linux過(guò)程如下: (1)當(dāng)用戶打開(kāi)PC(intel CPU)的電源時(shí),CPU將自動(dòng)進(jìn)入實(shí)模式,并從地址
    發(fā)表于 10-18 14:17 ?2次下載
    <b class='flag-5'>Linux</b>基礎(chǔ)命令之<b class='flag-5'>Linux</b><b class='flag-5'>啟動(dòng)過(guò)程</b>詳解

    試述shell的啟動(dòng)過(guò)程詳情

    進(jìn)程結(jié)束后wait函數(shù)會(huì)返回,從而shell收到通知并回收資源。本文主要說(shuō)明shell如何啟動(dòng)用戶進(jìn)程,Linux系統(tǒng)中可
    發(fā)表于 11-15 11:06 ?3891次閱讀
    試述shell的<b class='flag-5'>啟動(dòng)過(guò)程</b>詳情

    詳解bootloader的執(zhí)行流程與ARM Linux啟動(dòng)過(guò)程分析

    S3C2410 ARM處理器為例,詳細(xì)分析了系統(tǒng)上電后 bootloader的執(zhí)行流程及 ARM Linux啟動(dòng)過(guò)程。
    的頭像 發(fā)表于 12-21 09:24 ?1.1w次閱讀
    詳解bootloader的<b class='flag-5'>執(zhí)行</b>流程與ARM <b class='flag-5'>Linux</b><b class='flag-5'>啟動(dòng)過(guò)程</b>分析

    走進(jìn)Linux之systemd啟動(dòng)過(guò)程

    Linux系統(tǒng)的啟動(dòng)方式有點(diǎn)復(fù)雜,而且總是有需要優(yōu)化的地方。傳統(tǒng)的Linux系統(tǒng)啟動(dòng)過(guò)程主要由著名的init
    發(fā)表于 04-27 19:14 ?3384次閱讀

    Linux系統(tǒng)下init進(jìn)程的前世今生

    kernel_thread產(chǎn)生的進(jìn)程,其開(kāi)始在內(nèi)核態(tài)執(zhí)行,然后通過(guò)一個(gè)系統(tǒng)調(diào)用,開(kāi)始執(zhí)行用戶空間
    發(fā)表于 04-28 17:23 ?1106次閱讀

    解析基于ARM64的init用戶進(jìn)程究竟如何啟動(dòng)?

    [導(dǎo)讀] 前面的文章有提到linux啟動(dòng)的第一個(gè)進(jìn)程init,那么該進(jìn)程究竟是如何從內(nèi)核
    發(fā)表于 01-26 17:05 ?2次下載
    解析基于ARM64的<b class='flag-5'>init</b><b class='flag-5'>用戶</b><b class='flag-5'>進(jìn)程</b>究竟如何<b class='flag-5'>啟動(dòng)</b>?

    kernel執(zhí)行第一個(gè)init應(yīng)用程序的實(shí)現(xiàn)原理

    Linux系統(tǒng)啟動(dòng)過(guò)程中通過(guò)`init_task`創(chuàng)建0號(hào)idle進(jìn)程。然后通過(guò)`kernel_thread`創(chuàng)建1號(hào)init
    的頭像 發(fā)表于 06-05 14:53 ?1446次閱讀
    kernel<b class='flag-5'>執(zhí)行</b>第一個(gè)<b class='flag-5'>init</b>應(yīng)用程序的實(shí)現(xiàn)原理

    kernel到android核心啟動(dòng)過(guò)程

    總結(jié)一個(gè)圖:kernel 到android核心啟動(dòng)過(guò)程 kernel鏡像執(zhí)行跳轉(zhuǎn)到start_kernel開(kāi)始執(zhí)行,在rest_init會(huì)創(chuàng)
    的頭像 發(fā)表于 12-04 16:59 ?1538次閱讀
    kernel到android核心<b class='flag-5'>啟動(dòng)過(guò)程</b>