當前位置:首頁 » 操作系統 » linux內核啟動

linux內核啟動

發布時間: 2022-04-30 09:05:46

A. linux怎麼選擇啟動內核的順序

單獨定義一個優先順序,把afe相關的初始化都放到那裡面去,
這樣,就可以保證,其他沒什麼相關的沖突了。
最後證實,這樣是可以實現目的的。

具體添加一個新的優先順序的步驟如下:

1.定義新的優先順序

include\linux\init.h中:

#define pure_initcall(fn) __define_initcall("0",fn,1)

#define core_initcall(fn) __define_initcall("1",fn,1)
#define core_initcall_sync(fn) __define_initcall("1s",fn,1s)
#define postcore_initcall(fn) __define_initcall("2",fn,2)
#define postcore_initcall_sync(fn) __define_initcall("2s",fn,2s)
#define arch_initcall(fn) __define_initcall("3",fn,3)
#define arch_initcall_sync(fn) __define_initcall("3s",fn,3s)
#define subsys_initcall(fn) __define_initcall("4",fn,4)
#define subsys_initcall_sync(fn) __define_initcall("4s",fn,4s)
#define fs_initcall(fn) __define_initcall("5",fn,5)
#define fs_initcall_sync(fn) __define_initcall("5s",fn,5s)
#define rootfs_initcall(fn) __define_initcall("rootfs",fn,rootfs)
#if 1
#define prev_device_initcall(fn) __define_initcall("6",fn,6)
#define prev_device_initcall_sync(fn) __define_initcall("6s",fn,6s)
#define device_initcall(fn) __define_initcall("7",fn,7)
#define device_initcall_sync(fn) __define_initcall("7s",fn,7s)
#define late_initcall(fn) __define_initcall("8",fn,8)
#define late_initcall_sync(fn) __define_initcall("8s",fn,8s)

#else
#define device_initcall(fn) __define_initcall("6",fn,6)
#define device_initcall_sync(fn) __define_initcall("6s",fn,6s)
#define late_initcall(fn) __define_initcall("7",fn,7)
#define late_initcall_sync(fn) __define_initcall("7s",fn,7s)
#endif
復制代碼

2.用對應新的宏,定義我們的驅動:
prev_device_initcall(i2c_dev_init);
prev_device_initcall(as352x_afe_i2c_init);
prev_device_initcall(as352x_afe_init);

B. 用新編譯的LINUX內核啟動

修改/boot/grub/grub.conf 裡面有個default=0 0表示第一個,1表示第二個,一次類推。例如我的文件是這樣的。

# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/VolGroup00/LogVol00
# initrd /initrd-version.img
#boot=/dev/hda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.25linux1610-2.6)
root (hd0,0)
kernel /vmlinuz-2.6.25linux1610-2.6 ro root=/dev/VolGroup00/LogVol00
initrd /initrd-2.6.25linux1610-2.6.img
title CentOS (2.6.18-92.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-92.el5 ro root=/dev/VolGroup00/LogVol00
initrd /initrd-2.6.18-92.el5.img
我的default=0,那麼我就是默認啟動下面這個我最新編譯的了。
title CentOS (2.6.25linux1610-2.6)
root (hd0,0)
kernel /vmlinuz-2.6.25linux1610-2.6 ro root=/dev/VolGroup00/LogVol00
initrd /initrd-2.6.25linux1610-2.6.img

C. linux在內核啟動階段主要做什麼工作

1.
初始化cpu、內存
2.
載入c庫
3.
初始化其他硬體、外設(顯卡、網卡、滑鼠鍵盤等等)
4.
載入文件系統

D. 求詳細的linux內核啟動順序,和各個模塊的載入順序,優先順序等。

1. 載入 BIOS 的硬體信息不迚行自我測試,開依據謳定取得第一個可開機的裝置;
2. 讀取開執行第一個開機裝置內 MBR 的 boot Loader (亦即是 grub, spfdisk 等程序);
3. 依據 boot loader 的謳定載入 Kernel ,Kernel 會開始偵測硬體不載入驅勱程序;
4. 在硬體驅勱成功後,Kernel 會主勱呼叨 init 程序,而 init 會取得 run-level 信息;
5. init 執行 /etc/rc.d/rc.sysinit 檔案來准備軟體執行的作業環境 (如網路、時區等);
6. init 執行 run-level 的各個朋務乊吪勱 (script 方弅);
7. init 執行 /etc/rc.d/rc.local 檔案;
8. init 執行終端機仺真程序 mingetty 來吪勱 login 程序,最後就等待用戶登入啦;

E. Linux如何啟動流程Linux啟動流程詳解

當用戶打開電源後,BIOS開機自檢,確定啟動設備,安裝啟動設備,啟動設備上面安裝的GRUB開始引導Linux,Linux首先先進行內核引導,通過跟切換,執行init程序,init程序確定啟動級別,根據啟動級別進行系統初始化和運行的服務,然後返回init啟動終端,用戶通過驗證成功登陸Shell,這就是一個從開機到登陸的啟動過程。

一、硬體引導啟動
當用戶打開電源後POST開始自檢,檢測硬體設備是否確實或者存在故障(是否影響正常開機),如果不影響正常開機,就把任務交給BIOS。BIOS通過搜索,安裝啟動確定啟動設備,啟動項為硬碟,BIOS去讀取硬碟的前512位元組到內存,找到BootLoader,確定GRUB

二、GRUB引導啟動內核
這一部分概況起來就是:GRUB程序載入執行並開始引導kernel程序

Boot Loader就是在操作系統內核運行之前運行的一小段程序。通過GRUB引導可以確定內核程序,因為引導扇區只有446位元組,GRUB只是一個小的程序安裝在裡面,真正使用的在MBR後面的扇區存放,我們想使用Bootloader GRUB功能必須讀取後面的文件,Bootloader GRUB功能程序的運行和載入配置選項分為三個階段

Stage1階段:
Stage1階段其實就是執行系統安裝時預先寫入到MBR的Bootloader中的程序。

Stage1階段的任務僅是將硬碟0柱面0磁軌2扇區的內容讀入內存並執行,它是Stage1.5階段或Stage2階段的入口,引導進入Stage1.5階段或Stage2階段。 在此Stage1階段,還沒有識別文件系統的能力。

Stage1.5階段:
stage1.5階段是stage1階段和stage2階段的中間橋梁。stage1.5階段具有識別啟動分區文件系統的能力,此後GRUB程序便有能力去訪問/boot分區下/grub目錄下的 stage2文件,並將stage2載入內存執行。

Stage2階段
Stage2階段執行時,首先會解析GRUB程序的配置文件grub.conf,並依配置文件決定是否顯示系統啟動菜單。然後載入內核鏡像到內存中,通過initrd程序建立RAMDisk內存虛擬根文件系統。此時控制權將轉交給內核程序。

三、內核引導啟動
這一部分主要是通過在內存中建立虛擬根文件系統實現相關設備的驅動並建立和切換到真正的根文件系統。

解壓內核鏡像載入到內存,以及initrd程序建立RAMDisk內存虛擬根文件系統後,內核開始驅動基本硬體,並調用虛擬根文件系統中的init程序載入驅動模塊初始化系統中各種設備的相關配置工作,其中包括CPU、I/O、存儲設備等。當所需的驅動程序載入完後,會根據grub.conf配置文件中「root=XXX」部分所指定的內容創建一個根設備,然後將根文件系統以只讀的方式掛載,並切換到真正的根文件系統上,同時調用系統進程的/sbin/init程序,進入系統初始化階段。

四、系統初始化
這一步是通過/sbin/init,init程序准備軟體運行壞境,啟動系統服務

通過/etc/inittab文件確定運行級別,然後去執行系統初始化腳本/etc/rc.sysinit,為用戶初始化用戶空間環境,在完成初始化後,根據運行級別,系統開始對應級別的目錄啟動服務,關閉那些不要的服務(裡面S99local -> ../rc.local)用戶自動服務啟動腳本

運行級別:為系統運行或維護等目的而設定;0-6:7個級別
0:關機
1:單用戶模式(root自動登錄), single, 維護模式
2: 多用戶模式,啟動網路功能,但不會啟動NFS;維護模式
3:多用戶模式,正常模式;文本界面
4:預留級別;可同3級別
5:多用戶模式,正常模式;圖形界面
6:重啟
默認級別:3, 5
切換級別:init #
查看級別:runlevel ; who -r
五、啟動終端,用戶登錄
這一步是用戶登錄shell過程

如果沒有改變級別,默認情況執行/sbin/mingetty打開6個純文本終端,讓用戶輸入用戶名和密碼。輸入完成後,再調用login程序,核對密碼。如果密碼正確,就從文件 /etc/passwd 讀取該用戶指定的shell,然後啟動這個shell。更多Linux介紹請查看《Linux就該這么學》。

F. 嵌入式linux系統的啟動流程是什麼樣的

1)
初始化
RAM
因為
Linux
內核一般都會在
RAM
中運行,所以在調用
Linux
內核之前
Bootloader
必須設置和初始化
RAM,為調用
Linux內核
做好准備。初始化
RAM
的任務包括設置
CPU
的控制寄存器參數,以便能正常使用
RAM
以及檢測RAM
大小等。
2)
初始化串口埠

Linux
的啟動過程中有著非常重要的作用,它是
Linux內核和用戶交互的方式之一。Linux
在啟動過程中可以將信息通過串口輸出,這樣便可清楚的了解
Linux
的啟動過程。雖然它並不是
Bootloader
必須要完成的工作,但是通過串口輸出信息是調試
Bootloader
和Linux
內核的強有力的工具,所以一般的
Bootloader
都會在執行過程中初始化一個串口作為調試埠。
3)
檢測
處理器類型
Bootloader在調用
Linux內核前必須檢測系統的處理器類型,並將其保存到某個常量中提供給
Linux
內核。Linux
內核在啟動過程中會根據該處理器類型調用相應的初始化程序。
4)
設置
Linux啟動參數
Bootloader在執行過程中必須設置和初始化
Linux
的內核啟動參數。
5)
調用
Linux內核映像
Bootloader完成的最後一項工作便是調用
Linux內核。如果
Linux
內核存放在
Flash
中,並且可直接在上面運行(這里的
Flash

Nor
Flash),那麼可直接跳轉到內核中去執行。但由於在
Flash
中執行代碼會有種種限制,而且速度也遠不及
RAM
快,所以一般的
嵌入式系統
都是將
Linux內核拷貝到
RAM
中,然後跳轉到
RAM
中去執行。

G. Linux系統開機時啟動內核步驟是什麼

實模式,並開始執行位於地址0xFFFF0處
的代碼,也就是ROM-BIOS起始位置的代碼。BIOS先進行一系列的系統自檢,然後初始化位
於地址0的中斷向量表。最後BIOS將啟動盤的第一個扇區裝入到0x7C00,並開始執行此處
的代碼。這就是對內核初始化過程的一個最簡單的描述。
最初,linux核心的最開始部分是用8086匯編語言編寫的。當開始運行時,核心將自
己裝入到絕對地址0x90000,再將其後的2k位元組裝入到地址0x90200處,最後將核心的其餘
部分裝入到0x10000。
當系統裝入時,會顯示Loading...信息。裝入完成後,控制轉向另一個實模式下的匯
編語言代碼boot/Setup.S。Setup部分首先設置一些系統的硬體設備,然後將核心從
0x10000處移至0x1000處。這時系統轉入保護模式,開始執行位於0x1000處的代碼。
接下來是內核的解壓縮。0x1000處的代碼來自於文件Boot/head.S,它用來初始化寄
存器和調用decompress_kernel( )程序。decompress_kernel( )程序由Boot/inflate.c,
Boot/unzip.c和Boot../misc.c組成。解壓縮後的數據被裝入到了0x100000處,這也是
linux不能在內存小於2M的環境下運行的主要原因。
解壓後的代碼在0x1010000處開始執行,緊接著所有的32位的設置都將完成: IDT、
GDT和LDT將被裝入,處理器初始化完畢,設置好內存頁面,最終調用start_kernel過程。
這大概是整個內核中最為復雜的部分。
[系統開始運行]
linux kernel 最早的C代碼從匯編標記startup_32開始執行
startup_32:
start_kernel
lock_kernel
trap_init
init_IRQ
sched_init
softirq_init
time_init
console_init
#ifdef CONFIG_MODULES
init_moles
#endif
kmem_cache_init
sti
calibrate_delay
mem_init
kmem_cache_sizes_init
pgtable_cache_init
fork_init
proc_caches_init
vfs_caches_init
buffer_init
page_cache_init
signals_init
#ifdef CONFIG_PROC_FS
proc_root_init
#endif
#if defined(CONFIG_SYSVIPC)
ipc_init
#endif
check_bugs
smp_init
rest_init
kernel_thread
unlock_kernel
cpu_idle
・startup_32 [arch/i386/kernel/head.S]
・start_kernel [init/main.c]
・lock_kernel [include/asm/smplock.h]
・trap_init [arch/i386/kernel/traps.c]
・init_IRQ [arch/i386/kernel/i8259.c]
・sched_init [kernel/sched.c]
・softirq_init [kernel/softirq.c]
・time_init [arch/i386/kernel/time.c]
・console_init [drivers/char/tty_io.c]
・init_moles [kernel/mole.c]
・kmem_cache_init [mm/slab.c]
・sti [include/asm/system.h]
・calibrate_delay [init/main.c]
・mem_init [arch/i386/mm/init.c]
・kmem_cache_sizes_init [mm/slab.c]
・pgtable_cache_init [arch/i386/mm/init.c]
・fork_init [kernel/fork.c]
・proc_caches_init
・vfs_caches_init [fs/dcache.c]
・buffer_init [fs/buffer.c]
・page_cache_init [mm/filemap.c]
・signals_init [kernel/signal.c]
・proc_root_init [fs/proc/root.c]
・ipc_init [ipc/util.c]
・check_bugs [include/asm/bugs.h]
・smp_init [init/main.c]
・rest_init
・kernel_thread [arch/i386/kernel/process.c]
・unlock_kernel [include/asm/smplock.h]
・cpu_idle [arch/i386/kernel/process.c]
start_kernel( )程序用於初始化系統內核的各個部分,包括:
*設置內存邊界,調用paging_init( )初始化內存頁面。
*初始化陷阱,中斷通道和調度。
*對命令行進行語法分析。
*初始化設備驅動程序和磁碟緩沖區。
*校對延遲循環。
最後的function'rest_init' 作了以下工作:
・開辟內核線程'init'
・調用unlock_kernel
・建立內核運行的cpu_idle環, 如果沒有調度,就一直死循環
實際上start_kernel永遠不能終止.它會無窮地循環執行cpu_idle.
最後,系統核心轉向move_to_user_mode( ),以便創建初始化進程(init)。此後,進程0開始進入無限循環。
初始化進程開始執行/etc/init、/bin/init 或/sbin /init中的一個之後,系統內核就不再對程序進行直接控制了。之後系統內核的作用主要是給進程提供系統調用,以及提供非同步中斷事件的處理。多任務機制已經建立起來,並開始處理多個用戶的登錄和fork( )創建的進程。
[init]
init是第一個進程,或者說內核線程
init
lock_kernel
do_basic_setup
mtrr_init
sysctl_init
pci_init
sock_init
start_context_thread
do_init_calls
(*call())-> kswapd_init
prepare_namespace
free_initmem
unlock_kernel
execve
[目錄]
--------------------------------------------------------------------------------
啟動步驟
系統引導:
涉及的文件
./arch/$ARCH/boot/bootsect.s
./arch/$ARCH/boot/setup.s
bootsect.S
這個程序是linux kernel的第一個程序,包括了linux自己的bootstrap程序,
但是在說明這個程序前,必須先說明一般IBM PC開機時的動作(此處的開機是指
"打開PC的電源"):
一般PC在電源一開時,是由內存中地址FFFF:0000開始執行(這個地址一定
在ROM BIOS中,ROM BIOS一般是在FEOOOh到FFFFFh中),而此處的內容則是一個
jump指令,jump到另一個位於ROM BIOS中的位置,開始執行一系列的動作,包
括了檢查RAM,keyboard,顯示器,軟硬磁碟等等,這些動作是由系統測試代碼
(system test code)來執行的,隨著製作BIOS廠商的不同而會有些許差異,但都
是大同小異,讀者可自行觀察自家機器開機時,螢幕上所顯示的檢查訊息。
緊接著系統測試碼之後,控制權會轉移給ROM中的啟動程序
(ROM bootstrap routine),這個程序會將磁碟上的第零軌第零扇區讀入
內存中(這就是一般所謂的boot sector,如果你曾接觸過電腦病
毒,就大概聽過它的大名),至於被讀到內存的哪裡呢? --絕對
位置07C0:0000(即07C00h處),這是IBM系列PC的特性。而位在linux開機
磁碟的boot sector上的正是linux的bootsect程序,也就是說,bootsect是
第一個被讀入內存中並執行的程序。現在,我們可以開始來
看看到底bootsect做了什麼。
第一步
首先,bootsect將它"自己"從被ROM BIOS載入的絕對地址0x7C00處搬到
0x90000處,然後利用一個jmpi(jump indirectly)的指令,跳到新位置的
jmpi的下一行去執行,
第二步
接著,將其他segment registers包括DS,ES,SS都指向0x9000這個位置,
與CS看齊。另外將SP及DX指向一任意位移地址( offset ),這個地址等一下
會用來存放磁碟參數表(disk para- meter table )
第三步
接著利用BIOS中斷服務int 13h的第0號功能,重置磁碟控制器,使得剛才
的設定發揮功能。
第四步
完成重置磁碟控制器之後,bootsect就從磁碟上讀入緊鄰著bootsect的setup
程序,也就是setup.S,此讀入動作是利用BIOS中斷服務int 13h的第2號功能。
setup的image將會讀入至程序所指定的內存絕對地址0x90200處,也就是在內存
中緊鄰著bootsect 所在的位置。待setup的image讀入內存後,利用BIOS中斷服
務int 13h的第8號功能讀取目前磁碟的參數。
第五步
再來,就要讀入真正linux的kernel了,也就是你可以在linux的根目錄下看
到的"vmlinuz" 。在讀入前,將會先呼叫BIOS中斷服務int 10h 的第3號功能,
讀取游標位置,之後再呼叫BIOS 中斷服務int 10h的第13h號功能,在螢幕上輸
出字串"Loading",這個字串在boot linux時都會首先被看到,相信大家應該覺
得很眼熟吧。
第六步
接下來做的事是檢查root device,之後就仿照一開始的方法,利用indirect
jump 跳至剛剛已讀入的setup部份
第七步
setup.S完成在實模式下版本檢查,並將硬碟,滑鼠,內存參數寫入到 INITSEG
中,並負責進入保護模式。
第八步
操作系統的初始化。

H. Linux 內核啟動

那麼linux內核和android什麼關系?linux內核是怎樣引導起android呢?本文進行簡單的描述。
android雖然建立在linux內核之上,但是他對內核進行了一些擴展,增加了一些驅動。比如binder,loger等等驅動。可以拿android內核代碼和其baseline版本進行對比。可以看到android對linux內核的所有擴展。
熟悉linux啟動的朋友知道,首先linux引導完成之後,會啟動用戶態的init進程(pid為0),這個進程在整個系統運行過程中起著非常重要的作用,如果你對init進程不了解請查相關資料。init完成系統的初始化工作,然後進入shell,接收用戶的輸入。
android啟動也沒有什麼神秘的,就是用自己的init進程替換了linux內核的init進程,完成自己初始化工作(設備,文件系統等等初始化)。然後啟動自己的虛擬機,程序等等的東西。android的init進程的代碼位於system/core/init/init.c下面,可以去查看其源碼,來了解android啟動詳細流程。android啟動流程的資料網上已經比較多,這里就不贅述了。
可以看到移植android過程中,調試init非常重要。因為所有和硬體平台相關的東西都這里初始化,所以init進程有可能需要移植或者配置。其他的進程都是和硬體無關的,理論上不需要修改就應該能夠運行起來。
經過上面的描述可以看出,android的init進程起著一個承上啟下的作用。

I. linux內核啟動需要哪些

很復雜,大概說說吧。

1:IA-32系統上與體系結構相關的設置

arch/x86/boot/header

1檢查內核是否載入到正確位置

2確定系統內存的大小

3初始化顯卡

4將內核映像移動到內存的某個位置。

5將cpu切換到保護模式

arch/x86/boot/compressed/head_32.S

1創建一個臨時內核棧

2用0位元組填充內核為初始化的數據

3調用arch/x86/boot/compressed/misc_32.c中的c常式decompress_kernel

2:高層初始化(start_kernel)

  1. 子系統初始化

1顯示版本信息

2特定與體系結構的,內存管理的高層設置

3計算命令行參數

4初始化核心數據結構

5確定處理器和系統錯誤

6啟動idle進程init進程

細節不展開了,自己研究吧!

J. 請簡述armlinux內核啟動流程

能流動過程,正應該是會有一個專門的流動,這樣的話才能更好今年取得,所以這個還是要注意的。

熱點內容
安卓11如何隱藏圖標 發布:2024-10-05 09:11:32 瀏覽:701
唐山壹編程 發布:2024-10-05 08:48:07 瀏覽:811
廣東gps時鍾伺服器雲主機 發布:2024-10-05 08:27:31 瀏覽:754
超級訪問沙溢 發布:2024-10-05 08:26:13 瀏覽:227
php刪除數組空 發布:2024-10-05 08:15:21 瀏覽:466
100平小型超市如何配置 發布:2024-10-05 08:10:56 瀏覽:91
sql語句刪除多表 發布:2024-10-05 08:10:55 瀏覽:818
nosql資料庫對比 發布:2024-10-05 08:05:46 瀏覽:944
androidlollipop 發布:2024-10-05 07:40:38 瀏覽:699
買es200哪個配置性價比 發布:2024-10-05 07:33:03 瀏覽:555