鏁欑▼06 - UART閾惧姞杞藉櫒

tl;dr

  • 浠嶴D鍗′笂杩愯屾槸涓娆′笉閿欑殑浣撻獙锛屼絾鏄姣忔¢兘涓烘瘡涓鏂扮殑浜岃繘鍒舵枃浠惰繖鏍峰仛灏嗛潪甯哥箒鐞愩 鍥犳わ紝璁╂垜浠缂栧啓涓涓猍chainloader]銆
  • 杩欏皢鏄鎮ㄩ渶瑕佹斁鍦⊿D鍗′笂鐨勬渶鍚庝竴涓浜岃繘鍒舵枃浠躲 姣忎釜鍚庣画鐨勬暀绋嬮兘灏嗗湪Makefile涓鎻愪緵涓涓猔chainboot锛岃╂偍鏂逛究鍦伴氳繃UART`鍔犺浇鍐呮牳銆

娉ㄦ剰

璇锋敞鎰忥紝杩欎釜鏁欑▼涓鏈変竴浜涘唴瀹逛粎閫氳繃鏌ョ湅婧愪唬鐮佸緢闅剧悊瑙c

澶ц嚧鐨勬剰鎬濇槸锛屽湪boot.s涓锛屾垜浠缂栧啓浜嗕竴娈礫position independent code]浠g爜锛 瀹冧細鑷鍔ㄧ‘瀹氬浐浠跺姞杞戒簩杩涘埗鏂囦欢鐨勪綅缃锛坄0x8_0000锛夛紝浠ュ強閾炬帴鍒扮殑浣嶇疆锛坄0x200_0000锛屽弬瑙 kernel.ld锛夈 鐒跺悗锛屼簩杩涘埗鏂囦欢灏嗚嚜韬浠庡姞杞藉湴鍧澶嶅埗鍒伴摼鎺ュ湴鍧锛堜篃灏辨槸”閲嶅畾浣”鑷韬锛夛紝鐒跺悗璺宠浆鍒癭_start_rust()`鐨勯噸瀹氫綅鐗堟湰銆

鐢变簬閾惧姞杞界▼搴忕幇鍦ㄥ凡缁”鑴辩讳簡璺寰”锛屽畠鐜板湪鍙浠ヤ粠UART鎺ユ敹鍙︿竴涓鍐呮牳浜岃繘鍒舵枃浠讹紝骞跺皢鍏跺嶅埗鍒癛Pi鍥轰欢鐨勬爣鍑嗗姞杞藉湴鍧0x8_0000銆 鏈鍚庯紝瀹冭烦杞鍒癭0x8_0000`锛屾柊鍔犺浇鐨勪簩杩涘埗鏂囦欢浼氶忔槑鍦版墽琛岋紝灏卞ソ鍍忓畠涓鐩翠粠SD鍗″姞杞戒竴鏍枫

鍦ㄦ垜鏈夋椂闂磋︾粏鍐欎笅杩欎簺鍐呭逛箣鍓嶏紝璇疯愬績绛夊緟銆傜洰鍓嶏紝璇峰皢杩欎釜鏁欑▼瑙嗕负涓绉嶄究鍒╁姛鑳界殑鍚鐢ㄧ▼搴忥紝瀹冨厑璁稿揩閫熷惎鍔ㄤ互涓嬫暀绋嬨 _瀵逛簬閭d簺娓存湜娣卞叆浜嗚В鐨勪汉锛屽彲浠ョ洿鎺ヨ烦鍒扮琜15绔燷(../15_virtual_mem_part3_precomputed_tables)锛岄槄璇籖EADME鐨勫墠鍗婇儴鍒嗭紝 鍏朵腑璁ㄨ轰簡Load Address != Link Address鐨勯棶棰榑銆

瀹夎呭苟娴嬭瘯瀹

鎴戜滑鐨勯摼鍔犺浇绋嬪簭绉颁负MiniLoad锛屽彈鍒颁簡raspbootin鐨勫惎鍙戙

鎮ㄥ彲浠ユ寜鐓т互涓嬫暀绋嬪皾璇曞畠锛

  1. 鏍规嵁鎮ㄧ殑鐩鏍囩‖浠惰繍琛屽懡浠わ細make鎴朻BSP=rpi4 make`銆
  2. 灏哷kernel8.img`澶嶅埗鍒癝D鍗′腑锛屽苟灏哠D鍗¢噸鏂版彃鍏ユ偍鐨凴Pi銆
  3. 杩愯屽懡浠make chainboot鎴朻BSP=rpi4 make chainboot`銆
  4. 灏哢SB涓插彛杩炴帴鍒版偍鐨勪富鏈篜C涓娿
    • 璇峰弬鑰僛top-level README](../README.md#-usb-serial-output)涓鐨勬帴绾垮浘銆
    • 纭淇濇偍娌℃湁杩炴帴USB涓插彛鐨勭數婧愬紩鑴氾紝鍙杩炴帴RX/TX鍜孏ND銆
  5. 灏哛Pi杩炴帴鍒帮紙USB锛夌數婧愮嚎銆
  6. 瑙傚療鍔犺浇绋嬪簭閫氳繃UART鑾峰彇鍐呮牳锛

娉ㄦ剰: make chainboot鍋囪鹃粯璁ょ殑涓茶岃惧囧悕绉颁负/dev/ttyUSB0銆傛牴鎹鎮ㄧ殑涓绘満鎿嶄綔绯荤粺锛岃惧囧悕绉板彲鑳戒細鏈夋墍涓嶅悓銆 渚嬪傦紝鍦╜macOS涓婏紝瀹冨彲鑳芥槸绫讳技浜巂/dev/tty.usbserial-0001鐨勫悕绉般 鍦ㄨ繖绉嶆儏鍐典笅锛岃锋槑纭缁欏嚭璁惧囧悕绉帮細

$ DEV_SERIAL=/dev/tty.usbserial-0001 make chainboot
$ make chainboot
[...]
Minipush 1.0

[MP] 鈴 Waiting for /dev/ttyUSB0
[MP] 鉁 Serial connected
[MP] 馃攲 Please power the target now

 __  __ _      _ _                 _
|  \/  (_)_ _ (_) |   ___  __ _ __| |
| |\/| | | ' \| | |__/ _ \/ _` / _` |
|_|  |_|_|_||_|_|____\___/\__,_\__,_|

           Raspberry Pi 3

[ML] Requesting binary
[MP] 鈴 Pushing 7 KiB ==========================================馃 100% 0 KiB/s Time: 00:00:00
[ML] Loaded! Executing the payload now

[0] mingo version 0.5.0
[1] Booting on: Raspberry Pi 3
[2] Drivers loaded:
      1. BCM PL011 UART
      2. BCM GPIO
[3] Chars written: 117
[4] Echoing input now

鍦ㄨ繖涓鏁欑▼涓锛屼负浜嗘紨绀虹洰鐨勶紝鍔犺浇浜嗕笂涓涓鏁欑▼涓鐨勫唴鏍哥増鏈銆傚湪鍚庣画鐨勬暀绋嬩腑锛屽皢浣跨敤宸ヤ綔鐩褰曠殑鍐呮牳銆

娴嬭瘯瀹

杩欎釜鏁欑▼涓鐨刞Makefile鏈変竴涓棰濆栫殑鐩鏍嘸qemuasm锛屽畠鍙浠ヨ╀綘寰堝ソ鍦拌傚療鍒板唴鏍稿湪閲嶆柊瀹氫綅鍚庡備綍浠庡姞杞藉湴鍧鍖哄煙锛坄0x80_XXX锛 璺宠浆鍒伴噸鏂板畾浣嶇殑浠g爜锛坄0x0200_0XXX锛夛細

$ make qemuasm
[...]
N:
0x00080030:  58000140  ldr      x0, #0x80058
0x00080034:  9100001f  mov      sp, x0
0x00080038:  58000141  ldr      x1, #0x80060
0x0008003c:  d61f0020  br       x1

----------------
IN:
0x02000070:  9400044c  bl       #0x20011a0

----------------
IN:
0x020011a0:  90000008  adrp     x8, #0x2001000
0x020011a4:  90000009  adrp     x9, #0x2001000
0x020011a8:  f9446508  ldr      x8, [x8, #0x8c8]
0x020011ac:  f9446929  ldr      x9, [x9, #0x8d0]
0x020011b0:  eb08013f  cmp      x9, x8
0x020011b4:  54000109  b.ls     #0x20011d4
[...]

鐩告瘮涔嬪墠鐨勫彉鍖栵紙diff锛

璇锋鏌鑻辨枃鐗堟湰锛岃繖鏄鏈鏂扮殑銆倧樺寲锛坉iff锛 璇锋鏌鑻辨枃鐗堟湰锛岃繖鏄鏈鏂扮殑銆