通過移植bootm命令啟動已經編譯好

2021-08-02 21:20:08 字數 2234 閱讀 1958

首先在移植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...