错误修改了 /etc/selinux/config文件。
错误信息:
重启后发现出现错误,不能继续启动
Kernel panic - not syncing: Attempted to kill init
解决方案:
1.系统启动的时候,按下‘e’键进入grub编辑界面,编辑grub菜单,选择“kernel /vmlinuz-2.6.23.1-42.fc8 ro root=/dev/vogroup00/logvol00 rhgb quiet” 一栏,按‘e’键进入编辑,在末尾增加enforcing=0,即:
kernel /vmlinuz-2.6.23.1-42.fc8 ro root=/dev/vogroup00/logvol00 rhgb quiet enforcing=0 或者selinux=0
按‘b’键继续引导,OK顺利前进。
2.后来发现,通过改变/etc/grub.conf 在倒数第二行添加selinux=0 也可。
3.(推荐) 检查/etc/selinux/config文件是否出错
注意事项:
1.系统启动后,按e ,如果没有对应kerne选项继续按e 找到
2.在出现命令行后 空格加入 enforing=0 回车
3.除保存编辑不要按回车,esc等按键。输入enforing=0后直接按b 继续启动。
现象1: 提示gas gld 比识别
措施: gnu编译器发展到后来,越来越流行,更多使用别名为 as ld gcc等.
现象2: 提示字节对齐需要是 2的倍数
措施: 具体解决方法: 利用命令 sed -i 's/align 2/align 4/g' filename 替换align 2 为 align 4(align 3 替换为 align 8)
sed -i 's/align 2/align 4/g' boot/head.s
sed -i 's/align 3/align 8/g' boot/head.s
现象3: -fcombine-regs -mstring-insns选项不识别
措施: 此两个选项已经过时,直接去掉即可
现象4: warning 特别多
措施: 将-Wall 替换为 -w
现象5: __stack_chk_fail 未定义
措施: 去网上搜了一下,在Makefile中的$(CFLAGS)后面加上-fno-stack-protector,即不需要栈保护
现象6: main.c 中_syscall0重复定义
措施: main.c static inline _syscall0(int, fork) 去掉static即可
现象7: 提示内嵌汇编不符合语法限制
措施: 类似的问题在后面编译中出现好多,C内嵌汇编的格式 asm (汇编语句:输入寄存器:输出寄存器:可能被修改的寄存器),最新的GCC规定 输入或输出寄存器不能出现在可能被修改的寄存器中,目前看到网上的方法是把所有类似问题的可能被修改的寄存器全部删掉 解决方案:find -type f -exec sed -i 's/:"\w{2}"(,"\w{2}") )/:) /g' {} 其中's/:"\w{2}"(,"\w{2}") /:/g'
现象8: 在 control.c 中清楚定义了 static unsigned char attr = 0x70 ,而在链接 control.o 时,却爆出 attr未定义。
措施: 用 nm -C control.o 查看其符号,发现attr确实处于未定义状态。故单独编译一个小程序定义静态变量,查看其 .o 文件中,发现静态变量定义正常。故考虑为编译选项差异导致,最终发现因为 -O 编译优化选项导致,目前处理方式是去掉该选项。
现象9: build.c:(.text+0xde): undefined reference to `MAJOR'
措施: 通过分析编译打印信息,发现编译时没有加入头文件路径 -Iinclude
现象10: fs/fs.o: In function check_disk_change':(.text+0x1b2f): undefined reference to invalidate_buffers'
措施: 查找发现此函数定义在buffer.c 中,且为内联函数, 故尝试将其更改为普通函数, 然后编译通过.
现象11: 编译 build.c 时报错:/usr/include/i386-linux -gnu/bits/stdio2.h:57:8: error: unknown type name ‘__gnuc_va_list’
措施: 分析发现时此系列错误均由 -Iinclude 选项导致, 而该选项在 想象9 中加入, 故考虑去掉该选项, 直接在build.c 中加入 MAJOR 宏定义.
第一次把自己编译的驱动模块加载进开发板,就出现问题,还好没花费多长时间,下面列举出现的问题及解决方案1:出现insmod: error inserting 'hello.ko': -1 Invalid module 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/modules/2.6.35.6-45.fc14.i686.PAE/build1 改为
KDIR :=/lib/modules/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) modules ARCH=arm CROSS_COMPILE=arm-linux- //加这句
2. [70685.298483] hello: module license 'unspecified' taints kernel.
[70685.298673] Disabling lock debugging due to kernel taint
方法:在模块程序中加入: MODULE_LICENSE("GPL")
3. rmmod: chdir(2.6.32.2-FriendlyARM): No such file or directory 错误解决
方法:lsmod 可查看模块信息
即无法删除对应的模块。
就是必须在/lib/modules下建立错误提示的对应的目录((2.6.32.2)即可。
必须创建/lib/modules/2.6.32.2这样一个空目录,否则不能卸载ko模块.
# rmmod nls_cp936
rmmod: chdir(/lib/modules): No such file or directory
但是这样倒是可以卸载nls_cp936,不过会一直有这样一个提示:
rmmod: module 'nls_cp936' not found
初步发现,原来这是编译kernel时使用make modules_install生成的一个目录,
但是经测试得知,rmmod: module 'nls_cp936' not found来自于busybox,并不是来自kernel
1).创建/lib/modules/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_module(modname, O_NONBLOCK | O_EXCL)//系统调用sys_delete_module
if (ret <0 &&errno == EAGAIN)
usleep(500000)
else
break
}
if (ret != 0)
printf("Unable to unload driver module \"%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 copy
<span style="font-size:18px">#include <linux/module.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)
}
module_init(proc_init)
module_exit(proc_exit)</span></span></span></span></span>
[html] view plain copy
<span style="font-size:18px">
ifneq ($(KERNELRELEASE),)
obj-m :=proc.o
else
KDIR :=/opt/FriendlyARM/linux-2.6.32.2
#KDIR :=/lib/modules/2.6.35.13-92.fc14.i686.PAE/build1
PWD :=$(shell pwd)
all:
$(MAKE) -C $(KDIR) M=$(PWD) modules 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 就可以看到 产生的内核信息啦
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)