2013-10-04 337 views
0

我學習內核編程,並有一個簡單的調用kstrtol我使用的字符串轉換爲數字。但是,每次我編譯這個模塊並使用insmod將其放入內核時,我會收到「BUG:無法在f862b026處理內核分頁請求」,然後出現寄存器和堆棧轉儲。Linux內核:爲什麼這個調用kstrtol會崩潰?

我從這裏下了定義:https://www.kernel.org/doc/htmldocs/kernel-api/API-kstrtol.html。這似乎是一個非常簡單的電話。我在這裏做錯了什麼?

#include <linux/kernel.h> 

static int __init convert(void) 
{ 
    long myLong; 
    char *myNumber = "342"; 
    myNumber[2] = '\0'; //Overwriting the '2', just so I know for sure I have a terminating '\0' 

    if (kstrtol(myNumber, 10, &myLong) == 0) 
    { 
     printk("We have a number!\n"); 
    } 
return 0; 
} 

static void __exit convert_exit(void) 
{ 
    printk("Module unloaded\n"); 
} 

module_init(convert); 
module_exit(convert_exit); 
+0

該問題可能是與覆蓋2.字面不應該被修改。 – Barmar

回答

3

您不能修改字符串文字。首先將其複製到數組中。

編輯:使用該代替

char mystr[] = "abdc"; 

EDIT2: 這種情況的根本原因是,一個字符指針到一個字符串指向一個數據段,通常是隻讀的。如果你改變這個內存,你可能會崩潰。 當您創建字符數組代替,字符串文字被複制到堆棧,在那裏你可以安全地修改它的陣列。

+0

問題在於我需要爲我的字符串使用字符指針,因爲最終我需要解析進入模塊的參數輸入。我將一個字符串(格式如:120;東西)分解爲數字和單詞。所以,我把這個數字存儲在char *中。我在這種情況下如何處理它? – Maxthecat

+1

'char * mystr [] =「abcde」; char * myptr = mystr;' – Barmar

+0

@Maxthecat你爲什麼需要*指針? – 2013-10-04 16:28:26