導航:首頁 > 源碼編譯 > 編譯內核時電腦睡眠

編譯內核時電腦睡眠

發布時間:2022-05-25 10:06:43

『壹』 編譯linux內核過程的問題。

kernel panic的原因很多,這個需要根據報錯去分析。
你可以網路或者谷歌 centos救援模式恢復內核。centos光碟里有自帶的內核的rpm包。
實在不行,重新做個系統也不是很麻煩的事情。反正是虛擬機,以後記得在做這種會導致系統
崩潰的試驗時,可以先考慮克隆一個干凈的系統,這樣就算做錯了,也可以直接恢復初始狀態。
省著重做系統了。

『貳』 linux 編譯內核幾個常見問題解決方法

第一次把自己編譯的驅動模塊載入進開發板,就出現問題,還好沒花費多長時間,下面列舉出現的問題及解決方案
1:出現insmod: error inserting 'hello.ko': -1 Invalid mole format
法一(網上的):是因為內核模塊生成的環境與運行的環境不一致,用linux-2.6.27內核源代碼生成的模塊,可能就不能在linux-2.6.32.2內核的linux環境下載入,需要在linux-2.6.27內核的linux環境下載入。
a.執行 uname -r //查看內核版本
b.一般出錯信息被記錄在文件/var/log/messages中,執行下面命令看錯誤信息
# cat /var/log/messages |tail
若出現類似下面:
Jun 4 22:07:54 localhost kernel:hello: version magic '2.6.35.6-45.fc14.i686.PAE
' should be '2.6.35.13-92.fc14.i686.PAE'
則把 Makefile里的KDIR :=/lib/moles/2.6.35.6-45.fc14.i686.PAE/build1 改為
KDIR :=/lib/moles/2.6.35.13-92.fc14.i686.PAE/build1 //改成自己內核源碼路徑
(這里的build1是一個文件鏈接,鏈接到/usr/src/kernels/2.6.35.6-45.fc14.i686.PAE和13-92的)
然並卵,我的fedora 14 /usr/src/kernels下並沒有2.6.35.13-92.fc14.i686.PAE,只有2.6.35.13-92.fc14.i686,雖然不知道兩者有什麼區別,但改成2.6.35.13-92.fc14.i686還是不行,照樣這個問題,還好後來在看教學視頻的到啟發
法二:改的還是那個位置
KDIR :=/opt/FriendlyARM/linux-2.6.32.2 //把這里改成你編譯生成kernel的那個路徑
all:
$ (MAKE) -C $ (KDIR) M = $ (PWD) moles ARCH=arm CROSS_COMPILE=arm-linux- //加這句
2. [70685.298483] hello: mole license 'unspecified' taints kernel.
[70685.298673] Disabling lock debugging e to kernel taint
方法:在模塊程序中加入: MODULE_LICENSE("GPL");
3. rmmod: chdir(2.6.32.2-FriendlyARM): No such file or directory 錯誤解決
方法:lsmod 可查看模塊信息
即無法刪除對應的模塊。
就是必須在/lib/moles下建立錯誤提示的對應的目錄((2.6.32.2)即可。
必須創建/lib/moles/2.6.32.2這樣一個空目錄,否則不能卸載ko模塊.
# rmmod nls_cp936
rmmod: chdir(/lib/moles): No such file or directory
但是這樣倒是可以卸載nls_cp936,不過會一直有這樣一個提示:
rmmod: mole 'nls_cp936' not found
初步發現,原來這是編譯kernel時使用make moles_install生成的一個目錄,
但是經測試得知,rmmod: mole 'nls_cp936' not found來自於busybox,並不是來自kernel
1).創建/lib/moles/2.6.32.2空目錄
2).使用如下源碼生成rmmod命令,就可以沒有任何提示的卸載ko模塊了[luther.gliethttp]
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
int main(int argc, char *argv[])
{
const char *modname = argv[1];
int ret = -1;
int maxtry = 10;
while (maxtry-- > 0) {
ret = delete_mole(modname, O_NONBLOCK | O_EXCL);//系統調用sys_delete_mole
if (ret < 0 && errno == EAGAIN)
usleep(500000);
else
break;
}
if (ret != 0)
printf("Unable to unload driver mole \"%s\": %s\n",
modname, strerror(errno));
}
3).把生成的命令復制到文件系統
# arm-linux-gcc -static -o rmmod rmmod.c
# arm-linux-strip -s rmmod
# cp rmmod /nfs/
cp /nfs/rmmod /sbin
代碼如下:
proc.c
[html] view plain
<span style="font-size:18px;">#include <linux/mole.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/proc_fs.h> /* Necessary because we use the proc fs */
#define procfs_name "proctest"

MODULE_LICENSE("GPL");
struct proc_dir_entry *Our_Proc_File;
int procfile_read(char *buffer,char **buffer_location,off_t offset, int buffer_length, int *eof, void *data)
{ int ret;
ret = sprintf(buffer, "HelloWorld!\n");
return ret;
}

int proc_init()
{ Our_Proc_File = create_proc_entry(procfs_name, 0644, NULL);
if (Our_Proc_File == NULL) {
remove_proc_entry(procfs_name, NULL);
printk(KERN_ALERT "Error: Could not initialize /proc/%s\n",procfs_name);
return -ENOMEM; }
Our_Proc_File->read_proc = procfile_read;//
// Our_Proc_File->owner = THIS_MODULE;
Our_Proc_File->mode = S_IFREG | S_IRUGO;
Our_Proc_File->uid = 0;
Our_Proc_File->gid = 0;
Our_Proc_File->size = 37;
printk("/proc/%s created\n", procfs_name);
return 0;
}
void proc_exit()
{ remove_proc_entry(procfs_name, NULL);
printk(KERN_INFO "/proc/%s removed\n", procfs_name);
}
mole_init(proc_init);
mole_exit(proc_exit);</span></span></span></span></span>
[html] view plain
<span style="font-size:18px;">

ifneq ($(KERNELRELEASE),)
obj-m :=proc.o
else
KDIR :=/opt/FriendlyARM/linux-2.6.32.2
#KDIR :=/lib/moles/2.6.35.13-92.fc14.i686.PAE/build1
PWD :=$(shell pwd)
all:
$(MAKE) -C $(KDIR) M=$(PWD) moles ARCH=arm CROSS_COMPILE=arm-linux-
clean:
rm -f *.ko *.o *.mod.o *.mod.c *.symvers
endif</span></span></span></span></span>
make後生成proc.ko,再在開發板上insmod proc.ko即可
執行 dmesg 就可以看到 產生的內核信息啦

『叄』 Linux 內核下的睡眠機制是怎樣的

Linux設備驅動是linux內核的一部分,是用來封裝硬體細節,為上層提供標准介面的一種方法。 所以還是得從內核開始吧。

『肆』 電腦進入睡眠模式,然後在開起來就藍屏

微軟操作系統的睡眠模式有BUG,喚醒時容易出現藍屏.

你要麼去主板官網更新電源管理程序,要麼就進電源選項設置禁用休眠睡眠~

參考資料

0x0000000A (等同於新式藍屏表示代碼 BCCode: 1000000a或a)
如果只是這個藍屏代碼一般和硬體無關,是驅動和軟體有沖突造成的。
如果您的機器藍屏了,而且每次都是這個代碼請想一想最近是不是更新了什麼軟體或者什麼驅動了,把它卸載再看一下。一般情況下就能夠解決,如果實在想不起來,又非常頻繁的話,那麼沒辦法,重新做系統吧。 如果這個不只出這個代碼,重啟再藍屏還會出現8E、7E、50、D1、24等代碼,那麼首先要考慮內存損壞.

故障分析 0x0000000A 錯誤表示在內核模式中存在以過高的進程內部請求級別(IRQL)訪問其沒有許可權訪問的內存地址。這個錯誤一般是因為硬體設備的驅動程序存在BUG,某些軟體或硬體與Windows不兼容引起的。 如果遇到0x0000000A錯誤,建議嘗試以「最後一次正確的配置」方式啟動 Windows,並檢查一下最近有沒有安裝或升級過任何系統更新、硬體設備的驅動程序、BIOS、Firmware及應用軟體等。如果有的話,請將最近更新過的應用軟體及硬體設備逐一卸載、恢復到之前可以穩定運行的版本,看看問題能否解決。

如對你有幫助~還請及時採納~

『伍』 關於linux編譯內核的問題 如果一次沒有編譯完,中途可以保存關機嗎 我是在gentoo的live

正常環境關機是可以的,因為有編譯的中間文件存在。livecd是不可以的,因為一關機什麼都沒有了。

『陸』 電腦處於睡眠或 休眠狀態時斷網問題

一般為了保護電腦默認設置是在無操作四十分鍾(不一定)後進入睡眠狀態,睡眠狀態下會斷網,但是想要掛著下載東西又不想一會喚醒一下,就要改下電源選項。windows系統控制面板下有電源選項,修改一下就可以防止電腦自動睡眠了。

擴展:

1、電腦睡眠狀態即系統休眠狀態,也就是我們常說的S1,S3,S4狀態是通過ACPI實現的。ACPI就是Advanced Configuration and Power Interface的縮寫,意思是"高級配置與電源介面"。這是英特爾、微軟和東芝共同開發的一種電源管理標准。

2、在軟體方面,Windows 98及其後續產品和Windows 2000都對ACPI給予了全面的支持;而Linux的內核現在對此支持得並不是太理想。硬體方面比較麻煩,除了要求主板、顯卡和網卡等外設要支持 ACPI外,還需要機箱電源的配合。電源在提供5伏電壓給主板的同時,還必須使電流穩定在720毫安以上才可以,這樣它才能夠實現電腦的"睡眠"和"喚醒 "。

3、我們最常用到的是S3狀態,即Suspend to RAM(掛起到內存)狀態,簡稱STR。顧名思義,STR就是把系統進入STR前的工作狀態數據都存放到內存中去。在STR狀態下,電源仍然繼續為內存等最必要的設備供電,以確保數據不丟失,而其他設備均處於關閉狀態,系統的耗電量極低。一旦我們按下Power按鈕(主機電源開關),系統就被喚醒,馬上從內存中讀取數據並恢復到STR之前的工作狀態。

『柒』 Linux硬體中斷服務程序中為什麼不能睡眠

以下是根據一些資料和個人理解總結的,如有錯誤希望指出。

首先需要明確的是,這里的中斷指的是硬體中斷。

從事實上說明 有下面這些理由。
硬體中斷本身就是用來作為處理緊急事件的一種方法,所以硬體中斷服務程序應該盡量的快。不應該睡眠
硬體中斷服務程序會打斷某個無辜的進程(甚至是另一個中斷服務程序)。所以它應該盡量快(突然被打斷運行已經夠無辜了,總不能還讓一直等待吧)
硬體中斷是無法預測的,如果在中斷服務程序中睡眠就會導致睡眠過程中該中斷請求的丟失。(linux中一個中斷處理程序在運行時,相應中斷線會被屏蔽掉)

要理解為什麼硬體中斷處理程序中不能睡眠的內在機制。需要理解下面這些概念。

1 linux內核的工作模式 linux內核有兩種工作模式,進程上下文和中斷上下文。
1.1 進程上下文指內核代表進程執行
比如進程執行系統調用產生異常陷入內核後,內核就代表該進程執行操作。可以通過current宏關聯到當前進程,
因為陷入內核時進程造成的或需求的,所以內核的執行與當前進程相關。所以說他代表該進程執行

1.2 執行一個硬體中斷處理程序時就處於中斷上下文
中斷上下中和進程沒什麼關系(雖然此時current指向被中斷的進程)。這也容易理解,因為硬體中斷隨時
都有可能發生。不像上面提到的像系統調用之類的異常是由於程序執行某些指令造成的,所以陷入
內核後,因為要坐的工作基本都是和當前這個進程相關的(因為是他執行一些指令導致產生的異常),
所以我們說內核代表進程執行。
但是硬體中斷的產生完全無法預測,所以誰也不知道硬體中斷將會打斷哪個進程。所以硬體中斷服務程序與進程無關
它處於中斷上下文中

2 異常和硬體中斷的區別
2.1 異常屬於中斷的一種,和硬體中斷的區別在與它是"同步",是由於執行一些指令造成的。如除0
或者執行過程中產生缺頁,以及軟中斷實現的系統調用。(這也是叫「同步中斷」的原因,因為指令的執行是要時鍾同步的)。
當執行的指令會陷入內核時,就會運行在進程上下文中。內核代表進程
2.2 硬體中斷時一種 非同步中斷,他隨時都可能發生,無法預測。中斷執行時處於中斷上下文中。

綜上,linux中硬體中斷服務程序不能睡眠的原因在與。執行硬體中斷服務程序時,內核處於中斷上下文
中,此時內核與進程無關。如果睡眠後就不能調度回來了。因為調度程序調度的是進程,而之前的硬體中斷服務程序卻是和進程無關的

『捌』 amda8顯卡編譯成模塊正常,編譯進內核就黑屏

amda8顯卡編譯成模塊正常,編譯進內核就黑屏的解決方法如下:
1.安裝的時候選擇這個可以全新安裝AMD驅;
2.此外,AMD還提出了一個特別的解決方法,那就是安裝的時候別選覆蓋安裝,選擇全新安裝驅動,雖然這樣會要求重啟電腦一次,但是全新安裝是有可能解決部分莫名其妙問題的。電腦還真的就是這樣,就好比重啟電腦能解決大部分問題、重裝Windows能解決絕大多數麻煩一樣,真要是經常遇到黑屏等問題,那就全新安裝驅動吧。

『玖』 編譯linux內核,安裝模塊的過程中死機,重啟後是要直接安裝模塊呢,還是重新編譯內核(已make成功)

我覺得安裝模塊過程中死機,不會影響到已經編譯好的模塊。模塊還是編譯過的,直接install就可以了。

閱讀全文

與編譯內核時電腦睡眠相關的資料

熱點內容
安卓軟體怎麼還原之前的版本 瀏覽:869
什麼app可以看舌神綜藝 瀏覽:278
vba編好的程序編譯出來 瀏覽:91
如何清空伺服器數據 瀏覽:33
android計劃軟體 瀏覽:383
vivo手機文件夾加密路徑 瀏覽:131
程序員怎麼找到聯通卡 瀏覽:196
單片機實訓要求 瀏覽:268
程序員八大黑話 瀏覽:946
除了天天鑒寶app還有什麼 瀏覽:628
cs中的文件夾 瀏覽:792
php獲取內存地址 瀏覽:679
看電視直播節目什麼app最好 瀏覽:30
如何連子文件裡面的文件一起解壓 瀏覽:72
怎麼用單片機識別天氣 瀏覽:877
單片機實驗室認識 瀏覽:142
我的世界pe112伺服器地址 瀏覽:886
程序員轉行銷售 瀏覽:468
沈陽醫療程序員 瀏覽:47
戴爾伺服器主機系統如何安裝 瀏覽:958