2013-02-08 80 views
8

我有一個大的系統,主要用C語言編寫,到目前爲止一直在用戶空間中運行。現在我需要將代碼編譯爲內核模塊。爲此,AFAIK,我應該至少重寫代碼和替換功能作爲malloccallocfreeprintf與他們的內核當量,因爲這些都是僅僅用戶空間的功能。但問題是,我沒有系統中使用的一些定製庫的源代碼,這些庫在它們的函數內調用malloc等。所以,基本上,我可能需要重新實現整個圖書館。將用戶空間代碼移植到內核空間

現在的問題:會是一個非常骯髒的黑客,如果我寫我自己的實施malloc作爲一個包裝周圍kmalloc,這樣的事情:

void *malloc(size_t size) { 
    return kmalloc(size, GFP_USER); 
} 

然後這個實現鏈接到系統代碼,這將消除模塊中的所有未知符號錯誤。

其實我認爲這將是一個普遍的問題,有人會已經寫這樣的kmalloc的包裝,但我一直在google搜索了兩天,現在,沒有發現任何有用的。

編輯:這樣做的原因是我所說的系統是一個在VxWorks實時操作系統上運行的實時應用程序,現在我們要將它移植到Linux RTAI上,其中應用程序主要在內核中運行空間。但我想在用戶空間中也有實時的可能性,因此,我應該按照Mike的建議做,並將代碼分離到內核和用戶空間部分,並使用共享內存在它們之間進行通信。

+0

我剛剛看到[這個破解](http://stackoverflow.com/a/14728092/912144)對於gcc可能對你有用。 – Shahbaz 2013-02-08 12:32:10

+9

通常情況下,人們試圖將內容從內核移出,而不是相反。我個人的經驗是,如果你認爲你需要製作一個你的程序的內核模塊,那麼你可能做錯了。 – 2013-02-08 12:34:35

+0

@JoachimPileborg他可能會認爲它會在內核空間更快 – Ulterior 2013-02-08 12:37:07

回答

8

我從來沒有見過這樣做過。我確實有做在以前的工作類似的東西(在我們的手機,對節能的原因,我們不得不端口的代碼從用戶空間從內核的部分),但是這就是我做的。我花了一部分的代碼和移動它,並在那一小部分。

當我做到了,我改變了用戶空間調用到內核,因爲一些原因兩個主要的人呼叫:

  1. 它不那麼令人困惑的是這樣(別人看代碼沒有想知道我爲什麼從內核調用「malloc」)

  2. mallockmalloc不能正常工作。我的意思是

    2A。 kmalloc需要flags參數,在你上面的例子中你對它進行了硬編碼。如果您稍後決定要在某些地方而不是其他地方更換它,會怎麼樣? (假設你有許多不同的地方可以獲得動態內存)。

    2b。 kmalloc不會以與malloc相同的方式給你記憶。 malloc()會給你傳遞的字節數爲size_t size。另一方面,kmalloc()位於內核中,因此正在處理系統的物理內存,該內存僅在頁面大小的塊中可用;因此當您撥打kmalloc()時,您將只能獲得某些預定義的固定大小的字節數組。如果你沒有意識到這一點,你可能會問的只是特定塊,從而獲得比你需要...你的代碼直接端口不會保護你從更多的內存。

    2c。頭文件也必須改變。顯然,你不能在內核中包含<stdlib.h>,所以僅僅因爲你「包裝」了malloc調用,你仍然需要去替換頭文件。

我在上面2B點的簡單的例子:

void * stuff; 
stuff = kmalloc(1,GFP_KERNEL); 
printk("I got: %zu bytes of memory\n", ksize(stuff)); 
kfree(stuff); 

要顯示的內存分配的實際金額:

[90144.702588] I got: 32 bytes of memory 

反正...從技術上說,你怎麼描述它,應該工作得很好。兩者都採取size_t並返回void *所以它應該工作;但請注意,進入內核的代碼越多,確定性越小,並且malloc() < =>kmalloc()不像看起來那樣是1:1。

0

試圖使我的RTAI代碼在用戶和內核空間都可編譯(以及使用POSIX),我開發了基本上可以滿足你要求的URT。它是實時系統的輕量級抽象級別(甚至是不一致的用戶空間與內核空間RTAI函數)。