⑴ 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
中,並負責進入保護模式。
第八步
操作系統的初始化。
⑵ 如何使linux開機時選擇要進入的內核版本
找了蠻久解決方案的一個問題……
編輯 /etc/default/grub (比如命令:sudo gedit /etc/default/grub)
找到 hidden_timeout 數字改為10,保存
終端執行命令:sudo update-grub
sudo reboot重啟 ,正常的話 會有一個倒計時 那個時候按住shift 然後在菜單欄里選就ok了
⑶ 如何進入安卓手機linux內核
一、需要准備的東西
1
手機必須要Root,沒有的度娘解決。
2
首先安裝 終端模擬器 軟體,稍後有用,度娘一下搞定了。
3
然後是Busybox,這是一款高度集成的Linux小工具集合,也很容易找到,安裝好就行。
4
安裝android VNC ,用於連接遠程桌面。
5
手機內核必須支持loop和ext2文件系統,實踐證明ext3,ext4也是可以的。
(1)檢驗是否支持loop設備
打開 終端模擬器,鍵入命令 ls /dev/block看是否有loopN設備,N是數字。
(2)ext支持不好確定,多數安卓都支持,畢竟是Linux系統出身嘛,後續交代。
6
由於sourceforge伺服器在地球的另一面的美國,所以訪問速度自然是不用吐槽的啦,不過還好鏡像伺服器還是不少的,可以網路搜索sorceforge鏡像
選擇你喜歡用的系統下載下來吧。
這里要下載兩個文件
(1)、鏡像文件
有三個版本,完整版(Large)、精簡版(smalll)、核心版(core)
可以在伺服器相應文件夾下找到zip文件,大小約500MB,解壓出來2GB左右。
* 註:完整版和精簡版有桌面程序,核心版只有命令行界面
(2)、腳本文件
在相應Linux發行版文件夾裡面找到,帶script的zip文件就是了,也下載下來。
END
二、後續操作
下載鏡像和腳本文件之後在/sdcard上創建一個文件夾,名字與相應的linux發行版名字相同,將下載到的zip文件解壓到此處,鏡像和腳本都要解壓到這個文件夾。
比如筆者的Ubuntu 10.04就是在/sdcard上創建一個名為ubuntu的文件夾,然後把ubuntu.img和ubuntu.sh解壓到/sdcard/ubuntu/即可。
然後就是最重要的一步修改腳本了,許多人不成功就是這里沒有修改了。
先看一下腳本文件吧!所有的腳本都是差不多的歐!
如圖
找到圖上第三行的位置,
mount -o remount,rw /dev/block/mmcblk0p5 /system
我們看到這是掛載/system為 可寫 狀態,但是這里卻是掛載的固定是'/dev/block/mmcblk0p5',這腫么可以??要知道安卓的硬體是遍地開花、各式各樣都有,/system的所在的設備也各不相同,比如我的是在/dev/block/mmcblk0p19,以前用的是mmcblk0p12,根本不可能統一的
所以我們需要找到/system究竟對應的是那個分區。
方法:給個比較可靠的方法吧,下載一個和你的手機相對應的刷機包,打開\META-INF\com\google\android\updater-script文件,搜索"/dev/block"關鍵字,找到一條與system相關的一行,看到了這樣一行
format("ext4", "EMMC", "/dev/block/platform/msm_sdcc.1/by-name/system", "0", "/system");
那個帶/dev/block的那個就是你的system分區,用它來替換原來腳本的那一個 /dev/block/mmcblk0p5吧!
我的修改結果是
mount -o remount,rw /dev/block/platform/msm_sdcc.1/by-name/system /system
這里因人而異,不要照搬哦!
然後打開終端模擬器,測試一下
1.輸入 su 並回車,獲取root許可權
2.輸入 cd /sdcard/ubuntu 進入腳本文件所在目錄,這里ubuntu替換你創建的文件夾名字
3.輸入 sh ubuntu.sh ,運行ubuntu系統
到這里理論上是應該成功了
出現圖一這樣的情況時就要輸入解析度了,我的是1280x720,比較常用的還有800x600等
輸入1280x720 ,回車
等待出現 root@localhost:/# 你的Linux已經啟動成功啦
終端模擬器以經連接到ubuntu的終端了
但是沒有桌面讓我們怎樣愉快的玩耍呀?
所以打開AndroidVNC,配置一下 參數
Nickname:隨便寫
Password :你的Linux名稱,我的是ubuntu
Address : 因為是本機運行,所以寫 localhost 或者 127.0.0.1
Port : 默認5900
Username:root
Color Format : 24-color (4bpp)
然後點擊左上角Connect即可
然後就看見了我們期待已久的Ubuntu界面里
但是還有個問題,不支持中文是一個蛋疼的問題啊
所以在安卓系統上找個中文ttf(直接復制/system/fonts/DroidSansFallback.ttf也是可以的)放到/sdcard
進Linux系統後復制字體到
/usr/share/fonts/truetype/ttf-dejavu
重啟就能再見到親切的中文了!
在Linux界面下
1.音量鍵相當於鍵盤的上下箭頭↑↓
2.雙指可以縮放界面,雙指滑動可以滾屏
3.按下菜單鍵-send 可以 觸發特殊鍵 比如 ctrl + alt + delete 關機重啟
4.菜單鍵- Input Mode 可以選擇 滑鼠操作方式 , 推薦選擇touchPad 把觸屏當觸摸板用
⑷ Linux系統調用詳解(如何從用戶空間進入內核
其實進程在內核態和用戶態各有一個堆棧。運行在用戶空間時進程使用的是用戶空間中的堆棧,而運行在內核空間時,進程使用的是內核空間中的堆棧。所以說,Linux 中每個進程有兩個棧,分別用於用戶態和內核態。我其實也不是很理解,如果你想更理解的話可以看下這篇文章,上面講的很詳細網頁鏈接希望對你有幫助啊