1. 程式人生 > >Linux核心移植

Linux核心移植

以下內容大部分來自《嵌入式Linux應用開發完全手冊》

1.核心啟動過程概述


    如圖是Linux核心的vmlinux啟動過程。之所以強調是vmlinux,是因為其他格式的核心在進行與vmlinux相同的流程之前會有一些獨特的操作。比如壓縮格式的核心zImage,它首先進行自解壓得到vmlinux,然後執行vmlinux,開始“正常的”啟動流程。

    第一階段:引導階段,通常使用匯編語言編寫,它首先檢查核心是否支援當前架構的處理器,然後檢查是否支援當前開發板。通過檢查後,就為下一階段的start_kernel函式作準備了。

    第二階段主要使用c語言編寫,它進行核心初始化的全部工作,最後呼叫rest_init函式啟動init過程,建立系統第一個程序:init程序。

2.核心啟動程式碼分析

    由前面對Makefile的分析可知,arch/arm/kernel/head.s是核心執行的第一個檔案。另外,U-Boot呼叫核心時,r1暫存器中儲存“機器型別ID”,核心會用到它。




第82行呼叫_lookup_processor_type函式來確定核心是否支援當前cpu;第85行呼叫_lookup_machine_type函式來確定核心是否支援當前開發板。



如果_lookup_processor_type、_lookup_machine_type函式都返回成功,則載入程式將繼續執行下去。其中_create_page_tables函式用來建立一級頁表以建立虛擬地址到實體地址的對映關係,它用到_lookup_processor_type返回的proc_info_list結構。在引導階段的最後,呼叫start_kernel函式進入核心啟動的第二階段。_lookup_machine_type函式確定的machine_desc結構將在第二階段中多次使用。

移植U-Boot時,U-Boot傳給核心的引數有兩類:預先存在某個地址的tag列表和呼叫核心時在r1暫存器中指定的機器型別ID。後者在引導階段的_lookup_machine_type函式已經用到,而tag列表將在setup_arch函式中進行初步處理。

1)setup_arch函式

它在arch/arm/kernel/setup.c中定義,部分程式碼如下:



....

2)paging_init函式分析

這個函式在setup_arch函式中的呼叫形式如下:

paging_init(&meminfo,mdesc);

meminfo中存放記憶體的資訊,前面解釋記憶體tag時確定構建了這個全域性結構。

mdesc就是前面lookup_machine_type函式返回的machine_desc結構。對於S3C2440開發板,這個結構在arch/arm/mach-s3c2440/mach-smdk2440.c中有如下定義: