1. Trang chủ
  2. » Luận Văn - Báo Cáo

Luận văn thạc sĩ Kỹ thuật điện tử: Thiết kế và thi công thiết bị định tuyến có hỗ trợ tăng tốc bảo mật phần cứng

143 0 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Thiết kế và thi công thiết bị định tuyến có hỗ trợ tăng tốc bảo mật phần cứng
Tác giả Đoàn Ngọc Cẩm
Người hướng dẫn TS. Trần Hoàng Linh
Trường học Trường Đại học Bách Khoa - ĐHQG-HCM
Chuyên ngành Kỹ thuật Điện Tử
Thể loại Luận văn thạc sĩ
Năm xuất bản 2021
Thành phố Tp. Hồ Chí Minh
Định dạng
Số trang 143
Dung lượng 4,74 MB

Cấu trúc

  • CHƯƠNG 1. MỞ ĐẦU (0)
  • CHƯƠNG 2. TỔNG QUAN ĐỀ TÀI (20)
    • 2.2.1. Ý tưởng thiết kế (21)
    • 2.2.2. Đánh giá các chip có thể sử dụng trong thiết kế (23)
  • CHƯƠNG 3. THIẾT KẾ SƠ ĐỒ NGUYÊN LÝ ROUTER (0)
    • 3.1.1. Yêu cầu thiết kế (25)
    • 3.1.2. Phân tích thiết kế (25)
    • 3.1.3. Lựa chọn module xử lý trung tâm (26)
    • 3.3.1. Khối nguồn (30)
    • 3.3.2. Khối mPCIe (44)
    • 3.3.8. Khối USB 3.0 (60)
    • 3.3.9. Khối SIM card (61)
    • 3.3.10. Khối SD card (62)
    • 3.3.11. Khối giao tiếp UART (63)
  • CHƯƠNG 4. THIẾT KẾ LAYOUT ROUTER (66)
    • 4.1.1. Giới thiệu về mạch tốc độ cao (66)
    • 4.1.2. Các vấn đề cần chú ý khi layout mạch tốc độ cao (67)
    • 4.1.3. Một số cách khắc phục nhiễu (74)
  • CHƯƠNG 5. PHẦN MỀM CHO KHỐI ĐIỀU KHIỂN NGUỒN (0)
    • 5.2.1. Các tín hiệu từ nút nhấn: 2 nút nhấn (81)
    • 5.2.2. Báo tín hiệu trên LED (82)
    • 5.2.3. Tín hiệu I2C gửi từ CPU (82)
  • CHƯƠNG 6. HỆ ĐIỀU HÀNH CHO BO MẠCH (0)
    • 6.1.1. Cross Compiler & Toolchain (90)
    • 6.1.2. Bootloader (92)
    • 6.1.3. Kernel (93)
    • 6.1.4. Các ứng dụng ở lớp User-space (95)
    • 6.2.1. Xây dựng trình khởi động U-boot cho board mạch .................................... 80 6.2.2. Xây dựng hệ điều hành cho bo mạch router dựa trên hệ điều hành OpenWrt (96)
    • 6.3.1. Đối với khối hệ thống sử dụng SDCard (117)
    • 6.3.2. Đối với khối hệ thống sử dụng eMMC (118)
  • CHƯƠNG 7. THỰC HIỆN CHỨC NĂNG TĂNG TỐC MÃ HÓA BẢO MẬT BẰNG PHẦN CỨNG CESA TRÊN SOC (122)
  • CHƯƠNG 8. THỬ NGHIỆM CÁC CHỨC NĂNG CỦA ROUTER (124)
    • 8.1.1. Thử nghiệm chức năng DHCP và phản hồi ARP của bkrouter (124)
    • 8.1.2. Đăng nhập vào giao diện Web của bkrouter (125)
    • 8.1.3. Thiết lập kết nối Internet (125)
    • 8.1.4. Thiết lập Wi-Fi (127)
    • 8.2.1. Đo đạc thông lượng trên các cổng LAN của router (130)
    • 8.2.2. Đo đạc thông lượng trên cổng WAN của router (132)
    • 8.2.3. Đo đạc thông lượng khi kết nối VPN của router (134)
  • CHƯƠNG 9. KẾT LUẬN (140)
  • Kết luận (140)
  • TÀI LIỆU THAM KHẢO (0)

Nội dung

THIẾT KẾ SƠ ĐỒ NGUYÊN LÝ ROUTER

Yêu cầu thiết kế

- 5 Cổng LAN, 1 Cổng WAN, 1 Cổng SFP: để giao tiếp Ethernet

- 2 cổng mPCIE giao tiếp PCIe: để gắn card Wifi 2.4GHz/5GHz

- 1 cổng M2 giao tiếp PCIe: để giao tiếp với card FPGA

- 1 USB 3.0: để lưu trữ dữ liệu, khởi động,…

- 1 khe micro SD card: Lưu trữ firmware khi không có eMMC

- 1 khe micro SIM card: để gắn SIM 3G/4G và phát tín hiệu

- 12 đèn LED RGB để báo hiệu

- Có vi xử lý để quản lý nguồn và các tín hiệu đèn báo hiệu.

Phân tích thiết kế

a) Lựa chọn vi xử lý:

Router xử lý nhiều chức năng cùng một lúc, hoạt động như một máy tính nhúng, do đó cần phải chọn các vi xử lý có tốc độ xử lý nhanh và hỗ trợ về phần cứng Vì vậy, cách tốt nhất là sử dụng các vi xử lý nằm trong SoC (System on Chip) với các tính năng chuyên dụng cho Router, chip 88F6820 đã được chọn làm vi xử lý chính với CPU lõi kép, nhân ARMv& Cortex-A9 với hiệu năng cao b) Bộ nhớ:

Router cần bộ nhớ lớn để xứ lý các tín hiệu và mã hóa tín hiệu, nên cần phải có dung lượng RAM tối thiểu là 1GB

Firmware của Router và các ứng dụng cần nhiều dung lượng để lưu trữ Ngoài ra, bộ nhớ hệ điều hành cũng nên có dung lượng lớn để sau này dễ dàng phát triển Vì vậy, Router cần SD card khoảng 2GB, eMMC ít nhất 1 GB Về phần bộ nhớ để lưu trữ hệ điều hành sẽ có hai phương án thay thế lẫn nhau là eMMC và microSD card, nghĩa là chỉ được sử dụng một trong hai phương án trong một lúc, microSD card được sử dụng lưu trữ chương trình trong lúc xây dựng và phát triển phần mềm vì như vậy sẽ thuận tiện hơn, eMMC được sử

10 dụng để lưu trữ phần mềm khi phần mềm đã được xây dựng hoàn chỉnh, đã là thành phẩm c) Kết nối mạng:

Router cần các kết nối WAN, LAN và SFP, do đó đã chọn: cần thiết kế Router hỗ trợ 1 cổng WAN theo chuẩn RJ45, 1 cổng WAN theo chuẩn SFP, 5 cổng LAN để người dùng dễ dàng truy cập Ethernet qua đường có dây với tốc độ ổn định

Ngoài ra, nhóm còn sử dụng thêm thẻ SIM để phát sóng 3/4G để đề phòng khi không có Ethernet d) Các kết nối ngoại vi:

Router cần gắn card Wi-Fi: cần 2 cổng mPCIE giao tiếp PCIe để gắn card Wi-Fi phát sóng băng tần 2.4/5GHz

Ngoài ra, để hỗ trợ tăng tốc bảo mật phần cứng, nhóm thiết kế thêm 1 khe M2 chuẩn giao tiếp PCIe e) Nạp flash và gỡ lỗi:

Các bộ nhớ flash có thể được nạo qua một cổng kết nối nối tiếp trên Router, cổng đó cũng có thể dùng trong quá trình gỡ lỗi và phát triển Chính vì vây, một Router phát triển không thể thiếu cổng đó f) Các giao tiếp khác:

Ngoài những chức năng chính cần có của một Router, nên đưa các chân hỗ trợ giao tiếp I2C, UART, SPI,… ra ngoài, để sau này dễ dàng phát triển ứng dụng hay giao tiếp các module.

Lựa chọn module xử lý trung tâm

Để rút ngắn thời gian thiết kế, tăng tính mềm dẻo của hệ thống, nhóm lựa chọn module SOM A388, với chip tích hợp sẵn CPU và bộ nhớ, và thiết kế các ngoại vi xung quanh để chế tạo router

Hình 3.1 Sơ đồ khối SOM

SOM A388 là sản phẩm của SolidRun, với các khả năng ưu việt:

- Cung cấp khả năng tương thích cao và tốc độ cao: Hỗ trợ các hệ điều hành: Yocto Linux, OpenWrt và cùng với nhiều phần mềm khác Có nhiều cấu hình tiêu chuẩn cùng với vi xử lý tốc độ cao ( ARM Cortex-A9 đơn nhân và đa nhân với tốc độ xử lý lên đến 1.6 GHz), có nhiều sự lựa chọn bộ nhớ trong và ngoài Ngoài ra, bao gồm nhiều giao tiếp tốc độ cao như: nhiều cổng Gigabit Ethernet, mPCIe, USB2.0/3.0,… Chính vì vậy, rất phù hợp với yêu cầu đề ra của nhóm

- Giảm rủi ro thiết kế: A388 SOM đơn giản hóa đáng kể quá trình thiết kế và cho phép phát triển lên các sản phẩm mới Được hỗ trợ dầy đủ từ nhà sản xuất, cung cấp các tài liệu tham khảo như: Schematic đơn giản của SOM,… Khi sử dụng SOM thì tránh được việc layout RAM – phần layout dễ sai, dẫn đến kết quả không mong muốn và rút ngắn được thời gian thiết kế

- Kích thước đóng gói: Kích thước nhỏ gọn: 50x30mm Kích thước A388 nhỏ gần bằng tổng kích thước của các linh kiện trên board Với kích thước nhỏ này, có thể tự do và linh hoạt trong thiết kế, giảm kích thước của board thiết kế một cách đáng kể

- Cho phép chỉnh sửa: SolidRun A388 Som cho phép dễ dàng phát triển Nó cho phép thiết kế các thiết bị đầu cuối cùn tùy theo nhu cầu của người dùng với độ phức tạp it, vì các thiết kế phức tạp nhất đã được thiết kế trên SOM (như: giao

- Giá thanh không quá cao: Có thể đàm phán để được giá tốt nhất, mua với số lượng lớn sẽ giảm một khoản chi phí đáng kể, điều này rất tiết kiệm cho khoản chi phí nghiên cứu và phát triển Đặc điểm của A388 SOM

Bảng 3.1 Đặc điểm của SOM

Vi xử ly Dual core ARM Cortex A9

Tốc độ xử lý 1.6GHz thương mại

Bộ nhớ 32 bit, khả năng lên đến 2GB DDR3L

SPI Flash 32Mbit eMMC Optional

Các OS hỗ trợ Linux, Yocto, OpenWrt/LEDE

Giao tiếp SOM Hirose DF40 connectors 1.5mm, 3mm mating height Môi trường Thương mại: 0 o C – 17 o C

Sơ đồ khối tổng quát của bo mạch chủ Router

Hình 3.2 Sơ đồ khối tổng quát của Router

Router sử dụng bộ xử lý trung tâm là khối SOM – System on Module có tên gọi Armada

388 (A388) của hãng SolidRun Khối SOM A388 này là một module được tích hợp sẵn chip 88F6820 của Marvell với nhân ARM Cortex A9 hoạt động ở tốc độ lên đến 1.6GHz Trên SOM A388 dựa trên chip Marvell 88F6820 có 6 đường truyền SerDes tốc độ cao Các đường truyền SerDes này được hỗ trợ để cấu hình thành các truyền nhận tốc độ cao khác như PCIe 2.0, SATA 3.0 với tốc độ 6 Gb mỗi giây, SGMII với tốc độ lên đến 2.5Gb mỗi giây, USB 3.0

Hình 3.3 Các giao tiếp của đường truyền SerDes trên chip 88F6820

Trong thiết kế, đường truyền SerDes 1 được kết nối với một chip Gigabit Ethenet PHY, có mã số là 88E1512 của hãng Marvell cung cấp Chip PHY này có hỗ trợ RGMII và SGMII để kết nối trực tiếp với MAC/Switch port SGMII có thể sử dụng media/line để kết nối với module SFP hỗ trợ 1000BASE-X, 100BASE-FX Nó cũng hỗ trợ ứng dụng Copper/Fiber Auto-Media với RGMII như giao tiếp MAC SGMII hoạt động ở tốc độ 1.25Gbps trong một cặp vi sai, do đó làm giảm công suất và số lượng I/O được sử dụng trên giao diện MAC

Trong bo mạch Router cần 2 khe mPCIe để gắn card Wi-Fi, hai loại card Wi-Fi được sử dụng là WLE900VX (băng thông 2.4GHz và 5GHz, giao tiếp PCIe 1.1) và WLE200N2 (băng thông 2.4 GHz, giao tiếp PCIe 1.1) Hai đường truyền SerDes 2 và SerDes 4 sẽ được sử dụng để giao tiếp với card Wi-Fi qua giao tiếp PCIe Đường truyền SerDes 0 được sử dụng để giao tiếp với khe M2 qua giao tiếp PCIe Trên khe M2 sẽ được gắn với bo mạch FPGA làm nhiệm vụ tăng tốc bảo mật Đường truyền SerDes 5 được dùng cho giao tiếp giữa CPU và cổng SFP Đường truyền SerDes 3 dùng cho giao tiếp USB 3.0

Nguyên lý hoạt động các khối

Khối nguồn

Hình 3.4 Sơ đồ cây khối nguồn Router

Cụ thể thiết kế của các khối nguồn sẽ được trình bày dưới đây a) Khối nguồn 3.3V

Nguồn 3.3V được sử dụng để cung cấp cho phần lớn IC của bo mạch cụ thể là cung cấp cho chip PHY, sử dụng cho SOM, các khe PCIe, SD card

Tính toán dòng điện ngõ ra yêu cầu

Theo tài liệu nhà sản xuất cung cấp, SOM có công suất 7.5W [1] khi các chức năng hoạt động hết công suất, tức dòng điện tiêu thụ tối đa là 2.3A Chip PHY hoạt động dòng điện tiêu thụ tối đa là 600mA Các khe PCIe dùng để gắn hai module WLE900VX và WLE200N2 [2] [3] công suất bức xạ tối đa lần lượt là 16dBm và 20dBm quy đổi ra mW là 40mW và 100mW tức dòng điện tiêu thụ tổng là 43mA SD card tiêu thụ dòng khoản 0.1A Vậy tổng dòng ngõ ra của bộ nguồn phải đạt tối thiểu là 3.43A để đảm bảo nguồn hoạt động bình thường

IC biến đổi điện áp DC ngõ vào (12V) sang DC (ngõ ra 3.3V) được sử dụng có mã số là 88PH8101 của hãng Marvell, IC này có dòng ngõ ra hơn 5A

Hình 3.5 Sơ đồ chân của IC 88PH8101

Bảng 3.2 Mô tả các chân trên IC 88PH8101

Chân Tên Kiểu chân Mô tả

1 EN Ngõ vào Cho phép kích hoạt IC với mức logic cao (>2V) thì cho phép và ngược lại, với mức thấp (2 V) thì cho phép mode PWM và mức thấp (2V) thì cho phép và ngược lại, với mức thấp (All Layers, là nơi tổng hợp tất cả các đường mạch trong thiết kế của ta, tại đó đã được cài đặt mặc định là sử dụng các thông số cơ bản của gói default

Hình 4.7 Tab Physical: các gói thiết lập (trên), các đường mạch cụ thể (dưới)

Cụ thể, ta muốn thiết lập 1 gói cho đường mạch có trở kháng là 50 ohm, là đường mạch có kích thước dây là 4 mil Ta làm như sau: chọn cây thư mục Physcal Constraint Set-> All Layers, click chuột phải vào tên bản mạch in của bạn, chọn Creat/Physical Cset, đặt tên cho gói này là 50OHM Ta thiết lập kích thước đường mạch tối thiểu và tối đa là 4 mil

Hình 4.8 Tạo gói kích thước đường mạch có tên là 50OHM

Hình 4.9 Gói kích thước đường mạch 50OHM đã được tạo xong

Tương tự, ta tạo một gói cho các đường mạch vi sai và đặt tên là DIFF100, tức là đường mạch vi sai có trở kháng là 100 ohm Trong đó kích thước đường mạch tối đa và tối thiểu là 4 mil, đây là dây vi sai nên cần thiết lập thêm thông số Min Line Spacing (khoản cách dây tối thiểu) và Primary Gap là 9 mil, như đã đề cập lúc trước

Hình 4.10 Tạo gói kích thước đường mạch có tên DIFF100

Ta lại vào cây thư mục Net->All Layers, tìm các đường mạch cần thiết lập cụ thể, chỉnh lại gói thiết lập ban đầu

Hình 4.11 Chọn các đường mạch ứng với trở kháng cần thiết Đối với các đường mạch vi sai, cần vào tab Electrical đề cài thiết lập cho chương trình biết rằng đó là các dây vi sai, khi tiến hành vẽ đường mạch, chương trình sẽ biết và đảm bảo rằng lúc nào ta cũng vẽ đường mạch này theo 1 cặp song song với nhau Vào tab Electrical, trong cây thư mục chọn Net-> Routing -> Different Pair, cửa sổ Create Differential Pair hiện lên, ta chọn Auto Setup, trong cửa sổ mới hiện lên, ta nhập P (Positive) và N (Negative) vào +/-Fillter, sau đó nhấn Enter, phần mềm sẽ tự tìm đến các đường mạch có tên giống nhau nhưng chỉ khác ký tự cuối là P hoặc N và cấu hình chúng thành 1 cặp dây vi sai

Hình 4.12 Mở cửa sổ để thiết lập các đường dây vi sai

Hình 4.13 Tự động thiết lập các đường dây vi sai

57 đường mạch cụ thể, ta chọn tất cả các đường mạch cần thiết lập delay, click chuột phải chọn Create/ Match Group, đặt tên cho group này (thường là cùng tên với đường mạch) sau đó nhấn Ok

Trong phần sai số (Tolerance) đổi thành 0 mil: 5 mil

Hình 4.15 Đổi sai số, độ chênh lệch giữa các dây thành 0 mil: 5 mil

Các loại nhiễu có thể xuất hiện trong bản mạch in tốc độ cao:

Nhiễu xuyên kênh (cross talk): khi các bản mạch in được bố trí dày đặc, tín hiệu truyền trên một dây sẽ gây nên nhiễu ở một dây khác, đặc biệt là các dây song song và nằm gần với nhau

Một số cách khắc phục nhiễu

Tụ điện tách sóng (Decoupling capacitor): Tụ điện tách sóng được nối với nguồn/tín hiệu với đất (GND) và thường được đặt càng gần các chân nguồn/tín hiệu của IC Tụ tách sóng có nhiệm vụ:

Hoạt động như một nguồn dự phòng, khi mạch điện cần nguồn điện lớn thì tụ sẽ xả điện, ổn định nguồn điện trong một thời gian ngắn Sau đó, tụ sẽ được nạp lại lần nữa để sẵn sàng cho lần xả điện tiếp theo

Ngoài ra, trong mạch tần số cao, sẽ có sự xuất hiện của nhiễu tần số cao, đối với các nhiễu này, tụ điện được xem như ngắn mạch và đưa nhiễu tần số cao xuống đất Vì thế tụ điện được xem như một thành phần lọc nhiễu tần số cao

Lựa chọn và stack-up cho mạch in

Stack-up là việc xác định rõ ràng mạch in gồm bao nhiêu mặt phẳng (plane), cụ thể là bao nhiêu mặt phẳng dùng để vẽ các đường mạch tín hiệu, bao nhiêu mặt phẳng nguồn, bao nhiêu mặt phẳng đất và thứ tự sắp xếp các mặt phẳng sao cho hợp lý nhất Việc lựa chọn stack-up cho mạch in phụ thuộc vào khả năng thi công mạch in của nhà sản xuất mà ta lựa chọn, phụ thuộc vào mật độ linh kiện trên mạch in, phụ thuộc vào tần số hoạt động, thời gian lên/xuống của tín hiệu

Khi tần số hoạt động của thiết kế lớn, việc lựa chọn stack-up trở nên càng quan trọng hơn Nếu stack-up không tốt thì bản mạch in của bạn có thể hoạt động chập chờn, tạo nên bức xạ EMI nhiều Một stack-up tốt không những giảm khả năng bức xạ mà còn có thể giảm nhiễu từ các nguồn bên ngoài vào mạch in

Trừ các bản mạch in một lớp ra thì số lượng mặt phẳng trên bản mạch in thường là số chẵn (2, 4, 6…) Trong đó, một mặt phẳng tín hiệu hoặc mặt phẳng nguồn thường được đặt liền kề và càng gần một mặt phẳng đất nhưng mặt phẳng tín hiệu sẽ được ưu tiên hơn

Trong mạch in của ta, stack-up được chọn là 6 mặt phẳng (dẫn điện) theo thứ tự: Top – GND – Signal – Power – GND – Bottom Để cấu hình stack-up cho mạch in, ta mở menu Setup/ Cross-section…

Hình 4.17 Thêm một mặt phẳng

Hình 4.18 Cấu hình stack-up 6 lớp bên thi công bo mạch cung cấp

Hình 4.19 Cấu hình stack-up 6 lớp cho bo mạch

Kết quả layout bo mạch

63 sẽ được cho phép khởi động bằng cách tích cực chân EN của IC chuyển đổi mỗi bộ nguồn đó, khi bộ nguồn đã khởi động thành công, chân PG của IC sẽ được tích cực và STM sẽ nhận biết rằng bộ nguồn đó đã khởi động thành công Đồng thời mỗi khi có kết nối LAN, WAN, PCIe thì các kết nối này sẽ trả tín hiệu về STM thông báo rằng có kết nối, ngoài ra STM còn kết nối với module SOM qua giao tiếp I2C nhằm nhận lệnh điều khiển từ SOM để điều khiển các LED Từ đó STM sẽ quản lý các chương trình điều khiển dàn đèn LED RGB sáng để báo hiệu các trạng thái Router như LED khởi động, reset, nạp bootloader, sự cố nguồn, báo hiệu có card Wi-Fi, cổng LAN, WAN đang được kết nối vào bo mạch

Hình 5.1 Sơ đồ giao tiếp SOM và STM32

Sơ đồ khối tổng quát hoạt động:

Hình 5.2 Sơ đồ khối tổng quát của STM32

Khi cấp nguồn 12V/2A vào mạch qua jack DC: Nguồn +3V3AO sẽ được tạo ra đầu tiên nhờ khối nguồn +3V3AO (Ngõ vào 12V ngõ ra 3.3V), khối nguồn này cung cấp cho STM32 hoạt động Ngay sau đó, STM thực hiện chương trình điều khiển LED khởi động (Các LED chạy từ trái sang phải và ngược lại, bằng các màu khác nhau để báo hiệu router đã sẵn sàng)

Tiếp sau đó STM32, STM32 sẽ tích cực từng chân EN của các nguồn theo thứ tự lần lượt và đợi tín hiệu PG trả về trong 2s, nếu sau 2s mà không có tín hiệu PG trả về mức cao thì tức là nguồn hoạt động không ổn định và ngược lại, khi có tín hiệu PG trả về mức cao

PHẦN MỀM CHO KHỐI ĐIỀU KHIỂN NGUỒN

Các tín hiệu từ nút nhấn: 2 nút nhấn

Hình 5.3 Vị trí 2 nút nhấn mà người dùng có thể tương tác

Nút nhấn RESET khi được nhấn sẽ trả về mức 0 cho STM, lúc này STM sẽ kích reset cho CPU, do đó, toàn bộ mạch sẽ reset và hoạt động lại từ đầu

Nút nhấn thay đổi độ sáng khi được nhấn thì sẽ trả về mức 0 cho STM, các mức độ sáng

66 của LED gồm 100%, 70%, 40%, 25%, 12%, 5%, 1% và 0% Các độ sáng LED được diều chế bằng xung PWM Mỗi lần nhấn nút để thay đổi độ sáng thì độ sáng LED sẽ giảm theo các mức đã liệt kê phía trên, sau mức 0% sẽ quay về mức 100%.

Báo tín hiệu trên LED

STM32 quản lý các chương trình điều khiển LED hiển thị như: Hiệu ứng LED khởi động, reset, nạp bootloader, sự cố nguồn, bao hiệu có card wifi, cổng LAN, WAN đang hoạt động,…

Khi gắn card wifi hay FPGA, các cổng LAN, WAN thì đều có các đèn sáng tương ứng để báo hiệu cho người dùng như:

Bảng 5.1 Số thứ tự LED và ý nghĩa của chúng

Số thứ tự LED Báo kết nối

Các đèn LED này là RGB nên dễ dàng thay đổi màu sắc, với:

Bảng 5.2 Bảng màu xuất ra LED RGB

Màu xanh da trời 0x0000FF

Màu đen (không sáng LED) 0x000000

Tín hiệu I2C gửi từ CPU

Từ terminal, sử dụng các lệnh đã quy định sẵn để điều khiển các ứng dụng như: điều khiển độ sáng, giá trị độ sáng, đổi màu của LED, reset mạch,… Ta cần gửi các giá trị như: Bus data, địa chỉ I2C cảu slave, địa chỉ resister, kiểu dữ liệu xử lý,…

Lệnh Địa chỉ Giải thích

CMD_GET_STATUS_WORD 0x01 STM sẽ trả giá trị về

CMD_GENERAL_CONTROL 0x02 CPU điều khiển STM

CMD_LED_MODE 0x03 Chọn mode LED Default/user

CMD_LED_STATE 0x04 LED ON hay OFF

CMD_LED_COLOUR 0x05 Đổi màu LED

CMD_SET_BRIGHTNESS 0x07 Set độ sáng của LED

CMD_GET_BRIGHTNESS 0x08 Lấy giá trị độ sáng hiện tại

CMD_GET_FW_VERSION_APP 0x0A Lấy giá trị phiên bản version

CMD_WATCHDOG_STATE 0x0B RUN/STOP waichdog

CMD_WATCHDOG_STATUS 0x0C DISABLE/ENABLE watchdog

CMD_GET_WATCHDOG_STATE 0x0D Trạng thái watchdog

CMD_GET_FW_VERSION_BOOT 0x0E Lấy version của bootloader

Các lệnh giao tiếp I2C giữa MCU và STM đều có cấu trúc sau: i2cset [i2cbus number] [địa chỉ] [địa chỉ] [dữ liệu] [kiểu dữ liệu]

- i2cset: từ khóa giao tiếp i2c

- [i2cbus number]: bus number của giao tiếp, ở đây là 1

- [địa chỉ slave]: địa chỉ của slave trong đường truyền i2c, ở đây là 0x2A

- [địa chỉ thanh ghi]: địa chỉ của thanh ghi ứng với lệnh cần thực thi, là các lệnh trong Bảng 6.4

- [dữ liệu]: dữ liệu được gửi xuống, tùy lệnh mà dữ liệu được gửi xuống khác nha, sẽ được trình bày rõ ở từng lệnh Giá trị [dữ liệu] này tùy từng loại lệnh mà có hoặc không, đối với lệnh chỉ đọc thì sẽ không có giá trị này, đối với lệnh chỉ ghi thì giá trị này là một byte, hai byte hoặc nhiều hơn tùy câu lệnh

- [kiểu dữ liệu]: là một kí tự quy ước kiểu dữ liệu được gửi đi, kí tự ‘w’ quy ước kiểu dữ liệu là word, ‘b’ quy ước kiểu dữ liệu là byte, ‘i’ quy ước kiểu dữ liệu là

68 block data a) Lệnh CMD_GET_STATUS_WORD

Lệnh CMD_GET_STATUS_WORD này được gửi từ MCU xuống STM32 và STM32 sẽ trả về giá trị tương ứng với trạng thái hiện tại của nó, lệnh này là lệnh chỉ đọc Trong đó [địa chỉ thanh ghi] có giá trị 1 ứng với lệnh CMD_GET_STATUS_WORD, [dữ liệu] sẽ không có vì đây là lệnh chỉ đọc, [kiểu dữ liệu] là w (word) Sau khi gửi xong câu lệnh, STM sẽ trả về giá trị là một word (gồm 16 bit) ứng với mỗi bit là một trạng thái của các khối được liệt kê ở bảng sau

Trọng số bit Ý nghĩa Ghi chú

4 CARD_DET 1 - mSATA/PCIe card detected, 0 - no card

5 mSATA_IND 1 - mSATA card inserted, 0 - PCIe card inserted

6 USB30_OVC 1 - USB3-port0 overcurrent, 0 - no overcurrent

7 USB31_OVC 1 - USB3-port1 overcurrent, 0 - no overcurrent

8 USB30_PWRON 1 - USB3-port0 power ON, 0 - USB-port0 power off

9 USB31_PWRON 1 - USB3-port1 power ON, 0 - USB-port1 power off

10 ENABLE_4V5 1 - 4.5V power is enabled, 0 - 4.5V power is disabled

11 BUTTON_MODE 1 - user mode, 0 - default mode (brightness settings)

12 BUTTON_PRESSED 1 - button pressed in user mode, 0 - button not pressed 13 15 BUTTON_COUNT number of pressing of the button (max 7) - valid in user mode

Ví dụ: Muốn đọc trạng thái từ STM, sử dụng lệnh: i2cget 1 0x2A 1 w

W-> data kiểu word b) Lệnh CMD_GENERAL_CONTROL

Lệnh này dùng để cấu hình lại các thành phần phần cứng liên quan khác như ngắt kết

Bảng 5.4 Dữ liệu trong lệnh CMD_GENERAL_CONTROL

Trọng số bit Ý nghĩa Ghi chú

0 LIGHT_RST 1 - do light reset, 0 - no reset

1 HARD_RST 1 - do hard reset, 0 - no reset

3 USB30_PWRON 1 - USB3-port0 power ON, 0 - USB-port0 power off

4 USB31_PWRON 1 - USB3-port1 power ON, 0 - USB-port1 power off

6 BUTTON_MODE 1 - user mode, 0 - default mode (brightness settings)

Ví dụ: Để reset lại hệ thống: i2cset 1 0x2A 2 0x0101 w

W -> data kiểu word c) Lệnh CMD_LED_MODE

Cấu hình các đèn Led ở chế độ mặc định (default) hay người dùng tùy chỉnh (user), đối với chế độ mặc định, người dùng không thể dùng lệnh để thay đổi màu sắc, độ sáng của LED được và thứ tự LED ứng với các khối chức năng được thể hiện trong bảng sau Còn đối với chế độ người dùng, ta có thể dùng lệnh để thay đổi màu sắc hay độ sáng LED Theo cấu trúc mã lệnh đã được trình bày thì lệnh CMD_LED_MODE có [địa chỉ thanh ghi] là 3, [kiểu dữ liệu] là b (byte), [dữ liệu] là một byte tức 8 bit, mỗi bit quy ước chức năng được trình bày trong bảng sau

Bảng 5.5 Dữ liệu trong lệnh CMD_LED_MODE

Trọng số bit Ý nghĩa Ghi chú

0 3 LED number [0 11] Trường hợp muốn điều khiển tất cả các LED một lần -> LED number = 12

4 LED mode 1 - USER mode, 0 - default mode

Ví dụ: Chọn LED 1 là user mode: i2cset 1 0x2A 3 0x1A b

0x1A -> LED 1 ở chế độ user mode

B -> data kiểu byte d) Lệnh CMD_LED_STATE

Lệnh CMD_LED_STATE dùng để cấu hình các đèn LED ON/OFF, theo cấu trúc mã lệnh được trình bày thì lệnh CMD_LED_STATE có [địa chỉ thanh ghi] là 4, [kiểu dữ liệu] được gửi đi là b (byte), [dữ liệu] là một byte tức 8 bit, trong đó 4 bit trọng số thấp quy ước

12 vị trí của 12 LED (từ 0 đến 11), bit thứ 4 là trạng thái ON/OFF của LED cần cấu hình,

1 là ON, 0 là OFF như bảng sau

Trọng số bit Ý nghĩa Ghi chú

0 3 LED number [0 11] Trường hợp muốn điều khiển tất cả các LED -

4 LED mode 1 - LED ON, 0 - LED OFF

Ví dụ: set LED 1 ON: i2cset 1 0x2A 4 0x1A b

0x1A -> LED 1 set ON e) Lệnh CMD_LED_COLOUR

Lệnh này dùng để tùy chỉnh màu sắc của các đèn LED Theo cấu trúc mã lệnh được trình bày thì lệnh CMD_LED_COLOUR có [địa chỉ thanh ghi] là 5, [kiểu dữ liệu] được gửi đi là I (tức block data), [dữ liệu] là một khối dữ liệu gồm 4 byte riêng biệt, byte thứ nhất quy ước là để chọn LED, byte thứ 2, 3 và 4 quy ước mã màu sắc của các tông màu đỏ, xanh lá cây, xanh dương, cụ thể được trình bày ở bảng sau

Bảng 5.6 Dữ liệu được gửi trong lệnh CMD_LED_COLOUR

Byte Trọng số bit Ý nghĩa Ghi chú

1 0 3 LED number [0 11] Trường hợp muốn điều khiển tất cả các

71 0x00 0xFF 0 x00 -> red colour = 0x00, green = 0xFF, blue = 0x00

I -> data kiểu block f) Lệnh CMD_SET_BRIGHTNESS

Lệnh CMD_SET_BRIGHTNESS dùng để thay đổi độ sáng của LED trong khoảng 0- 100%, [địa chỉ thanh ghi] của lệnh này là 7, [kiểu dữ liệu] gửi xuống là kiểu b (byte), [dữ liệu] được gửi đi là một byte tức 8 bit quy định độ sáng cần thay đổi trong khoản 0 đến 100 tương ứng với 0 đến 100%

Ví dụ: Set độ sáng của LED là 20%: i2cset 1 0x2A 7 20 b

20 -> độ sáng 20% g) Lệnh CMD_GET_BRIGHTNESS

Lệnh CMD_GET_BRIGHTNESS dùng để lấy giá trị đọ sáng của LED hiện tại, đây là lệnh chỉ đọc vì thế không có thành phần [dữ liệu] trong lệnh gửi đi Các thành phần còn lại như [địa chỉ thanh ghi] có giá trị là 8, [kiểu dữ liệu] là b (byte)

Ví dụ: Để đọc giá trị độ sáng hiện tại: i2cget 1 0x2A 8 b

8 -> địa chỉ của register h) Lệnh CMD_USER_VOLTAGE

Lệnh CMD_USER_VOLTAGE dùng để set giá trị điện áp, hiện tại chưa phát triển phần này nên không sử dụng i) Lệnh CMD_GET_RESET:

Lệnh CMD_GET_RESET được dùng để reset cả hệ thống, đây là lệnh chỉ ghi, [địa chỉ thanh ghi] có giá trị là 9, [kiểu dữ liệu] là b (byte)

Ví dụ: Để reset: i2cget 1 0x2A 9 b

9 -> địa chỉ register j) Lệnh CMD_WATCHDOG_STATE

Lệnh CMD_ WATCHDOG_STATE được dùng để bật/ tắt watchdog, đây là lệnh chỉ

72 ghi, [địa chỉ thanh ghi] có giá trị là 0X0B, [dữ liệu] chỉ có hai giá trị 1 hoặc 0 ứng với bật hoặc tắt watchdog Watchdog cần phải được tắt trong vòng 2 phút sau khi khởi động k) Lệnh CMD_GET_WATCHDOG_STATE

Lệnh CMD_GET_WATCHDOG_STATE được dùng để xem trạng thái watchdog, đây là lệnh chỉ đọc, [địa chỉ thanh ghi] có giá trị là 0X0D, [dữ liệu] không có, [kiểu dữ liệu] là b (byte) l) Lệnh CMD_WATCHDOG_STATUS

Lệnh CMD_WATCHDOG_STATUS là lệnh gán trạng thái cho watchdog, khi trạng thái này được gán thì watchdog hoạt động (lúc này cần tự tắt watchdog bằng lệnh CMD_WATCHDOG_STATE mỗi khi reset), khi không gán thì watchdog bị tắt vĩnh viễn [địa chỉ thanh ghi] có giá trị là 0X0C, [dữ liệu] là 1 hoặc 0 ứng với bật hoặt tắt vĩnh viễn m) Lệnh CMD_GET_FW_VERSION_APP/_BOOT

Lệnh CMD_GET_FW_VERSION_APP và CMD_GET_FW_VERSION_BOOT: để lấy giá trị version của Application và bootloader.

73 Trước khi đi sâu vào xây dựng một hệ điều hành cho board mạch, việc chọn lựa một hệ điều hành cho board mạch đóng vai trò quan trọng trong quá trình phát triển một thiết bị định tuyến Ở thời điểm hiện nay, đã có nhiều hãng sản xuất thiết bị định tuyến tự phát triển một hệ điều hành cho riêng mình, nhưng hầu hết trong các hãng sản xuất này đều phát triển từ hệ điều hành với nhân Linux vì đây là hệ điều hành có những ưu điểm như là bảo mật củng như linh hoạt Không giống như ở một vài năm về trước khi mà hệ điều hành Linux vẫn là một khái niệm xa lạ đối với người dùng phổ thông nên ít có nhà phát triển phần mềm phát triển ứng dụng của họ trên hệ điều hành này, nhưng trong những năm gần đây, khi mà những ưu điểm của hệ điều hành nhân Linux mang lại cho người dùng, các nhà phát triển ứng dụng đã nhận thấy tiềm năng mà hệ điều hành này mang lại và tập trung phát triển những ứng dụng liên quan cho hệ điều hành nhân Linux Vì vậy thay vì phát triển một hệ điều hành từ con số không sẽ tốn khá nhiều công sức và chi phí, việc phát triển từ một hệ điều hành nhân Linux và phát triển các ứng dụng liên quan cho hệ điều hành này vẫn là lựa chọn tối ưu nhất

Hệ thống nhúng Linux gồm những thành phần chính sau:

- Toolchain: chứa trình biên dịch và các công cụ cần thiết để tạo code cho thiết bị

Những thứ khác đều phụ thuộc vào toolchain

- Bootloader: Nó cần thiết cho quá trình khởi tạo và tải Linux kernel

- Kernel: trái tim của hệ thống, có nhiệm vụ quản lý tài nguyên và giao tiếp với hardware

- Root filesystem: chứa các thư viện và chương trình được chạy sau khi quá trình khởi tạo kernel hoàn thành.

HỆ ĐIỀU HÀNH CHO BO MẠCH

Cross Compiler & Toolchain

Toolchain là một tập hợp các công cụ lập trình được sử dụng để thực hiện phát triển phần mềm phức tạp hoặc để tạo ra một sản phẩm phần mềm, thường là một chương trình ở một thiết bị khác hoặc một tập hợp các chương trình có liên quan Thông thường, Toolchain dành cho các thiết bị nhúng là cross toolchain Tất cả các chương trình (như là GCC) đều được chạy trên host system với một kiến trúc cụ thể (như là kiến trúc x86), nhưng chúng tạo ra một tệp binary code để chạy trên một hệ thống với kiến trúc khác (như là kiến trúc ARM) Đây được gọi là cross compile và là cách để xây dựng nên một hệ thống nhúng

Trước khi tìm hiểu kỹ hơn về toolchain, cần phải phân biệt ba loại máy sau đây:

- Build machine: Nơi mà toolchain được xây dựng

- Host machine: Nơi mà toolchain được thực thi

- Target machine: Toolchain tạo ra code để chạy trên máy này

Bên cạnh khái niệm về ba loại máy trên, chúng ta cần phải phân biệt ba loại toolchain:

- Native toolchain: Có thể tìm thấy trên các bản phân phối Linux thông thường được xây dựng trên kiến trúc cụ thể như x86, chạy trên kiến trúc x86 và tạo ra tệp thực thi chạy trên kiến trúc x86

- Cross-compilation toolchain: là loại toolchain để phát triển nhúng, thường được biên dịch trên x86, chạy trên x86 và tạo mã cho kiến trúc khác (có thể là ARM,

Các thành phần của một toolchain:

- Binutils: GNU Binutils là thành phần đầu tiên của chuỗi công cụ GNU Binutils chứa hai công cụ rất quan trọng: as (assembler, chuyển mã lắp ráp (do GCC tạo ra) thành nhị phân), ld (linker, liên kết một số mã đối tượng vào một thư viện hoặc một tệp thực thi)

- Compiler: Thành phần chính thứ hai của toolchain là compiler Trong hệ điều hành nhúng Linux, phổ biến là trình biên dịch của GNU

- C Library: Thư viện C triển khai API POSIX có thể được sử dụng để phát triển các ứng dụng lớp user-space Nó giao tiếp với hạt nhân thông qua các cuộc gọi hệ thống (system call 1 ) và cung cấp các dịch vụ cấp cao hơn Ngày nay có nhiều tùy chọn cho Thư viện C:

- glibc: là thư viện C từ dự án GNU Đó là thư viện C được hầu như tất cả các hệ thống GNU / Linux trên máy tính để bàn và máy chủ sử dụng Nó có đầy đủ tính năng, tuân thủ các tiêu chuẩn, nhưng nhược điểm của nó là hơi cồng kềnh

- Embedded GLIBC (EGLIBC): là một biến thể của GNU C Library (GLIBC) được tối ưu hóa cho các hệ thống nhúng Các mục tiêu của nó bao gồm giảm footprint, hỗ trợ cross compile và cross testing, đồng thời duy trì khả năng tương thích mã nguồn và mã nhị phân với GLIBC Tuy nhiên dự án này đã không còn được phát triển nữa

- uClibc: là một thư viện C thay thế, có dung lượng nhỏ hơn nhiều Thư viện này có thể là một sự thay thế phù hợp nếu bộ nhớ là một vấn đề Tuy nhiên, lợi thế về không gian bộ nhớ đạt được khi sử dụng uClibc đang trở nên ít quan trọng hơn khi giá bộ nhớ và flash tiếp tục giảm Nó vẫn là thư viện C hữu ích cho các hệ thống nhúng không có MMU

1 System call: lệnh gọi hệ thống là cách một tiến trình yêu cầu một dịch vụ từ kernel của hệ điều hành mà nó thường không có quyền chạy Các cuộc gọi hệ thống cung cấp giao diện giữa một tiến trình và hệ điều hành Hầu hết các hoạt động tương tác với hệ thống yêu cầu các quyền không có sẵn đối với quy trình cấp người dùng, ví dụ: I / O được thực hiện với một thiết bị có trên hệ thống hoặc bất kỳ hình thức giao tiếp nào với các quy trình khác đều yêu cầu sử dụng lệnh gọi hệ thống

- uClibc-ng: là một phần phụ của thư viện uClibc C Mục tiêu chính của spin-off là làm thường xuyên phát hành và thực hiện nhiều thử nghiệm thời gian chạy tự động

- musl: Thư viện C tiêu chuẩn mới Nhẹ, nhanh, đơn giản, miễn phí

Thư viện C có mối quan hệ đặc biệt với trình biên dịch C, vì vậy việc lựa chọn thư viện

C phải được thực hiện khi chuỗi công cụ được tạo Khi chuỗi công cụ đã được xây dựng, bạn không thể chuyển sang thư viện khác được nữa

- Debugger: Trình gỡ lỗi cũng thường là một phần của toolchain, vì cần có trình gỡ lỗi chéo để gỡ lỗi các ứng dụng đang chạy trên thiết bị mục tiêu Trong thế giới nhúng Linux , trình gỡ lỗi điển hình là GDB.

Bootloader

Một hệ thống nhúng Linux thường được bao gồm bootloader (trình khởi động) Bootloader không phải một phần của Linux, nhưng nó là một phần quan trọng không thể thiếu trong một hệ thống nhúng Linux

Khi một hệ thống nhúng được khởi động, CPU chạy những dòng code đầu tiên, đó là bootloader Bootloader sẽ khởi động những phần cứng cần thiết, Sau đó là tìm những chương trình tiếp theo và tải nó lên bộ nhớ, và thực thi các chương trình đó Tại thời điểm này, bootloader sẽ không được chạy lại, vì vậy nó bị loại bỏ khỏi bộ nhớ Chương trình tiếp theo để chạy có thể là bất cứ thứ gì Không có gì lạ khi có bộ nạp khởi động tải một bộ nạp khởi động tiếp theo, bộ nạp khởi động này lại tải thêm một bộ nạp khởi động khác Cuối cùng, để hệ thống trở nên hữu ích, cuối cùng nó sẽ tải mã hệ điều hành - trong trường hợp này là nhân Linux Một hệ thống đơn giản sẽ chạy bộ nạp khởi động sau khi đặt lại CPU, sau đó tải và chạy hệ điều hành Có một bootloader riêng, thay vì chỉ chạy kernel ngay lập tức, mang lại sự linh hoạt; bây giờ kernel có thể nằm ở nhiều vị trí khác nhau, được bootloader tìm thấy và tải Điều này làm cho nó có thể sử dụng cùng một bootloader từ giai đoạn đầu phát triển đến sản xuất hệ thống nhúng, chỉ bằng cách lưu trữ các cấu hình khác nhau trong bootloader Ví dụ, trong giai đoạn đầu phát triển, nền tảng nhúng có thể khởi động hoàn toàn từ mạng; trong khi trong quá trình phát triển sau này, nó có thể khởi động từ thẻ SD và hệ thống sản xuất có thể khởi động từ flash NAND

U-Boot: Bộ nạp khởi động phổ biến nhất cho các hệ thống Linux nhúng là U-Boot U-

Boot có tên chính thức là Das U-Boot, gọi tắt là U-Boot Nó hỗ trợ nhiều kiến trúc CPU - bao gồm 68k, ARM, MicroBlaze, MIPS, Nios, SuperH, PPC, RISC-V, x86, v.v Nó cũng chứa mã để hỗ trợ nhiều bảng phát triển nhúng hiện tại

U-Boot là một bộ nạp khởi động mã nguồn mở Đối với các hệ thống mã U-Boot có thể được sửa đổi để hỗ trợ phần cứng cụ thể U-Boot cũng có rất nhiều trình điều khiển, có

77 dạng các biến môi trường U-Boot thường lưu trữ các biến môi trường này trong bộ nhớ flash, nơi các giá trị của chúng có thể tồn tại qua các lần khởi động lại Khi U-Boot chạy, nó sẽ tìm kiếm biến môi trường có tên là ‘bootcmd’ Sau đó, U-Boot mở rộng biến này và chạy bất kỳ lệnh nào có trong đó U-Boot chứa dòng lệnh có cú pháp giống Unix Trong môi trường dòng lệnh này, có thể sửa đổi các biến môi trường và lưu trữ các giá trị mới trong flash - sẽ được sử dụng trong các lần khởi động tiếp theo Trên thực tế, có thể sử dụng U-Boot trong quá trình đang phát triển, ví dụ: được định cấu hình để khởi động kernel qua TFTP bằng NFS cho hệ thống tệp gốc Sau đó, khi sắp hoàn thiện, có thể thay đổi nó để khởi động từ thẻ SD qua MMC bằng cách sử dụng ext4 Và khi tiến gần sản phẩm hoàn thiện, chúng ta có thể thay đổi U-Boot để khởi động từ flash NAND bên trong bo mạch bằng UBIFS

Một tính năng quan trọng khác trong U-Boot là hỗ trợ device-tree device-tree là một cách mới hơn để mô tả phần cứng cho kernel Hệ thống nhúng hiếm khi có phần cứng có thể phát hiện trong thời gian chạy Kernel không thể chỉ truy vấn phần cứng để tìm ra thứ có sẵn Kernel phải biết được cho biết thiết bị nào hiện diện Thay vì thông tin phần cứng được mã hóa cứng, kernel có thể đọc device-tree mô tả phần cứng và tải các trình điều khiển thích hợp Điều này cho phép cùng một tệp nhị phân hạt nhân chạy trên các bảng khác nhau dựa trên cùng một kiến trúc.

Kernel

Kernel là một chương trình máy tính ở lõi của hệ điều hành máy tính, có quyền kiểm soát hoàn toàn mọi thứ trong hệ thống Nó là một phần của hệ điều hành luôn được hiện diện trong bộ nhớ, và tạo điều kiện cho các tương tác giữa các thành phần cứng và phần mềm Trên hầu hết các hệ thống, hạt nhân là một trong những chương trình đầu tiên được tải khi khởi động (sau bootloader) Nó xử lý phần còn lại của khởi động cũng như bộ nhớ, thiết bị ngoại vi và các yêu cầu nhập / xuất (I/O) từ phần mềm, chuyển chúng thành các lệnh xử lý dữ liệu cho bộ xử lý trung tâm

Mã quan trọng của kernel thường được tải vào một vùng bộ nhớ riêng biệt, vùng này được bảo vệ khỏi sự truy cập của các chương trình ứng dụng hoặc các phần khác ít quan trọng hơn của hệ điều hành Kernel thực hiện các tác vụ của nó, chẳng hạn như chạy các tiến trình, quản lý các thiết bị phần cứng như đĩa cứng và xử lý các ngắt trong không gian

78 kernel được bảo vệ Ngược lại, các chương trình ứng dụng như trình duyệt, trình xử lý văn bản hoặc trình phát âm thanh hoặc video sử dụng một vùng bộ nhớ, không gian người dùng riêng biệt Sự tách biệt này ngăn không cho dữ liệu người dùng và dữ liệu hạt nhân giao thoa với nhau và gây ra sự mất ổn định và chậm chạp, cũng như ngăn chặn các chương trình ứng dụng bị trục trặc làm hỏng toàn bộ hệ điều hành

Kernel interface là một lớp mức thấp Khi một tiến trình yêu cầu một dịch vụ tới kernel, nó phải gọi một lệnh gọi hệ thống (system call), thường là thông qua một hàm wrapper được các ứng dụng userspace dùng bởi các thư viện hệ thống nhúng để nhập kernel sau khi tải các thanh ghi CPU với số system call và các tham số của nó (ví dụ: hệ điều hành giống UNIX thực hiện nhiệm vụ này bằng cách sử dụng thư viện chuẩn C)

Hình 6.2 Kernel là trung gian giao tiếp giữa Application và phần cứng

Có các thiết kế kiến trúc nhân khác nhau Kernel nguyên khối chạy hoàn toàn trong một không gian địa chỉ duy nhất với CPU thực thi ở chế độ giám sát, chủ yếu là tốc độ Các kênh vi mô chạy hầu hết nhưng không phải tất cả các dịch vụ của chúng trong không gian người dùng, giống như các quy trình của người dùng, chủ yếu để phục hồi và mô đun MINIX 3 là một ví dụ đáng chú ý về thiết kế kênh vi mô Thay vào đó, nhân Linux là nguyên khối, mặc dù nó cũng là mô-đun, vì nó có thể chèn và gỡ bỏ các mô-đun nhân có thể tải được trong thời gian chạy

Thành phần trung tâm này của hệ thống máy tính chịu trách nhiệm cho các chương trình 'đang chạy' hoặc 'đang thực thi' Kernel chịu trách nhiệm quyết định bất cứ lúc nào trong số nhiều chương trình đang chạy sẽ được cấp phát cho bộ xử lý hoặc các bộ xử lý

Linux Kernel: Torvalds đã tạo ra Linux kernel vào năm 1991 Ban đầu, ông đặt tên cho dự án là Freax (kết hợp giữa các từ “free”, “freak” và “UNIX”) Nhưng một đồng nghiệp khác của Torvalds lại thích cái tên Linux (sau đó Linux trở thành tên gọi chính thức)

79 tại sao một số người gọi hệ điều hành này là GNU/Linux Những desktop mã nguồn mở và miễn phí khác, như FreeBSD, trông giống với Linux vì chúng chạy hầu hết các phần mềm GNU giống nhau Do Linux kernel có sẵn theo giấy phép GNU, nên ít quan tâm đến việc tiếp tục phát triển một kernel riêng biệt như một phần của dự án GNU Và thay vì tạo ra các kernel cạnh tranh khác, như trong Windows và macOS, nhiều công ty đã chọn sử dụng và đóng góp cho Linux kernel Linux kernel đã phát triển thành một dự án lớn chứa hàng triệu dòng code Hàng ngàn người và hơn một nghìn công ty đã đóng góp cho sự phát triển của kernel Đây là một trong những ví dụ nổi bật nhất về phần mềm mã nguồn mở và miễn phí trên thế giới.

Các ứng dụng ở lớp User-space

Như đã đề cập ở phần Kernel, một hệ thống cần thiết phải có Kernel để hoạt động, nhưng hệ thống đó là vô nghĩa nếu như không có một ứng dụng nào sử dụng kernel Các ứng dụng này có thể là các chương trình init 2 hoặc các ứng dụng đồ họa dành cho người dùng

Hệ điều hành máy tính hiện đại thường tách bộ nhớ ảo thành không gian kernel và không gian người dùng Về cơ bản, sự tách biệt này nhằm cung cấp khả năng bảo vệ bộ nhớ và bảo vệ phần cứng khỏi hành vi phần mềm độc hại hoặc sai lầm

Không gian kernel được dành riêng cho việc chạy nhân hệ điều hành đặc quyền, phần mở rộng nhân và hầu hết các trình điều khiển thiết bị Ngược lại, không gian người dùng là vùng bộ nhớ nơi phần mềm ứng dụng và một số trình điều khiển thực thi

Thuật ngữ userspace đề cập đến tất cả mã chạy bên ngoài kernel của hệ điều hành Vùng người dùng thường đề cập đến các chương trình và thư viện khác nhau mà hệ điều hành sử dụng để tương tác với kernel: phần mềm thực hiện I/O, thao tác các đối tượng hệ thống tệp, phần mềm ứng dụng, v.v Mỗi tiến trình không gian người dùng thường chạy trong không gian bộ nhớ ảo của riêng nó, không thể truy cập bộ nhớ của các tiến trình khác Đây là cơ sở để bảo vệ bộ nhớ trong các hệ điều hành chính thống ngày nay và là nền tảng để phân tách đặc quyền Một chế độ người dùng riêng biệt cũng có thể được sử dụng để xây dựng các máy ảo hiệu quả - xem các yêu cầu về ảo hóa của Popek và Goldberg Với đủ đặc

2 Chương trình init: Ứng dụng User-space đầu tiên được chạy

80 quyền, các tiến trình có thể yêu cầu hạt nhân ánh xạ một phần không gian bộ nhớ của tiến trình khác thành riêng của nó, như trường hợp của trình gỡ lỗi Các chương trình cũng có thể yêu cầu các vùng bộ nhớ được chia sẻ với các quy trình khác, mặc dù các kỹ thuật khác cũng có sẵn để cho phép giao tiếp giữa các quá trình

Xây dựng hệ điều hành cho bo mạch router Ở mục trước, chúng ta đã tìm hiểu tổng quát những khái niệm về một hệ thống nhúng nhân Linux và các thành phần cấu tạo nên nó Trong mục này chúng ta sẽ đi sâu vào xây dựng một hệ điều hành nhân Linux dành cho board mạch Ở thời điểm hiện tại, đã có nhiều nhà phát triển phần mềm tạo ra một hệ điều hành nhân Linux dành cho các thiết bị nhúng khác nhau với các kiến trúc khác nhau Và củng có nhiều hệ điều hành phát triển để hỗ trợ cho các thiết bị định tuyến chạy trên nhân Linux Một trong số đó có thể kể đến như OpenWrt, OPNsense, pfSense, IPFire Nhưng trong số đó, OpenWrt mang nhiều ưu điểm nổi trội như :

- Hỗ trợ WiFi tốt nhất Nó hỗ trợ tất cả các tiêu chuẩn không dây mới nhất và có,

- Giao diện Web tuyệt vời để nhanh chóng cấu hình và quản lý các điểm truy cập WiFi,

- Sử dụng tất cả các lõi CPU để định tuyến và đạt được hiệu suất định tuyến tốt nhất,

- Có khoảng 3500 gói phần mềm tùy chọn có sẵn để cài đặt

- Khởi động trong khoảng 7 giây Nhanh hơn nhiều so với các bản phân phối khác Chính vì nhưng ưu điểm kể trên, chúng tôi sẽ xây dựng ra một hệ điều hành nhân Linux cho riêng mình nhưng dựa trên hệ điều hành OpenWrt để phát triển Điều này sẻ giảm thời gian, chi phí nghiên cứu củng như đã có một cộng đồng hỗ trợ rộng lớn thường xuyên phát triển thêm các ứng dụng trên thiết bị định tuyến, điều mà khó có thể thực hiện được khi phải phát triển một hệ điều hành từ con số không.

Xây dựng trình khởi động U-boot cho board mạch 80 6.2.2 Xây dựng hệ điều hành cho bo mạch router dựa trên hệ điều hành OpenWrt

U-boot (Universal Bootloader) là một bộ nạp khởi động mã nguồn mở, đa nền tảng U- boot hỗ trợ các lệnh tương tác, biến môi trường, tập lệnh và khởi động từ thiết bị bên ngoài U-boot hỗ trợ nhiều loại CPU và các kiến trúc phổ biến được sử dụng ngày nay U-boot cung cấp các chức năng bổ sung ngoài việc chỉ khởi động thiết bị và khởi tạo hạt nhân Thông thường nó đi kèm với giao diện dòng lệnh

6.2.1.1 Thiết kế Device-tree cho board mạch

Trước khi thiết kế Device Tree cho board mạch, chúng ta cần phải hiểu khái niệm về Device tree củng như cách để viết một tệp cấu hình cho nó

81 các quy ước sử dụng chung, được gọi là ràng buộc, được định nghĩa về cách dữ liệu xuất hiện trong cây để mô tả các đặc điểm phần cứng điển hình bao gồm bus dữ liệu, đường ngắt, kết nối GPIO và thiết bị ngoại vi Phần cứng được mô tả bằng cách sử dụng các ràng buộc hiện có để sử dụng tối đa mã hỗ trợ hiện có, nhưng vì tên thuộc tính và nút chỉ đơn giản là chuỗi văn bản, nên dễ dàng mở rộng các liên kết hiện có hoặc tạo liên kết mới bằng cách xác định các nút và thuộc tính mới Decice tree ban đầu được tạo bởi Open Firmware như một phần của phương thức giao tiếp để truyền dữ liệu từ Open Firmware sang chương trình khách (như hệ điều hành) Một hệ điều hành đã sử dụng Decice tree để khám phá cấu trúc liên kết của phần cứng trong thời gian chạy và do đó hỗ trợ phần lớn phần cứng có sẵn

Vì Open Firmware thường được sử dụng trên các nền tảng PowerPC và SPARC, việc hỗ trợ Linux cho các kiến trúc đó đã sử dụng Device Tree trong một thời gian dài

Cây thiết bị là một cấu trúc cây đơn giản gồm các nút và thuộc tính Thuộc tính là các cặp key-value và nút có thể chứa cả thuộc tính và nút con Ví dụ, sau đây là một cây đơn giản ở định dạng dts:

 ranges =

Ngày đăng: 03/08/2024, 13:07

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN