嵌入式linux第六讲 内核分析
2019-07-12 22:26发布
生成海报
烧写内核
1.使用secureCRT串口工具连接开发板。
2.开发板设置为nor启动,启动开发板,倒数10秒按任意键进入boot菜单界面。按q推出。
3.输入命令print可以看到开发板信息。有一栏是 ipaddr
4. set ipaddr 192.168.1.10
5. save
6. 重启开发板,按照前三步,重新print就可以看到修改后的开发板ip
内核分析
*
把这个文件 解压缩 打补丁 配置 编译
root@liuhehe-machine:/home/system/linux-2.6.22.6# patch -p1< ../linux-2.6.22.6_jz2440.patch 打补丁
配置
make menuconfig
使用默认的配置
使用厂家提供的配置文件 把厂家的配置文件 cp为.config文件 make menuconfig
root@liuhehe-machine:/home/system/linux-2.6.22.6# find -name "*defconfig*"
root@liuhehe-machine:/home/system/linux-2.6.22.6# cd ././arch/arm/configs/
root@liuhehe-machine:/home/system/linux-2.6.22.6/arch/arm/configs# cd ../..
root@liuhehe-machine:/home/system/linux-2.6.22.6/arch# cd ..
root@liuhehe-machine:/home/system/linux-2.6.22.6#找到相似的文件
root@liuhehe-machine:/home/system/linux-2.6.22.6# make s3c2410_defconfig 执行相似的文件
# configuration written to .config 保存在.config中
root@liuhehe-machine:/home/system/linux-2.6.22.6# make menuconfig 执行
root@liuhehe-machine:/home/system/linux-2.6.22.6# ls config_ok 厂家提供的配置文件
config_ok
root@liuhehe-machine:/home/system/linux-2.6.22.6# cp config_ok .config
root@liuhehe-machine:/home/system/linux-2.6.22.6#
root@liuhehe-machine:/home/system/linux-2.6.22.6# make menuconfig
编译 直接make
或者想生成ulmage
用tftp 下载 ulmage
用sourceinsighe 进入 cmd_menu.c 进入menu_shell
case 'k':
{
strcpy(cmd_buf, "usbslave 1 0x30000000; nand erase kernel; nand write.jffs2 0x30000000 kernel $(filesize)")
查看.config文件
root@liuhehe-machine:/home/system/linux-2.6.22.6# vi .config
CONFIG_FAT_DEFAULT_IOCHARSET="cp936"
# CONFIG_NTFS_FS is not set
/=m //命令
一个配置项 CONFIG_DM9000
root@liuhehe-machine:/home/system/linux-2.6.22.6# grep "CONFIG_DM9000" * -nR
arch/arm/plat-s3c24xx/common-smdk.c.rej:7:+#if defined(CONFIG_DM9000)
C 原码用到 DM9000 宏来源于include/linux/autoconf.h:145:#define CONFIG_DM9000 1
drivers/net/Makefile.rej:7:-obj-$(CONFIG_DM9000)
include/config/auto.conf:144:CONFIG_DM9000=y来源 。config
include/linux/autoconf.h:145:#define CONFIG_DM9000 1由.config自动生成
root@liuhehe-machine:/home/system/linux-2.6.22.6# vi include/linux/autoconf.h
#define CONFIG_DM9000 1
root@liuhehe-machine:/home/system/linux-2.6.22.6# vi drivers/net/Makefile
/dm9000
#obj-$(CONFIG_DM9000) += dm9000.o
makefile的内核子目录下
obj-y+=xxx.o 会编译进入内核
obj-m+=yyy.o 会变成一个模块 yyy.c编译成yyy.ko
root@liuhehe-machine:/home/system/linux-2.6.22.6# vi include/config/auto.conf
make ulmage时
先 生成/linux/autoconf.h 来源于源代码
再/config/auto.conf 来源于顶成makefile
分析makefile 第一个文件 链接脚本
arch/arm/kernel/head.S
arch/arm/kernel/vmlinux.lds
F:嵌入式韦东山一期(S3C2440)Sourc Insight工程文件linux-2.6.22.6_jz2440archarmkernel
*处理uboot传入的参数
查看内核makefile
F:嵌入式韦东山一期(S3C2440)Sourc Insight工程文件linux-2.6.22.6_jz2440Documentationkbuild
看下面的makefile、
F:嵌入式韦东山一期(S3C2440)Sourc Insight工程文件linux-2.6.22.6_jz2440driverschar
obj-y+= mem.o random.o tty_io.o n_tty.o tty_ioctl.o
y表示会编译进内核
obj-m += s3c24xx_leds.o
m表示会编译成一个模块
a.c b.c
编译进内核
obj -y+=a.o b.o
如果 a.c b.c 组成一个模块
obj -m+=ab.o
ab -objs :=a.o b.o
a.c b.c>a.o b.o>ab.ko 编译成一个模块
arm架构的makefile
F:嵌入式韦东山一期(S3C2440)Sourc Insight工程文件linux-2.6.22.6_jz2440archarm
顶层目录的makefile
F:嵌入式韦东山一期(S3C2440)Sourc Insight工程文件linux-2.6.22.6_jz2440
include $(srctree)/arch/$(ARCH)/Makefile
相互依赖关系
uImage i 这个是I
zImage Image xipImage bootpImage uImage: vmlinux
vmlinux: $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) $(kallsyms.o) FORCE
vmlinux-init := $(head-y) $(init-y)
head-y := arch/arm/kernel/head$(MMUEXT).o arch/arm/kernel/init_task.o
init-y := init/
init-y := $(patsubst %/, %/built-in.o, $(init-y))= init/built-in.o, 在int/下涉及的文件编译成in.o
vmlinux-main := $(core-y) $(libs-y) $(drivers-y) $(net-y)
core-y := usr/
core-y += kernel/ mm/ fs/ ipc/ security/ crypto/ block/
core-y := $(patsubst %/, %/built-in.o, $(core-y))
=usr/built-in.okernel/built-in.o mm/built-in.o
fs/built-in.o ipc/
built-in.osecurity/ built-in.ocrypto/built-in.o block/built-in.o
libs-y := lib/
drivers-y := drivers/built-in.osound/built-in.o
net-y := net/built-in.o
vmlinux-all := $(vmlinux-init) $(vmlinux-main)
vmlinux-lds := arch/$(ARCH)/kernel/vmlinux.lds
export KBUILD_VMLINUX_OBJS := $(vmlinux-all)
就是用这些原材料编译成内核
我们要分析怎么编译成的
一是看makefile
二是 make uImage 查看
root@liuhehe-machine:/home/system/linux-2.6.22.6# make uImage V=1 命令详细么列出
*处理u-boot传入进来参数
*运行应用程序(应用程序在根文件系统里面)
运行应用程序 必须挂接根文件系统
内核如果过大 可以压缩 前面加一个自解压代码
mrc p15, 0, r9, c0, c0@ get processor id
bl __lookup_processor_type@ r5=procinfo r9=cpuid 查找处理器 是否支持这个单板
单板 就是uboot启动时 传入进来的 机器ID
![]()
bl __lookup_machine_type@ r5=machinfo
root@liuhehe-machine:/home/system/linux-2.6.22.6# grep " .arch.info.init" * -nR 查看支持内核
#define MACHINE_START(_type,_name)
static const struct machine_desc __mach_desc_##_type
__used
__attribute__((__section__(".arch.info.init"))) = {
.nr = MACH_TYPE_##_type,
.name = _name,
#define MACHINE_END
};
*查看是否支持CPU
*查看是否支持单板
*建立页表
*使能mmu
*跳到 start kernel 第一个c函数
内核启动流程
arch/arm/kernel/head.S
start_ kernel
setup_arch//解析uboot传入的启动参数
setup_command_line//解析uboot传入的启动参数
rest_ init
kernel _init
prepare_namespace
mount_root //挂接根文件系统
init_post//执行应用程序
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮