2017-11-16 65 views
6

Tôi muốn tạo chương trình với phần đặc biệt ở cuối Bộ nhớ ảo. Vì vậy, tôi muốn làm một cái gì đó linker script như thế này:Đặt rõ ràng bắt đầu con trỏ ngăn xếp với tập lệnh liên kết

/* ... */ 
.section_x 0xffff0000 : { 
    _start_section_x = .; 
    . = . + 0xffff; 
    _end_section_x = .; 
} 

Vấn đề là gcc/ld/glibc dường như tải các ngăn xếp ở vị trí này theo mặc định cho một ứng dụng 32 bit, thậm chí nếu nó trùng lặp một biết phần. Các mã trên không của ra khỏi ngăn xếp gây ra một ngoại lệ. Có cách nào để nói cho các liên kết để sử dụng một vị trí bộ nhớ VM cho ngăn xếp? (Đồng thời, tôi muốn đảm bảo heap không kéo dài phần này của bộ nhớ ảo ...).

+0

Bạn cần cung cấp thêm thông tin về mục tiêu của mình. Nội dung đăng ký ban đầu (xác định vị trí ngăn xếp) phụ thuộc vào mục tiêu. –

+0

Đây là hệ thống arm-8 (biên dịch ở chế độ 32 bit). Tôi đang sử dụng một hạt nhân Linux 3.10 với một gcc 4.7.0 toolchain. – HardcoreHenry

Trả lời

1

Tôi ghét câu trả lời đoán trước hoặc thậm chí hỏi xem câu hỏi có sai hay không, nếu bạn cần phân đoạn 64k, tại sao bạn không thể phân bổ một lần khi khởi động?

Tại sao bạn có thể cần địa chỉ cố định trong không gian địa chỉ quy trình của mình? Tôi đã làm rất nhiều loại mã hóa khác nhau trong gần 30 năm, và tôi đã không thấy sự cần thiết cho một địa chỉ cố định kể từ sự ra đời của bộ nhớ được bảo vệ.

+0

Không may là câu hỏi không chính xác. Tôi đang sửa đổi một hệ thống hiện có với khả năng gán ý nghĩa đặc biệt cho các bit khác nhau trong một con trỏ. Vì vậy, tôi cần đặt trước dải địa chỉ 0xffff0000 cho một mục đích đặc biệt. – HardcoreHenry

+0

@HardcoreHenry Tôi chắc chắn rằng bất cứ ai tạo ra hệ thống này mô tả nó là "thanh lịch" tuy nhiên tôi nghĩ rằng 99% của thế giới, hy vọng bao gồm cả bạn, thấy điều này là ác. Điều đó nói rằng, tại sao những con trỏ ngốc nghếch này lại phải giải quyết cho các địa chỉ hợp lệ? Không thể một số lớp trừu tượng cung cấp chức năng bổ sung trong khi không yêu cầu địa chỉ bộ nhớ cố định? Họ có thể trỏ đến một cấu trúc với những bit thiết lập, hoặc dereferencing con trỏ có thể được thực hiện bởi một thói quen mà biết làm thế nào để làm một lookaside? –

Các vấn đề liên quan