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

PC bị treo hoàn toàn khi truy cập bộ nhớ vật lý trên Ubuntu 10.04 (máy 64 bit)

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-04 09:08:00 32 4
mua khóa gpt4 Nike

Tôi đang cố truy cập bộ nhớ vật lý của PC bằng chương trình sử dụng mmap() -

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

#define FATAL do { fprintf(stderr, "Lỗi ở dòng %d, tệp %s (%d) [%s]\n", \
__LINE__, __FILE__, errno, strerror(errno)); exit(1); } while(0)

#defineMAP_SIZE 4096UL
#define MAP_MASK (MAP_SIZE - 1)

int main(int argc, char **argv) {
int fd;
vô hiệu *map_base, *virt_addr;
read_result dài không dấu, giá trị ghi;
tắt_t mục tiêu;
int access_type = 'w';

nếu(argc < 2) {
fprintf(stderr, "\nUsage:\t%s { address } [ type [ data ] ]\n"
"\taddress : địa chỉ bộ nhớ để xử lý\n"
"\ttype : loại hoạt động truy cập: [b]yte, [h]alfword, [w]ord\n"
"\tdata : dữ liệu được ghi\n\n",
argv[0]);
exit(1);
}
target = strtoul(argv[1], 0, 0);

nếu(argc > 2)
access_type = tolow(argv[2][0]);


if((fd = open("/dev/mem", O_RDWR | O_SYNC)) == -1) TUYỆT VỜI;
printf("/dev/mem đã mở.\n");
fflush(stdout);

/* Ánh xạ một trang */
map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, target & ~MAP_MASK);
if(map_base == (void *) -1) FATAL;
printf("Bộ nhớ được ánh xạ tại địa chỉ %p.\n", map_base);
fflush(stdout);

virt_addr = map_base + (đích & MAP_MASK);
chuyển đổi (access_type) {
trường hợp 'b':
read_result = *((unsigned char *) virt_addr);
phá vỡ;
trường hợp 'h':
read_result = *((unsigned short *) virt_addr);
phá vỡ;
trường hợp 'w':
read_result = *((unsigned long *) virt_addr);
phá vỡ;
default:
fprintf(stderr, "Loại dữ liệu không hợp lệ '%c'.\n", access_type);
exit(2);
}
printf("Giá trị tại địa chỉ 0x%X (%p): 0x%X\n", target, virt_addr, read_result);
fflush(stdout);

nếu(argc > 3) {
writeval = strtoul(argv[3], 0, 0);
chuyển đổi (access_type) {
trường hợp 'b':
*((unsigned char *) virt_addr) = writeval;
read_result = *((unsigned char *) virt_addr);
phá vỡ;
trường hợp 'h':
*((unsigned short *) virt_addr) = writeval;
read_result = *((unsigned short *) virt_addr);
phá vỡ;
trường hợp 'w':
*((dài không dấu *) virt_addr) = giá trị ghi;
read_result = *((unsigned long *) virt_addr);
phá vỡ;
}
printf("Đã viết 0x%X; đọc lại 0x%X\n", giá trị ghi, read_result);
fflush(stdout);
}

if(munmap(map_base, MAP_SIZE) == -1) FATAL;
đóng(fd);
return 0;
}

Khi tôi chạy cái này với tên sudo ./a.out 0xfdff8000, hệ thống của tôi bị treo. Chuột, bàn phím và màn hình đều bị treo! Khởi động lại là lựa chọn duy nhất. Tôi đã kiểm tra 0xfdff8000 trong /proc/iomem. Nó tương ứng với âm thanh ICH HD. Tôi không chắc điều này có nghĩa là gì. kmsg, dmesg và /var/log/messages cũng không đưa ra gợi ý nào!

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

Bạn đang đọc một từ từ đâu đó trong bộ nhớ IO của chipset. Tôi không thể cho bạn biết chính xác lý do tại sao điều này sẽ đóng băng hệ thống của bạn, nhưng việc nhìn trộm và lục lọi bộ nhớ IO mà không biết thanh ghi phần cứng nào ở địa chỉ đó hoặc không biết cách lập trình phần cứng phù hợp có thể sẽ gây nhiễu hệ thống của bạn.

Về linux - PC bị treo hoàn toàn khi truy cập bộ nhớ vật lý trên Ubuntu 10.04 (máy 64-bit), 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/6148061/

32 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