2012-05-09 37 views
5

Tôi muốn có một chương trình "trình nạp ứng dụng" nhỏ nhận các tệp ứng dụng nhị phân khác qua TCP từ một máy chủ bên ngoài và chạy chúng.Thực thi quy trình từ bộ nhớ trong một tiến trình khác?

Tôi có thể thực hiện việc này bằng cách lưu tệp đã truyền vào đĩa cứng và sử dụng lệnh system() để chạy nó. Tuy nhiên, tôi tự hỏi nếu nó sẽ có thể khởi động các ứng dụng mới từ bộ nhớ mà không có nó bao giờ chạm vào ổ đĩa cứng.

Trạng thái của ứng dụng trình tải không quan trọng sau khi tải ứng dụng mới. Tôi thích gắn bó với C, nhưng các giải pháp C++ cũng được chào đón. Tôi cũng muốn tuân thủ các chức năng chuẩn của Linux C và không sử dụng bất kỳ thư viện bên ngoài nào, nếu có thể.

+0

Có, có thể nhưng nó hơi phức tạp. Bạn có thể mô phỏng hệ điều hành và ánh xạ nhị phân vào bộ nhớ, vv –

+2

Bạn có thể ghi nó vào một tệp trên ramdisk – TJD

+1

Tôi cũng có xu hướng nghĩ rằng bất kỳ mức độ bảo mật nào của OS trên một CPU vừa phải sẽ thực hiện tốt nhất để đảm bảo rằng điều này không thể xảy ra. Nó chắc chắn có thể thực hiện được, nhưng sẽ là nỗi đau thực sự để sử dụng trên các bản phân phối thực tế (tôi hy vọng) – BRFennPocock

Trả lời

3

Câu trả lời ngắn gọn: không.

Câu trả lời dài: Có thể nhưng khá khó khăn để thực hiện việc này mà không cần ghi nó ra đĩa. Về mặt lý thuyết, bạn có thể viết trình đọc elf của riêng mình đọc nhị phân, ánh xạ một số bộ nhớ, xử lý liên kết động theo yêu cầu, và sau đó chuyển điều khiển nhưng đó là một công việc khủng khiếp.

Giải pháp tốt nhất tiếp theo là ghi nó vào đĩa và gọi hủy liên kết càng sớm càng tốt. Đĩa thậm chí không phải là đĩa "thực", nó có thể là tmpfs hoặc tương tự.

Cách thay thế mà tôi đã sử dụng gần đây là không chuyển các tệp nhị phân được biên dịch hoàn chỉnh, nhưng để chuyển mã bytecode LLVM thay vào đó, sau đó có thể được JIT'd/interpreted/saved as fit. Điều này cũng có lợi thế là làm cho ứng dụng của bạn hoạt động trong môi trường không đồng nhất.

Nó có thể hấp dẫn để thử một sự kết hợp của fmemopen, filenofexecve, nhưng điều này sẽ không làm việc vì hai lý do:

  1. Từ fexecve() manpage:

    "Các tập tin fd mô tả phải được mở chỉ đọc và người gọi phải có quyền thực thi tệp mà nó đề cập đến "

    I.e. nó cần phải là một fd đề cập đến một tập tin.

  2. Từ fmemopen() manpage:

    "Không có mô tả tập tin liên quan đến các dòng tập tin được trả về bởi các chức năng này (ví dụ, fileno(3) sẽ trả về một lỗi nếu gọi trên dòng trả lại)"

+0

Cảm ơn bạn đã phản hồi; điều này thật đúng với gì mà tôi đã tìm kiếm. Googling chủ đề đã không nhận được tôi rất xa và tôi cần phải đáp ứng sự tò mò của tôi! – Flip

+0

Lưu ý rằng nó là một cái gì đó của một tiêu chuẩn những ngày này để có một 'tmpfs' gắn kết tại'/dev/shm/'. – caf

0

Dễ dàng hơn nhiều so với thực hiện nó là C sẽ chỉ thiết lập hệ thống tệp tmpfs. Bạn sẽ có tất cả những lợi thế của giao diện của một đĩa cứng, từ chương trình/máy chủ của bạn/bất cứ điều gì bạn chỉ có thể làm một exec. Những loại hệ thống tập tin ảo này khá hiệu quả hiện nay, sẽ chỉ có một bản sao của tập tin thực thi trong bộ đệm trang.

Như Andy đã chỉ ra, để chương trình đó hiệu quả, bạn phải đảm bảo rằng bạn không sử dụng tính năng ghi đệm vào tệp nhưng bạn "viết" (theo nghĩa rộng hơn) trực tiếp tại chỗ.

  • bạn phải biết làm thế nào lớn thực thi của bạn sẽ được
  • tạo ra một tập tin trên tmpfs bạn
  • quy mô nó với kích thước đó với ftruncate
  • "bản đồ" mà nộp vào bộ nhớ với mmap để có được addr của một bộ đệm
  • qua đó giải quyết trực tiếp đến recv cuộc gọi để ghi dữ liệu tại chỗ
  • munmap file
  • gọi exec với tệp
  • rm tệp. có thể được thực hiện ngay cả khi thực thi vẫn chạy
+0

Các tệp tmpfs trung thực sẽ không nhanh hơn hệ thống tệp gốc trừ khi bộ nhớ của bạn đã có dung lượng. Viết được đệm vào bộ nhớ như vậy mà một execve ngay lập tức() sẽ chỉ đơn giản là bản đồ chúng ra khỏi bộ nhớ cache. Chi phí duy nhất bạn trả là sự tuôn ra cuối cùng vào đĩa, đó là không đồng bộ. –

+0

@AndyRoss, không sử dụng ghi đệm cho một điều như vậy, tôi sẽ cập nhật câu trả lời của tôi. –

+1

Thậm chí chỉ cần tránh một bản sao bộ nhớ. Hạn chế hiệu suất ở đây là gì? Tôi đang gặp khó khăn trong việc tưởng tượng một tình huống mà tốc độ ghi thông qua hệ thống tập tin là giới hạn nhưng tốc độ nhận các gói tin qua mạng không phải là. Dường như quá phức tạp. Chỉ cần mở/ghi vào hệ thống tập tin thông thường của bạn và lưu các rắc rối. –

0

Bạn có thể muốn xem xét và tái sử dụng UPX, mà giải nén tập tin thực thi để nhớ, và sau đó chuyển điều khiển đến ld-linux để bắt đầu nó.

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