嵌入式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//执行应用程序