本人用的android平台用的bootloader用的是uboot,貌似大多數手持設備平台都不用這個,因為功能過於強大用不上,反而顯得太復雜了。不知道這個平台開發者是怎麼想的。既然用了那就來分析一下,順便修改一下其中的幾個小問題,以符合我們的要求。
uboot等同於其他所有的bootloader程序,從根本上講是一個稍復雜的裸機程序,是最底層的東西,要分析裸機程序我們要從它的連接文件開始。連 接文件(.lds文件)定義了程序編譯之後整個連接過程,這樣我們就可以找到這個程序的第一句匯編代碼,進而來下一步分析。uboot的鏈接文件代碼在 android\bootable\bootloader\uboot-imx\u-boot.lds
[cpp] view plain
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") //文件輸出格式
OUTPUT_ARCH(arm)
ENTRY(_start) //首地址標示符
SECTIONS
{
. = 0x00000000; //其實地址0
. = ALIGN(4); //4位元組對齊
.text : //代碼段
{
board/freescale/mx6q_sabresd/flash_header.o (.text.flasheader) //第一個文件是board/freescale/mx6q_sabresd/flash_header.o
cpu/arm_cortexa8/start.o //第二個cpu/arm_cortexa8/start.o
board/freescale/mx6q_sabresd/libmx6q_sabresd.a (.text)
lib_arm/libarm.a (.text)
net/libnet.a (.text)
drivers/mtd/libmtd.a (.text)
drivers/mmc/libmmc.a (.text)
. = DEFINED(env_offset) ? env_offset : .;
common/env_embedded.o(.text)
*(.text) //剩餘的所有代碼
}
. = ALIGN(4);
.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) } //readonly data 段
. = ALIGN(4);
.data : { *(.data) } //所有的readonly data
. = ALIGN(4);
.got : { *(.got) }
. = .;
__u_boot_cmd_start = .; //u_boot_cmd段,裡面是所有uboot命令的一個列表
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;
. = ALIGN(4);
_end_of_ = .;
__bss_start = .; //bss段 就是內存數據段
.bss : { *(.bss) }
_end = .;
}
從上面的代碼可以看出我們編譯生成的二進制應用程序組成是:代碼段->rodata段->uboot命令列表->bss段。我們啟動這個應用程序時候是從,0地址開始的,因此我們來看
board/freescale/mx6q_sabresd/flash_header.s這個文件。
這個文件中除了分配內存和宏定義的偽匯編指令以外,真正執行的命令有一條
[cpp] view plain
.section ".text.flasheader", "x"
b _start
.org CONFIG_FLASH_HEADER_OFFSET
也就是說,這個文件一執行就直接跳到_start 位置處。_start 在android\bootable\bootloader\uboot-imx\cpu\arm_cortexa8\ start.S中,因此我們來看這個文件代碼
[cpp] view plain
.globl _start
_start: b reset
這里直接跳轉的reset中接下來看
[csharp] view plain
reset:
/*
* set the cpu to SVC32 mode cpu設置成32位管理模式
*/
mrs r0, cpsr
bic r0, r0, #0x1f
orr r0, r0, #0xd3
msr cpsr,r0
#if (CONFIG_OMAP34XX) //因為我們的cpu不是ompa的 所以這段不會編譯
.............................
#endif
/* the mask ROM code should have PLL and others stable */
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
bl cpu_init_crit
#endif
這里接下來執行cpu_init_crit
[csharp] view plain
/*************************************************************************
*
* CPU_init_critical registers
*
* setup important registers
* setup memory timing
*
*************************************************************************/
cpu_init_crit:
/*
* Invalidate L1 I/D
*/
mov r0, #0 @ set up for MCR
mcr p15, 0, r0, c8, c7, 0 @ invalidate TLBs
mcr p15, 0, r0, c7, c5, 0 @ invalidate icache
/*
* disable MMU stuff and caches //關閉mmu
*/
mrc p15, 0, r0, c1, c0, 0
bic r0, r0, #0x00002000 @ clear bits 13 (--V-)
bic r0, r0, #0x00000007 @ clear bits 2:0 (-CAM)
orr r0, r0, #0x00000002 @ set bit 1 (--A-) Align
orr r0, r0, #0x00000800 @ set bit 12 (Z---) BTB
mcr p15, 0, r0, c1, c0, 0
/*
* Jump to board specific initialization...
* The Mask ROM will have already initialized
* basic memory. Go here to bump up clock rate and handle
* wake up conditions.
*/
mov ip, lr @ persevere link reg across call
bl lowlevel_init @ go setup pll,mux,memory//執行lowlevel_init這個函數代碼在
@\bootloader\uboot-imx\board\freescale\mx6q_sabresd\lowlevel_init.S中
@主要對時鍾,外部ram,rom等進行了初始化代碼不貼了。
mov lr, ip @ restore link
mov pc, lr @ back to my caller
初始化完成後,接下來執行
[csharp] view plain
#ifndef CONFIG_SKIP_RELOCATE_UBOOT
relocate: @ relocate U-Boot to RAM 將uboot重新定位到內存中
adr r0, _start @ r0 <- current position of code
ldr r1, _TEXT_BASE @ test if we run from flash or RAM
cmp r0, r1 @ don't reloc ring debug測試當前代碼是否已經在內存中
beq stack_setup @如果在的話就直接跳轉到stack_setup
ldr r2, _armboot_start @如果不在的話,載入_armboot_start地址到r2中。_armboot_start是uboot執行的主體c函數。
ldr r3, _bss_start
sub r2, r3, r2 @ r2 <- size of armboot計算bss_start-armboot_start 保存到R2中,也就是uboot的總大小
add r2, r0, r2 @ r2 <- source end address 計算出uboot代碼和rodata地址
_loop: @ 32 bytes at a time //開始拷貝
ldmia r0!, {r3 - r10} @ from source address [r0]
stmia r1!, {r3 - r10} @ to target address [r1]
cmp r0, r2 @ until source end addreee [r2]
ble _loop
#endif /* CONFIG_SKIP_RELOCATE_UBOOT */
Ⅱ bootstrap壓縮版和源碼有什麼區別
壓縮版是壓縮了的,所有的東西打成了一行,這樣做的好處是體積更小。源碼就是源碼,換行,縮進都還在的那種。 開發的時候可以使用源碼,正式環境的話可以考慮改為壓縮版,因為體積小好多,可以節省流量。
Ⅲ boost源碼如何應用
下載Boost庫,這里我選擇下載boost_1_55_0.zip
解壓boost文件到本地目錄(如G:\boost_1_55_0),可以發現解壓後的文件中有一個bootstrap.bat文件。
然後以管理員身份打開cmd窗口,
上述命令執行完畢後可以發現G:\boost_1_55_0下新生成了一個bjam.exe文件
在命令窗口中輸入語句:bjam.exe
此過程將默認根據系統已經安裝好的編譯工具(VS2008,2010,2012,2013)等編譯相應的Lib文件、頭文件等。(此步驟大概需要10分鍾)
可以看到msvc 12.0,這是因為我系統中已經安裝過了VS2013
msvc : 8.0是VS2005
msvc : 10.0是VS2010
msvc : 12.0是VS2012、VS2013
第5步執行成功後會有如下信息提示
至此我們已經完成了boost庫的安裝,下面需要配置一下VS2013了。新建一個VS2013控制台應用程序(工程名為boostest),添加如下代碼
#include "stdafx.h"
#include <boost/lexical_cast.hpp>
#include <iostream>
using namespace std;
int main()
{
using boost::lexical_cast;
int a = lexical_cast<int>("123");
double b = lexical_cast<double>("123.0123456789");
string s0 = lexical_cast<string>(a);
string s1 = lexical_cast<string>(b);
cout << "number: " << a << " " << b << endl;
cout << "string: " << s0 << " " << s1 << endl;
int c = 0;
try{
c = lexical_cast<int>("abcd");
}
catch (boost::bad_lexical_cast& e){
cout << e.what() << endl;
}
return 0;
}
添加boostest工程的包含目錄和庫目錄
包含目錄添加 G:\boost_1_55_0
庫目錄添加 G:\boost_1_55_0\stage\lib
進入代碼窗口編譯並成功運行說明BOOST庫確實已經配置成功,可以放心使用。
Ⅳ 誰能給發幾個bootstrap案例源碼
<!DOCTYPE html>
<html>
<head>
<title>Bootstrap 實例 - 基本的按鈕組</title>
<link href="/bootstrap/css/bootstrap.min.css" rel="stylesheet">
<script src="/scripts/jquery.min.js"></script>
<script src="/bootstrap/js/bootstrap.min.js"></script>
</head>
<body>
<div class="btn-group">
<button type="button" class="btn btn-default">按鈕 1</button>
<button type="button" class="btn btn-default">按鈕 2</button>
<button type="button" class="btn btn-default">按鈕 3</button>
</div>
</body>
</html>
Ⅳ LTIB環境下的uboot源碼在哪個目錄下
樓主你好,首先你要釋放u-boot的源碼,因為在編譯的時候在LTIB選項中選擇的是編譯後不釋放源碼。 釋放源碼,在ltib目錄下輸入命令:./ltib -m prep -p u-boot
Ⅵ 的linux源碼和uboot源碼是開源的么
Linux 不光核心系統是開源的,正規的 GNU/Linux 的要求是整個系統也都是開源的。
不過這不是絕對的,SUSE 企業版,Mandriva PowerPack ,以及一些系統,裡面會有不開源的的東西存在,但大部分都開源。
你可以認為,所有的 GNU/Linux 都是完全開源的。
他們的源代碼都可以在官方網站下載,或者藉助他們的軟體包管理器在軟體源中下載。
開源的系統不光 Linux ,常見的還有 BSD ,BSD 的更加開放,因為他的源代碼允許商業化修改後閉源再發布,這比 GNU GPL 對於商業友好不知多少倍。當然也有不少無恥的公司,拿來直接閉源再發布騙錢的。
之後還有 MAC OS X ,他的底層系統 darwin 是開源的,不過協議不同於一般的開源。但他的界面是不開源的,所以就有了 GNU/darwin ,底層 darwin ,上層 GNU 軟體。
還有 openSolaris ,開源的 UNIX 。
剩下的還有一些,就不如上面的廣泛了。
Ⅶ 如何編譯bootstrap-4.0.0源碼
因為bootstrap 4.0.0將放棄less轉用sass來處理css,所以開發環境需要裝SASS插件(必須先安裝Ruby)。
安裝Ruby,略。
安裝SASS
gem install sass
安裝Node.js,略。
安裝grunt
npm install -g grunt
安裝node-sass,大多數環境正常。安裝不成功的話可以看後面的手動編譯css部分。
npm install -g node-sass
grunt打包,加強制參數
grunt --force
在dist目錄下編譯出下列文件
|-- dist
|-- css
|-- bootstrap.css
|-- bootstrap.css.map
|-- bootstrap.min.css
|-- bootstrap.min.css.map
|-- js
|-- bootstrap.js
|-- bootstrap.min.js
|-- npm.js
|-- umd
|-- alert.js
|-- button.js
|-- carousel.js
|-- collapse.js
|-- dropdown.js
|-- modal.js
|-- popover.js
|-- scrollspy.js
|-- tab.js
|-- tooltip.js
|-- util.js
scsslint檢查時可能會報錯,可以將bundleExcc關掉,不用本地的
//You can choose to have your gems installed via bundler and if so, set this option to true to use the local gems.
scsslint: {
options: {
bundleExec: false,
config: 'scss/.scss-lint.yml',
reporterOutput: null
},
src: ['scss/*.scss', '!scss/_normalize.scss']
}
手動編譯css,進入scss目錄會看到大量的scss文件。主要關注下面幾個
|-- scss
|-- ...
|-- bootstrap.scss
|-- bootstrap-flex.scss
|-- bootstrap-grid.scss
|-- bootstrap-reboot.scss
|-- ...
可以用sass命令直接生成相應的css文件和map文件
sass bootstrap.scss bootstrap.css
sass bootstrap-flex.scss bootstrap-flex.css
sass bootstrap-grid.scss bootstrap-grid.css
sass bootstrap-reboot.scss bootstrap-reboot.css
Ⅷ 熟悉Bootstrap源碼的進,給解釋一下唄。
Bootstrap所有的JavaScript插件都可以通過配置使用,即通過特定的HTML設置,而不需要任何JavaScript再次觸發。但
如果需要啟用手動觸發事件的行為,可以禁用默認的行為,禁用方法非常簡單,只需要將body元素上的命名空間為data-api下的全部事件禁用即可。代
碼如下所示:
$(document).off('.data-api');
如果想禁用特定插件的默認行為,只需要禁用該插件所在命名空間下的事件即可。代碼如下所示:
$(document).off('.alert.data-api');
Ⅸ 我需要一個UBOOT源碼包,已經添加了UBIFS,能在MINI2440的開發板上運行的,內核2,6.32.2
學習不能這么功利,uboot最好自己配置並編譯一下,不同的板子需要的設置不一樣~~