2012-06-20 38 views
8

Tôi đang tìm cách gọi hàm C trong một ngăn xếp khác, tức là lưu con trỏ ngăn xếp hiện tại, đặt con trỏ ngăn xếp đến một vị trí khác, gọi hàm và khôi phục con trỏ ngăn xếp cũ khi nó trở về.Gọi hàm C với con trỏ ngăn xếp khác nhau (gcc)

Mục đích của việc này là một hệ thống luồng nhẹ cho một ngôn ngữ lập trình. Các luồng sẽ hoạt động trên các ngăn xếp rất nhỏ, kiểm tra khi cần thêm stack và tự động thay đổi kích thước của nó. Điều này là để hàng ngàn chủ đề có thể được phân bổ mà không lãng phí rất nhiều bộ nhớ. Khi gọi đến mã C, không an toàn khi sử dụng một ngăn xếp nhỏ, vì mã C không biết về kiểm tra và thay đổi kích thước, vì vậy tôi muốn sử dụng ngăn xếp lớn được sử dụng chỉ để gọi C (được chia sẻ giữa các chuỗi nhẹ trên cùng một pthread).

Bây giờ tôi có thể viết các đoạn mã lắp ráp sẽ hoạt động tốt, nhưng tôi tự hỏi liệu có cách nào tốt hơn để làm điều này, chẳng hạn như phần mở rộng gcc hoặc thư viện đã triển khai nó. Nếu không, sau đó tôi đoán tôi sẽ có đầu của tôi chôn trong ABI và hướng dẫn sử dụng ngôn ngữ lắp ráp ;-) Tôi chỉ yêu cầu này ra khỏi sự lười biếng và không muốn phát minh lại bánh xe.

+0

Bạn có thể thực hiện "chuỗi chủ đề" của riêng mình với ngăn xếp được cá nhân hóa bằng syscall bản sao. Nếu bạn sử dụng lệnh gọi hệ thống trực tiếp thay vì trình bao bọc libc, nó hoạt động khá giống với ngã ba ngoại trừ việc bạn có thể chỉ định tài nguyên và không gian tên nào được chia sẻ. – technosaurus

Trả lời

2

Giả sử bạn đang sử dụng các chủ đề POSIX và trên hệ thống POSIX, bạn có thể đạt được điều này với các tín hiệu. Thiết lập một ngăn xếp xử lý tín hiệu thay thế (sigaltstack) và chỉ định một tín hiệu thời gian thực đặc biệt để bộ xử lý của nó chạy trên ngăn xếp tín hiệu thay thế. Sau đó, raise tín hiệu để chuyển sang ngăn xếp và có trình xử lý tín hiệu đọc dữ liệu cho chức năng cần gọi và đối số nào để truyền dữ liệu đó, từ dữ liệu chuỗi địa phương.

Lưu ý rằng cách tiếp cận này khá tốn kém (nhiều cuộc gọi hệ thống để thay đổi ngăn xếp), nhưng phải 100% di động với hệ thống POSIX. Vì nó rất chậm, bạn có thể muốn tạo các hàm gọi-on-alt-stack cụ thể được viết bằng assembly, và chỉ sử dụng giải pháp chung của tôi làm dự phòng cho các vòm mà bạn chưa viết phiên bản lắp ráp.

+0

Đó là một ý tưởng thú vị, nhưng quá đắt vì nó sử dụng các cuộc gọi hệ thống. Cảm ơn bạn đã trả lời. –

+0

Vâng, nếu bạn sẵn sàng để viết asm cho cpus bạn quan tâm, nó có thể cung cấp một dự phòng khá. Bạn cũng có thể xem xét API 'makecontext' cũ (lỗi thời trong POSIX 2001, bị loại bỏ vào năm 2008) như là một dự phòng đầu tiên vì nó có thể được thực hiện hoàn toàn trong không gian người dùng. –

+0

Nói chung, thiết lập ngăn xếp của riêng bạn và có một vài cuống lắp ráp để hoán đổi ngữ cảnh sẽ hoạt động. Tuy nhiên, bạn có thể chạy vào "kiểm tra ngăn xếp" để thực thi con trỏ ngăn xếp nằm trong phạm vi bộ nhớ cụ thể. Bạn cần phải trao đổi các giới hạn ngăn xếp (bất cứ nơi nào nó được lưu trữ trên nền tảng của bạn) cùng với con trỏ ngăn xếp. Ví dụ, trong các cửa sổ, nó nằm trong _TIB :: StackLimit và _TIB :: StackBase trong phân đoạn GS. – doug65536

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