cuốn sách gpt4 ai đã làm

c - Hủy dữ liệu trên A20 SoC

In lại Tác giả: Vũ trụ không gian 更新时间:2023-11-04 08:11:46 26 4
mua khóa gpt4 Nike

Tôi đang cố viết một ứng dụng nhỏ hiển thị thông báo qua cổng nối tiếp. Tệp nhị phân này thực thi mà không cần hệ điều hành, vì vậy nó là kim loại trần.

Mã này như sau:

#include 
#defineFIFO 0x0
#define NOFIFO 0x1
#defineFIFO_STATUS 0x0

#define THR_READY 0x1
#define THR_STATUS 0x5

#define UART_MEM 0x1C28000


int không dấu dễ bay hơi *uart0 = (unsigned int *)UART_MEM;
int không dấu dễ bay hơi *uart_str = (unsigned int *)(UART_MEM + 0x7c);
int không dấu dễ bay hơi *uart_lstr = (unsigned int *)(UART_MEM + 0x14);


void print_smth(const char *str) {
trong khi (*str != '\0') {
trong khi ((*uart_lstr & (1 << THR_STATUS)) != THR_READY)
;
*uart0 = (unsigned int)(*str);
str++;
}
}

void c_entry(void) {
print_smth("Xin chào");
}

Tôi đang sử dụng u-boot để khởi động tệp nhị phân này và thực tế tệp nhị phân khởi động tốt cho đến khi đạt:

*uart0 = (unsigned int)(*str);

Ngay khi tôi cố ghi vào bộ nhớ này, tôi gặp lỗi hủy dữ liệu. Có vẻ như tôi không được phép ghi vào địa chỉ bộ nhớ này, nhưng hãy nhìn xem Hướng dẫn sử dụng A20Tôi thấy rằng thực sự UART0 được ánh xạ tới 0x01C28000, vì vậy tôi có thể viết ở đó.

这是输出:

=> tảix
## Sẵn sàng tải xuống nhị phân (xmodem) về 0x42000000 với tốc độ 115200 bps...
CxyzModem - Chế độ CRC, gói 2(SOH)/0(STX)/0(CAN), 2 lần thử
## Tổng kích thước = 0x000000c4 = 196 Byte
=> đi 0x42000000
## Bắt đầu ứng dụng ở 0x42000000 ...
hủy bỏ dữ liệu
máy tính : [<4200007c>] lr : [<420000ac>]
reloc pc : [<0d0a207c>] lr : [<0d0a20ac>]
sp: 000010b0 ip: 7fe79000 fp: 000010bc
r10: 00000002 r9: 7af3dee0 r8: 7efb47a8
r7: 7af3fab8 r6: 42000000 r5: 00000002 r4: 7af3fabc
r3: ee070f15 r2: 0000001e r1: 7af3fabc r0: 000000b0
Cờ: nZCv IRQ tắt FIQ tắt Chế độ SVC_32
Đang đặt lại CPU...

đang đặt lại...

Bạn có biết tại sao điều này xảy ra?

Có thể mã không được ánh xạ tới RAM và đó là lý do tại sao tôi gặp phải lỗi này?

==Cập nhật==

Việc xác định vars là hằng số hiện hoạt động "tốt hơn". Nó vẫn không hoạt động vì tôi nhận được rác thay vì văn bản của mình.

Đây là mã được cập nhật:

#include 

#define TEMT_STATUS (0x1 << 6)

#define UART0 0x1C28000
#define UART_LSR 0x14



int không dấu dễ bay hơi *const uart0 = (unsigned int *)(UART0);
int không dấu dễ bay hơi *const uart_lsr = (unsigned int *)(UART0 + UART_LSR);


void print_smth(const char *str) {

trong khi (*str != '\0') {
trong khi ( !(*uart_lsr & TEMT_STATUS))
;
*uart0 = (unsigned int)(*str);
str++;
}
}

void c_entry(void) {
print_smth("os");
}

Đầu ra là:

=> đi 0x42000000
## Bắt đầu ứng dụng ở 0x42000000 ...
��ᚕ��
��

Tôi chắc chắn rằng tôi đang thiếu một cái gì đó, nhưng tôi không chắc chắn về điều gì. Tôi đã xem qua trình điều khiển mà u-boot đang sử dụng, nằm ở:

Arch/arm/cpu/armv7/sunxi/ear_print.c

Và nó thực sự không làm được gì nhiều hơn tôi. Vì vậy, tôi tự hỏi thất bại nằm ở đâu.

Cảm ơn trước và lời chào

câu trả lời hay nhất

Câu trả lời rất có thể xảy ra ở đây là bạn đã không xây dựng ứng dụng kim loại trần của mình một cách chính xác. Hãy xem ví dụ hello_world trong U-Boot trong phần ví dụ/độc lập để biết cách liên kết ứng dụng quan trọng nhất. Trước tiên, bạn có thể muốn gọi một số hàm đã xuất để xác nhận rằng bạn đã vượt qua những trở ngại này trước khi tiến hành tấn công trực tiếp vào phần cứng.

Về việc hủy bỏ dữ liệu trên C-A20 SoC, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/38900328/

26 4 0
không gian vũ trụ
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress