Tôi có một số phần cứng mà tôi muốn mô phỏng; tôi tự hỏi nếu tôi có thể làm điều đó ở mức thấp như thế này. Các phần cứng có nhiều thanh ghi, mà tôi sắp xếp trong một cấu trúc:Cách mô phỏng ánh xạ bộ nhớ I/O
#include <stdint.h>
struct MyControlStruct
{
uint32_t data_reg_1;
uint32_t data_reg_2;
uint32_t dummy[2]; // to make the following registers have certain addresses
uint32_t control_reg_1;
uint32_t control_reg_2;
};
volatile struct MyControlStruct* MyDevice = (struct MyControlStruct*)0xDeadF00;
Vì vậy, tôi muốn hỗ trợ cú pháp sau để truy cập phần cứng trên Windows và Linux:
MyDevice->data_reg_1 = 42;
MyDevice->data_reg_2 = 100;
MyDevice->control_reg_1 = 1;
Khi dòng cuối cùng của mã được thực thi, tôi muốn trình mô phỏng phần cứng "đánh thức" và thực hiện một số công cụ. Tôi có thể thực hiện điều này trên Windows và/hoặc Linux không? Tôi nghĩ về việc bằng cách nào đó bắt tín hiệu "lỗi phân đoạn", nhưng không chắc chắn liệu điều này có thể được thực hiện trên Windows hay không.
Tôi đã xem trang hướng dẫn sử dụng mmap
; nó có vẻ như nó có thể giúp đỡ, nhưng tôi không thể hiểu làm thế nào tôi có thể sử dụng nó. Tất nhiên, tôi có thể trừu tượng truy cập vào phần cứng bằng cách xác định các chức năng như WriteToMyDevice
, và mọi thứ sẽ dễ dàng (có thể), nhưng tôi muốn hiểu liệu tôi có thể sắp xếp truy cập vào phần cứng của mình theo cách chính xác này hay không. Không phải là một cách dễ dàng.
"Mức thấp" của bạn quá cao ... Cả trong Windows và trong phần cứng Linux truy cập được thực hiện từ chế độ hạt nhân. Bạn cần suy nghĩ về nhiều chi tiết triển khai hơn - cách nói chuyện với phần cứng. Ví dụ, bạn có thể viết trình điều khiển thực và trình mô phỏng trình điều khiển. –
Vì vậy, việc sử dụng các địa chỉ bộ nhớ được xác định trước trong chế độ người dùng là không thể? – anatolyg
Bạn không thể nói chuyện trực tiếp với thiết bị phần cứng từ chế độ người dùng Windows/Linux bằng quyền truy cập bộ nhớ trực tiếp. Điều này chỉ có thể ở chế độ hạt nhân. Đây là lý do tại sao tôi đề nghị bạn suy nghĩ đầu tiên về chi tiết triển khai. Nếu không có chúng, bạn thực sự không biết phải cạnh tranh gì. –