Tin tức chung·Hacker News·2 lượt xem

Thử nghiệm quy mô lớn với QEMU

Big-Endian Testing with QEMU

AI Summary

Bài viết này hướng dẫn cách kiểm thử code cho các kiến trúc big-endian, vốn ít phổ biến hơn so với các hệ thống little-endian mà hầu hết thiết bị hiện đại sử dụng. Việc này rất quan trọng để đảm bảo code của bạn xử lý đúng thứ tự byte, đặc biệt khi làm việc với network protocols hay đảm bảo tính tương thích đa nền tảng. Để thực hiện, bạn có thể tận dụng QEMU ở chế độ user-mode emulation kết hợp với các cross-compilers như GCC. Cách này giúp bạn dễ dàng mô phỏng môi trường big-endian (ví dụ: MIPS, s390x) ngay trên máy local để kiểm thử, không cần tới phần cứng vật lý. Điều này hỗ trợ việc kiểm thử kỹ lưỡng các logic nhạy cảm với thứ tự byte.

Trong điện toán, thuật ngữ big endian và little endian đề cập đến thứ tự lưu trữ các byte của giá trị trong bộ nhớ: phần quan trọng nhất (lớn) hoặc ít quan trọng nhất (nhỏ) được đặt trước. Ví dụ,...

Trong điện toán, các thuật ngữ big endianlittle endian đề cập đến thứ tự lưu trữ byte của một giá trị trong bộ nhớ: phần quan trọng nhất (lớn) hoặc ít quan trọng nhất (nhỏ) được đặt trước.

Ví dụ: giá trị thập lục phân 0x12345678 bao gồm bốn byte. Nếu chúng tôi hướng dẫn máy tính lưu trữ máy tính tại một số địa chỉ bộ nhớ mem thì độ bền của máy tính sẽ xác định xem byte có ý nghĩa nhỏ nhất (0x78) hay byte có ý nghĩa nhất (0x12) có được lưu trữ ở địa chỉ bộ nhớ đầu tiên hay không, mem[0].

Theo Wikipedia, thuật ngữ này được mượn từ cuốn sách Gulliver's Travels kể về xung đột giữa những người làm vỡ quả trứng luộc ở đầu lớn hơn (Big-Endians) và đầu nhỏ hơn (Little-Endians).

Một số kiến trúc bộ xử lý hỗ trợ cả hai chế độ nhưng hầu hết máy tính cá nhân và điện thoại thông minh hiện đại đều là hệ thống endian nhỏ. (Intel x86_64 hoặc ARM AArch64.)

Khi lập trình, điều quan trọng là phải viết mã chạy chính xác trên các hệ thống có thứ tự byte (xem ví dụ Ngụy biện thứ tự byte). Nhưng nếu không có quyền truy cập vào một cỗ máy lớn, làm cách nào để kiểm tra nó? QEMU cung cấp giải pháp thuận tiện. Với tính năng mô phỏng chế độ người dùng, chúng tôi có thể dễ dàng chạy tệp nhị phân trên hệ thống lớn được mô phỏng và chúng tôi có thể sử dụng GCC để biên dịch chéo sang hệ thống đó.

Chương trình này (endian.c) hiển thị tác dụng của thứ tự byte:

#include <stdint.h>
#include <stdio.h>
int main(void)
{
 uint32_t x = 0x12345678;
 int i;
 dành cho (i = 0; i < kích thước của(x); i++) {
 printf("mem[%d] = 0x%02x\n", i, ((char*)[[TAG_172] &x)[i]);
 
 return 0;

Trên máy Linux nhỏ bé của tôi, nó chạy như thế này:

$ gcc endian.c && ./a.out
mem[0] = 0x78
ghi nhớ [1] = 0x56
ghi nhớ [2] = 0x34
mem[3] = 0x12

MIPS là kiến trúc big-endian. Trên hệ thống Debian, chúng tôi có thể cài đặt mô phỏng chế độ người dùng QEMU và GCC cho MIPS như thế này:

$ sudo apt-get install qemu-user gcc-mips-linux-gnu

và xây dựng cũng như chạy cùng một chương trình:

$ mips-linux-gnu-gcc -static endian.c && qemu-mips a.out
mem[0] = 0x12
ghi nhớ [1] = 0x34
ghi nhớ [2] = 0x56
mem[3] = 0x78

Bây giờ chúng ta thấy giá trị được lưu trữ theo thứ tự lớn nhất!

Chúng tôi có thể nhắm mục tiêu thậm chí còn kỳ lạ hơn IBM z/Architecture (s390x) cũng là big-endian:

$ sudo apt-get install gcc-s390x-linux-gnu
$ s390x-linux-gnu-gcc -static endian.c && qemu-s390x a.out
mem[0] = 0x12
ghi nhớ [1] = 0x34
ghi nhớ [2] = 0x56
mem[3] = 0x78

Khá gọn gàng!

Tác giả: jandeboevrie

#discussion