对linux系统进行内核升级遇到的一些问题

来源:互联网 发布:php页面重定向 编辑:程序博客网 时间:2024/05/22 16:48

1.如何查看linux系统是否是安装在scsi磁盘上:

进入/dev目录,查找是/hda还是/sda。

在Linux系统下对于IDE硬盘,每块盘有一个设备名:

对应于主板的四个IDE接口,设备名依次为:/dev/hda,/dev/hdb,/dev/hdc,/dev/hdd等,如果还有IDE 

Raid卡,则依次为:/dev/hde,/dev/hdf,/dev/hdg,/dev/hdh.

对于SCSI硬盘,则设备名依次为/dev/sda,/dev/sdb,/dev/sdc等。


2.安装内核make install时,进入 /usr/src/linux-3.9.4即可,否则出现提示:

make: *** 没有规则可以创建目标“install”。 


3.chmod 777 grub.cfg 更改该文件的只读属性。


4.第10步,配置grub引导程序。

打开/boot/grub/grub.cfg,复制粘帖3.26.。。。。分别修改vmlinuz跟intird值为3.9.4的文件,重启即可。

但是进入3.9.4内核之后,网络连接不上,无法显示。


5,回答网络连接不上的问题:编译tg3网卡驱动程序的时候,出错,/tg3.c:18630: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘tg3_remove_one’。可进入vim,18630gg,找到那一行里面的宏定义,在文件前面加#define __宏名。一般出错原因为找不到那个宏所在,这样相当于将宏置为零,什么也不做,可以使程序编译通过。

这里添加:

//-------------------------------------

#define __devexit
#define __devinitdata
#define __devinit 
#define __devexit_p
//-----------------------------------

文件编译通过。

这里源驱动程序不能通过编译的原因可能是,驱动比较老,没人维护。


6,根本就不是驱动程序的问题,因为我还没驱动成功,让朱老师给我鼓捣了一番,重启就好了。

原因是

配置编译选项出了问题。我没有把怎么搜索无线信号的选项给选中编译,所以怎么整也整不出来。

     作为操作系统的内核,其内容和功能必然非常繁杂,包括处理器调度,内存管理,文件系统管理,进程通讯以及设备管理等等,而对于不同的硬件,其配置选项也不相同,所以在编译源代码之前必须设置编译选项。其实我觉得这一步是升级内核整个过程中最有技术含量的,因为要根据自己的需要正确选择yes or no需要对计算机方方面面的知识都有所了解。但是这里的选项实在是太多了,大概有几百项之多,我以前曾尝试着一项一项的选,但是最后还是放弃了,因为有很多选项不是很明白。

     既然这样,难道没有什么简便的方法么? 当然有!那就是make menuconfig 或者make xconfig。我使用的是make menuconfig,但是前提条件是要装ncurses。

        ncurses 到http://ftp.gnu.org/pub/gnu/ncurses/下载,可以放到任何目录进行安装:

                        tar zxvf  ncurses<version>.tar.gz  #解压缩并且释放 文件包

cd ncurses<version>        #进入解压缩的目录(注意版本)
./configure                        #按照你的系统环境制作安装配置文件
make                                 #编译源代码并且编译NCURSES库
su root                              #切换到root用户环境
make install                     #安装编译好的NCURSES库

     另外,在make menuconfig过程中也会有一些选项需要你来设置*, y, n 或者m,选择*表示选项中的内容被直接编入内核中,选择m表示选项中的内容不编入内核,而只是编成独立的module,用到时才调用。

     ok, 在当前文件路径下,输入命令:

    make menuconfig(或者用 make xconfig,我没有启用成功)

PS:苦逼的捣鼓了3个多小时,本来早请教朱老师,1个小时就能搞定的事儿。不知道自己到底有啥收获,咳!


7,空间内存不足,无法进入ubuntu,提示电源管理器配置出错。删掉kernel中所有的linux版本文件,终于可以进入。重新将linux-3.9.4解压缩至 /usr/src。su下,tar -xvf linux-3.9.4.tar -C /usr/src,发现已经没有linux-***/arch/x86/include/generated/asm/syscalls_32.h的generated目录。


8,

int $0x80

在系统libc库的源代码里面。

执行这条指令时发生以下动作:

  1. int指令称为软中断指令,可以用这条指令故意产生一个异常,上一章讲过,异常的处理和中断类似,CPU从用户模式切换到特权模式,然后跳转到内核代码中执行异常处理程序。

  2. int指令中的立即数0x80是一个参数,在异常处理程序中要根据这个参数决定如何处理,在Linux内核中int $0x80这种异常称为系统调用(System Call)。内核提供了很多系统服务供用户程序使用,但这些系统服务不能像库函数(比如printf)那样调用,因为在执行用户程序时CPU处于用户模式,不能直接调用内核函数,所以需要通过系统调用切换CPU模式,经由异常处理程序进入内核,用户程序只能通过寄存器传几个参数,之后就要按内核设计好的代码路线走,而不能由用户程序随心所欲,想调哪个内核函数就调哪个内核函数,这样可以保证系统服务被安全地调用。在调用结束之后,CPU再切换回用户模式,继续执行int $0x80的下一条指令,在用户程序看来就像函数调用和返回一样。

  3. eaxebx的值是传递给系统调用的两个参数。eax的值是系统调用号,Linux的各种系统调用都是由int $0x80指令引发的,内核需要通过eax判断用户要调哪个系统调用,_exit的系统调用号是1。ebx的值是传给_exit的参数,表示退出状态。大多数系统调用完成之后会返回用户空间继续执行后面的指令,而_exit系统调用比较特殊,它会终止掉当前进程,而不是返回用户空间继续执行。

原创粉丝点击