青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 297,  comments - 15,  trackbacks - 0
簡(jiǎn)介: 引導(dǎo) Linux® 系統(tǒng)的過(guò)程包括很多階段。不管您是引導(dǎo)一個(gè)標(biāo)準(zhǔn)的 x86 桌面系統(tǒng),還是引導(dǎo)一臺(tái)嵌入式的 PowerPC® 機(jī)器,很多流程都驚人地相似。本文將探索 Linux 的引導(dǎo)過(guò)程,從最初的引導(dǎo)到啟動(dòng)第一個(gè)用戶空間應(yīng)用程序。在本文介紹的過(guò)程中,您將學(xué)習(xí)到各種與引導(dǎo)有關(guān)的主題,例如引導(dǎo)加載程序、內(nèi)核解壓、初始 RAM 磁盤(pán)以及 Linux 引導(dǎo)的其他一些元素。

早期時(shí),啟動(dòng)一臺(tái)計(jì)算機(jī)意味著要給計(jì)算機(jī)喂一條包含引導(dǎo)程序的紙帶,或者手工使用前端面板地址/數(shù)據(jù)/控制開(kāi)關(guān)來(lái)加載引導(dǎo)程序。盡管目前的計(jì)算機(jī)已經(jīng)裝備了很多工具來(lái)簡(jiǎn)化引導(dǎo)過(guò)程,但是這一切并沒(méi)有對(duì)整個(gè)過(guò)程進(jìn)行必要的簡(jiǎn)化。

讓我們先從高級(jí)的視角來(lái)查看 Linux 引導(dǎo)過(guò)程,這樣就可以看到整個(gè)過(guò)程的全貌了。然后將回顧一下在各個(gè)步驟到底發(fā)生了什么。在整個(gè)過(guò)程中,參考一下內(nèi)核源代碼可以幫助我們更好地了解內(nèi)核源代碼樹(shù),并在以后對(duì)其進(jìn)行深入分析。

概述

圖 1 是我們?cè)?20,000 英尺的高度看到的視圖。


圖 1. Linux 引導(dǎo)過(guò)程在 20,000 英尺處的視圖
Linux 引導(dǎo)過(guò)程在 20,000 英尺處的視圖 

當(dāng)系統(tǒng)首次引導(dǎo)時(shí),或系統(tǒng)被重置時(shí),處理器會(huì)執(zhí)行一個(gè)位于已知位置處的代碼。在個(gè)人計(jì)算機(jī)(PC)中,這個(gè)位置在基本輸入/輸出系統(tǒng)(BIOS)中,它保存在主板上的閃存中。嵌入式系統(tǒng)中的中央處理單元(CPU)會(huì)調(diào)用這個(gè)重置向量來(lái)啟動(dòng)一個(gè)位于閃存/ROM 中的已知地址處的程序。在這兩種情況下,結(jié)果都是相同的。因?yàn)?PC 提供了很多靈活性,BIOS 必須確定要使用哪個(gè)設(shè)備來(lái)引導(dǎo)系統(tǒng)。稍后我們將詳細(xì)介紹這個(gè)過(guò)程。

當(dāng)找到一個(gè)引導(dǎo)設(shè)備之后,第一階段的引導(dǎo)加載程序就被裝入 RAM 并執(zhí)行。這個(gè)引導(dǎo)加載程序在大小上小于 512 字節(jié)(一個(gè)扇區(qū)),其作用是加載第二階段的引導(dǎo)加載程序。

當(dāng)?shù)诙A段的引導(dǎo)加載程序被裝入 RAM 并執(zhí)行時(shí),通常會(huì)顯示一個(gè)動(dòng)畫(huà)屏幕,并將 Linux 和一個(gè)可選的初始 RAM 磁盤(pán)(臨時(shí)根文件系統(tǒng))加載到內(nèi)存中。在加載映像時(shí),第二階段的引導(dǎo)加載程序就會(huì)將控制權(quán)交給內(nèi)核映像,然后內(nèi)核就可以進(jìn)行解壓和初始化了。在這個(gè)階段中,第二階段的引導(dǎo)加載程序會(huì)檢測(cè)系統(tǒng)硬件、枚舉系統(tǒng)鏈接的硬件設(shè)備、掛載根設(shè)備,然后加載必要的內(nèi)核模塊。完成這些操作之后啟動(dòng)第一個(gè)用戶空間程序(init),并執(zhí)行高級(jí)系統(tǒng)初始化工作。

這就是 Linux 引導(dǎo)的整個(gè)過(guò)程。現(xiàn)在讓我們深入挖掘一下這個(gè)過(guò)程,并深入研究一下 Linux 引導(dǎo)過(guò)程的一些詳細(xì)信息。

系統(tǒng)啟動(dòng)

系統(tǒng)啟動(dòng)階段依賴于引導(dǎo) Linux 系統(tǒng)上的硬件。在嵌入式平臺(tái)中,當(dāng)系統(tǒng)加電或重置時(shí),會(huì)使用一個(gè)啟動(dòng)環(huán)境。這方面的例子包括 U-Boot、RedBoot 和 Lucent 的 MicroMonitor。嵌入式平臺(tái)通常都是與引導(dǎo)監(jiān)視器搭配銷售的。這些程序位于目標(biāo)硬件上的閃存中的某一段特殊區(qū)域,它們提供了將 Linux 內(nèi)核映像下載到閃存并繼續(xù)執(zhí)行的方法。除了可以存儲(chǔ)并引導(dǎo) Linux 映像之外,這些引導(dǎo)監(jiān)視器還執(zhí)行一定級(jí)別的系統(tǒng)測(cè)試和硬件初始化過(guò)程。在嵌入式平臺(tái)中,這些引導(dǎo)監(jiān)視器通常會(huì)涉及第一階段和第二階段的引導(dǎo)加載程序。

提取 MBR 的信息

要查看 MBR 的內(nèi)容,請(qǐng)使用下面的命令:

dd if=/dev/hda of=mbr.bin bs=512 count=1 #od -xa mbr.bin

這個(gè) dd 命令需要以 root 用戶的身份運(yùn)行,它從 /dev/hda(第一個(gè) IDE 盤(pán)) 上讀取前 512 個(gè)字節(jié)的內(nèi)容,并將其寫(xiě)入 mbr.bin 文件中。od 命令會(huì)以十六進(jìn)制和 ASCII 碼格式打印這個(gè)二進(jìn)制文件的內(nèi)容。

在 PC 中,引導(dǎo) Linux 是從 BIOS 中的地址 0xFFFF0 處開(kāi)始的。BIOS 的第一個(gè)步驟是加電自檢(POST)。POST 的工作是對(duì)硬件進(jìn)行檢測(cè)。BIOS 的第二個(gè)步驟是進(jìn)行本地設(shè)備的枚舉和初始化。

給定 BIOS 功能的不同用法之后,BIOS 由兩部分組成:POST 代碼和運(yùn)行時(shí)服務(wù)。當(dāng) POST 完成之后,它被從內(nèi)存中清理了出來(lái),但是 BIOS 運(yùn)行時(shí)服務(wù)依然保留在內(nèi)存中,目標(biāo)操作系統(tǒng)可以使用這些服務(wù)。

要引導(dǎo)一個(gè)操作系統(tǒng),BIOS 運(yùn)行時(shí)會(huì)按照 CMOS 的設(shè)置定義的順序來(lái)搜索處于活動(dòng)狀態(tài)并且可以引導(dǎo)的設(shè)備。引導(dǎo)設(shè)備可以是軟盤(pán)、CD-ROM、硬盤(pán)上的某個(gè)分區(qū)、網(wǎng)絡(luò)上的某個(gè)設(shè)備,甚至是 USB 閃存。

通常,Linux 都是從硬盤(pán)上引導(dǎo)的,其中主引導(dǎo)記錄(MBR)中包含主引導(dǎo)加載程序。MBR 是一個(gè) 512 字節(jié)大小的扇區(qū),位于磁盤(pán)上的第一個(gè)扇區(qū)中(0 道 0 柱面 1 扇區(qū))。當(dāng) MBR 被加載到 RAM 中之后,BIOS 就會(huì)將控制權(quán)交給 MBR。

 

第一階段引導(dǎo)加載程序

MBR 中的主引導(dǎo)加載程序是一個(gè) 512 字節(jié)大小的映像,其中包含程序代碼和一個(gè)小分區(qū)表(參見(jiàn)圖 2)。前 446 個(gè)字節(jié)是主引導(dǎo)加載程序,其中包含可執(zhí)行代碼和錯(cuò)誤消息文本。接下來(lái)的 64 個(gè)字節(jié)是分區(qū)表,其中包含 4 個(gè)分區(qū)的記錄(每個(gè)記錄的大小是 16 個(gè)字節(jié))。MBR 以兩個(gè)特殊數(shù)字的字節(jié)(0xAA55)結(jié)束。這個(gè)數(shù)字會(huì)用來(lái)進(jìn)行 MBR 的有效性檢查。


圖 2. MBR 剖析
MBR 剖析 

主引導(dǎo)加載程序的工作是查找并加載次引導(dǎo)加載程序(第二階段)。它是通過(guò)在分區(qū)表中查找一個(gè)活動(dòng)分區(qū)來(lái)實(shí)現(xiàn)這種功能的。當(dāng)找到一個(gè)活動(dòng)分區(qū)時(shí),它會(huì)掃描分區(qū)表中的其他分區(qū),以確保它們都不是活動(dòng)的。當(dāng)這個(gè)過(guò)程驗(yàn)證完成之后,就將活動(dòng)分區(qū)的引導(dǎo)記錄從這個(gè)設(shè)備中讀入 RAM 中并執(zhí)行它。

 

第二階段引導(dǎo)加載程序

次引導(dǎo)加載程序(第二階段引導(dǎo)加載程序)可以更形象地稱為內(nèi)核加載程序。這個(gè)階段的任務(wù)是加載 Linux 內(nèi)核和可選的初始 RAM 磁盤(pán)。

GRUB 階段引導(dǎo)加載程序

/boot/grub 目錄中包含了 stage1stage1.5 和 stage2 引導(dǎo)加載程序,以及很多其他加載程序(例如,CR-ROM 使用的是 iso9660_stage_1_5)。

在 x86 PC 環(huán)境中,第一階段和第二階段的引導(dǎo)加載程序一起稱為 Linux Loader(LILO)或 GRand Unified Bootloader(GRUB)。由于 LILO 有一些缺點(diǎn),而 GRUB 克服了這些缺點(diǎn),因此下面讓我們就來(lái)看一下 GRUB。(有關(guān) GRUB、LILO 和相關(guān)主題的更多內(nèi)容,請(qǐng)參閱本文后面的 參考資料 部分的內(nèi)容。)

關(guān)于 GRUB,很好的一件事情是它包含了有關(guān) Linux 文件系統(tǒng)的知識(shí)。GRUB 不像 LILO 一樣使用裸扇區(qū),而是可以從 ext2 或 ext3 文件系統(tǒng)中加載 Linux 內(nèi)核。它是通過(guò)將兩階段的引導(dǎo)加載程序轉(zhuǎn)換成三階段的引導(dǎo)加載程序來(lái)實(shí)現(xiàn)這項(xiàng)功能的。階段 1 (MBR)引導(dǎo)了一個(gè)階段 1.5 的引導(dǎo)加載程序,它可以理解包含 Linux 內(nèi)核映像的特殊文件系統(tǒng)。這方面的例子包括 reiserfs_stage1_5(要從 Reiser 日志文件系統(tǒng)上進(jìn)行加載)或 e2fs_stage1_5(要從 ext2 或 ext3 文件系統(tǒng)上進(jìn)行加載)。當(dāng)階段 1.5 的引導(dǎo)加載程序被加載并運(yùn)行時(shí),階段 2 的引導(dǎo)加載程序就可以進(jìn)行加載了。

當(dāng)階段 2 加載之后,GRUB 就可以在請(qǐng)求時(shí)顯示可用內(nèi)核列表(在 /etc/grub.conf 中進(jìn)行定義,同時(shí)還有幾個(gè)軟符號(hào)鏈接/etc/grub/menu.lst 和 /etc/grub.conf)。我們可以選擇內(nèi)核甚至修改附加內(nèi)核參數(shù)。另外,我們也可以使用一個(gè)命令行的 shell 對(duì)引導(dǎo)過(guò)程進(jìn)行高級(jí)手工控制。

將第二階段的引導(dǎo)加載程序加載到內(nèi)存中之后,就可以對(duì)文件系統(tǒng)進(jìn)行查詢了,并將默認(rèn)的內(nèi)核映像和 initrd 映像加載到內(nèi)存中。當(dāng)這些映像文件準(zhǔn)備好之后,階段 2 的引導(dǎo)加載程序就可以調(diào)用內(nèi)核映像了。

內(nèi)核

GRUB 中的手工引導(dǎo)

在 GRUB 命令行中,我們可以使用 initrd 映像引導(dǎo)一個(gè)特定的內(nèi)核,方法如下:

grub> kernel /bzImage-2.6.14.2
[Linux-bzImage, setup=0x1400, size=0x29672e]
grub> initrd /initrd-2.6.14.2.img
[Linux-initrd @ 0x5f13000, 0xcc199 bytes]
grub> boot
Uncompressing Linux... Ok, booting the kernel.

如果您不知道要引導(dǎo)的內(nèi)核的名稱,只需使用斜線(/)然后按下 Tab 鍵即可。GRUB 會(huì)顯示內(nèi)核和 initrd 映像列表。

當(dāng)內(nèi)核映像被加載到內(nèi)存中,并且階段 2 的引導(dǎo)加載程序釋放控制權(quán)之后,內(nèi)核階段就開(kāi)始了。內(nèi)核映像并不是一個(gè)可執(zhí)行的內(nèi)核,而是一個(gè)壓縮過(guò)的內(nèi)核映像。通常它是一個(gè) zImage(壓縮映像,小于 512KB)或一個(gè) bzImage(較大的壓縮映像,大于 512KB),它是提前使用 zlib 進(jìn)行壓縮過(guò)的。在這個(gè)內(nèi)核映像前面是一個(gè)例程,它實(shí)現(xiàn)少量硬件設(shè)置,并對(duì)內(nèi)核映像中包含的內(nèi)核進(jìn)行解壓,然后將其放入高端內(nèi)存中,如果有初始 RAM 磁盤(pán)映像,就會(huì)將它移動(dòng)到內(nèi)存中,并標(biāo)明以后使用。然后該例程會(huì)調(diào)用內(nèi)核,并開(kāi)始啟動(dòng)內(nèi)核引導(dǎo)的過(guò)程。

當(dāng) bzImage(用于 i386 映像)被調(diào)用時(shí),我們從./arch/i386/boot/head.S 的 start 匯編例程開(kāi)始執(zhí)行(主要流程圖請(qǐng)參看圖 3)。這個(gè)例程會(huì)執(zhí)行一些基本的硬件設(shè)置,并調(diào)用./arch/i386/boot/compressed/head.S 中的 startup_32 例程。此例程會(huì)設(shè)置一個(gè)基本的環(huán)境(堆棧等),并清除 Block Started by Symbol(BSS)。然后調(diào)用一個(gè)叫做 decompress_kernel 的 C 函數(shù)(在./arch/i386/boot/compressed/misc.c 中)來(lái)解壓內(nèi)核。當(dāng)內(nèi)核被解壓到內(nèi)存中之后,就可以調(diào)用它了。這是另外一個(gè) startup_32 函數(shù),但是這個(gè)函數(shù)在 ./arch/i386/kernel/head.S 中。

 vi arch/x86/{boot/{header.S,compressed/{head_{32,64}.S,misc.c},kernel/head.S}} init/main.c

在這個(gè)新的 startup_32 函數(shù)(也稱為清除程序或進(jìn)程 0)中,會(huì)對(duì)頁(yè)表進(jìn)行初始化,并啟用內(nèi)存分頁(yè)功能。然后會(huì)為任何可選的浮點(diǎn)單元(FPU)檢測(cè) CPU 的類型,并將其存儲(chǔ)起來(lái)供以后使用。然后調(diào)用 start_kernel 函數(shù)(在 init/main.c 中),它會(huì)將您帶入與體系結(jié)構(gòu)無(wú)關(guān)的 Linux 內(nèi)核部分。實(shí)際上,這就是 Linux 內(nèi)核的 main 函數(shù)。


圖 3. Linux 內(nèi)核 i386 引導(dǎo)的主要函數(shù)流程 
Linux 內(nèi)核 i386 引導(dǎo)的主要函數(shù)流程  

通過(guò)調(diào)用 start_kernel,會(huì)調(diào)用一系列初始化函數(shù)來(lái)設(shè)置中斷,執(zhí)行進(jìn)一步的內(nèi)存配置,并加載初始 RAM 磁盤(pán)。最后,要調(diào)用kernel_thread(在 arch/i386/kernel/process.c 中)來(lái)啟動(dòng) init 函數(shù),這是第一個(gè)用戶空間進(jìn)程(user-space process)。最后,啟動(dòng)空任務(wù),現(xiàn)在調(diào)度器就可以接管控制權(quán)了(在調(diào)用 cpu_idle 之后)。通過(guò)啟用中斷,搶占式的調(diào)度器就可以周期性地接管控制權(quán),從而提供多任務(wù)處理能力。

在內(nèi)核引導(dǎo)過(guò)程中,初始 RAM 磁盤(pán)(initrd)是由階段 2 引導(dǎo)加載程序加載到內(nèi)存中的,它會(huì)被復(fù)制到 RAM 中并掛載到系統(tǒng)上。這個(gè) initrd 會(huì)作為 RAM 中的臨時(shí)根文件系統(tǒng)使用,并允許內(nèi)核在沒(méi)有掛載任何物理磁盤(pán)的情況下完整地實(shí)現(xiàn)引導(dǎo)。由于與外圍設(shè)備進(jìn)行交互所需要的模塊可能是 initrd 的一部分,因此內(nèi)核可以非常小,但是仍然需要支持大量可能的硬件配置。在內(nèi)核引導(dǎo)之后,就可以正式裝備根文件系統(tǒng)了(通過(guò) pivot_root):此時(shí)會(huì)將 initrd 根文件系統(tǒng)卸載掉,并掛載真正的根文件系統(tǒng)。

decompress_kernel 輸出

函數(shù) decompress_kernel 就是顯示我們通常看到的解壓消息的地方:

Uncompressing Linux... Ok, booting the kernel.

initrd 函數(shù)讓我們可以創(chuàng)建一個(gè)小型的 Linux 內(nèi)核,其中包括作為可加載模塊編譯的驅(qū)動(dòng)程序。這些可加載的模塊為內(nèi)核提供了訪問(wèn)磁盤(pán)和磁盤(pán)上的文件系統(tǒng)的方法,并為其他硬件提供了驅(qū)動(dòng)程序。由于根文件系統(tǒng)是磁盤(pán)上的一個(gè)文件系統(tǒng),因此 initrd 函數(shù)會(huì)提供一種啟動(dòng)方法來(lái)獲得對(duì)磁盤(pán)的訪問(wèn),并掛載真正的根文件系統(tǒng)。在一個(gè)沒(méi)有硬盤(pán)的嵌入式環(huán)境中,initrd 可以是最終的根文件系統(tǒng),或者也可以通過(guò)網(wǎng)絡(luò)文件系統(tǒng)(NFS)來(lái)掛載最終的根文件系統(tǒng)。

 

Init

當(dāng)內(nèi)核被引導(dǎo)并進(jìn)行初始化之后,內(nèi)核就可以啟動(dòng)自己的第一個(gè)用戶空間應(yīng)用程序了。這是第一個(gè)調(diào)用的使用標(biāo)準(zhǔn) C 庫(kù)編譯的程序。在此之前,還沒(méi)有執(zhí)行任何標(biāo)準(zhǔn)的 C 應(yīng)用程序。

在桌面 Linux 系統(tǒng)上,第一個(gè)啟動(dòng)的程序通常是 /sbin/init。但是這不是一定的。很少有嵌入式系統(tǒng)會(huì)需要使用 init 所提供的豐富初始化功能(這是通過(guò) /etc/inittab 進(jìn)行配置的)。在很多情況下,我們可以調(diào)用一個(gè)簡(jiǎn)單的 shell 腳本來(lái)啟動(dòng)必需的嵌入式應(yīng)用程序。

 

結(jié)束語(yǔ)

與 Linux 本身非常類似,Linux 的引導(dǎo)過(guò)程也非常靈活,可以支持眾多的處理器和硬件平臺(tái)。最初,加載引導(dǎo)加載程序提供了一種簡(jiǎn)單的方法,不用任何花架子就可以引導(dǎo) Linux。LILO 引導(dǎo)加載程序?qū)σ龑?dǎo)能力進(jìn)行了擴(kuò)充,但是它卻缺少文件系統(tǒng)的感知能力。最新一代的引導(dǎo)加載程序,例如 GRUB,允許 Linux 從一些文件系統(tǒng)(從 Minix 到 Reise)上進(jìn)行引導(dǎo)。


參考資料

學(xué)習(xí)

  • 您可以參閱本文在 developerWorks 全球站點(diǎn)上的 英文原文 。

  • Boot Records Revealed 是有關(guān) MBR 和各種引導(dǎo)加載程序很好的資源。這個(gè)資源不僅僅是有關(guān) MBR 的資料的匯編,還討論了 GRUB、LILO 和各種 Windows® 引導(dǎo)加載程序的問(wèn)題。 

  • 請(qǐng)查看 Disk Geometry 頁(yè)面來(lái)理解磁盤(pán)及其結(jié)構(gòu)。您會(huì)發(fā)現(xiàn)有關(guān)磁盤(pán)的有用屬性。 

  • live CD 是一個(gè)可以從 CD 或 DVD 上引導(dǎo)的操作系統(tǒng),它不需要使用硬盤(pán)。 

  • 引導(dǎo)加載程序之爭(zhēng):了解 LILO 和 GRUB”(developerWorks,2005 年 8 月)詳細(xì)介紹了 LILO 和 GRUB 引導(dǎo)加載程序。 

  • 在 developerWorks 上的 LPI 考試準(zhǔn)備 系列教程中,我們可以學(xué)習(xí)有關(guān)引導(dǎo) Linux 系統(tǒng)的詳細(xì)介紹,以及在準(zhǔn)備參加系統(tǒng)管理員認(rèn)證考試時(shí)需要準(zhǔn)備的 Linux 基礎(chǔ)知識(shí)。 

  • LILO 是 GRUB 的先驅(qū),但是我們可能發(fā)現(xiàn)它依然可以引導(dǎo) Linux。 

  • mkintrd 命令用來(lái)創(chuàng)建初始的 RAM 磁盤(pán)映像。這個(gè)命令可以用來(lái)構(gòu)建初始的根文件系統(tǒng),它可以用來(lái)引導(dǎo)允許提前加載訪問(wèn)真正根文件系統(tǒng)所需要的塊設(shè)備的配置。 

  • 在 Debian Linux Kernel Project 中,我們可以找到更多有關(guān) Linux 內(nèi)核、引導(dǎo)和嵌入式開(kāi)發(fā)的信息。 

  • 在 developerWorks Linux 專區(qū) 中可以找到為 Linux 開(kāi)發(fā)人員準(zhǔn)備的更多資源。 

  • 隨時(shí)關(guān)注 developerWorks 技術(shù)事件和網(wǎng)絡(luò)廣播。 

獲得產(chǎn)品和技術(shù)

  • MicroMonitor 為各種小型的目標(biāo)設(shè)備提供了引導(dǎo)環(huán)境。我們可以使用這個(gè)監(jiān)視器在嵌入式環(huán)境中引導(dǎo) Linux。它已經(jīng)移植到 ARM、 XScale、MIPS、PowerPC、Coldfire 和 Hitachi 的 Super-H 上了。 

  • GNU GRUB 是一個(gè)具有眾多選項(xiàng)和靈活性的引導(dǎo) shell。 

  • LinuxBIOS 是 BIOS 的一個(gè)替代品。LinuxBIOS 不但可以引導(dǎo) Linux,而且它本身就是一個(gè)壓縮的 Linux 內(nèi)核。 

  • OpenBIOS 是另一個(gè)可移植的 BIOS 項(xiàng)目,可以在很多體系結(jié)構(gòu)上進(jìn)行操作,例如 x86、Alpha 和 AMD64。 

  • 在 kernel.org 上可以找到最新的內(nèi)核樹(shù)。 

  • 使用 IBM 試用版軟件 改進(jìn)您的下一個(gè)開(kāi)發(fā)項(xiàng)目,從 developerWorks 上可以直接下載這些軟件。 

 


from:

http://www.ibm.com/developerworks/cn/linux/l-linuxboot/



 

posted on 2010-11-08 19:58 chatler 閱讀(420) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Linux_Coding
<2008年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用鏈接

留言簿(10)

隨筆分類(307)

隨筆檔案(297)

algorithm

Books_Free_Online

C++

database

Linux

Linux shell

linux socket

misce

  • cloudward
  • 感覺(jué)這個(gè)博客還是不錯(cuò),雖然做的東西和我不大相關(guān),覺(jué)得看看還是有好處的

network

OSS

  • Google Android
  • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
  • os161 file list

overall

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            在线综合亚洲| 亚洲欧美999| 在线电影一区| 欧美成人午夜激情视频| 亚洲毛片在线观看.| 老司机午夜免费精品视频| 亚洲欧美日本国产专区一区| aaa亚洲精品一二三区| 亚洲高清一区二| 136国产福利精品导航| 狠狠色噜噜狠狠色综合久| 欧美国产日本在线| 欧美mv日韩mv国产网站app| 亚洲一区二区三区在线看 | 亚洲高清在线| 久久精品在线视频| 亚洲国产欧洲综合997久久| 国产真实乱子伦精品视频| 国产色爱av资源综合区| 欧美freesex交免费视频| 蜜臀久久99精品久久久久久9 | 久久久亚洲综合| 久久久水蜜桃av免费网站| 久久久精品动漫| 六月天综合网| 亚洲国产日韩综合一区| 日韩一区二区久久| 亚洲欧美日韩久久精品| 9人人澡人人爽人人精品| 亚洲天堂av图片| 香蕉久久夜色| 午夜亚洲福利| 久久综合久久久久88| 欧美成人官网二区| 老鸭窝毛片一区二区三区 | 免费观看日韩av| 性亚洲最疯狂xxxx高清| 久久综合给合久久狠狠色| 欧美xart系列高清| 亚洲精品一区二区三区不| 亚洲无线一线二线三线区别av| 欧美一区在线视频| 欧美视频第二页| 亚洲精品国产欧美| 久久综合久久久久88| 香蕉久久夜色精品国产| 国产精品久久久久三级| 一区二区欧美日韩| 亚洲激情视频网| 麻豆成人小视频| 欧美一区网站| 国产日韩综合一区二区性色av| 亚洲视频欧美视频| 亚洲欧洲精品成人久久奇米网| 久久久久久久久久久一区| 国内视频一区| 久久综合伊人77777蜜臀| 欧美一进一出视频| 国产一区自拍视频| 久久久亚洲国产天美传媒修理工 | 亚洲精品四区| 亚洲国产精品一区二区第一页 | 国产精品亚洲综合久久| 亚洲婷婷国产精品电影人久久| 亚洲激情偷拍| 欧美精品在线免费观看| 一本久道久久综合婷婷鲸鱼 | 久久久久久精| 在线精品一区二区| 亚洲国产精品成人久久综合一区| 久久午夜av| 亚洲精品国产欧美| 日韩午夜激情电影| 国产精品欧美一区喷水| 久久精品一区二区国产| 久久精品伊人| 亚洲免费电影在线| 一区二区冒白浆视频| 国产精品美女久久久久av超清| 羞羞漫画18久久大片| 久久精品亚洲热| 亚洲精品欧美在线| 一区二区三区日韩欧美精品| 国产欧美日本| 欧美激情日韩| 欧美视频亚洲视频| 久久美女艺术照精彩视频福利播放| 久久精品二区三区| 99热在这里有精品免费| 亚洲午夜精品| 亚洲国产福利在线| 亚洲图片你懂的| 亚洲高清视频在线| 一区二区不卡在线视频 午夜欧美不卡在 | 亚洲午夜激情网站| 免费日韩精品中文字幕视频在线| 亚洲精品一区二区三区99| 99精品热6080yy久久| 国产综合色在线| 亚洲精品影院在线观看| 国产偷久久久精品专区| 亚洲欧洲在线免费| 国产一区二区丝袜高跟鞋图片 | 亚洲最新中文字幕| 性欧美videos另类喷潮| 亚洲精选久久| 久久精品国产一区二区三区免费看 | 国产一二三精品| 欧美成人首页| 国产乱肥老妇国产一区二| 18成人免费观看视频| 国产免费亚洲高清| 永久免费毛片在线播放不卡| 在线一区二区视频| 久久九九99视频| 亚洲影视综合| 欧美激情女人20p| 狂野欧美一区| 国产欧美精品国产国产专区| 亚洲人人精品| 在线观看亚洲精品视频| 亚洲一区二区在线看| 日韩视频永久免费| 美女图片一区二区| 老鸭窝毛片一区二区三区| 国产欧美在线| 亚洲男人的天堂在线| 夜夜精品视频| 欧美激情一区二区三区全黄| 奶水喷射视频一区| 国产一区二区三区不卡在线观看| 亚洲视频视频在线| 亚洲女人天堂av| 欧美午夜精品久久久久免费视| 亚洲精品乱码久久久久| 亚洲精品欧美日韩专区| 欧美第十八页| 亚洲国产成人精品久久久国产成人一区| 国产一区二区三区精品久久久 | 亚洲婷婷免费| 国产精品久久久久婷婷| 亚洲小视频在线| 午夜一区不卡| 国产亚洲精品aa午夜观看| 小黄鸭精品密入口导航| 久久久久成人网| 黑丝一区二区| 免费在线成人av| 亚洲高清成人| 亚洲欧洲一区二区天堂久久 | 亚洲一区二区三区在线观看视频| 在线视频亚洲欧美| 国产精品狼人久久影院观看方式| 亚洲少妇一区| 久久一区二区三区国产精品| 怡红院精品视频在线观看极品| 久久婷婷国产综合国色天香| 欧美激情一区二区久久久| 亚洲精品久久久久久久久久久久久 | 亚洲婷婷在线| 国产精品大片| 久久国产福利国产秒拍| 亚洲第一网站免费视频| 亚洲手机成人高清视频| 国产精品中文字幕欧美| 久久久久久久久久久久久9999| 欧美成人免费va影院高清| 日韩视频免费观看高清完整版| 国产精品福利在线观看网址| 久久aⅴ国产紧身牛仔裤| 亚洲成人在线| 欧美日韩卡一卡二| 久久精品论坛| 一区二区三区日韩欧美| 免费观看成人www动漫视频| 中日韩男男gay无套| 韩国女主播一区二区三区| 欧美日韩免费一区| 久久蜜臀精品av| 亚洲综合精品| 亚洲破处大片| 久久资源在线| 欧美在线看片| 亚洲午夜激情| 亚洲人成高清| 狠狠色狠狠色综合日日小说| 欧美日韩免费观看一区| 久久亚洲精品欧美| 欧美一区日韩一区| 亚洲天堂黄色| 亚洲精选视频免费看| 欧美激情中文字幕乱码免费| 久久久久91| 欧美在线观看天堂一区二区三区| 一本色道婷婷久久欧美| 亚洲国产欧美日韩精品| 国内精品视频一区| 国产视频自拍一区| 国产精品一区二区在线观看| 国产精品久久久久久亚洲毛片|