首先在移植bootm命令之前,我們要了解bootloader的主要作用;除了初始化cpu和外設外,bootloader還有乙個最大的作用就是啟動linux核心。但是在啟動linux核心之前,有幾個部分是必須先初始化的
1.初始化記憶體
2.初始化串列埠(其實也不是必須的,但可以方便看輸出,檢查錯誤)
3.獲取處理器型號(這裡我們就只用乙個處理器,所以不用去檢測)
4.設定linux啟動引數
我們把linux的啟動引數設定在記憶體的乙個區域裡,然後在啟動linux核心之前先把設定啟動引數的指標指向這個位址,完成引數設定;最後呼叫linux核心映像
所以下面開始講解啟動linux核心的函式boot_linux()
void (*thekernel)(int , int , unsigned int );
這個指標沒有型別,只是它可以指向乙個位址的函式,這個函式的引數必須是(int,int,unsigned int),所以在使用記憶體裡的位址時,必須進行強制型別轉換
thekernel = (void (*)(int ,int ,unsigned int))sdram_kernel_start;
接下來就要分別設定核心啟動引數,記憶體啟動引數,命令列啟動引數,結束標誌引數
1.設定核心啟動引數setup_core_tag();
首先定義乙個型別tag
struct tag u;
};
其中 struct tag_header ;
struct tag_core ;
struct tag_mem32 ;
struct tag_cmdline ;
然後參照uboot,對其進行改寫
struct tag *pcurtag;
void setup_core_tag()
2.3.4對記憶體,命令列,結束標誌的引數同理
void setup_mem_tag()
void setup_cmdline_tag()
void setup_end_tag()
最後呼叫linux核心(這個大函式),函式名就是這個void指標指向的位址,引數(int,int,unsigned int)
thekernel(0, 1626, sdram_tags_start);
其中sdram_tags_start為第乙個設定的啟動引數,核心啟動引數的基位址,後面的引數都是緊挨著的,這樣就把cpu型號,啟動引數的基位址告訴核心了
附上啟動**
#include "string.h"
#include "atag.h"
#define sdram_kernel_start 0x51000000
#define sdram_tags_start
0x50000100
#define sdram_addr_start
0x50000000
#define sdram_total_size
0x16000000
void (*thekernel)(int , int , unsigned int );
struct tag *pcurtag;
const char *cmdline = "console=ttysac0,115200 init=/init";
void setup_core_tag()
void setup_mem_tag()
void setup_cmdline_tag()
void setup_end_tag()
void boot_linux()
附上標頭檔案
#define atag_core 0x54410001
#define atag_mem 0x54410002
#define atag_cmdline 0x54410009
#define atag_none 0x00000000
struct tag_header ;
struct tag_core ;
struct tag_mem32 ;
struct tag_cmdline ;
struct tag u;
};#define tag_size(type) ((sizeof(struct tag_header) + sizeof(struct type)) >> 2)
#define tag_next(t) ((struct tag *)((unsigned long *)(t) + (t)->hdr.size))
四十二 移植bootm命令
2 加上了原版u boot裡dm9000傳送函式裡傳送前後都要清除傳送標誌 3 取消了老師說的要對包進行判斷,實際上不判斷效果還要好一點,那一部分,要求只要在空讀前後有20微妙的時間間隔就好了,經我實際測試,我的開發板確實只用空讀一次就滿足該條件。4 取消了中斷處理函式裡之前為了驗證進的是什麼中斷的...
通過bat命令快速啟動oracle
如果我們並不是太頻繁使用某些軟體,為了加快機器的執行響應速度,我們就會選擇暫停這些軟體相關的服務以減輕記憶體 cpu的負載。下面我們將oracle 11g作為乙個例子來介紹一下。oracle本身就是乙個很佔資源的軟體,光乙個例項服務所佔記憶體,根據其安裝時分配的記憶體就至少要達到256mb以上,再加...
如何通過Intent啟動乙個已經安裝好的APP
首先你需要乙個工具來提取apk的包名,我們要用到的工具是apk helper 該工具將apk安裝包拖到窗體上後,便可顯示apk的包名等詳細資訊。得到包名以後 用以下 即可 packageinfo packageinfo null try catch namenotfoundexception e c...