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就可以了。