熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

精彩arm linux演義

2022-06-13   來源: Oracle 

  長篇連載arm linux演藝
  
  滾滾長江東四水浪花淘淨英雄
  
  大家好許多人和我一樣正在苦讀linux源代碼希望有照一日寶典在手天下我有小弟不才也讀了兩年寫的幾首歪詩從本級開始把我所理解的linux如何啟動貼出來不懂之處大家討論一番也希望把linux從頭到尾討論一遍計劃寫它三年寫完(笑歡迎大家動員一些牛人來參與討論提高人氣增加流量
  
  小弟用的是armT跑LINUX 下面是第一回
  
  長篇連載arm linux演藝第一回
  
  
  話說(噓聲入正題把!
  
  好好
  
  首先porting linux的時候要規劃內存影像如小弟的系統有m SDRAM
  地址從x xbff ffffm flash地址從xc xdff ffff
  規劃如下bootloader linux kernel rootdisk放在flash裡
  具體從 xc 開始的第一個M放bootloader
  xc 開始的m放linux kernelxc 開始都給rootdisk
  
  啟動
  首先啟動後armT將地址xc 映射到(可通過跳線設置)
  實際上從xc 啟動進入我們的bootloader但由於flash速度慢
  所以bootloader前面有一小段程序把bootloader拷貝到SDRAM 中的xAFE
  再從x 運行bootloader我們叫這段小程序為flashloader
  flashloader必須要首先初始化SDRAM不然往那放那些東東
  
  equ SOURCE xC bootloader的存放地址
  equ TARGET xAFE 目標地址
  equ SDCTL x SDRAM控制器寄存器
  // size is stored in location xCFC
  
  global _start
  _start: //入口點
  
  //;***************************************
  //;* Init SDRAM
  //;***************************************
  
  // ;***************
  // ;* SDRAM
  // ;***************
  
  LDR r =SDCTL //
  
  // ; Set Precharge Command
  LDR r =x
  //ldr r=x
  STR r [r]
  
  // ; Issue Precharge All Commad
  LDR r =x
  LDR r [r]
  
  // ; Set AutoRefresh Command
  LDR r =xA
  STR r [r]
  
  // ; Issue AutoRefresh Command
  LDR r =x
  LDR r [r]
  LDR r [r]
  LDR r [r]
  LDR r [r]
  LDR r [r]
  LDR r [r]
  LDR r [r]
  LDR r [r]
  
  // ; Set Mode Register
  LDR r =xB
  STR r [r]
  
  // ; Issue Mode Register Command
  LDR r =x //; Mode Register Value
  LDR r [r]
  
  // ; Set Normal Mode
  LDR r =x
  STR r [r]
  
  //;***************************************
  //;* End of SDRAM and SyncFlash Init *
  //;***************************************
  
  // copy code from FLASH to SRAM
  
  _CopyCodes:
  ldr r=SOURCE
  ldr r=TARGET
  sub rr#
  ldr r[r]
  
  _CopyLoop:
  ldr r[r]
  str r[r]
  add rr#
  add rr#
  sub rr#
  teq r#
  beq _EndCopy
  b _CopyLoop
  
  _EndCopy:
  ldr r=TARGET
  mov pcr
  
  欲知後事如何下回分解
  
  長篇連載arm linux演藝第二回
  
  
  上回書說到flashloader把bootloader load到xAFE 然回跳了過去
  其實xAFE 就是燒在flash xC中的真正的bootloader:
  
  bootloader 有幾個文件組成先是STARTs也是唯一的一個匯編程序其余的都是C寫成的STARTs主要初始化堆棧
  
  _start:
  ldr r=StackInit
  ldr sp[r]
  b main
  //此處我們跳到了C代碼的main函數當C代碼執行完後還要調用
  //下面的JumpToKernelx跳到LINXU kernel運行
  
  equ StackInitValue __end_data+x // K __end_data在連結腳本中指定
  
  StackInit:
  long StackInitValue
  
  global JumpToKernel
  
  JumpToKernel:
  // jump to the copy code (get the arguments right)
  mov pc r
  
  global JumpToKernelx
  // r = jump address
  // rr = arguments to use (these get shifted)
  JumpToKernelx:
  // jump to the copy code (get the arguments right)
  mov r r
  mov r r
  mov r r
  mov r r
  mov r r
  mov pc r
  section databoot
  section bssboot
  
  欲知bootloader中的c代碼如何運行請看下集
  
  長篇連載arm linux演藝第三回
  
  
  書接上回
  
  下面讓我們看看bootloader的c代碼干了些什麼main函數比較長讓我們分段慢慢看
  
  int main()
  {
  U *pSource *pDestin count;
  U countDown bootOption;
  U delayCount;
  U fileSize i;
  char c;
  char *pCmdLine;
  char *pMem;
  
  init(); //初始化FLASH控制器和CPU時鐘
  
  EUARTinit(); //串口初始化
  EUARTputString(\n\nDBMX Linux Bootloader ver \n);
  EUARTputString(Copyright (C) Motorola Ltd\n\n);
  EUARTputString((U *)cmdLine);
  EUARTputString(\n\n);
  
  EUARTputString(Press any key for alternate bootup options );
  
  小弟的bootloader主要干這麼幾件事:init(); 初始化硬件打印一些信息和提供一些操作選項
   Program bootloader image
   Program kernel image
   Program rootdisk image
   Download kernel and boot from RAM
   Download kernel and boot with ver x bootloader format
   Boot a verx kernel
   Boot with a different command line
  
  也就是說可以在bootloader裡選擇重新下載kernelrootdisk並寫入flash
  下載的方法是用usb連接m的rootdisk也就刷的一下關於usb下載的討論請參看先前的貼子為arm開發平台增加usb下載接口
  如果不選直接回車就開始把整個linux的內核拷貝到SDRAM中運行
  
  列位看官可能有人要問在flashloader中不是已經初始化過sdram控制器了嗎?怎麼init(); 中還要初始化呢各位有所不知小弟用的是syncflash
  可以直接使用sdram控制器的接口切記在flash中運行的代碼是不能初始化連接flash的sdram控制器的不然絕對死掉了所以當程序在flash中運行的時候去初始化sdram而現在在sdram中運行可放心大膽地初始化flash了主要是設定字寬行列延時因為缺省都是最大的
  
  另外如果列位看官的cpu有足夠的片內ram完全可以先把bootloader放在片內ram干完一切後再跳到LINUX小弟著也是不得已而為之啊
  
  今天太晚了回去睡覺了
  
  長篇連載arm linux演藝第四回
  
  
  如果直接輸入回車進入kernel拷貝工作
  
  EUARTputString(Copying kernel from Flash to RAM \n);
  count = x; // Mbytes
  pSource = (U *)xC;
  pDestin = (U *)x;
  do
  {
  *(pDestin++) = *(pSource++);
  count = ;
  } while (count > );
  }
  
  EUARTputString(Booting kernel \n\n);
  
  這一段沒有什麼可說的運行完後kernel就在x至於為什麼要
  空出x的一段主要是放kelnel的一些全局數據結構如內核頁表arm的頁目錄要有k大
  
  我們知道linux內核啟動的時候可以傳入參數如在PC上如果使用LILO
  當出現LILO我們可以輸入root=/dev/hda或mem=M等指定文件系統的設備或內存大小在嵌入式系統上參數的傳入是要靠bootloader完成的
  
  pMem = (char *)xFF; //參數字符串的目標存放地址
  pCmdLine = (char *)&cmdLine; //定義的靜態字符串
  while ((*(pMem++)=*(pCm
From:http://tw.wingwit.com/Article/program/Oracle/201311/16703.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.