Khả năng phục hồi phần mềm nền tảng Platform Firmware Resilience (PFR) là gì?

Khả năng phục hồi chương trình cơ sở nền tảng (PFR) là một khuôn khổ bảo mật được tạo ra để bảo vệ, phát hiện và phục hồi các nền tảng máy tính như Hệ thống đầu vào/đầu ra cơ bản (BIOS) và bộ nạp khởi động khỏi các cuộc tấn công, hành vi giả mạo và khai thác trái phép.

PFR tuân theo các hướng dẫn được xác định trong Viện Tiêu chuẩn và Công nghệ Quốc gia (NIST) 800-193 , trong đó nêu ra các biện pháp tốt nhất để bảo vệ phần sụn khỏi các mối đe dọa mạng.

  • Bảo vệ : Cơ chế bảo vệ tính toàn vẹn của phần mềm nền tảng thông qua xác thực mật mã và cơ chế Hardware Root of Trust (HRoT).
  • Phát hiện : Cơ chế theo dõi các bất thường hoặc thay đổi trái phép.
  • Phục hồi : Cơ chế đảm bảo hệ thống có thể trở lại trạng thái bình thường khi bị xâm phạm.

Triển khai PFR

  1. HRoT
    • Tạo một mô-đun phần cứng đáng tin cậy để xác minh mọi hoạt động của chương trình cơ sở.
    • Đảm bảo chỉ có phần mềm đã xác thực mới được tải và thực thi.
    • Ngăn chặn việc thay đổi hoặc thực thi mã độc trái phép.
  2. Khởi động an toàn và xác thực chương trình cơ sở
    • Sử dụng chữ ký mật mã  (ví dụ: RSA, ECC, SHA) để xác thực tính toàn vẹn của chương trình cơ sở trước khi thực hiện.
  3. Giám sát tính toàn vẹn của chương trình cơ sở
    • Phát hiện và báo cáo các sửa đổi trái phép đối với chương trình cơ sở trong thời gian chạy.
  4. Cơ chế phục hồi
    • Lưu giữ bản sao của hình ảnh chương trình cơ sở đáng tin cậy mới nhất (hay còn gọi là trạng thái tốt đã biết).
    • Nếu phát hiện phần sụn đang hoạt động bị xâm phạm, FPGA sẽ ngay lập tức chuyển về phiên bản đáng tin cậy.

Tại sao PFR lại quan trọng?

Với vai trò quan trọng của điện toán đám mây và trung tâm dữ liệu trong cơ sở hạ tầng kỹ thuật số hiện đại, PFR đảm bảo rằng máy chủ, thiết bị lưu trữ và thiết bị mạng được bảo vệ khỏi các mối đe dọa mạng như phần mềm độc hại dai dẳng và trộm cắp dữ liệu.

Lỗi phần mềm hệ thống có thể ảnh hưởng đến doanh nghiệp và người dùng trên toàn cầu, dẫn đến mất doanh thu do các dịch vụ đám mây bị gián đoạn hoặc tăng chi phí vận hành để khôi phục. Với cơ chế khôi phục, PFR giúp khôi phục phần mềm hệ thống về trạng thái toàn vẹn.

PFR đảm bảo rằng chương trình cơ sở nền tảng vẫn được bảo vệ trong suốt vòng đời của nó, giúp bảo vệ chương trình khỏi:

  • Các sửa đổi phần mềm độc hại, bao gồm trojan, cửa hậu và rootkit.
  • Tấn công chuỗi cung ứng hoặc đưa phần mềm bị xâm phạm vào trong quá trình sản xuất hoặc giao hàng.
  • Quay lại phiên bản phần mềm dễ bị tấn công hoặc cập nhật phần mềm trái phép.
  • Việc khai thác gây ra bởi việc ghi đè chương trình cơ sở không cố ý hoặc mất điện.

PFR hiện là một điều cần thiết. Khi các mối đe dọa mạng liên tục gia tăng, việc đảm bảo khả năng phục hồi ở cấp độ phần mềm hệ thống có thể bảo vệ hệ thống khỏi các mối đe dọa này và duy trì cơ sở hạ tầng an toàn.

Các trường hợp sử dụng ví dụ về khả năng phục hồi phần sụn nền tảng (PFR) trong FPGA

FPGA được trang bị nền tảng phần cứng linh hoạt và năng động để tăng cường khả năng phục hồi mạng. Các đặc tính của FPGA  khiến chúng trở thành thiết bị lý tưởng cho nhiều ngành công nghiệp đang tìm kiếm các giải pháp bảo mật mạnh mẽ. Ví dụ bao gồm:

  • Chữ ký mật mã được sử dụng bởi các máy chủ dựa trên FPGA, hệ thống tự động hóa công nghiệp và thiết bị Internet vạn vật (IoT) để xác nhận tính hợp lệ của phần mềm hệ thống trước khi thực thi. PFR  ngăn phần mềm hệ thống khởi động trong trường hợp xác thực không thành công và đảm bảo chỉ những mã đáng tin cậy mới được thực thi. Điều này bảo vệ thiết bị khỏi việc chạy mã độc hại.
  • Đối với các phương tiện tự hành cần cập nhật qua mạng an toàn hoặc các trung tâm dữ liệu cần bản vá bảo mật, FPGA sẽ thực thi các bản cập nhật được mã hóa và ký kỹ thuật số để đảm bảo rằng các bản cập nhật chương trình cơ sở của nền tảng được an toàn trước những kẻ tấn công.
  • FPGA duy trì tính dự phòng hình ảnh kép và bản sao lưu của phiên bản chương trình cơ sở đáng tin cậy cho các thiết bị y tế và các ứng dụng khác cần độ tin cậy cao để khôi phục hệ thống về chương trình cơ sở ban đầu sau khi bị tấn công hoặc hỏng hóc.
  • Để xử lý khối lượng công việc nhạy cảm trong điện toán đám mây và điện toán biên, FPGA PFR ngăn chặn kẻ tấn công chèn phần mềm độc hại vĩnh viễn vào chương trình cơ sở nền tảng bằng cách phát hiện các sửa đổi trái phép thông qua kiểm tra tính toàn vẹn dựa trên hàm băm và chặn việc thực thi chương trình cơ sở không đáng tin cậy và kích hoạt cảnh báo.

Định dạng YAML

YAML Ain’t Markup Language ( YAML ) là một ngôn ngữ tuần tự hóa dữ liệu luôn được liệt kê là một trong những ngôn ngữ lập trình phổ biến nhất. Nó thường được sử dụng làm định dạng cho các tệp cấu hình, nhưng khả năng tuần tự hóa đối tượng của nó khiến nó trở thành sự thay thế khả thi cho các ngôn ngữ như JSON. Hướng dẫn YAML này sẽ trình bày cú pháp ngôn ngữ với hướng dẫn và một số ví dụ mã hóa đơn giản trong Python . YAML có hỗ trợ ngôn ngữ rộng và dễ dàng ánh xạ vào các cấu trúc dữ liệu gốc. Con người cũng dễ đọc, đó là lý do tại sao nó là một lựa chọn tốt cho cấu hình. Từ viết tắt YAML là viết tắt của Yet Another Markup Language. Nhưng những người bảo trì đã đổi tên nó thành YAML Ain’t Markup Language để nhấn mạnh hơn vào các tính năng hướng dữ liệu của nó.

Hướng dẫn YAML Bắt đầu nhanh: Một tệp đơn giản

Chúng ta hãy xem xét tệp YAML để có cái nhìn tổng quan ngắn gọn.

---
doe: "a deer, a female deer"
ray: "a drop of golden sun"
pi: 3.14159
xmas: true
french-hens: 3
calling-birds:
  - huey
  - dewey
  - louie
  - fred
xmas-fifth-day:
  calling-birds: four
  french-hens: 3
  golden-rings: 5
  partridges:
    count: 1
    location: "a pear tree"
  turtle-doves: two

Tệp bắt đầu bằng ba dấu gạch ngang. Những dấu gạch ngang này biểu thị phần đầu của một tài liệu YAML mới. YAML hỗ trợ nhiều tài liệu và trình phân tích cú pháp tuân thủ sẽ nhận dạng mỗi bộ dấu gạch ngang là phần đầu của một tài liệu mới. Tiếp theo, chúng ta thấy cấu trúc tạo nên phần lớn tài liệu YAML thông thường: cặp khóa-giá trị. “Doe” là khóa trỏ đến giá trị chuỗi: “a deer, a female deer”. YAML hỗ trợ nhiều hơn là chỉ các giá trị chuỗi. Tệp bắt đầu bằng sáu cặp khóa-giá trị. Chúng có bốn kiểu dữ liệu khác nhau. “doe” và “ray” là chuỗi. “pi” là số dấu phẩy động. “xmas” là boolean. “french-hens” là số nguyên. Bạn có thể đặt chuỗi trong dấu ngoặc đơn(‘) hoặc dấu ngoặc kép(“) hoặc không có dấu ngoặc kép nào cả. YAML nhận dạng các số không được trích dẫn là số nguyên hoặc dấu phẩy động. Mục thứ bảy là một mảng. “calling-birds” có bốn phần tử, mỗi phần tử được biểu thị bằng dấu gạch ngang mở. Tôi đã thụt lề các phần tử trong “calling-birds” bằng hai khoảng trắng. Thụt lề là cách YAML biểu thị sự lồng nhau. Số lượng khoảng trắng có thể thay đổi tùy theo từng tệp, nhưng không được phép sử dụng tab. Chúng ta sẽ xem cách thụt lề hoạt động bên dưới. Cuối cùng, chúng ta thấy “xmas-fifth-day”, có thêm năm phần tử bên trong, mỗi phần tử đều được thụt lề. Chúng ta có thể xem “xmas-fifth-day” như một từ điển chứa hai chuỗi, hai số nguyên và một từ điển khác. YAML hỗ trợ lồng nhau của khóa-giá trị và trộn các loại. Trước khi đi sâu hơn, hãy xem tài liệu này trông như thế nào trong JSON. Tôi sẽ đưa nó vào trình chuyển đổi JSON sang YAML tiện dụng này .

{
 "doe": "a deer, a female deer",
 "ray": "a drop of golden sun",
 "pi": 3.14159,
 "xmas": true,
 "french-hens": 3,
 "calling-birds": [
    "huey",
    "dewey",
    "louie",
    "fred"
 ],
 "xmas-fifth-day": {
 "calling-birds": "four",
 "french-hens": 3,
 "golden-rings": 5,
 "partridges": {
   "count": 1,
   "location": "a pear tree"
 },
 "turtle-doves": "two"
 }
}

JSON và YAML có khả năng tương tự nhau và bạn có thể chuyển đổi hầu hết các tài liệu giữa các định dạng này.

Phác thảo thụt lề và khoảng trắng

Khoảng trắng là một phần trong định dạng của YAML. Trừ khi có chỉ định khác, dòng mới sẽ chỉ ra phần cuối của một trường. Bạn cấu trúc một tài liệu YAML bằng cách thụt lề. Mức thụt lề có thể là một hoặc nhiều khoảng trắng. Đặc tả này cấm các tab vì các công cụ xử lý chúng theo cách khác. Hãy xem xét tài liệu này. Các mục bên trong được thụt lề bằng hai khoảng trắng.

foo: bar
pleh: help
stuff:
foo: bar
bar: foo

Hãy cùng xem một tập lệnh python đơn giản xem tài liệu này như thế nào. Chúng ta sẽ lưu nó dưới dạng tệp có tên là foo.yaml . Gói PyYAML sẽ ánh xạ luồng tệp YAML vào một từ điển. Chúng ta sẽ lặp qua tập hợp khóa và giá trị ngoài cùng và in khóa và biểu diễn chuỗi của mỗi giá trị. Bạn có thể tìm bộ xử lý cho nền tảng yêu thích của mình tại đây.

Import yaml 

from yaml import load
try:
    from yaml import CLoader as Loader
except ImportError:
    from yaml import Loader

if __name__ == '__main__':

    stream = open("foo.yaml", 'r')
    dictionary = yaml.load(stream)
    for key, value in dictionary.items():
        print (key + " : " + str(value))

Output:

foo : bar
pleh : help
stuff : {'foo': 'bar', 'bar': 'foo'}

Khi chúng ta yêu cầu python in một từ điển dưới dạng chuỗi, nó sử dụng cú pháp nội tuyến mà chúng ta sẽ thấy bên dưới. Chúng ta có thể thấy từ đầu ra rằng tài liệu của chúng ta là một từ điển python với hai chuỗi và một từ điển khác được lồng bên trong nó. Việc lồng nhau đơn giản của YAML cung cấp cho chúng ta sức mạnh để xây dựng các đối tượng phức tạp. Nhưng đó chỉ là khởi đầu.

Bình luận

Bình luận bắt đầu bằng dấu thăng. Chúng có thể xuất hiện sau giá trị tài liệu hoặc chiếm toàn bộ một dòng.

___
# This is a full line comment
foo: bar # this is a comment, too

Bình luận dành cho con người. Bộ xử lý YAML sẽ loại bỏ chúng.

Kiểu dữ liệu YAML

Các giá trị trong cặp khóa-giá trị của YAML là vô hướng. Chúng hoạt động giống như các kiểu vô hướng trong các ngôn ngữ như Perl, Javascript và Python. Thường thì chỉ cần đặt chuỗi trong dấu ngoặc kép, để số không có dấu ngoặc kép và để trình phân tích cú pháp tìm ra là đủ. Nhưng đó chỉ là phần nổi của tảng băng chìm. YAML có khả năng làm được nhiều hơn thế nữa.

Cặp khóa-giá trị và từ điển

Key-value là khối xây dựng cơ bản của YAML. Mỗi mục trong tài liệu YAML là thành viên của ít nhất một từ điển. Khóa luôn là một chuỗi. Giá trị là một số vô hướng nên có thể là bất kỳ kiểu dữ liệu nào. Vì vậy, như chúng ta đã thấy, giá trị có thể là một chuỗi, một số hoặc một từ điển khác.

Các loại số

YAML nhận dạng các kiểu số. Chúng ta đã thấy số dấu phẩy động và số nguyên ở trên. YAML hỗ trợ một số kiểu số khác. Một số nguyên có thể là số thập phân, thập lục phân hoặc bát phân.

---
foo: 12345
bar: 0x12d4
plop: 023332

Hãy chạy tập lệnh python trên tài liệu này.

foo : 12345
bar : 4820
plop : 9946

Như bạn mong đợi, Ox biểu thị giá trị là hex và số 0 đứng đầu biểu thị giá trị bát phân. YAML hỗ trợ cả số dấu phẩy động cố định và số mũ.

---
foo: 1230.15
bar: 12.3015e+05

Khi chúng tôi đánh giá các mục này, chúng tôi thấy:

foo : 1230.15
bar : 1230150.0

Cuối cùng, chúng ta có thể biểu diễn không phải số (NAN) hoặc vô cực.

---
foo: .inf
bar: -.Inf
plop: .NAN

Giá trị của foo là vô cực. Bar là âm vô cực và plop là NAN.

Chuỗi

Chuỗi YAML là Unicode. Trong hầu hết các trường hợp, bạn không cần phải chỉ định chúng trong dấu ngoặc kép.

---
foo: this is a normal string

Chương trình thử nghiệm của chúng tôi xử lý điều này như sau:

foo: this is a normal string

Nhưng nếu chúng ta muốn xử lý chuỗi thoát, chúng ta cần sử dụng dấu ngoặc kép.

---
foo: "this is not a normal string\n"
bar: this is not a normal string\n

YAML xử lý giá trị đầu tiên như kết thúc bằng một ký tự xuống dòng và xuống dòng. Vì giá trị thứ hai không được trích dẫn, YAML xử lý \n như hai ký tự.

foo: this is not a normal string
bar: this is not a normal string\n

YAML sẽ không thoát chuỗi bằng dấu ngoặc đơn, nhưng dấu ngoặc đơn tránh việc nội dung chuỗi được diễn giải là định dạng tài liệu. Giá trị chuỗi có thể kéo dài hơn một dòng. Với ký tự fold (lớn hơn), bạn có thể chỉ định một chuỗi trong một khối.

bar: >
 this is not a normal string it
 spans more than
 one line
 see?

Nhưng nó được diễn giải mà không cần xuống dòng.

bar : this is not a normal string it spans more than one line see?

Ký tự khối (ống) có chức năng tương tự, nhưng YAML diễn giải trường chính xác như hiện trạng.

bar: |
 this is not a normal string it
 spans more than
 one line
 see?

Vì vậy, chúng ta thấy các dòng mới ở vị trí nào trong tài liệu.

bar : this is not a normal string it
spans more than
one line
see?

Nulls

Bạn nhập giá trị null bằng dấu ngã (~) hoặc chuỗi ký tự null không có dấu ngoặc kép.

---
foo: ~
bar: null

Chương trình của chúng tôi in:

foo : None
bar : None

Biểu diễn null của Python là None.

Boolean

YAML chỉ ra các giá trị boolean với các từ khóa True, On và Yes cho giá trị true. False được chỉ ra bằng False, Off hoặc No.

---
foo: True
bar: False
light: On
TV: Off

Mảng

Bạn có thể chỉ định mảng hoặc danh sách trên một dòng.

---
items: [ 1, 2, 3, 4, 5 ]
names: [ "one", "two", "three", "four" ]

Hoặc bạn có thể đặt chúng trên nhiều dòng.

---
items:
 - 1
 - 2
 - 3
 - 4
 - 5
names:
 - "one"
 - "two"
 - "three"
 - "four"

Định dạng nhiều dòng hữu ích cho các danh sách chứa các đối tượng phức tạp thay vì các số vô hướng.

___
items:
 - things:
     thing1: huey
     things2: dewey
     thing3: louie
 - other things:
     key: value

Một mảng có thể chứa bất kỳ giá trị YAML hợp lệ nào. Các giá trị trong danh sách không nhất thiết phải cùng loại.

Từ điển

Chúng tôi đã đề cập đến từ điển ở trên, nhưng chúng còn nhiều hơn thế nữa. Giống như mảng, bạn có thể đặt từ điển trực tuyến. Chúng tôi đã thấy định dạng này ở trên. Đó là cách python in từ điển.

---
foo: { thing1: huey, thing2: louie, thing3: dewey }

Chúng ta đã từng thấy họ xếp hàng trước đây.

---
foo: bar
bar: foo

Và tất nhiên, chúng có thể lồng nhau và giữ bất kỳ giá trị nào.

---
foo:
 bar:
   - bar
   - rab
   - plop

Tùy chọn nâng cao

Bộ điều chỉnh Chomp

Giá trị nhiều dòng có thể kết thúc bằng khoảng trắng và tùy thuộc vào cách bạn muốn xử lý tài liệu, bạn có thể không muốn giữ nguyên nó. YAML có các toán tử strip chomp và preserve chomp. Để lưu ký tự cuối cùng, hãy thêm dấu cộng vào toán tử fold hoặc block.

bar: >+
 this is not a normal string it
 spans more than
 one line
 see?

Vì vậy, nếu giá trị kết thúc bằng khoảng trắng, như ký tự xuống dòng, YAML sẽ giữ nguyên giá trị đó. Để xóa ký tự, hãy sử dụng toán tử xóa.

bar: |-
 this is not a normal string it
 spans more than
 one line
 see?

Nhiều tài liệu

Một tài liệu bắt đầu bằng ba dấu gạch ngang và kết thúc bằng ba dấu chấm. Một số bộ xử lý YAML yêu cầu toán tử bắt đầu tài liệu. Toán tử kết thúc thường là tùy chọn. Ví dụ, Jackson của Java sẽ không xử lý tài liệu YAML mà không có phần bắt đầu, nhưng PyYAML của Python sẽ xử lý. Bạn thường sẽ sử dụng toán tử kết thúc tài liệu khi một tệp chứa nhiều tài liệu. Hãy cùng sửa đổi mã python của chúng ta.

import yaml

from yaml import load
try:
from yaml import CLoader as Loader
except ImportError:
from yaml import Loader

if __name__ == '__main__':
stream = open("foo.yaml", 'r')
dictionary = yaml.load_all(stream, Loader)

for doc in dictionary:
print("New document:")
for key, value in doc.items():
print(key + " : " + str(value))
if type(value) is list:
print(str(len(value)))

Load_all của PyYAML sẽ xử lý tất cả các tài liệu trong một luồng. Bây giờ, hãy xử lý một tài liệu hợp nhất bằng nó.

---
bar: foo
foo: bar
...
---
one: two
three: four

Tập lệnh tìm thấy hai tài liệu YAML.

New document:
bar : foo
foo : bar
New document:
one : two
three : four

Phần kết luận

YAML là một ngôn ngữ mạnh mẽ có thể được sử dụng cho các tệp cấu hình, tin nhắn giữa các ứng dụng và lưu trạng thái ứng dụng. Chúng tôi đã đề cập đến các tính năng được sử dụng phổ biến nhất của nó, bao gồm cách sử dụng các kiểu dữ liệu tích hợp và cấu trúc các tài liệu phức tạp. Một số nền tảng hỗ trợ các tính năng nâng cao của YAML, bao gồm các kiểu dữ liệu tùy chỉnh.

Trên GitHub, ý nghĩa của con sóc “Ship It” là gì?

Con sóc “Ship It” là linh vật phổ biến được sử dụng trên GitHub để tượng trưng cho sự chấp thuận và sẵn sàng triển khai các thay đổi hoặc tính năng của mã. Khi một nhà phát triển xem xét mã và quyết định rằng mã đã sẵn sàng để hợp nhất vào cơ sở mã chính, họ thường bình luận “Ship It!” hoặc sử dụng biểu tượng cảm xúc sóc 🐿️ để chỉ ra rằng mã đã sẵn sàng.

Sau đây là một số điểm chính về tầm quan trọng của nó:

  1. Quy trình phê duyệt : Con sóc thường đại diện cho bước phê duyệt cuối cùng trong quy trình đánh giá mã, báo hiệu rằng những thay đổi được coi là thỏa đáng.
  2. Biểu tượng văn hóa : Con sóc “Ship It” đã trở thành biểu tượng văn hóa trong cộng đồng GitHub và trong giới nhà phát triển, thường được sử dụng một cách vui vẻ để ăn mừng việc phát hành mã.
  3. Biểu diễn trực quan : GitHub sử dụng con sóc dưới nhiều hình thức khác nhau, bao gồm nhãn dán và biểu tượng cảm xúc, khiến nó trở thành biểu tượng dễ nhận biết đối với người dùng.
  4. Sự khích lệ : Cụm từ và linh vật khuyến khích bầu không khí tích cực và hợp tác trong phát triển phần mềm, củng cố ý tưởng làm việc nhóm trong mã vận chuyển.

Nhìn chung, chú sóc “Ship It” tượng trưng cho sự phấn khích khi triển khai mã mới và tinh thần hợp tác của cộng đồng nhà phát triển.

GitHub: Pull Request là gì? Lợi ích và cách thức hoạt động

Pull request là một yêu cầu đề xuất thay đổi code. Trong quy trình phát triển phần mềm, nhà phát triển gửi pull request để đề xuất và thảo luận về sự thay đổi trước khi hợp nhất chúng vào mã nguồn chính, tạo cầu nối mượt mà giữa các đội và đảm bảo chất lượng mã nguồn.

Pull request là gì? (Nguồn: TopOnSeek)

1. Pull Request là gì?

Trong việc quản lý mã nguồn và lập trình trong các dự án sử dụng hệ thống quản lý phiên bản Git, Pull Request (hay yêu cầu kéo) là một yêu cầu được gửi bởi một lập trình viên để thông báo cho người quản lý dự án hoặc các đồng nghiệp rằng họ đã hoàn thành một tập hợp các thay đổi trong mã nguồn và muốn hợp nhất (merge) những thay đổi đó vào nhánh chính của dự án.

Để đóng góp vào một dự án, người dùng thường tạo một nhánh riêng từ nhánh chính (gọi là nhánh master), thực hiện thay đổi cần thiết, sau đó gửi những thay đổi này lên remote repository và tạo pull request. Pull request chứa thông tin về thay đổi đã thực hiện, các commit mới, nhận xét, v.v. Các Admin (hay là các chủ dự án) hoặc các thành viên khác có thể xem xét trước khi quyết định chấp nhận hay từ chối.

Khi được chấp nhận, thay đổi trong pull request được hợp nhất vào nhánh chính của dự án. Quá trình này có thể tự động hóa qua công cụ tích hợp với hệ thống quản lý mã nguồn. 

Pull request là phương pháp an toàn và linh hoạt để đóng góp vào dự án, đảm bảo thay đổi mới không ảnh hưởng tiêu cực đến mã nguồn hiện tại.

2. Tại sao Pull Request quan trọng đến vậy?

Pull request rất quan trọng trong quá trình phát triển phần mềm, đặc biệt khi làm việc với nhóm trong các dự án mã nguồn mở. Vậy thì những lợi ích của pull request là gì?

Tăng cường tính minh bạch và thúc đẩy sự tham gia của cộng đồng

Pull request giữ vai trò quan trọng trong việc tăng cường tính minh bạch và thúc đẩy sự tham gia của cộng đồng trong dự án mã nguồn mở.

Khi một pull request được tạo, nó mở ra cơ hội cho cả cộng đồng xem xét, thảo luận và đóng góp ý kiến, làm cho quá trình phát triển mã nguồn trở nên rõ ràng và dễ dàng theo dõi. Sự tham gia này không chỉ giúp cải thiện chất lượng mã nguồn mà còn xây dựng tinh thần hợp tác trong cộng đồng, tạo nên một môi trường làm việc chuyên nghiệp, hỗ trợ và học hỏi lẫn nhau. 

Kiểm tra chất lượng mã nguồn 

Pull Request đóng một vai trò quan trọng trong việc đảm bảo chất lượng mã nguồn trong các dự án phần mềm. Chức năng này tạo điều kiện cho các thành viên khác trong nhóm có cơ hội kiểm tra và xem xét mã nguồn mới trước khi nó được hợp nhất vào nhánh chính.

Quá trình này không chỉ giúp phát hiện và sửa chữa các lỗi hoặc vấn đề về mã nguồn một cách sớm nhất, mà còn ngăn chặn việc áp dụng các thay đổi không mong muốn, từ đó đảm bảo rằng mã nguồn luôn duy trì ở trạng thái chất lượng cao.

Khi tất cả các thay đổi trên mã nguồn đều được xem xét và kiểm tra kỹ lưỡng thông qua pull request trước khi hợp nhất, điều này giúp tránh được các lỗi và xung đột tiềm ẩn, đóng góp vào sự ổn định và tin cậy của mã nguồn trong quá trình phát triển.

Chất lượng và lịch sử mã nguồn

Pull Request giúp người tham gia dự án đóng góp thay đổi vào mã nguồn một cách dễ dàng, tạo điều kiện cho quá trình kiểm tra và chấp nhận các thay đổi trở nên đơn giản hơn. Mỗi Pull Request đi kèm với bình luận, đánh giá và quá trình thảo luận, tạo ra một lịch sử chi tiết về việc thay đổi mã nguồn. Điều này không chỉ giúp các thành viên trong nhóm dễ dàng theo dõi và hiểu rõ hơn về quá trình phát triển, mà còn giúp họ nắm bắt được lý do đằng sau các quyết định đã được đưa ra. 

3. Quá trình các bước tạo Pull Request

Sau khi tìm hiểu những lợi ích của pull request là gì, thì giờ là lúc thực hành tạo lệnh pull request.

Bước 1: Fork dự án gốc

  • Truy cập vào dự án gốc trên GitHub.
  • Nhấn vào nút “Fork” ở góc trên bên phải để sao chép dự án vào tài khoản của bạn.

Bước 2: Clone dự án về máy

  • Truy cập vào repository đã fork trong tài khoản của bạn.
  • Sao chép URL của repository.
  • Mở Terminal và sử dụng lệnh git clone để clone dự án về máy.

Bước 3: Tạo nhánh mới

  • Mở Terminal trong thư mục dự án đã clone.
  • Sử dụng lệnh git checkout -b [tên_nhánh] để tạo và chuyển đổi sang một nhánh mới.

Bước 4: Thực hiện thay đổi

  • Mở dự án trong trình chỉnh sửa mã nguồn.
  • Thực hiện các thay đổi cần thiết và lưu lại.

Bước 5: Commit và Push

  • Mở Terminal và sử dụng lệnh git add . để thêm các thay đổi vào danh sách commit.
  • Sử dụng lệnh git commit -m “Mô tả commit” để commit các thay đổi đã thêm.
  • Sử dụng lệnh git push origin [tên_nhánh] để đẩy thay đổi lên repository của bạn trên GitHub.

Bước 6: Tạo Pull Request

  • Truy cập vào repository của bạn trên GitHub.
  • Nhấn vào nút “Compare & pull request” bên cạnh tên nhánh của bạn.
  • Điền thông tin cần thiết, mô tả về Pull Request và nhấn “Create Pull Request“.

Bước 7: Kiểm tra và xử lý yêu cầu chỉnh sửa

  • Nhóm quản lý dự án sẽ xem xét và thảo luận về Pull Request của bạn.
  • Nếu cần chỉnh sửa, bạn chỉ cần thêm commit vào nhánh đã tạo và Pull Request sẽ tự động cập nhật.

Bước 8: Pull Request được chấp nhận và merge

  • Sau khi Pull Request đạt yêu cầu, nhóm quản lý sẽ chấp nhận và merge vào nhánh chính.
  • Code của bạn đã được hợp nhất vào dự án gốc.

4. Kết luận

Tóm lại, quy trình tạo Pull Request trên nền tảng GitHub đóng một vai trò trung tâm trong quản lý và phát triển phần mềm theo đội ngũ. Việc này không chỉ giúp đảm bảo rằng mọi thay đổi đều được kiểm tra kỹ lưỡng trước khi hợp nhất vào nhánh chính của dự án, mà còn tạo ra một kênh giao tiếp mạnh mẽ giữa các thành viên trong dự án. Pull Request không chỉ là một công cụ kỹ thuật, mà còn là một phương pháp hợp tác, giúp xây dựng và duy trì một môi trường làm việc tích cực, đồng thuận và hiệu quả.

Cách tạo pull request?

Cách tạo pull request bao gồm 8 bước:
Bước 1: Fork dự án gốc
Bước 2: Clone dự án về máy
Bước 3: Tạo nhánh mới
Bước 4: Thực hiện thay đổi
Bước 5: Commit và Push
Bước 6: Tạo Pull Request
Bước 7: Kiểm tra và xử lý yêu cầu chỉnh sửa
Bước 8: Pull Request được chấp nhận và merge

Pull request vs Merge request?

Hai khái niệm này đều có ý nghĩa giống nhau, đó là đề xuất được hợp vào nhánh chính của một dự án. Khi pull request được chấp nhận, nhánh phụ sẽ được “merge” vào nhánh chính. Thế nên, pull request và merge request là hoàn toàn giống nhau.

Giới thiệu chung về Card HBA (Host Bus Adapter)

Card adapter bus cho máy chủ (Card HBA) là một bảng mạch và / hoặc Card IC cung cấp quá trình xử lý đầu vào / đầu ra (I / O) và kết nối vật lý giữa máy chủ và thiết bị lưu trữ. Vì Card HBA làm giảm gánh nặng cho bộ xử lý chủ trong các tác vụ lưu trữ và truy xuất dữ liệu, nên nó có thể cải thiện hiệu suất máy chủ. Card HBA và một hệ thống con đĩa được kết nối với nó đôi khi được gọi là kênh đĩa.

Định nghĩa chung về Card HBA  – Card  I/O kết nối bus I/O máy chủ và hệ thống bộ nhớ máy tính. Theo định nghĩa này, giống như card màn hình được kết nối với máy tính và bộ nhớ, NIC được kết nối với bus mạng và bộ nhớ, card SCSI-FC được kết nối với bus và bộ nhớ SCSI hoặc FC, chúng nên được coi là Card HBA. Card HBA bao gồm FC-Card HBA và iSCSI Card HBA và các Card HBA khác trong tương lai, nhưng Card HBA thường được sử dụng trong SCSI. Card  (adapter) và NIC được sử dụng cho FC, và NIC cũng được sử dụng cho mạng Ethernet và Token Ring.

Card HBA giải thích chi tiết cần thiết cho bạn?

Chúng ta biết rằng một máy tính hầu hết được kết nối bởi hai bus (tất nhiên, tình hình thực tế sẽ khác nhau, ở đây chỉ nói đến tình huống phổ biến, đơn giản), một bus gọi là bus hệ thống, gọi khác là bus I / O. Bus hệ thống trên CPU, bộ nhớ, bộ nhớ đệm, v.v., bus I / O là thiết bị ngoại vi và hiện nay phổ biến nhất là bus PCI. Hai bus được kết nối bằng một chip hoặc mạch bắc cầu. Ví dụ như thành phố, có hai con đường chính, một đường thuộc khu hành chính, một đường thuộc khu thương mại, ở giữa có bùng binh, hai con đường chính nối với nhau, hệ thống xe buýt giống như chính. đường trong quận, và xe buýt I / O giống như trục đường chính trong khu thương mại. Đơn vị băng thông bus hệ thống và bus I / O là Gbyte cần ghi nhớ,

Mặc dù tốc độ bus I/O thấp hơn nhiều so với băng thông bus hệ thống, dù kết quả là Gbyte để đo lường và chúng ta biết tốc độ của các thiết bị ngoại vi, thường chỉ là vài trăm nghìn tỷ, thậm chí hàng chục k thôi, làm thế nào để điều phối công việc? Thật dễ dàng, chúng ta sẽ tổ chức các thiết bị ngoại vi, kết nối với bus I / O! Card HBA đề cập đến Máy chủ lưu trữ và I / O BUS trực tiếp là một bộ chuyển đổi, nhưng cũng giống như một thợ sửa ống nước thường nói “vượt qua kép”. Vai trò của Card HBA là đạt được giao thức kênh nội bộ PCI hoặc Sbus và chuyển đổi giữa giao thức Fibre Channel.

Tầm quan trọng của Card HBA

Trong hệ thống lưu trữ SAN ban đầu, máy chủ và việc truyền dữ liệu chuyển mạch là thông qua sợi quang, bởi vì máy chủ là lệnh SCSI cho thiết bị lưu trữ, không thể lấy giao thức IP mạng LAN thông thường, do đó, nhu cầu sử dụng FC truyền tải, vì vậy SAN này được gọi là FC-SAN, và sau đó xuất hiện trong gói giao thức IP SAN , có thể lấy mạng LAN thông thường, vì vậy được gọi là IP-SAN, điển hình nhất hiện nay là ISCSI phổ biến.

Hai phương pháp này cần thực hiện thao tác giải nén gói dữ liệu nặng, do đó  hệ thống SAN hiệu suất cao yêu cầu một card mạng chuyên dùng để giải nén máy chủ để giảm gánh nặng cho bộ xử lý. NIC này được gọi là Card HBA, tất nhiên ngoài công việc giải nén, còn có thể cung cấp giao diện sợi quang (nếu cạc iSCSI Card HBA cung cấp giao diện RJ45 chung) cho kết nối chuyển mạch tương ứng; Về mặt vật lý, bạn có thể cắm Card HBA vào khe cắm PCI hoặc PCI như một card mạng, vì vậy việc sử dụng thiết bị này giống như một card mạng, và nhiều người nhầm lẫn nó với một NIC thông thường hoặc một card cáp quang thông thường. Tất nhiên, một số card iSCSI Card HBA có thể được sử dụng như một card mạng bình thường, nhưng nếu xét về giá cả thì rất không kinh tế.

Nguyên tắc của Card HBA

Giao thức truyền thông dữ liệu phổ biến giữa máy chủ và thiết bị lưu trữ là IDE, SCSI và Fibre Channel. Để đạt được giao tiếp giữa máy chủ và thiết bị lưu trữ, cần có cùng một giao thức truyền thông ở cả hai đầu của giao tiếp. Cạc điều khiển thường có sẵn trên thiết bị lưu trữ và bộ điều khiển triển khai một hoặc nhiều giao thức truyền thông cho phép chuyển đổi giữa các giao thức lưu trữ như IDE, SCSI hoặc Fibre Channel sang các giao thức hoạt động của thiết bị lưu trữ vật lý.

Giao thức truyền thông của máy chủ được thực hiện bởi một mạch tích hợp của cạc mở rộng hoặc bo mạch chủ, chịu trách nhiệm chuyển đổi giao thức bus máy chủ và giao thức lưu trữ IDE và SCSI. Ví dụ: trong PC, các tính năng của giao thức IDE có trên bo mạch chủ và bộ điều khiển đĩa của IDE có giao thức IDE. Do đó, đĩa IDE có thể được kết nối với đầu nối IDE trên PC.

Nếu đĩa chỉ hỗ trợ giao thức SCSI, thì không thể kết nối trực tiếp đĩa với PC. Bạn cần lắp cạc SCSI trên khe cắm mở rộng của PC và đĩa SCSI có thể được kết nối với cạc. Card SCSI cho phép chuyển đổi bus PC sang SCSI. Loại cạc SCSI này nhận ra chức năng là chức năng card adapter Bus máy chủ. Nếu đĩa chỉ hỗ trợ các giao thức Fibre Channel, thì giao thức Fibre Channel là bắt buộc trên máy chủ vì đặc tính tốc độ cao của Fibre Channel không được hỗ trợ bởi Bo mạch chủ chung và yêu cầu một card adapter bus máy chủ chuyên dụng. Sau khi máy chủ được cắm vào card adapter bus máy chủ, nó có thể được kết nối với đĩa hỗ trợ kênh sợi quang.

Cạc adapter bus chủ bên trong có một CPU nhỏ, một số bộ nhớ làm bộ nhớ đệm dữ liệu và kết nối kênh cáp quang và các thiết bị kết nối bus. Bộ xử lý trung tâm nhỏ này chịu trách nhiệm chuyển đổi các giao thức PCI và Fibre Channel. Nó còn có một số chức năng khác để khởi tạo cổng máy chủ kết nối với mạng Fibre Channel, hỗ trợ các giao thức lớp trên như mã hóa và giải mã TCP / IP, SCSI, 8B / 10B.

Card HBA giải thích chi tiết cần thiết cho bạn?

Mối quan hệ giữa cạc giao diện mạng cáp quang Cạc (NIC) và Card HBA

Do giao thức truyền dẫn khác nhau, card mạng có thể được chia thành ba loại, một là card Ethernet, loại còn lại là card mạng Fibre Channel và ba là card mạng iSCSI.

Card mạng Ethernet –  Tên của Card  Ethernet, giao thức truyền tải là giao thức IP, thường được kết nối với bộ chuyển mạch Ethernet thông qua cáp quang hoặc cáp xoắn đôi. Các loại giao diện được chia thành cổng quang và cổng điện. Cổng quang thường được truyền qua cáp quang , module giao diện thường là SFP  (tốc độ truyền GB) và GBIC  (1GB / s), giao diện tương ứng là SC, ST và LC. Loại giao diện thường được sử dụng hiện nay là RJ45, nó được sử dụng để kết nối với xoắn đôi, cũng có giao diện với cáp đồng trục, nhưng hiện nay nó được sử dụng ít hơn.

FC Card mạng –  hay còn gọi chung là card mạng cáp quang, tên khoa học là Fiber Channel Card HBA. Giao thức truyền tải là một giao thức Kênh Sợi và thường được kết nối với một bộ chuyển Kênh Sợi thông qua cáp quang . Loại giao diện được chia thành cổng quang và cổng điện. Giao diện quang thường thông qua cáp quang  để truyền dữ liệu, mô-đun giao diện thường là SFP  (tốc độ truyền 2Gb / s) và GBIC  (1Gb / s), giao diện tương ứng cho SC và LC. Loại giao diện của giao diện điện nói chung là chân DB9 hoặc HSSDC.

ISCSI Card mạng –  Tên của iSCSI Card HBA, giao thức Transport iSCSI và kiểu giao diện giống như card Ethernet.

Chúng tôi nói “card mạng cáp quang” thường đề cập đến cạc FC Card HBA, cắm vào máy chủ, bộ nhớ ngoài với bộ chuyển mạch quang; và cạc Ethernet quang thường được gọi là “Card Ethernet quang” cũng được đưa vào máy chủ, nhưng nó bên ngoài là bộ chuyển mạch Ethernet với cổng quang.

Nguồn: https://netsystemvn.com/

Các loại bộ nhớ và thiết bị lưu trữ

Cơ bản về: RAM và ROM

RAM (Bộ nhớ truy cập ngẫu nhiên): Bộ nhớ tạm thời, dễ mất dữ liệu khi tắt nguồn, dùng để lưu trữ dữ liệu trong lúc hệ thống đang hoạt động. Ví dụ: DDR4, DDR5.

ROM (Bộ nhớ chỉ đọc): Bộ nhớ không mất dữ liệu khi tắt nguồn, chứa firmware hoặc mã khởi động hệ thống.

DDR4 và DDR5

DDR4 (Double Data Rate 4): Thế hệ thứ tư của RAM, phổ biến trong các hệ thống hiện đại, có tốc độ cao, băng thông lớn và tiết kiệm điện năng.

DDR5 (Double Data Rate 5): Phiên bản nâng cấp của DDR4, cung cấp tốc độ truyền dữ liệu nhanh hơn, dung lượng lớn hơn và hiệu suất năng lượng tốt hơn.

Firmware và BIOS

Firmware: Phần mềm cố định được lập trình vào bộ nhớ chỉ đọc, kiểm soát hoạt động phần cứng ở cấp độ thấp.

BIOS (Hệ thống đầu vào/đầu ra cơ bản): Một dạng firmware đặc biệt, chịu trách nhiệm khởi tạo và kiểm tra phần cứng hệ thống khi khởi động trước khi bàn giao quyền kiểm soát cho hệ điều hành.

SRAM và DRAM

SRAM (Bộ nhớ tĩnh): RAM nhanh hơn và đắt hơn so với DRAM, không cần làm tươi (refresh) liên tục, thường được sử dụng làm bộ nhớ đệm (cache) trong CPU.

DRAM (Bộ nhớ động): RAM chậm hơn nhưng rẻ hơn SRAM, cần được làm tươi hàng nghìn lần mỗi giây, dùng làm bộ nhớ chính trong hầu hết các máy tính.

Thiết bị lưu trữ: HDD, SSD, USB Drive, Thẻ SD

HDD (Ổ cứng truyền thống): Thiết bị lưu trữ sử dụng đĩa từ quay, có dung lượng lớn với chi phí thấp nhưng tốc độ chậm hơn so với SSD.

SSD (Ổ cứng thể rắn): Sử dụng bộ nhớ flash, không có bộ phận chuyển động, tốc độ nhanh và bền hơn HDD nhưng chi phí cao hơn.

USB Drive (Ổ USB): Thiết bị lưu trữ di động, có thể ghi/xóa dữ liệu, tiện lợi để chuyển dữ liệu giữa các thiết bị.

SD Card (Thẻ nhớ SD): Dạng bộ nhớ flash di động, thường dùng trong máy ảnh, điện thoại thông minh và hệ thống nhúng.

Giao thức truyền thông SPI – Serial Peripheral Interface

SPI (tiếng Anh: Serial Peripheral Interface, tạm dịch: Giao diện Ngoại vi Nối tiếp) là một chuẩn truyền thông nối tiếp đồng bộ được sử dụng để truyền dữ liệu trong khoảng cách ngắn, thường được sử dụng trong các hệ thống nhúng. SPI được phát triển bởi Motorola vào giữa những năm 1980 và trở thành chuẩn de facto. Các ứng dụng tiêu biểu của SPI có thể kể đến như thẻ nhớ (Secure Digital cards) và giao tiếp màn hình LCD.

Các thiết bị hỗ trợ SPI giao tiếp ở chế độ chế độ song công toàn phần (full duplex), sử dụng mô hình master – slave với một master trên đường truyền. Thiết bị master khi đó sẽ khởi tạo frame cho việc gởi và nhận. Bus SPI hỗ trợ nhiều slave thông qua việc lựa chọn chân Chip Select (viết tắt: CS, hay còn gọi là Slave select, viết tắt là SS) kết nối từ master đến slave tương ứng với chân CS đó.

Đôi khi SPI cũng còn được gọi là bus nối tiếp bốn dây (four wire serial bus), để phân biệt với các loại bus nối tiếp đã có như three-wire, two-wire và one-wire.

Dù là một chuẩn truyền thông đồng bộ (khi yêu cầu xung clock để đồng bộ tín hiệu trên đường truyền) nhưng SPI khác với giao thức Synchronous Serial Interface (SSI), một giao thức truyền thông nối tiếp đồng bộ cũng sử dụng 4 dây. Giao thức SSI sử dụng dung sai tín hiệu và chỉ cung cấp một kênh truyền đơn hướng trong khi SPI hỗ trợ truyền thông giữa một master và nhiều slave.

Chân tín hiệu

Kết nối trên một SPI bus với một master và một slave

Bus SPI sử dụng 4 chân logic tín hiệu:

  • SCLK (Serial Clock): xung clock phát ra từ master
  • MOSI (Master Out Slave In): Dành cho việc truyền dữ liệu từ master đến slave. Chân MOSI ở master sẽ kết nối đến chân MOSI ở slave.
  • MISO (Master In Slave Out): Dành cho việc truyền dữ liệu từ slave đến master. Chân MISO ở master sẽ kết nối đến chân MISO ở slave.
  • CS/SS (Chip/Slave Select): Chân CS được master sử dụng để lựa chọn slave cần giao tiếp.

Ngoài ra, chân MOSI còn có các tên khác:

  • SIMO, MTSR: trên cả thiết bị master và slave
  • SDI, DI, DIN, SI: trên thiết bị slave
  • SDO, DO, DOUT, SO: trên thiết bị master

Chân MISO còn có các tên khác:

  • SOMI, MRST: trên cả thiết bị master và slave
  • SDO, DO, DOUT, SO: trên thiết bị slave
  • SDI, DI, DIN, SI: trên thiết bị master

Trong các thiết bị chỉ hoạt động ở chế độ slave, chân MOSI còn có tên SDI (Serial Data In) và MISO còn có tên SDO (Serial Data Out).

Chân Slave Select còn có các tên khác:

  • SS, SS, SSEL, nSS, /SS, SS# (slave select)
  • CS, CS (chip select)
  • CSN (chip select/enable)
  • CE (chip enable)

Hoạt động

Bus SPI hoạt động với một master với một hoặc nhiều slave.

Nếu một slave được master chọn để giao tiếp, chân SS khi đó sẽ được ghi mức LOW nếu slave này cho phép giao tiếp với master. Một số slave yêu cầu tín hiệu xung xuống ở chân SS để khởi tạo một kết nối master-slave, ví dụ như Maxim MAX1242 ADC, khi yêu cầu tín hiệu HIGH -> LOW. Với nhiều slave trên đường truyền SPI, mỗi slave này sẽ yêu cầu một chân SS tương ứng ở master cho quá trình giao tiếp.

Truyền dữ liệu

Truyền dữ liệu

Để bắt đầu quá trình truyền dữ liệu, master sẽ cấu hình xung clock để tương ứng với tần số hỗ trợ bởi slave, thường lên đến vài MHz. Master sau đó lựa chọn slave cần giao tiếp với chân SS tương ứng và ghi giá trị 0 lên chân này. Nếu có yêu cầu chờ trên đường truyền, ví dụ như quá trình chuyển đổi ADC đang diễn ra, master sẽ phải chờ trong khoảng thời gian đó trước khi khởi tạo xung clock.

Quá trình truyền dữ liệu song công diễn ra trên mỗi chu kỳ xung clock SPI. Master truyền một bit trên đường dây MOSI, và slave nhận bit này; cùng lúc đó, slave truyền một bit trên đường dây MISO và master nhận bit này. Quá trình này diễn ra kể cả khi master và slave chỉ cần thực thi truyền thông theo một chiều, ví dụ như master chỉ cần gởi data đến slave.

Quá trình truyền thường bao gồm 2 thanh ghi dịch với kích thước cố định, ví dụ như 8 bit, một thanh ghi dịch cho master và một thanh ghi dịch cho slave. Một cách trừu tượng, hai thanh ghi này được kết nối theo kiểu vòng. Khi đó, quá trình truyền sẽ bao gồm các bước:

Bước 1: Chân SS với slave tương ứng mà master muốn truyền/nhận sẽ được master ghi mức logic thấp

Bước 2: Bit MSB sẽ được truyền đi trước. Trong một xung clock, cả master và slave đều dịch ra 1 bit và đưa bit này đến bên slave hoặc master cần truyền tương ứng. Trong xung clock tiếp theo, ở mỗi bên nhận, bit được lấy mẫu trên đường truyền và được lưu như là bit LSB mới nhất trên thanh ghi dịch. Sau khi các bit trên thanh ghi dịch được đẩy ra hoặc đã nhận vào toàn bộ, cả master và slave đã hoàn tất việc trao đổi giá trị thanh ghi. Nếu nhiều data hơn cần được truyền đi, các thanh ghi dịch sẽ được load lại và quá trình trên được lặp lại.

Bước 3: Khi hoàn tất, master ngừng việc đảo xung clock và ngừng chọn chân SS với slave tương ứng. Khi đó chân SS sẽ được master ghi mức logic cao.

Việc truyền SPI thường là việc truyền 8 bit. Tuy nhiên cũng có các trường hợp mà nhiều hơn 8 bit được truyền đi, ví dụ như truyền 16 bit trong các bộ điều khiển màn hình cảm ứng hay các bộ giải mã tín hiệu âm thanh, như IC TSC2101 của Texas Instruments, hay truyến 12 bit với các bộ chuyển đổi DAC hoặc ADC.

Clock polarity và phase

Biểu đồ thời gian thể hiện CPOL và CPHA. Đường màu đỏ thể hiện xung SCK dẫn đầu, đường xanh thể hiện xung SCK còn lại.

Bên cạnh việc thiết lập tần số xung clock, SPI master còn phải cấu hình clock polarity (tạm dịch: cực của xung clock) và clock phase theo data. Tài liệu chính thức Motorola SPI Block Guide đặt tên 2 khái niệm này theo thứ tự là CPOL và CPHA (clock polarity và phase). 2 khái niệm này được dùng cho cả master và slave. Biểu đồ thời gian bên cạnh thể hiện CPOL và CPHA.

CPOL được xác định dựa trên xung SCK với:

  • CPOL = 0 khi xung dẫn đầu của 1 chu kỳ là xung cạnh lênh, xung còn lại là xung cạnh xuống.
  • CPOL = 1 khi xung dẫn đầu của 1 chu kỳ là xung cạnh xuống, xung còn lại là xung cạnh lên.

Giá trị của CPOL có thể được đảo lại bởi cổng NOT logic.

CPHA dựa trên việc định thời điểm (tức là phase) của dữ liệu bit tương ứng xung clock.

  • CPHA = 0 khi bit dữ liệu đầu ra đúng với xung SCK còn lại còn xung dẫn đầu rơi vào khoảng giữa của bit dữ liệu.
  • CPHA = 1 khi bit dữ liệu đầu ra đúng với xung SCK dẫn đầu còn xung còn lại rơi vào khoảng giữa của bit dữ liệu.

Từ đây, việc lựa chon các giá trị CPOL và CPHA sẽ tương ứng với 4 chế độ hoạt động trên SPI. 4 chế độ này được quy ước trên tất cả các dòng vi điều khiển có hỗ trợ SPI:

ModeCPOLCPHA
000
101
210
311

Chế độ SPI cũng thường được quy ước theo dạng tuple cho (CPOL, CPHA), ví dụ (0, 1) để chỉ CPOL=0 và CPHA=1.

Để truyền thông SPI thành công, cả master và slave phải có cùng chế độ (CPOL, CPHA). Việc lựa chọn 4 chế độ (CPOL, CPHA) không ảnh hưởng đến hiệu suất truyền SPI.

Kết nối từng slave độc lập

Một bus SPI với một master và 3 slave được kết nối độc lập

Mô hình phổ biến nhất của một bus SPI bao gồm một master kết nối với một hoặc nhiều slave, với các chân SCK, MOSI và MISO được nối đến tất cả các slave trên bus, mỗi slave sẽ kết nối đến một chân CS riêng trên master. Mỗi chân CS khi đó nên có một điện trở kéo lên để đảm bảo rằng chân CS đó luôn có mức logic xác định. Khi khởi tạo một giao tiếp SPI và một chân CS ứng với một slave được chọn. điện trở kéo lên này giúp ngăn chặn các chân CS của các slave phản hồi với master dù không được yêu cầu từ master này.

Kết nối daisy chain

Một bus SPI được kết nối theo mô hình daisy chain

Một số thiết bị triển khai SPI theo mô hình daisy chain, với chân MISO của slave đầu tiên được nối vào chân MOSI của slave thứ 2, và cứ thế tiếp tục như ở hình bên. Việc triển khai SPI trên mỗi slave khi đó cần phải đảm bảo rằng mỗi slave đó phải truyền đi được chính xác dữ liệu mà nó nhận được từ slave trước nó trong mỗi xung clock. Quá trình nhận và truyền dữ liệu đi trên các slave của bus SPI daisy chain sẽ kết thúc khi một chân/dây SS duy nhất trên bên được master ghi mức logic cao (chuyển từ logic thấp lên cao). Từ đó, mô hình SPI daisy chain chỉ sử dụng 1 chân SS trên đường truyền.

Nguồn: Wikipedia

FRU – Field Replaceable Unit – Bộ phận có thể thay thế tại hiện trường

FRU là một bảng mạch in , bộ phận hoặc cụm lắp ráp có thể được tháo ra nhanh chóng và dễ dàng khỏi 
máy tính hoặc thiết bị điện tử khác và được người dùng hoặc kỹ thuật viên thay thế mà không cần phải gửi toàn bộ sản phẩm hoặc hệ thống đến cơ sở sửa chữa. FRU cho phép một kỹ thuật viên thiếu kiến ​​thức chuyên sâu về sản phẩm có thể cô lập lỗi và thay thế các thành phần bị lỗi. Mức độ chi tiết của FRU trong một hệ thống ảnh hưởng đến tổng chi phí sở hữu và hỗ trợ, bao gồm chi phí dự trữ 
phụ tùng thay thế , nơi phụ tùng được triển khai để đáp ứng mục tiêu thời gian sửa chữa, cách thiết kế và triển khai các công cụ chẩn đoán, mức độ đào tạo cho nhân viên thực địa, liệu người dùng cuối có thể tự thay thế FRU của họ hay không, v.v.

FRU là các thành phần phần cứng của một thiết bị hoặc hệ thống có thể được thay thế tại chỗ mà không cần gửi toàn bộ thiết bị về trung tâm bảo hành hoặc nhà sản xuất. Những bộ phận này thường được thiết kế để dễ dàng tháo lắp nhằm giảm thời gian sửa chữa và bảo trì.

Ví dụ về FRU trong máy tính và thiết bị điện tử:

  • RAM (Bộ nhớ)
  • HDD/SSD (Ổ cứng)
  • PSU (Bộ nguồn)
  • Pin laptop
  • Card đồ họa
  • Quạt làm mát
  • Module mạng

FRU giúp giảm thời gian ngừng hoạt động của thiết bị, tiết kiệm chi phí sửa chữa và nâng cao hiệu suất vận hành trong môi trường doanh nghiệp cũng như cá nhân.

PCH – Platform Controller Hub – Trung tâm điều khiển nền tảng

Platform Controller Hub ( PCH ) là một họ chipset chip đơn của Intel , được giới thiệu lần đầu tiên vào năm 2009. Đây là sản phẩm kế thừa của Intel Hub Architecture , sử dụng hai chip – một cầu bắc và một cầu nam , và lần đầu tiên xuất hiện trong Intel Series 5 .

PCH kiểm soát một số đường dẫn dữ liệu và hỗ trợ các chức năng được sử dụng kết hợp với CPU Intel . Chúng bao gồm xung nhịp ( xung nhịp hệ thống ), Giao diện hiển thị linh hoạt (FDI) và Giao diện phương tiện trực tiếp (DMI), mặc dù FDI chỉ được sử dụng khi chipset được yêu cầu hỗ trợ bộ xử lý có đồ họa tích hợp . Do đó, các chức năng I/O được chỉ định lại giữa hub trung tâm mới này và CPU so với kiến ​​trúc trước đó: một số chức năng cầu bắc, bộ điều khiển bộ nhớ và làn PCIe , đã được tích hợp vào CPU trong khi PCH tiếp quản các chức năng còn lại ngoài các vai trò truyền thống của cầu nam. AMD có tương đương với PCH, được gọi đơn giản là chipset kể từ khi phát hành kiến ​​trúc Zen vào năm 2017. AMD không còn sử dụng tương đương của mình cho PCH, hub bộ điều khiển Fusion (FCH).

Tổng quan

Bộ điều khiển nền tảng Intel Cannon Lake Hub

Kiến trúc PCH thay thế Kiến trúc Hub trước đây của Intel , với thiết kế giải quyết tình trạng tắc nghẽn hiệu suất có vấn đề cuối cùng giữa bộ xử lý và bo mạch chủ . Theo Kiến trúc Hub, bo mạch chủ sẽ có một chipset hai mảnh bao gồm một chip cầu bắc và một chip cầu nam. Theo thời gian, tốc độ của CPU tiếp tục tăng nhưng băng thông của bus mặt trước (FSB) (kết nối giữa CPU và bo mạch chủ) thì không, dẫn đến tình trạng tắc nghẽn hiệu suất. 

Để giải quyết tình trạng tắc nghẽn, một số chức năng thuộc về chipset cầu bắc và cầu nam truyền thống đã được sắp xếp lại. Cầu bắc và các chức năng của nó hiện đã bị loại bỏ hoàn toàn: Bộ điều khiển bộ nhớ, các làn PCI Express cho các card mở rộng và các chức năng cầu bắc khác hiện được tích hợp vào đế CPU như một tác nhân hệ thống (Intel) hoặc được đóng gói trong bộ xử lý trên một đế I/O (AMD Zen 2).

PCH sau đó kết hợp một số chức năng còn lại của cầu bắc (ví dụ như xung nhịp) ngoài tất cả các chức năng của cầu nam, thay thế nó. Đồng hồ hệ thống trước đây là kết nối với một chip chuyên dụng nhưng hiện được kết hợp vào PCH. Có hai kết nối khác nhau giữa PCH và CPU: Giao diện hiển thị linh hoạt (FDI) và Giao diện phương tiện trực tiếp (Flexible Display Interface  DMI). FDI chỉ được sử dụng khi chipset yêu cầu hỗ trợ bộ xử lý có đồ họa tích hợp. Intel Management Engine cũng đã được chuyển đến PCH bắt đầu từ bộ xử lý Nehalem và chipset 5-Series . Thay vào đó, chipset của AMD sử dụng một số làn PCIe để kết nối với CPU đồng thời cung cấp các làn PCIe riêng của chúng, cũng được cung cấp bởi chính bộ xử lý. Chipset cũng chứa bộ nhớ BIOS không mất dữ liệu .

Với các chức năng của cầu bắc được tích hợp vào CPU, phần lớn băng thông cần thiết cho chipset hiện đã được giải quyết.

Phong cách này bắt đầu ở Nehalem và sẽ tiếp tục trong tương lai gần, thông qua Cannon Lake .

Loại bỏ dần

Bắt đầu với Haswell công suất cực thấp và tiếp tục với bộ xử lý Skylake di động , Intel đã kết hợp bộ điều khiển IO cầu nam vào gói CPU, loại bỏ PCH cho thiết kế hệ thống trong gói (SOP) với hai khuôn; khuôn lớn hơn là khuôn CPU, khuôn nhỏ hơn là khuôn PCH. Thay vì DMI , các SOP này trực tiếp phơi bày các làn PCIe, cũng như các đường SATA, USB và HDA từ bộ điều khiển tích hợp và các đường SPI/ I²C /UART/GPIO cho cảm biến. Giống như CPU ​​tương thích với PCH, chúng tiếp tục phơi bày các đường DisplayPort, RAM và SMBus . Tuy nhiên, bộ điều chỉnh điện áp tích hợp đầy đủ sẽ không có cho đến Cannon Lake.

FCH của AMD đã ngừng sản xuất kể từ khi phát hành dòng CPU Carrizo vì nó đã được tích hợp vào cùng một khuôn với phần còn lại của CPU. Tuy nhiên, kể từ khi phát hành kiến ​​trúc Zen, vẫn còn một thành phần gọi là chipset chỉ xử lý I/O tốc độ tương đối thấp như cổng USB và SATA và kết nối với CPU bằng kết nối PCIe. Trong các hệ thống này, tất cả các kết nối PCIe đều được định tuyến trực tiếp đến CPU. Giao diện UMI trước đây được AMD sử dụng để giao tiếp với FCH được thay thế bằng kết nối PCIe. Về mặt kỹ thuật, bộ xử lý có thể hoạt động mà không cần chipset; nó chỉ tiếp tục có mặt để giao tiếp với I/O tốc độ thấp. CPU máy chủ và máy tính xách tay AMD thay vào đó áp dụng thiết kế hệ thống trên chip (SoC) độc lập không yêu cầu chipset. 

Nguồn: Wikipedia (https://en.wikipedia.org/wiki/Platform_Controller_Hub)

Các loại linh kiện “nhớ”

Hệ thống nhúng có mặt ở khắp mọi nơi, tích hợp liền mạch vào cuộc sống hàng ngày của chúng ta. Nhưng điều gì đứng sau sự tin cậy và hiệu quả của chúng? Đó chính là việc sử dụng chiến lược các loại bộ nhớ khác nhau:

  1. NAND Flash: Một giải pháp lưu trữ không khả biến (không mất dữ liệu khi mất điện) nổi tiếng với dung lượng cao và độ bền lớn.
    • Ví dụ: Được sử dụng trong ổ cứng SSD để truy xuất và lưu trữ dữ liệu nhanh chóng, trở thành thành phần chủ chốt trong các thiết bị điện tử tiêu dùng như điện thoại thông minh và máy tính bảng.
  2. DRAM: Bộ nhớ khả biến cung cấp khả năng truy cập dữ liệu tốc độ cao.
    • Ví dụ: Đóng vai trò trung tâm trong sức mạnh tính toán của PC và máy chủ, hỗ trợ xử lý nhanh và đa nhiệm.
  3. EEPROM: Bộ nhớ không khả biến cho phép ghi và xóa dữ liệu bằng điện.
    • Ví dụ: Thành phần không thể thiếu trong các bộ điều khiển ô tô, cho phép xe lưu trữ các dữ liệu vận hành quan trọng và cài đặt của người dùng.
  4. NOR Flash: Được biết đến với khả năng đọc nhanh và độ tin cậy cao.
    • Ví dụ: Tìm thấy trong các hệ thống nhúng yêu cầu thực thi mã trực tiếp từ bộ nhớ, chẳng hạn như trong máy ảnh kỹ thuật số và thiết bị y tế.
  5. SRAM: Cung cấp khả năng truy cập dữ liệu cực nhanh, dùng để lưu trữ dữ liệu tạm thời.
    • Ví dụ: Thường được dùng trong vi điều khiển và CPU dưới dạng bộ nhớ đệm (cache), giúp tăng tốc độ truy cập các dữ liệu thường dùng.
  6. NVRAM: Kết hợp độ bền của bộ nhớ không khả biến với khả năng truy cập nhanh của bộ nhớ khả biến.
    • Ví dụ: Được sử dụng trong các thiết bị mạng để lưu trữ thông tin cấu hình, đảm bảo các cài đặt được bảo toàn qua các lần tắt/mở nguồn.
  7. ROM: Bộ nhớ chỉ đọc được lập trình sẵn với phần mềm vĩnh viễn.
    • Ví dụ: Được sử dụng trong các thiết bị gia dụng như lò vi sóng và máy giặt để lưu trữ firmware, điều khiển các chức năng cơ bản của thiết bị.

Mặc dù việc lựa chọn bộ nhớ ảnh hưởng đến hiệu suất thiết bị, nhưng hiểu được cách nó tác động đến chi phí cũng quan trọng không kém. Nếu bạn là một nhà phát triển đang tìm cách tối ưu hóa thiết kế hệ thống nhúng của mình cả về mặt kỹ thuật lẫn tài chính, việc so sánh các loại bộ nhớ là bước khởi đầu. Tuy nhiên, việc nắm bắt được giá cả chính xác và hiện hành có thể là một thách thức. Nếu bạn có thông tin chuyên sâu về giá bộ nhớ hoặc chiến lược thiết kế hệ thống nhúng tiết kiệm chi phí, những đóng góp của bạn sẽ vô cùng quý giá.