一、Linux内核简介
1.1 Linux系统架构
Linux体系结构:用户空间(用户接口、C库),内核空间(系统调用、内核、结构支持内核代码)。
分成两个结构,可以使操作系统本身的到充分的保护。内核空间与用户空间是程序执行的两种不同状态,通过系统调用和硬件中断能够完成从用户空间到内核空间的转移。
1.2 Linux内核架构
1.3 Linux内核源码
Linux内核源代码采用树形结构进程组织,非常合理的把功能相关的文件都放在同一个子目录下,使得程序更具可读性。 arch目录:内核所支持的CPU体系,在该目录下都有对应的子目录。每个CPU的子目录,又进一步分解为boot,mm,kernel等子目录,分别包含控制系统引导,内存管理,系统调用等
fs目录:存放各种文件系统的实现代码。每个子目录对应一种文件系统的实现,公用的源程序用于实现虚拟文件系统vfs。
net目录:网路协议的实现代码
二、Linux内核配置与编译
2.1 为什么要配置内核
1. 硬件的需求
2. 软件的需求
选出需要的,去掉不要的!
2.2 内核配置方法
make config:基于文本模式的交互式配置。
make menuconfig:基于文本模式的菜单型配置。
2.3 内核配置的结果在哪里?
刚编译的在内核文件下的.config。 内核配置通常在一个已有的配置文件基础上,通过修改得到新的配置文件,Linux内核提供了一系列可供参考的内核配置文件,位于Arch/$cpu/configs
2.4 内核编译--make zImage--make bzImage
*区别:在X86平台,zImage只能用于小于512K的内核
*如需获取详细编译信息,可使用:
make zImage V=1
make bzImage V=1
** 编译好的内核位于arch//boot/目录下 **
2.5 编译内核模块
编译内核模块:make modules
将编译好的内核模块,从内核源代码目录复制至/lib/modules下**,为打包做好准备: make modules_install
2.6 制作init ramdisk
方法:mkinitrd initrd-$version $version
例:mkinitrd initrd-2.6.32 2.6.32
*$version /lib/modules 可以通过查询下的目录得到
2.7 安装内核(x86)
1、cp arch/x86/boot/bzImage
/boot/vmlinuz-$version
2、cp initrd-$version /boot/
3、修改/etc/grub.conf
2.8 清理内核
make clean:清理的是*.o,配置文件.config
make distclean:清理的是*.ko和*.o,配置文件.config
三、嵌入式内核制作
3.1 嵌入式系统构成
3.2 内核制作步骤
2、配置内核
x86: make menuconfig
arm: make menuconfig ARCH=arm
3、编译内核
x86: make bzImage
arm: make uImage ARCH=arm CROSS_COMPILE=arm-linux-
编译后报错:
-
Kernel: arch/arm/boot/zImage is ready
-
UIMAGE arch/arm/boot/uImage
-
"mkimage" command not found - U-Boot images will not be built
-
Image arch/arm/boot/uImage is ready
赋值uboot的tools/mkimage到/bin目录下。重新编译
-
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)
-
Backtrace:
-
[] (dump_backtrace+0x0/0x10c) from [] (dump_stack+0x18/0x1c)
-
r7:c380c0cb r6:c04f4d80 r5:c380c000 r4:c381df40
-
[] (dump_stack+0x0/0x1c) from [] (panic+0x4c/0x12c)
-
[] (panic+0x0/0x12c) from [] (mount_block_root+0x178/0x234)
-
r3:00000000 r2:c38313ec r1:c381df40 r0:c0446f9c
-
[] (mount_block_root+0x0/0x234) from [] (mount_root+0xb0/0xf4)
-
[] (mount_root+0x0/0xf4) from [] (prepare_namespace+0x104/0x19c)
-
r7:00000000 r6:c002483c r5:c002483c r4:c04f4744
-
[] (prepare_namespace+0x0/0x19c) from [] (kernel_init+0xc8/0xf4)
-
r6:c00236dc r5:c0023274 r4:c00236dc
-
[] (kernel_init+0x0/0xf4) from [] (do_exit+0x0/0x620)
-
r7:00000000 r6:00000000 r5:00000000 r4:00000000
没有制作文件系统
阅读(597) | 评论(0) | 转发(0) |