2012-02-17 34 views
8

Truy vấn này liên quan đến phân bổ bộ nhớ sử dụng malloc.malloc trong hệ thống nhúng không có hệ điều hành

Nói chung những gì chúng tôi nói là malloc phân bổ bộ nhớ từ heap.

Bây giờ nói rằng tôi có một hệ thống nhúng đơn giản (Không có hệ điều hành), tôi có chương trình bình thường được tải nơi tôi làm malloc trong chương trình của mình.

Trong trường hợp này bộ nhớ được phân bổ từ đâu?

Trả lời

8

malloc() là một hàm thường được thực hiện bởi thư viện thời gian chạy. Bạn có quyền, nếu bạn đang chạy trên một hệ điều hành, sau đó malloc đôi khi (nhưng không phải mọi lần) kích hoạt một cuộc gọi hệ thống mà làm cho hệ điều hành bản đồ một số bộ nhớ vào không gian địa chỉ của chương trình của bạn.

Nếu chương trình của bạn chạy mà không có hệ điều hành, thì bạn có thể nghĩ chương trình của mình là hệ điều hành. Bạn có quyền truy cập vào tất cả các địa chỉ, nghĩa là bạn chỉ có thể gán một địa chỉ cho một con trỏ, sau đó bỏ tham chiếu đến con trỏ đó để đọc/ghi.

Tất nhiên bạn phải chắc chắn rằng các bộ phận không khác của chương trình của bạn chỉ cần sử dụng bộ nhớ tương tự, vì vậy bạn viết riêng bộ nhớ quản lý của bạn:

Nói một cách đơn giản là bạn có thể thiết dành một dải địa chỉ mà "quản lý bộ nhớ" của bạn sử dụng để lưu trữ các dải địa chỉ đã được sử dụng (các cơ sở dữ liệu được lưu trữ trong đó có thể dễ dàng như danh sách được liên kết hoặc phức tạp hơn nhiều). Sau đó, bạn sẽ viết một hàm và gọi hàm đó, ví dụ: malloc() tạo thành phần chức năng của trình quản lý bộ nhớ của bạn. Nó nhìn vào cơ sở dữ liệu được đề cập để tìm địa chỉ của các phạm vi, miễn là đối số xác định và trả về một con trỏ tới nó.

Bây giờ, nếu mọi chức năng trong chương trình của bạn gọi hàm malloc() thay vì viết ngẫu nhiên vào địa chỉ tùy chỉnh bạn đã thực hiện bước đầu tiên. Bạn có thể viết miễn phí() - chức năng sẽ tìm con trỏ được đưa ra trong cơ sở dữ liệu đã đề cập và điều chỉnh datastructure (trong danh sách liên kết ngây thơ nó sẽ hợp nhất hai liên kết).

+1

Không trả lời câu hỏi thực: Bộ nhớ được cấp phát động ở đâu. Nó đi vào đống. Đâu là đống? Nó nằm trong một dải địa chỉ được cấu hình bởi tập lệnh trình liên kết. –

+0

@fanl Câu hỏi của bạn khác với câu hỏi của Leo Messi. Bạn có -1 câu trả lời này không? Vui lòng hoàn tác. Nếu bạn mở câu hỏi của riêng mình, tôi sẽ cố gắng trả lời nó. –

5

Câu trả lời thực sự duy nhất là "Bất cứ nơi nào trình biên dịch/triển khai thư viện của bạn đặt nó".

Trong hệ thống nhúng tôi sử dụng, không có đống, vì chúng tôi chưa viết.

+0

+1 và khi bạn bật tối ưu hóa, trình biên dịch có thể chọn ngăn xếp khi có thể xác định rằng phân bổ là cục bộ (ví dụ: với hàm). – justin

+0

Ok, đúng, nhưng cũng không hữu ích. –

4

Từ heap như bạn nói. Sự khác biệt là heap không được cung cấp bởi hệ điều hành. Kịch bản trình liên kết của ứng dụng của bạn sẽ không nghi ngờ bao gồm phân bổ cho heap. Thư viện thời gian chạy sẽ quản lý việc này.

Trong trường hợp thư viện Newlib C thường được sử dụng trong các hệ thống nhúng GCC không chạy HĐH hoặc ít nhất là không chạy Linux, thư viện có hàm stub syscall được gọi là sbrk(). Đó là khả năng respnsibility của các nhà phát triển để thực hiện sbrk(), mà phải cung cấp bộ nhớ nhiều hơn người quản lý heap theo yêu cầu. Thông thường nó chỉ đơn thuần là tăng một con trỏ và trả về một con trỏ đến đầu khối mới, sau đó trình quản lý heap của thư viện quản lý và duy trì khối mới có thể hoặc không tiếp giáp với các khối trước đó. Liên kết trước bao gồm triển khai ví dụ.

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