嵌入式里面uboot、kernel、文件系统的区别与关系_嵌入式空白的博客-CSDN博客_uboot和kernel
总览:
在linux系统软件架构可以分为4个层次(从低到高分别为):
1.引导加载程序
引导加载程序(Bootloader)是固化在硬件Flash中的一段引导代码,用于完成硬件的一些基本配置,引导内核启动。
同时,Bootloader会在自身与内核分区之间存放一些可设置的参数(Boot parameters),比如IP地址,串口波特率,要传递给内核的命令行参数。
2.系统内核
系统内核(Kernel)是整个操作系统的最底层,它负责整个硬件的驱动,以及提供各种系统所需的核心功能,包括防火墙机制、是否支持LVM或Quota等文件系统等等,如果内核不认识某个最新的硬件,那么硬件也就无法被驱动,你也就无法使用该硬件。计算机真正工作的东西其实是硬件,例如数值运算要使用到CPU、数据储存要使用到硬盘、图形显示会用到显示适配器、音乐发声要有音效芯片、连接Internet 可能需要网络卡等等。内核就是控制这些芯片如何工作。
3.文件系统
Linux文件系统(File System)中的文件是数据的集合,文件系统不仅包含着文件中的数据而且还有文件系统的结构,所有Linux 用户和程序看到的文件、目录、软连接及文件保护信息等都存储在其中。
文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。
4.用户程序
用户应用程序(Application)为了完成某项或某几项特定任务而被开发运行于操作系统之上的计算机程序。
Linux启动过程
正常启动过程中,Bootloader首先运行,然后将内核复制到内存中(或者在固态存储设备上直接运行,但是效率较低),并在内存某个固定的地址(包括地址与参数的结构)设置好要传递给内核的参数,最后运行内核。内核启动后,挂载(mount)根文件系统(Root filesystem),启动文件系统中的应用程序。
上电 ——> Bootloader —[传递参数]—> 加载内核 ——> 内核挂载根文件系统 ——>执行应用程序
如何理解Bootloader与Kernel
操作系统内核本身就是一个裸机程序,和我们学的uboot和其他裸机程序没有本质的区别;事实上,不少U-Boot源码就是根据相应的Linux内核源程序进行简化而形成的,尤其是一些设备的驱动程序。如果我们去琢磨U-Boot源码的注释,便会轻易的发现这一情况。
区别就是操作系统运行起来后可以分为应用层(用户态)和内核层(内核态),分层后,两层的权限不同(实现的原理是基于CPU的模式切换),内存访问和设备操作的管理上更加精细(内核可以随便方位各种硬件,而应用程序只能被限制的访问硬件和内存地址)。
以ARM处理器为例,除用户模式外,其余6种工作模式都属于特权模式:
用户模式(USR):正常程序执行模式,不能直接切换到其他模式
系统模式(SYS):运行操作系统的特权任务,与用户模式类似,但具有可以直接切换到其他模式等特权
快中断模式(FIQ):支持高速数据传输及通道处理,FIQ异常响应时进入此模式
中断模式(IRQ):用于通用中断处理,IRQ异常响应时进入此模式
管理模式(SVC):操作系统保护模式,系统复位和软件中断响应时进入此模式(由系统调用执行软中断SWI命令触发)
中止模式(ABT):用于支持虚拟内存和/或存储器保护,在ARM7TDMI没有大用处
未定义模式(UND):支持硬件协处理器的软件仿真,未定义指令异常响应时进入此模式
Linux内核态是从ARM的SVC即管理模式下启动的,但在某些情况下、如:硬件中断、程序异常(被动)等情况下进入ARM的其他特权模式,这时仍然可以进入内核态(因为就是可以操作内核了);同样,Linux用户态是从ARM用户模式启动的,但当进入ARM系统模式时、仍然可以操作Linux用户态程序(进入用户态,如init进程的启动过程)。
即:Linux内核从ARM的SVC模式下启动,但内核态不仅仅指ARM的SVC模式(还包括可以访问内核空间的所有ARM模式);Linux用户程序从ARM的用户模式启动,但用户态不仅仅指ARM的用户模式。
直观来看:uboot的镜像是u-boot.bin,Linux系统的镜像是zImage,这两个东西其实都是裸机程序镜像。从系统启动的角度来讲,内核和uboot都是裸机程序。
文件系统
概念
Linux文件系统中的文件是数据的集合,文件系统不仅包含着文件中的数据而且还有文件系统的结构,所有Linux 用户和程序看到的文件、目录、软连接及文件保护信息等都存储在其中。这种机制有利于用户和操作系统的交互。
尽管内核是 Linux 的核心,但文件却是用户与操作系统交互所采用的主要工具。这对 Linux 来说尤其如此,这是因为在 UNIX 传统中,它使用文件 I/O 机制管理硬件设备和数据文件
虚拟文件系统、根文件系统和文件系统
VFS:
Linux支持多种文件系统类型,因为它将底层与应用层分隔开;而提供统一的接口支持应用层对于不同实现的文件系统的访问,这个统一的接口称为虚拟文件系统VFS。
kernel中以VFS去支持各种文件系统,如yaffs,ext3,cramfs等等。yaffs/yaffs2是专为嵌入式系统使用NAND型闪存而设计的一种日志型文件系统。在内核中以VFS来屏蔽各种文件系统的接口不同,以VFS向kernel提供一个统一的接口。
根文件系统:
文件系统指文件存在的物理空间,linux系统中每个分区都是一个文件系统,都有自己的目录层次结构。以“/”为顶级目录的文件系统称为根文件系统。
Linux启动时,第一个必须挂载的是根文件系统;若系统不能从指定设备上挂载根文件系统,则系统会出错而退出启动。系统正常挂载根文件系统之后可以自动或手动挂载其他的文件系统(根文件系统是其他文件的最终挂载点)。因此,一个系统中可以同时存在不同的文件系统。
也就是说:
根文件系统可以是任何kernel支持的文件系统类型(ext4,yaffs等)。
但它必须包含linux内核启动时所必需的文件(根文件系统必需存在的目录 /dev /bin /sbin 等等),不然系统启动会失败。
根文件系统是之所以有个根(/)字,是因为它是linux系统启动时挂载(mount,所谓挂载:就是在内存中创建一个虚拟的文件对应具体的存储空间分区的过程,挂载时不会保存信息,下次启动时得重新挂载)的第一个文件系统,启动完成后可以自动(配置etc/fstab)或者手动的方式将其它文件系统(分区)挂载到根文件系统中。
其他文件系统:
不同的文件系统类型有不同的特点,因而根据存储设备的硬件特性、系统需求等有不同的应用场合。在嵌入式Linux应用中,主要的存储设备为 RAM(DRAM, SDRAM)和ROM(常采用FLASH存储器),常用的基于存储设备的文件系统类型包括:jffs2, yaffs, cramfs, romfs, ramdisk,initramfs, ramfs/tmpfs,ubifs等。
uboot与根文件系统的关系
早期的uboot没有分区的概念,uboot只知道应该将什么数据烧写到存储介质的什么区间中。
(也就是说,对于uboot来看,只有起始地址结束地址等,A~B地址放内核,C~D地址放文件系统,即:规定哪个地址区间放内核或者文件系统等)
虽然此后,uboot中渐渐也有了MTD等管理分区部分的功能。尽管如此,不影响我们的学习理解。
总结:
cpu首先执行位于0地址的uboot,uboot启动以后初始化一些资源,告诉内核有关的参数并引导内核,内核通过事先添加对于某种文件系统类型的支持驱动(相当于一小段程序),读取uboot等boot loader在指定的区域烧写制作好的文件系统镜像,内核解析并挂载成根文件系统,并在此基础上,通过VFS再挂载不同的文件系统类型,完成启动以后,再去管理有关的资源(包括应用程序)
烧写uboot和kernel的步骤
uboot是用EOP工具通过串口烧写,速度较慢,适合烧写代码量小的bin文件。
烧写前需要安装:
1、USB转串口驱动,2、OpenJTAG软件
安装OpenJTAG是为了里面的oflash工具,可以在cmd黑框中调用。uboot可以被烧进nand flash,也可以被烧进nor flash,这在oflash的烧写界面可以配置。
烧写uboot步骤:
1、得到uboot源码和补丁文件
2、解压缩源码:tar xjf u-boot-1.1.6.tar.bz2
3、转移到uboot目录:cd u-boot-1.1.6
4、给uboot打补丁:patch -p1 < ../u-boot-1.1.6_jz2440.patch
(-p1的意思是忽略位于补丁文件开头的路径的第一项,也就是当前所在的文件夹u-boot-1.1.6,如下图)
5、配置uboot:make 100ask24x0_config
6、编译uboot:make
7、编译之后会得到一个uboot.bin文件,直接在windows环境下把这个bin文件通过oflash烧写进nor flash或者nand flash就行:oflash uboot.bin
linux内核如果用EOP烧写的话需要几个小时,所以选择通过USB烧写。
烧写前需要安装:
1、USB烧写软件dnw_100ask.exe,2、DNW的驱动zadig-2.3.exe(安装驱动时要先把开发板上电,启动uboot并停留在菜单界面,这时候打开zadig-2.3.exe并选择libusb-win32 (v1.2.6.0))
烧写内核步骤:
1、得到uboot源码和补丁文件
2、解压缩源码:tar xjf linux-2.6.22.6.tar.bz2
3、转移到内核目录:cdlinux-2.6.22.6
4、给内核打补丁:linux-2.6.22.6$ patch -p1 < ../linux-2.6.22.6_jz2440_v1.patch
5、配置内核:
配置内核有3种方式:
1、直接执行make menuconfig,执行之后会跳出一个菜单,里面有很多驱动的选项,可以选Y:编译进内核,选N:不编译进内核,选M:作为一个模块编译进内核,但这种方式要配置的项太多,不可取
2、使用默认配置,在上面修改:
在内核目录下查找文件名带有“defconfig”的文件:find -name "*defconfig*"。会发现各个架构下的处理器都有后缀为_defconfig的配置文件,可以从配置文件所在的路径名字上看出,比如./arch/mips/configs/tb0219_defconfig是mips架构的配置文件,./arch/arm/configs/s3c2410_defconfig是arm的,./arch/powerpc/configs/mpc8568mds_defconfig是ppc的,./arch/ppc/configs/katana_defconfig也是ppc的,这里用两个路径只是因为arch/ppc是老版本linux内核的架构配置代构代码,另一个是新版本的linux内核架构代码。
找到s3c2410_defconfig配置文件(最贴近s3c2440),执行make s3c2410_defconfig,把配置写入.config文件;再执行make menuconfig,这条指令会读取之前生成的.config文件,形成一个经过默认配置的菜单,之后只要在默认配置的基础上修改自己想要的配置就行了。
3、使用厂家给的配置文件
把config_厂家的文件直接复制成.config:cp config_ok .config,再执行make menuconfig,这种方法和第二种类似。
6、编译内核:make uImage
uImage是再真正的内核之前加一个头部,uboot需要用到这个头部,编译完的uIamge在linux-2.6.22.6\arch\arm\boot目录下。
7、开发板上电,按任意键使uboot停留在菜单界面,选择k烧写内核,等待usb传输数据
8、在windows环境下打开dnw_100ask.exe,在USB_PORT下找到transmit选项,传输uImage就行了
uboot及linux内核,uboot如何启动内核_裴崽崽的博客-CSDN博客
导读
ARM设备如何通过uboot启动Linux内核
uboot和内核就是一个裸机程序
(1)uboot的本质就是就是一个复杂点的裸机程序,和ARM部分写的裸机程序没有本质区别。
(2)内核本身也是一个裸机程序,和uboot、裸机程序无本质区别。要说不同的地方,那就是内核运行起来后,在软件上分为内核层和应用层,分层后两层的权限不同,内存访问和设备操作的管理上更加精细(内核可以随便访问各种硬件,而应用程序只能被限制地访问硬件和内存地址)。
(3)直观上来看,uboot的镜像是u-boot.bin,linux系统的镜像是zImage,这两个东西其实都是两个裸机程序镜像。从系统的启动角度来讲,内核其实就是一个大的复杂点的裸机程序。
部署在SD卡特定分区内
(1)一个完整的软件+硬件的嵌入式系统,静止时(未上电时)bootloader、kernel、rootfs等必须的软件都以镜像的形式存储在启动介质中(x210中是iNand/SD卡),运行时都是在DDR内存中运行的,与存储介质无关。上面两个状态都是稳定状态,第三个状态是动态过程,即从静止态到运行态的过程,也就是启动过程。
(2)动态启动过程就是一个从SD卡逐步搬移到DDR内存,并且运行启动代码进行相关的硬件初始化和软件架构的建立,最终达到运行时稳定状态。
(3)静止时,u-boot.bin、kernel、rootfs都在SD卡中,它们不可能随意存在SD卡的任意位置,因此需要对SD卡进行一个分区,然后将各种镜像存在不同的分区,这样在启动过程中uboot、内核就知道到哪里去找。(uboot和kernel中的分区表必须一致,同时和SD卡的实际使用分区也要一致)
运行时必须先加载到DDR中链接地址处
(1)uboot在第一阶段中进行重定位时将第二阶段(整个uboot)加载到DDR的0xC3E00000地址处,这个地址就是uboot的链接地址。
(2)内核也有类似要求,uboot启动内核时,将内核从SD卡读取放到DDR中(其实就是个重定位的过程),不能随意放置,必须放在内核的链接地址处,否则启动不起来。例如在x210中使用的内核链接地址是0x30008000。
内核启动需要必要的参数
(1)uboot是无条件启动的,从零开始启动的。
(2)内核是不能开机自动完全从零开始启动的,内核启动需要别人帮忙。uboot需帮助内核实现重定位(从SD卡到DDR),uboot还要给内核提供启动参数。
Uboot + Kernel_arm-cortex_a9-eabi-4.7-eglibc-2.18.tar.gz_Jasonakeke的博客-CSDN博客
《转》u-boot移植烧写步骤、u-boot命令和kernel烧写步骤_Wi-Fi研习者的博客-CSDN博客
u-boot移植烧写步骤、u-boot命令和kernel烧写步骤
移植烧写步骤
1. 解压u-boot源文件
2. 从u-boot/include/configs里找相近的配置,复制成自已的名字
3. 改makefile文件增加目标,比如 mini2440_config: arm<体系> <SMDK2410板型号> <文件夹名字> <公司/开发者,可以为NULL> 核心s3c24x0
4. 把相应文件改好
例如: 硬件配置在 u-boot/include/configs/mini2440.h <包括 启动参数,命令指示符等>
相关指令的 u-boot/common/cmd_console.c
相关驱动的文件,都放到相应目录里去
5. make distclean 清除垃圾(把上一级的配置全部删除)
6. 启动你改好的配置 make mini2440_config
7. 交叉编译 make CROSS_COMPILE=arm-linux-
8. 在uboot/下生成了uboot.bin
9. 传输数据到内存
9.1 烧写机<工厂级,Nand中的bootload已被破坏>
9.2 USB+驱动 输入<Nand启动,并且bootloader完好>指令usbslave ,然后给计算机制定文件
<Nand中的bootloader已被破坏,就用开发板Nor启动>
<如果Nand中的bootloader已被破坏, 又不是开发板, 则成砖头机>
9.3 串口 输入 <Nand启动,并且bootloader完好> 指令loadx ,然后给计算机制定文件
9.4 网络 输入 <Nand启动,并且bootloader完好> 指令tftp <遇先要在u-boot环境变量里设定好服务器和本机的IP地址,MAC地址,网关,MASK>
(注:数据传输指令后可以跟数据输入的内存目标地址, 默认是bootloader的mini2440.h里CONFIG_SYS_LOAD_ADDR指定的值)
10. 烧写进Nand
10.1 先擦除nand erase offset<Nand基址(起始地址)> len<数据长度>
10.2 写入nand write.jffs2 addr<内存基址> offset<Nand基址> len<数据长度>
10.3 根文件系统rootfs定入要用yaffs文件系统写入
nand wrtie.yaffs addr offset len
u-boot命令
u-boot新版本下载地址,
ftp://ftp.denx.de/pub/u-boot
http://sourceforge.net/projects/U-Boot/
= 0.常用命令
- 内存操作-
md 是显示内存信息,默认是以32位显示md.l
md.b 以2位显示
md.w 以4位
mm 修改内存的值 也可以.b .w .l
空格+回车 结束修改
mw内存填充
数据复制cp
cp[.b .w .l]src_add dest_add len
例: cp.b 31000000 50000 D0000 从31000000复制到50000 长度D0000
- Flash操作 -
查看FLASH型号的扇区
flinfo
第一行显示Bank所在的号码,容量bit
大小Size和扇区Sectors大小
按扇区块写保护FLASH,一定要按整扇区块,如果不是整扇区块,则失败
protect off all 关闭所有扇区写保护
protect on all 打开所有
protect off start end <start和end为起始地址和结束地址>
protect on start end
例: protect on 0 1FFFF
擦除FLASH, Nor Flash无法写入1,所以需要用erase擦除来写入1
erase start end
例 erase 30000 1EFFFF
- Nand Flash命令-
nand info
nand erase
nand read[.jffs2] addr off size .jffs代表ECC方式不同
nand read.yaffs addr off size
nand write[.jffs2] addr off size .jffs代表ECC方式不同
nand write.yaffs addr off size
nand dump offset 打印offset开始的一个扇区的数据
- 设置环境变量 -
printenv 显示所有环境变量
setenv val item 添加/修改val变量,值为item
setenv val 把val的值清空了, 等效删除val
saveenv 把所有的env都保存至flash(关机后不会丢失)
bootdelay是开机延时的时间变量
从NAND启动参数
setenv bootargs noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0 <设置root的存储设备>
setenv bootcmd "nand read 0x30000000 0x60000 0x2300000; bootm 0x30000000" <设置kernel的起始地址>
设置YAFFS启动,引导参数:
setenv bootargs noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0
设置NFS启动,引导参数:
setenv bootargs console=ttySAC0 root=/dev/nfs nfsroot=192.168.1.201:/home/root/root_fs/fs_mini ip=192.168.1.227:192.168.1.201:192.168.1.201:255.255.255.0:sbc2440.arm9.net:eth0:off
- 启动命令 -
go 执行内存中的二进制代码<不带头的程序,比如 zImage>
go addr[arg...]
bootm 执行内存中的二进制代码<有固定格式的头,比如系统,格式,压缩,等头信息等,如uImage>
bootm[addr[arg...]]
如果addr省略,则存放到配置文件中定义的宏CFG_LOAD_ADDR
nboot 执行NandFlash中的代码
nboot[[[addr]dev]offset]从dev偏移offset处的映像复制到内存的addr处,如果环境变量autostart的值是yes,就启动这个映像
如果addr省略,则存放到配置文件中定义的宏CFG_LOAD_ADDR
如果dev省略,则取环境变量bootdevice的值
如果offset省略,默认为0
bootp 从网络中启动
= 2. 下载文件到开发板
下载固件有3种模式(串口,USB,网络)
- USB下载 - <开发板常用/手机常用, 需要USB驱动>
usbslave
nand erase 0x100000 0x300000
起始地址 大小
nand write 0x30000000 0x100000 0x300000 <目标地址必须是设置kernel的起始地址>
源地址 目标地址 大小
usbslave 从USB下载 rootfs
nand erase 0x560000 0x305700
nand write.yaffs 0x30000000 0x560000 0x305700 0
<yaffs大小必须是528的倍数,所以0x305700必须要改大成是528的倍数>
- 串口下载 - <任何设备维修时用,万能,但速度慢,115.2Kbps>
在超级终端下
loadb
loady
loadz
loadx 0x32000000 loadb跟上地址
然后点发送文件
- 网络通过tftp来下载 - <网络设备专用, 速度快>
主机先 打开TFTP Server软件,将u-boot.bin拷贝至C:\Program Files\TftpdWin\
setenv ethaddr 12:34:56:78:xx:xx //开发板MAC地址
setenv ipaddr 192.168.0.x //本开发板IP地址
setenv serverip 192.168.0.x //服务器IP地址
下载指令tftp 0x32000000 uImage //下载uImage到内存0x3200000地址的地方3
= 3. 烧入FLASH
假设FLASH地址分段
bootloader 0x0 ~0x40000
parameter 0x40000 ~0x50000
kernel 0x50000 ~0x250000
(空)
rootfs 0x270000~
- 烧U-BOOT - nand命令后面的地址 有0x和没有,都认为是16进制
下载u-boot.bin至Nand Flash 地址0x0处
1)借助DNW
跳线从Nor Flash启动,进入SuperViVi菜单界面,输入“n”,借助DNW,通过USB下载刚编译生成的u-boot.bin;
2)更新自已
SMDK2440A>tftp 0x30000000 u-boot.bin // 通过tftp server下载u-boot.bin至开发板内存0x30000000 地址处
SMDK2440A>nand erase 0x0 0x40000 //首先擦除Nand Flash从0x0 开始,大小为0x40000 ,来存放u-boot.bin
SMDK2440A>nand write.jffs2 30000000 0 0x40000 //烧写u-boot.bin至0x0 开始的Nand Flash
- 烧kernel-
先从zImage转到uImage
mkimage -n 'linux-2.6.14' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000 -d zImage zImage.img
Image Name: linux-2.6.14
Created: Fri Jan 12 17:14:50 2007
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 1262504 Bytes = 1232.91 kB = 1.20 MB
Load Address: 0x30008000
Entry Point: 0x30008000
-A ==> set architecture to 'arch'
-O ==> set operating system to 'os'
-T ==> set image type to 'type'
-C ==> set compression type 'comp'
-a ==> set load address to 'addr' (hex)
-e ==> set entry point to 'ep' (hex)
-n ==> set image name to 'name'
-d ==> use image data from 'datafile'
-x ==> set XIP (execute in place)
SMDK2440A>tftp 0x32000000 uImage // 通过tftp server下载uImage至开发板内存0x32000000 地址处
SMDK2440A>nand erase 0x50000 0x200000 //首先擦除Nand Flash从0x50000 开始,大小为0x200000 的空间,来存放uImage
SMDK2440A>nand write.jffs2 0x32000000 0x50000 0x200000 //烧写uImage至0x30000
想开发板上电后自动启动kernel则要设置bootcmd环境变量
set bootcmd 'nand read 32000000 50000 2000000; bootm 32000000'
saveenv
- 烧rootfs-
SMDK2440A>tftp 0x30000000 root_qtopia.img// 通过tftp server下载root_qtopia.img至开发板内存0x30000000 地址处
SMDK2440A>nand erase 0x270000 $(filesize) //首先擦除Nand Flash从0x270000 开始,大小为$(filesize)
(可用echo $(filesize)来查看root_qtopia.img的大小),来存放root_qtopia.img
SMDK2440A>nand write.yaffs 30000000 270000 $(filesize) //烧写root_qtopia.img至0x270000 开始的Nand Flash
SMDK2440A>boot
注明: $(filesize) 为系统环境变量, 可以用printenv查看, 调用tftp后,系统自动会更新$(filesize) 的值,
直接调用即可,不必查看后再输入
kernel烧写步骤
1. 从内核源文件kernel/arch/arm/configs/里找一个config样本
2. 把样本复制到kernel/目录复制成 .config
例: 指令 cp xxx_config .config
3. make distclean清除垃圾
4. make menuconfig 打开配置介面
5. 修改配置 , 最后选save保存配置
6. make zImage CROSS_COMPILE=arm-linux-
7. 把生成的/arch/arm/boot/zImage 放到当初u-boot源代码中/tools里去,
<有一个写好的mkz2uimage脚本>使用mkimage生成uImage
8. 用nand启动u-boot
9. 用DNW软件用usbslave用USB传输uImage到内存中
注意u-boot默认下载的地址
10. bootm 地址 , 从内存中启动内核,验证内核是否正常<启动了kernel,不能再回到u-boot>
===========
关机,开机,从nand启动u-boot重下载kernel
11. nand erase 60000<nand偏移量> 400000<大小> 清除kernel区
nand write.jffs2 30000000<内存中的地址> 60000<nand偏移量> 400000<大小>
12.
=============
2.X86平台 make bzImage
但要肥编好的zImage复制到/boot 并改名为vmlinuz-版本号
修改/boot/grub/grub.conf内容为当前内核版本
==== 驱动模块的编译, 和存放
编译内核时,编译选译M的模块, make modules
然后安装M模块, make modules_install
(安装实际是将编译好的*.ko代码,复制到/lib/modules/<$version>/kernel/arch/x86/kernel/下)
<2.4内核,都叫*.o, 2.6之后的动态驱动都改成*.ko, 是由*.mod.o+*.o构成>
单个编译时,自已写个makefile,用make编译,然后自已复制到/lib/modules下面
对于ARM平台,因为系统的根目录还没有生成,所以*.ko将延后到rootfs根文件系统中存放
= ramdisk
X86需要 还需要把内核中M的模块,制作成ramdisk,
"用mkinitrd initrd-版本号 版本号目录名"
"版本号目录名"为刚刚安装的M模块/lib/modules下
命令类似mkinitrd initrd-2.6.32.2 2.6.32.2
mkinitrd initrd-2.6.18-8.el5xen 2.6.18-8.el5xen
也复制到/boot 并改名为initrd-版本号.img
修改/boot/grub/grub.conf内容为当前内核版本
====