2010-07-09 39 views
13

Khi nói về bộ nhớ của một quá trình, tôi nghe nói về những thứ như bộ nhớ mãbộ nhớ dữ liệu.Bộ nhớ mã được quản lý như thế nào?

Và đối với bộ nhớ dữ liệu, có 2 cơ chế quản lý chính, ngăn xếp và đống.

Tôi hiện đang tự hỏi làm thế nào là bộ nhớ mã được quản lý? Và ai quản lý nó?

Xin lỗi nếu tuyên bố của tôi không rõ ràng.

Cảm ơn.

Trả lời

17

Tôi khuyên bạn nên http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory (và các bài viết liên quan đến bộ nhớ khác) nếu bạn muốn tìm hiểu thêm về các chi tiết về quản lý bộ nhớ của quá trình.

bộ nhớ mã = ​​Đoạn văn bản

Chú ý cách không gian địa chỉ là 4GB. Khi hạt nhân tạo ra một quá trình, nó cung cấp cho nó bộ nhớ ảo. Dưới đây là một ví dụ về một hệ điều hành 32 bit. Nhân quản lý những địa chỉ nào được ánh xạ tới RAM thực tế thông qua MMU của bộ xử lý. Vì vậy, hạt nhân và MMU quản lý bộ nhớ mã, cũng giống như chúng quản lý toàn bộ không gian địa chỉ của một tiến trình.

Borrowed from duartes.org http://static.duartes.org/img/blogPosts/linuxFlexibleAddressSpaceLayout.png

+1

liên kết rất đẹp ... – wrapperm

+0

Tôi đóng gói thứ hai. :) – smwikipedia

+2

Bố cục thường được thiết lập (và được quản lý) bởi trình liên kết chứ không phải hạt nhân.Hạt nhân chỉ đọc thông tin trong hình ảnh thực thi và thiết lập bản đồ bộ nhớ cho phù hợp. Trình liên kết động sẽ được ánh xạ trong nếu tệp thực thi như vậy chỉ định (được thực hiện cho các tệp thi hành được liên kết động) và xử lý rất nhiều thứ. Bạn có thể xem xét mối liên kết 'một phần của' hệ điều hành, nhưng bạn có thể tạo một trình liên kết tùy chỉnh thực hiện bất kỳ thứ gì bạn muốn, –

2

Nó được quản lý bởi hệ điều hành. Khi một chương trình được chạy, mã của nó được tải từ một tệp thi hành đến một số địa chỉ bộ nhớ. Tùy thuộc vào bản chất của chương trình, một số thay đổi được áp dụng cho các phần mã, ví dụ: nhảy tới thư viện được liên kết động được giải quyết.

Theo đề xuất của Space_C0wb0y, hãy xem en.wikipedia.org/wiki/Dynamic_linker để biết chi tiết về những gì đang diễn ra.

+1

Kiểm tra bài viết wikipedia này về tải động để biết một số thông tin chi tiết về những gì đang diễn ra: http://en.wikipedia.org/wiki/Dynamic_linker –

+0

Cảm ơn Space_C0wb0y, liên kết đó hữu ích. – smwikipedia

0

hệ điều hành của bạn cung cấp cái gọi là hệ thống gọi tự động cấp phát bộ nhớ (malloc, miễn phí, vv), nó cũng cung cấp các cơ chế để tải và thực thi chương trình của bạn.

Khi chương trình được tải bởi hệ điều hành, đoạn văn bản (bộ nhớ mã) được thiết lập và bộ nhớ phân bổ tĩnh trong chương trình của bạn sẽ có sẵn ngay lập tức. Khi mã của bạn gọi hàm, các biến (tĩnh phân bổ) trong các hàm của bạn được cấp phát trên ngăn xếp và bộ nhớ được cấp phát động của bạn (ví dụ sử dụng malloc()) được cấp phát trên heap. Trong thời gian chương trình của bạn chạy, trách nhiệm của bạn (lập trình viên) để quản lý bộ nhớ (thiếu làm như vậy sẽ dẫn đến rò rỉ bộ nhớ và cuối cùng sẽ gây ra một chương trình chạy dài để hết bộ nhớ và nó sẽ bị lỗi hoặc cực đoan) trường hợp, tùy thuộc vào hệ điều hành, đưa toàn bộ hệ điều hành xuống với nó).

cũng Xem bài viết này: http://www.maxi-pedia.com/what+is+heap+and+stack

+0

Heap không được quản lý bởi hạt nhân trên hầu hết các hệ điều hành. Nó thường là thành phần chế độ người dùng thuần túy nằm trong một số loại thư viện thời gian chạy (ví dụ: ntdll, libc), sau đó thực hiện cuộc gọi hệ thống đến các hàm xử lý trang cấp thấp hơn (ví dụ: NtAllocateVirtualMemory). – wj32

4

Bộ nhớ mã số không cần quản lý vì nó không thay đổi. Khi một tập tin thực thi được nạp vào không gian địa chỉ, mã chỉ được đọc từ tệp thực thi vào bộ nhớ. Trên thực tế, trên các hệ điều hành hiện đại, phân đoạn mã chỉ là bộ nhớ được ánh xạ tới tệp thực thi.

+1

Vâng, vâng .... nó phụ thuộc vào hệ điều hành. Như tôi nhớ từ cuốn sách A. Silberschatz về các hệ điều hành, một số kiến ​​trúc có thể di chuyển được mã, nhưng nó phải minh bạch với lập trình viên. Ngoài ra việc tải/dỡ các thư viện động liên quan đến việc quản lý bộ nhớ của mã. – doc

+0

@doc: Đúng, nhưng nó khác nhau giữa hệ điều hành và kiến ​​trúc. Những gì tôi đã nói ở trên dựa chủ yếu vào việc nói về định dạng tệp thi hành OS X. – JeremyP

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