Tôi có một hệ thống lớn được viết chủ yếu bằng C đang chạy trong không gian người dùng cho đến bây giờ. Bây giờ tôi cần biên dịch mã như một mô-đun hạt nhân. Để làm được điều đó, tôi nên ít nhất viết lại mã và thay thế các hàm như malloc
, calloc
, free
, printf
tương đương với hạt nhân của chúng, bởi vì chúng chỉ là các hàm không gian người dùng. Tuy nhiên, vấn đề là tôi không có mã nguồn cho một số thư viện được tạo tùy chỉnh được sử dụng trong hệ thống, và các thư viện đó gọi malloc
vv bên trong các chức năng của chúng. Vì vậy, về cơ bản, tôi có thể cần phải reimplement toàn bộ thư viện.Nhập mã vùng người dùng vào không gian hạt nhân
Bây giờ câu hỏi: nó sẽ là một hack thực sự bẩn, nếu tôi muốn viết thực hiện riêng của tôi về malloc
như là một wrapper quanh kmalloc
, một cái gì đó như thế này:
void *malloc(size_t size) {
return kmalloc(size, GFP_USER);
}
Sau đó, liên kết thực hiện này vào hệ thống mã sẽ loại bỏ tất cả biểu tượng Không xác định trong mô-đun lỗi.
Thực ra tôi nghĩ rằng đây sẽ là một vấn đề phổ biến và ai đó đã viết một trình bao bọc kmalloc như vậy, nhưng tôi đã googling được vài ngày và không tìm thấy gì hữu ích. EDIT: Lý do để làm điều này là hệ thống tôi đang nói đến là một ứng dụng thời gian thực chạy trên hệ điều hành thời gian thực VxWorks và bây giờ chúng tôi muốn chuyển nó sang Linux RTAI, nơi các ứng dụng chủ yếu chạy trong hạt nhân không gian. Nhưng tôi đoán có khả năng có thời gian thực trong không gian người dùng, vì vậy, tôi có lẽ nên làm như Mike đề xuất và tách mã thành các phần hạt nhân và không gian người dùng và liên lạc giữa chúng với bộ nhớ dùng chung.
Tôi vừa thấy [hack này] (http://stackoverflow.com/a/14728092/912144) cho gcc có thể hữu ích cho bạn. – Shahbaz
Thông thường mọi người cố gắng di chuyển mọi thứ ra khỏi hạt nhân, thay vì theo cách khác. Kinh nghiệm cá nhân của tôi là nếu bạn nghĩ rằng bạn cần tạo một mô-đun hạt nhân của chương trình, thì có thể bạn đang làm sai. –
@JoachimPileborg có lẽ anh ta đã nghĩ đến điều này sẽ nhanh hơn trong không gian hạt nhân – Ulterior