Tôi đang làm việc trên một dự án có yêu cầu thời gian khởi động chặt chẽ. Kiến trúc được nhắm mục tiêu là một bộ xử lý dựa trên IA-32 chạy trong chế độ được bảo vệ 32 bit. Một trong những khu vực được xác định có thể được cải thiện là hệ thống hiện tại tự động khởi tạo IDT của bộ xử lý (bảng mô tả ngắt). Vì chúng tôi không có bất kỳ thiết bị cắm và chạy nào và hệ thống tương đối tĩnh nên tôi muốn có thể sử dụng một IDT được tạo tĩnh.IDT được xác định tĩnh
Tuy nhiên, điều này chứng minh là phiền hà đối với kiến trúc IA-32 vì các bộ mô tả cổng ngắt 8 byte tách địa chỉ ISR. 16 bit thấp của ISR xuất hiện trong 2 byte đầu tiên của bộ mô tả, một số bit khác điền vào 4 byte tiếp theo, và sau đó cuối cùng 16 bit cuối cùng của ISR xuất hiện trong 2 byte cuối cùng.
tôi muốn sử dụng một mảng const để xác định IDT và sau đó chỉ cần chỉ thanh ghi IDT vào nó như vậy:
typedef struct s_myIdt {
unsigned short isrLobits;
unsigned short segSelector;
unsigned short otherBits;
unsigned short isrHibits;
} myIdtStruct;
myIdtStruct myIdt[256] = {
{ (unsigned short)myIsr0, 1, 2, (unsigned short)(myIsr0 >> 16)},
{ (unsigned short)myIsr1, 1, 2, (unsigned short)(myIsr1 >> 16)},
, vv
Rõ ràng điều này sẽ không làm việc vì nó là bất hợp pháp để làm điều này trong C vì myIsr không phải là hằng số. Giá trị của nó được giải quyết bởi trình liên kết (có thể chỉ làm một số lượng giới hạn của toán học) chứ không phải bởi trình biên dịch.
Bất kỳ đề xuất hoặc ý tưởng nào khác về cách thực hiện việc này?
Xin cảm ơn,
Đề xuất của tôi là đảm bảo IDT và ISR của bạn nằm trong cùng một mô-đun (và rõ ràng là ISR được tải ở vị trí cố định) và sau đó sử dụng nhãn. Tôi đã thử làm điều này với GCC nhưng nó không thích sử dụng cú pháp '&& myIsr0' bên ngoài một hàm và tôi không có các kỹ năng lắp ráp nội tuyến để khai báo IDT bằng cách sử dụng cú pháp' __asm__'. Tôi có lẽ chỉ cần biên dịch một mô-đun này bằng cách sử dụng NASM (sở thích cá nhân) với các ISR được gọi là các hàm C. Đó sẽ là gợi ý của tôi, mặc dù tôi chắc chắn không thể yêu cầu được một chuyên gia :) – Justin
Đây là một loại gợi ý gây phiền nhiễu mà tôi muốn đưa ra: sử dụng lắp ráp. Khi sử dụng các tính năng xử lý rất cụ thể hoặc các cấu trúc mức cực thấp, hãy gọi vào một số lắp ráp. Nó làm cho nó dễ dàng hơn. – Linuxios
Đây không phải là sở trường của tôi; ai đó có thể giải thích ngắn gọn hoặc chỉ cho tôi biết tại sao điều này là bất hợp pháp? – taz