linux 内核 程序(linux用什么软件写程序)

本篇文章给大家谈谈linux 内核 程序,以及linux用什么软件写程序对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

Linux内核程序入口地址

在Linux内核中,使用 vmlinux.lds.S文件(路径: arch/arm64/kernel/)布局内核映像中相关段(例:.text、.data)的位置。

在Linux内核编译时, vmlinux.lds.S文件最终会被构建成链接脚本 vmlinux.lds文件(路径: arch/arm64/kernel/)。

本文主要介绍Linux内核程序运行的起始位置 _text,在 vmlinux.lds.S文件中定义如下:

从上面可以看出: _text= KIMAGE_VADDR+ TEXT_OFFSET。

1、KIMAGE_VADDR定义

文件: arch/arm64/include/asm/memory.h,定义如下:

文件: include/linux/sizes.h,定义如下:

宏 KIMAGE_VADDR展开如下:

上面是按照无符号计算, KIMAGE_VADDR为: 0xFFFFFF8008000000。

2、TEXT_OFFSET定义

文件: arch/arm64/Makefile,定义如下:

通过计算, _text值为: 0xFFFFFF8008080000。

在Linux内核启动时,从 log信息中也可以找到对应的地址:

_text对应的是虚拟地址,在内核中可以直接通过访问该地址获取其保存的值,其对应 Image映像中的第一个字 0x14424000。

Image映像查看方法如下:

本文基于 RockPI 4A单板Linux 4.4内核。

如何编写一个简单的linux内核模块和设备驱动程序

Linux是Unix操作系统的一种变种,在Linux下编写驱动程序的原理和思想完全类似于其他的Unix系统,但它dos或window环境下的驱动程序有很大的区别。在Linux环境下设计驱动程序,思想简洁,操作方便,功能也很强大,但是支持函数少,只能依赖kernel中的函数,有些常用的操作要自己来编写,而且调试也不方便。

以下的一些文字主要来源于khg,johnsonm的Write linux device driver,Brennan's Guide to Inline Assembly,The Linux a-z,还有清华bbs上的有关device driver的一些资料。

一、Linux device driver的概念

系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作。设备驱动程序是内核的一部分,它完成以下的功能:

1、对设备初始化和释放。

2、把数据从内核传送到硬件和从硬件读取数据。

3、读取应用程序传送给设备文件的数据和回送应用程序请求的数据。

4、检测和处理设备出现的错误。

在Linux操作系统下有三类主要的设备文件类型,一是字符设备,二是块设备,三是网络设备。字符设备和块设备的主要区别是:在对字符设备发出读/写请求时,实际的硬件I/O一般就紧接着发生了,块设备则不然,它利用一块系统内存作缓冲区,当用户进程对设备请求能满足用户的要求,就返回请求的数据,如果不能,就调用请求函数来进行实际的I/O操作。块设备是主要针对磁盘等慢速设备设计的,以免耗费过多的CPU时间来等待。

已经提到,用户进程是通过设备文件来与实际的硬件打交道。每个设备文件都都有其文件属性(c/b),表示是字符设备还是块设备?另外每个文件都有两个设备号,第一个是主设备号,标识驱动程序,第二个是从设备号,标识使用同一个设备驱动程序的不同的硬件设备,比如有两个软盘,就可以用从设备号来区分他们。设备文件的的主设备号必须与设备驱动程序在登记时申请的主设备号一致,否则用户进程将无法访问到驱动程序。

最后必须提到的是,在用户进程调用驱动程序时,系统进入核心态,这时不再是抢先式调度。也就是说,系统必须在你的驱动程序的子函数返回后才能进行其他的工作。如果你的驱动程序陷入死循环,不幸的是你只有重新启动机器了,然后就是漫长的fsck。

读/写时,它首先察看缓冲区的内容,如果缓冲区的数据未被处理,则先处理其中的内容。

如何编写Linux操作系统下的设备驱动程序

二、实例剖析

我们来写一个最简单的字符设备驱动程序。虽然它什么也不做,但是通过它可以了解Linux的设备驱动程序的工作原理。把下面的C代码输入机器,你就会获得一个真正的设备驱动程序。

#define __NO_VERSION__

#include<linux/modules.h>

#include<linux/version.h>

char kernel_version []= UTS_RELEASE;

这一段定义了一些版本信息,虽然用处不是很大,但也必不可少。Johnsonm说所有的驱动程序的开头都要包含<linux/config.h>,一般来讲最好使用。

由于用户进程是通过设备文件同硬件打交道,对设备文件的操作方式不外乎就是一些系统调用,如 open,read,write,close…,注意,不是fopen, fread,但是如何把系统调用和驱动程序关联起来呢?这需要了解一个非常关键的数据结构:

struct file_operations

{

int(*seek)(struct inode*,struct file*, off_t,int);

int(*read)(struct inode*,struct file*, char,int);

int(*write)(struct inode*,struct file*, off_t,int);

int(*readdir)(struct inode*,struct file*, struct dirent*,int);

int(*select)(struct inode*,struct file*, int,select_table*);

int(*ioctl)(struct inode*,struct file*, unsined int,unsigned long);

int(*mmap)(struct inode*,struct file*, struct vm_area_struct*);

int(*open)(struct inode*,struct file*);

int(*release)(struct inode*,struct file*);

int(*fsync)(struct inode*,struct file*);

int(*fasync)(struct inode*,struct file*,int);

int(*check_media_change)(struct inode*,struct file*);

int(*revalidate)(dev_t dev);

}

这个结构的每一个成员的名字都对应着一个系统调用。用户进程利用系统调用在对设备文件进行诸如read/write操作时,系统调用通过设备文件的主设备号找到相应的设备驱动程序,然后读取这个数据结构相应的函数指针,接着把控制权交给该函数。这是linux的设备驱动程序工作的基本原理。既然是这样,则编写设备驱动程序的主要工作就是编写子函数,并填充file_operations的各个域。

下面就开始写子程序。

#include<linux/types.h>

#include<linux/fs.h>

#include<linux/mm.h>

#include<linux/config.h>

#include<linux/errno.h>

#include<asm/segment.h>

unsigned int test_major= 0;

static int read_test(struct inode*node,struct file*file,char*buf,int count)

{

int left;

if(verify_area(VERIFY_WRITE,buf,count)==-EFAULT)

return-EFAULT;

for(left= count; left> 0; left--)

{

__put_user(1,buf,1);

buf++;

}

return count;

}

这个函数是为read调用准备的。当调用read时,read_test()被调用,它把用户的缓冲区全部写1。buf是read调用的一个参数。它是用户进程空间的一个地址。但是在read_test被调用时,系统进入核心态。所以不能使用buf这个地址,必须用__put_user(),这是kernel提供的一个函数,用于向用户传送数据。另外还有很多类似功能的函数。请参考robert著的《Linux内核设计与实现》(第二版)。然而,在向用户空间拷贝数据之前,必须验证buf是否可用。这就用到函数verify_area。

static int write_tibet(struct inode*inode,struct file*file,const char*buf,int count)

{

return count;

}

static int open_tibet(struct inode*inode,struct file*file)

{

MOD_INC_USE_COUNT;

return 0;

}

static void release_tibet(struct inode*inode,struct file*file)

{

MOD_DEC_USE_COUNT;

}

这几个函数都是空操作。实际调用发生时什么也不做,他们仅仅为下面的结构提供函数指针。

struct file_operations test_fops={

NULL,

read_test,

write_test,

NULL,/* test_readdir*/

NULL,

NULL,/* test_ioctl*/

NULL,/* test_mmap*/

open_test,

release_test,

NULL,/* test_fsync*/

NULL,/* test_fasync*/

/* nothing more, fill with NULLs*/

};

这样,设备驱动程序的主体可以说是写好了。现在要把驱动程序嵌入内核。驱动程序可以按照两种方式编译。一种是编译进kernel,另一种是编译成模块(modules),如果编译进内核的话,会增加内核的大小,还要改动内核的源文件,而且不能动态的卸载,不利于调试,所以推荐使用模块方式。

int init_module(void)

{

int result;

result= register_chrdev(0,"test",&test_fops);

if(result< 0){

printk(KERN_INFO"test: can't get major number\n");

return result;

}

if(test_major== 0) test_major= result;/* dynamic*/

return 0;

}

在用insmod命令将编译好的模块调入内存时,init_module函数被调用。在这里,init_module只做了一件事,就是向系统的字符设备表登记了一个字符设备。register_chrdev需要三个参数,参数一是希望获得的设备号,如果是零的话,系统将选择一个没有被占用的设备号返回。参数二是设备文件名,参数三用来登记驱动程序实际执行操作的函数的指针。

如果登记成功,返回设备的主设备号,不成功,返回一个负值。

void cleanup_module(void)

{

unregister_chrdev(test_major,"test");

}

在用rmmod卸载模块时,cleanup_module函数被调用,它释放字符设备test在系统字符设备表中占有的表项。

一个极其简单的字符设备可以说写好了,文件名就叫test.c吧。

下面编译:

$ gcc-O2-DMODULE-D__KERNEL__-c test.c

得到文件test.o就是一个设备驱动程序。

如果设备驱动程序有多个文件,把每个文件按上面的命令行编译,然后

ld-r file1.o file2.o-o modulename。

驱动程序已经编译好了,现在把它安装到系统中去。

$ insmod–f test.o

如果安装成功,在/proc/devices文件中就可以看到设备test,并可以看到它的主设备号。要卸载的话,运行:

$ rmmod test

下一步要创建设备文件。

mknod/dev/test c major minor

c是指字符设备,major是主设备号,就是在/proc/devices里看到的。

用shell命令

$ cat/proc/devices

就可以获得主设备号,可以把上面的命令行加入你的shell script中去。

minor是从设备号,设置成0就可以了。

我们现在可以通过设备文件来访问我们的驱动程序。写一个小小的测试程序。

#include<stdio.h>

#include<sys/types.h>

#include<sys/stat.h>

#include<fcntl.h>

main()

{

int testdev;

int i;

char buf[10];

testdev= open("/dev/test",O_RDWR);

if( testdev==-1)

{

printf("Cann't open file\n");

exit(0);

}

read(testdev,buf,10);

for(i= 0; i< 10;i++)

printf("%d\n",buf[i]);

close(testdev);

}

编译运行,看看是不是打印出全1?

以上只是一个简单的演示。真正实用的驱动程序要复杂的多,要处理如中断,dma,I/O port等问题。这些才是真正的难点。请看下节,实际情况的处理。

如何编写Linux操作系统下的设备驱动程序

三、设备驱动程序中的一些具体问题

1。 I/O Port。

和硬件打交道离不开I/O Port,老的isa设备经常是占用实际的I/O端口,在linux下,操作系统没有对I/O口屏蔽,也就是说,任何驱动程序都可对任意的I/O口操作,这样就很容易引起混乱。每个驱动程序应该自己避免误用端口。

有两个重要的kernel函数可以保证驱动程序做到这一点。

1)check_region(int io_port, int off_set)

这个函数察看系统的I/O表,看是否有别的驱动程序占用某一段I/O口。

参数1:I/O端口的基地址,

参数2:I/O端口占用的范围。

返回值:0没有占用,非0,已经被占用。

2)request_region(int io_port, int off_set,char*devname)

如果这段I/O端口没有被占用,在我们的驱动程序中就可以使用它。在使用之前,必须向系统登记,以防止被其他程序占用。登记后,在/proc/ioports文件中可以看到你登记的I/O口。

参数1:io端口的基地址。

参数2:io端口占用的范围。

参数3:使用这段io地址的设备名。

在对I/O口登记后,就可以放心地用inb(), outb()之类的函来访问了。

在一些pci设备中,I/O端口被映射到一段内存中去,要访问这些端口就相当于访问一段内存。经常性的,我们要获得一块内存的物理地址。

2。内存操作

在设备驱动程序中动态开辟内存,不是用malloc,而是kmalloc,或者用get_free_pages直接申请页。释放内存用的是kfree,或free_pages。请注意,kmalloc等函数返回的是物理地址!

注意,kmalloc最大只能开辟128k-16,16个字节是被页描述符结构占用了。

内存映射的I/O口,寄存器或者是硬件设备的ram(如显存)一般占用F0000000以上的地址空间。在驱动程序中不能直接访问,要通过kernel函数vremap获得重新映射以后的地址。

另外,很多硬件需要一块比较大的连续内存用作dma传送。这块程序需要一直驻留在内存,不能被交换到文件中去。但是kmalloc最多只能开辟128k的内存。

这可以通过牺牲一些系统内存的方法来解决。

3。中断处理

同处理I/O端口一样,要使用一个中断,必须先向系统登记。

int request_irq(unsigned int irq,void(*handle)(int,void*,struct pt_regs*),

unsigned int long flags, const char*device);

irq:是要申请的中断。

handle:中断处理函数指针。

flags:SA_INTERRUPT请求一个快速中断,0正常中断。

device:设备名。

如果登记成功,返回0,这时在/proc/interrupts文件中可以看你请求的中断。

4。一些常见的问题。

对硬件操作,有时时序很重要(关于时序的具体问题就要参考具体的设备芯片手册啦!比如网卡芯片RTL8139)。但是如果用C语言写一些低级的硬件操作的话,gcc往往会对你的程序进行优化,这样时序会发生错误。如果用汇编写呢,gcc同样会对汇编代码进行优化,除非用volatile关键字修饰。最保险的办法是禁止优化。这当然只能对一部分你自己编写的代码。如果对所有的代码都不优化,你会发现驱动程序根本无法装载。这是因为在编译驱动程序时要用到gcc的一些扩展特性,而这些扩展特性必须在加了优化选项之后才能体现出来。

写在后面:学习Linux确实不是一件容易的事情,因为要付出很多精力,也必须具备很好的C语言基础;但是,学习Linux也是一件非常有趣的事情,它里面包含了许多高手的智慧和“幽默”,这些都需要自己亲自动手才能体会到,O(∩_∩)O~哈哈!

如何编译linux内核

内核,是一个操作系统的核心。它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。Linux作为一个自由软件,

在广大爱好者的支持下,内核版本不断更新。新的内核修订了旧内核的bug,并增加了许多新的特性。如果用户想要使用这些新特性,或想根据自己的系统度身定

制一个更高效,更稳定的内核,就需要重新编译内核。本文将以RedHat Linux 6.0(kernel

2.2.5)为操作系统平台,介绍在Linux上进行内核编译的方法。

一、下载新内核的源代码

目前,在Internet上提供Linux源代码的站点有很多,读者可以选择一个速度较快的站点下载。笔者是从站点www.kernelnotes.org上下载了Linux的最新开发版内核2.3.14的源代码,全部代码被压缩到一个名叫Linux-2.3.14.tar.gz的文件中。

二、释放内核源代码

由于源代码放在一个压缩文件中,因此在配置内核之前,要先将源代码释放到指定的目录下。首先以root帐号登录,然后进入/usr/src子目录。如果用户在安装Linux时,安装了内核的源代码,则会发现一个linux-2.2.5的子目录。该目录下存放着内核2.2.5的源代码。此外,还会发现一个指向该目录的链接linux。删除该连接,然后将新内核的源文件拷贝到/usr/src目录中。

(一)、用tar命令释放内核源代码

# cd/usr/src

# tar zxvf Linux-2.3.14.tar.gz

文件释放成功后,在/usr/src目录下会生成一个linux子目录。其中包含了内核2.3.14的全部源代码。

(二)、将/usr/include/asm、/usr/inlude/linux、/usr/include/scsi链接到/usr/src/linux/include目录下的对应目录中。

# cd/usr/include

# rm-Rf asm linux

# ln-s/usr/src/linux/include/asm-i386 asm

# ln-s/usr/src/linux/include/linux linux

# ln-s/usr/src/linux/include/scsi scsi

(三)、删除源代码目录中残留的.o文件和其它从属文件。

# cd/usr/src/linux

# make mrproper

三、配置内核

(一)、启动内核配置程序。

# cd/usr/src/linux

# make config

除了上面的命令,用户还可以使用make menuconfig命令启动一个菜单模式的配置界面。如果用户安装了X window系统,还可以执行make xconfig命令启动X window下的内核配置程序。

(二)、配置内核

Linux的

内核配置程序提供了一系列配置选项。对于每一个配置选项,用户可以回答"y"、"m"或"n"。其中"y"表示将相应特性的支持或设备驱动程序编译进内

核;"m"表示将相应特性的支持或设备驱动程序编译成可加载模块,在需要时,可由系统或用户自行加入到内核中去;"n"表示内核不提供相应特性或驱动程序

的支持。由于内核的配置选项非常多,本文只介绍一些比较重要的选项。

1、Code maturity level options(代码成熟度选项)

Prompt for development and/or incomplete code/drivers

(CONFIG_EXPERIMENTAL) [N/y/?]

如果用户想要使用还处于测试阶段的代码或驱动,可以选择“y”。如果想编译出一个稳定的内核,则要选择“n”。

1、 Processor type and features(处理器类型和特色)

(1)、Processor family(386, 486/Cx486, 586/K5/5x86/6x86, Pentium/K6/TSC, PPro/6x86MX) [PPro/6x86MX]选择处理器类型,缺省为Ppro/6x86MX。

(2)、Maximum Physical Memory(1GB, 2GB) [1GB]内核支持的最大内存数,缺省为1G。

(3)、Math emulation(CONFIG_MATH_EMULATION) [N/y/?]协处理器仿真,缺省为不仿真。

(4)、MTRR(Memory Type Range Register) support(CONFIG_MTRR) [N/y/?]

选择该选项,系统将生成/proc/mtrr文件对MTRR进行管理,供X server使用。

(5)、Symmetric multi-processing support(CONFIG_SMP) [Y/n/?]选择“y”,内核将支持对称多处理器。

2、 Loadable module support(可加载模块支持)

(1)、Enable loadable module support(CONFIG_MODULES) [Y/n/?]选择“y”,内核将支持加载模块。

(2)、Kernel module loader(CONFIG_KMOD) [N/y/?]选择“y”,内核将自动加载那些可加载模块,否则需要用户手工加载。

3、 General setup(一般设置)

(1)、Networking support(CONFIG_NET) [Y/n/?]该选项设置是否在内核中提供网络支持。

(2)、PCI support(CONFIG_PCI) [Y/n/?]该选项设置是否在内核中提供PCI支持。

(3)、PCI access mode(BIOS, Direct, Any) [Any]该选项设置Linux探测PCI设备的方式。选择“BIOS”,Linux将使用BIOS;选择“Direct”,Linux将不通过BIOS;选择“Any”,Linux将直接探测PCI设备,如果失败,再使用BIOS。

(4)Parallel port support(CONFIG_PARPORT) [N/y/m/?]选择“y”,内核将支持平行口。

4、 Plug and Play configuration(即插即用设备支持)

(1)、Plug and Play support(CONFIG_PNP) [Y/m/n/?]选择“y”,内核将自动配置即插即用设备。

(2)、ISA Plug and Play support(CONFIG_ISAPNP) [Y/m/n/?]选择“y”,内核将自动配置基于ISA总线的即插即用设备。

5、 Block devices(块设备)

(1)、Normal PC floppy disk support(CONFIG_BLK_DEV_FD) [Y/m/n/?]选择“y”,内核将提供对软盘的支持。

(2)、Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support(CONFIG_BLK_DEV_IDE) [Y/m/n/?]选择“y”,内核将提供对增强IDE硬盘、CDROM和磁带机的支持。

6、 Networking options(网络选项)

(1)、Packet socket(CONFIG_PACKET) [Y/m/n/?]选择“y”,一些应用程序将使用Packet协议直接同网络设备通讯,而不通过内核中的其它中介协议。

(2)、Network firewalls(CONFIG_FIREWALL) [N/y/?]选择“y”,内核将支持防火墙。

(3)、TCP/IP networking(CONFIG_INET) [Y/n/?]选择“y”,内核将支持TCP/IP协议。

(4)The IPX protocol(CONFIG_IPX) [N/y/m/?]选择“y”,内核将支持IPX协议。

(5)、Appletalk DDP(CONFIG_ATALK) [N/y/m/?]选择“y”,内核将支持Appletalk DDP协议。

8、SCSI support(SCSI支持)

如果用户要使用SCSI设备,可配置相应选项。

9、Network device support(网络设备支持)

Network device support(CONFIG_NETDEVICES) [Y/n/?]选择“y”,内核将提供对网络驱动程序的支持。

10、Ethernet(10 or 100Mbit)(10M或100M以太网)

在该项设置中,系统提供了许多网卡驱动程序,用户只要选择自己的网卡驱动就可以了。此外,用户还可以根据需要,在内核中加入对FDDI、PPP、SLIP和无线LAN(Wireless LAN)的支持。

11、Character devices(字符设备)

(1)、Virtual terminal(CONFIG_VT) [Y/n/?]选择“y”,内核将支持虚拟终端。

(2)、Support for console on virtual terminal(CONFIG_VT_CONSOLE) [Y/n/?]

选择“y”,内核可将一个虚拟终端用作系统控制台。

(3)、Standard/generic(dumb) serial support(CONFIG_SERIAL) [Y/m/n/?]

选择“y”,内核将支持串行口。

(4)、Support for console on serial port(CONFIG_SERIAL_CONSOLE) [N/y/?]

选择“y”,内核可将一个串行口用作系统控制台。

12、Mice(鼠标)

PS/2 mouse(aka"auxiliary device") support(CONFIG_PSMOUSE) [Y/n/?]如果用户使用的是PS/2鼠标,则该选项应该选择“y”。

13、Filesystems(文件系统)

(1)、Quota support(CONFIG_QUOTA) [N/y/?]选择“y”,内核将支持磁盘限额。

(2)、Kernel automounter support(CONFIG_AUTOFS_FS) [Y/m/n/?]选择“y”,内核将提供对automounter的支持,使系统在启动时自动 mount远程文件系统。

(3)、DOS FAT fs support(CONFIG_FAT_FS) [N/y/m/?]选择“y”,内核将支持DOS FAT文件系统。

(4)、ISO 9660 CDROM filesystem support(CONFIG_ISO9660_FS) [Y/m/n/?]

选择“y”,内核将支持ISO 9660 CDROM文件系统。

(5)、NTFS filesystem support(read only)(CONFIG_NTFS_FS) [N/y/m/?]

选择“y”,用户就可以以只读方式访问NTFS文件系统。

(6)、/proc filesystem support(CONFIG_PROC_FS) [Y/n/?]/proc是存放Linux系统运行状态的虚拟文件系统,该项必须选择“y”。

(7)、Second extended fs support(CONFIG_EXT2_FS) [Y/m/n/?] EXT2是Linux的标准文件系统,该项也必须选择“y”。

14、Network File Systems(网络文件系统)

(1)、NFS filesystem support(CONFIG_NFS_FS) [Y/m/n/?]选择“y”,内核将支持NFS文件系统。

(2)、SMB filesystem support(to mount WfW shares etc.)(CONFIG_SMB_FS)

选择“y”,内核将支持SMB文件系统。

(3)、NCP filesystem support(to mount NetWare volumes)(CONFIG_NCP_FS)

选择“y”,内核将支持NCP文件系统。

15、Partition Types(分区类型)

该选项支持一些不太常用的分区类型,用户如果需要,在相应的选项上选择“y”即可。

16、Console drivers(控制台驱动)

VGA text console(CONFIG_VGA_CONSOLE) [Y/n/?]选择“y”,用户就可以在标准的VGA显示方式下使用Linux了。

17、Sound(声音)

Sound card support(CONFIG_SOUND) [N/y/m/?]选择“y”,内核就可提供对声卡的支持。

18、Kernel hacking(内核监视)

Magic SysRq key(CONFIG_MAGIC_SYSRQ) [N/y/?]选择“y”,用户就可以对系统进行部分控制。一般情况下选择“n”。

四、编译内核

(一)、建立编译时所需的从属文件

# cd/usr/src/linux

# make dep

(二)、清除内核编译的目标文件

# make clean

(三)、编译内核

# make zImage

内核编译成功后,会在/usr/src/linux/arch/i386/boot目录中生成一个新内核的映像文件zImage。如果编译的内核很大的话,系统会提示你使用make bzImage命令来编译。这时,编译程序就会生成一个名叫bzImage的内核映像文件。

(四)、编译可加载模块

如果用户在配置内核时设置了可加载模块,则需要对这些模块进行编译,以便将来使用insmod命令进行加载。

# make modules

# make modelus_install

编译成功后,系统会在/lib/modules目录下生成一个2.3.14子目录,里面存放着新内核的所有可加载模块。

五、启动新内核

(一)、将新内核和System.map文件拷贝到/boot目录下

# cp/usr/src/linux/arch/i386/boot/bzImage/boot/vmlinuz-2.3.14

# cp/usr/src/linux/System.map/boot/System.map-2.3.14

# cd/boot

# rm-f System.map

# ln-s System.map-2.3.14 System.map

(二)、配置/etc/lilo.conf文件。在该文件中加入下面几行:

default=linux-2.3.14

image=/boot/vmlinuz-2.3.14

label=linux-2.3.14

root=/dev/hda1

read-only

(三)、使新配置生效

#/sbin/lilo

(四)、重新启动系统

#/sbin/reboot

新内核如果不能正常启动,用户可以在LILO:提示符下启动旧内核。然后查出故障原因,重新编译新内核即可。

了解更多开源相关,去LUPA社区看看吧。

阅读剩余
THE END