看视频做的笔记——内核

来源:互联网 发布:50部网络禁书下载 编辑:程序博客网 时间:2024/05/15 10:27
内核
下载地址 www.kernel.org

1.解压缩
2.打补丁 patch -pn < 补丁文件
3.配置(1)使用默认的配置,在上面修改
在arch/arm/configs找到相似的配置文件xxx_defconfig
回到内核目录,make xxx_defconfig(结果保存在.config)
make menuconfig
之后出现菜单,就可以修改配置项
(2)make menuconfig(自己配置)
(3)使用厂家提供的配置文件(把厂家的config 复制为 .config)
4.编译 make


通过find -name "*defconfig"查找config
cd arch/arm/configs
ls //查看默认的配置文件,看那一个和自己的单板相像,看到s3c2410_defconfig
进入linxu-2.6.30.4的内核目录
执行 make s3c2410_defconfig

make uImage  // 编译一个的头部和内核
(头部 + 内核)

内核子目录的makefile
obj-y += xx.o(被编译进内核)
obj-m += yyy.o(被编译为模块,yyy.o编译为yyy.ko)

配置结果是生成了.config
查看.config,里面有很多配置项
以配置项:DM9000为例
在(1)c源码
  (2)子目录makefile
 (3)include/config/auto.conf(自动生成,来自与.config。会被顶层的makefile包含)
  (4)include/linux/autoconf.h(自动生成,里面的内容来自于.config.在这个文件里面都定义为1)

make uImage 时
(1).config 生成 autoconf.h(被源代码使用)
 (2).config 生成auto.conf(被子目录的makefile引用,obj-$(DM9000) += DM9000)
(结果 Image arch/arm/boot/uImage is ready)

有时间阅读一下Documentation/kbuild/makefile.txt文件
如果有两个文件a.c b.c要编译进内核
使用 obj-y += a.o b.o
如果两个文件要编译为一个模块
obj-m += ab.o
ab-objs := a.o b.o
效果为: 
a.c 编译为 a.o  b.c 编译为 b.o
a.o和b.o 链接为ab.ko

分析makefile
make uImage 在arch/arm/Makefile中
uImage 依赖于 vmlinxu(真正的内核)
vmlinux在顶层makefile中
vmlinux-init := $(head-y) $(init-y)
vmlinux-main := $(core-y) $(libs-y) $(drivers-y)$(net-y)
vmlinux-all  := $(vmlinux-init)$(vmlinux-main)
vmlinux-lds  :=arch/$(SRCARCH)/kernel/vmlinux.lds

可以直接用指令
rm vmlinux
make uImage V=1 ,查看链接过程(V=1:列出详细命令过程),在最后面有
arm-linux-ld -EL  -p --no-undefined -X--build-id -o vmlinux -T arch/arm/kernel/vmlinux.ldsarch/arm/kernel/head.o arch/arm/kernel/init_task.o init/built-in.o --start-group usr/built-in.o arch/arm/kernel/built-in.o arch/arm/mm/built-in.o arch/arm/common/built-in.o arch/arm/mach-s3c2410/built-in.o arch/arm/mach-s3c2400/built-in.o arch/arm/mach-s3c2412/built-in.o arch/arm/mach-s3c2440/built-in.o arch/arm/mach-s3c2442/built-in.o arch/arm/mach-s3c2443/built-in.o arch/arm/plat-s3c24xx/built-in.o arch/arm/plat-s3c/built-in.o kernel/built-in.o  mm/built-in.o fs/built-in.o  ipc/built-in.o security/built-in.o crypto/built-in.o block/built-in.o arch/arm/lib/lib.a  lib/lib.a arch/arm/lib/built-in.o lib/built-in.o drivers/built-in.o sound/built-in.o firmware/built-in.o net/built-in.o --end-group .tmp_kallsyms2.o

其中
-o vmlinux输出linux
-Tarch/arm/kernel/vmlinux.lds为链接脚本,决定了原材料应该怎么排布(下面的就为原材料)文件的顺序由原材料中文件的顺序排放,各个文件的段有链接脚本指定
arch/arm/kernel/head.o 为第一个文件


内核启动的时候要做的事情(内核有时会压缩,所会在运行之前先运行自解压)
从arch/arm/kernel/head.s开始分析

1.处理u-boot传入的参数(机器id,启动参数) 
a.判断是否支持这个cpu
b.判断是否支持这个单板
c.建立页表 bl __create_page_tables
d.是能mmu
e.跳转start_kernel 等一系列函数,挂接跟文件系统,
内核的启动流程:
arch/arm/kernel/head.s
start_kernel
setup_arch //解析u-boot传入的启动参数
setup_command_line//解析u-boot传入的启动参数
rest_init
kernel_init
prepare_namespace
mount_root //挂接根文件系统
init_post
//执行应用程序
2
最终目的:运行根目录下面的应用程序


//arch/arm/kernel/head.s中
       mrc p15, 0, r9, c0, c0 @ get processor id
bl __lookup_processor_type @ r5=procinfo r9=cpuid
//读出寄存器,看内核是否支持
       movs r10, r5 @ invalid processor (r5=0)?
beq __error_p @ yes, error 'p'
bl __lookup_machine_type @ r5=machinfo
//查看u-boot的传入的参数
//__lookup_machine_type 在arch/arm/kernel/head_common.s中
.long __proc_info_begin
.long __proc_info_end
3: .long .
.long __arch_info_begin
.long __arch_info_end

__lookup_machine_type:
adr r3, 3b                      @r3为3b的地址(实际存放的地址)
ldmia r3, {r4, r5, r6}              @r4为 “.”当前地址(虚拟地址),
@r5=__arch_info_begin
@r6=__arch_info_end
@r5,r6中的内容在链接脚本中定义
@即在arch/arm/kernel/vmlinux.lds中
sub r3, r3, r4 @ get offset betweenvirt&phys
add r5, r5, r3 @ convert virt addresses to
add r6, r6, r3 @ physical address space
1: ldr r3, [r5, #MACHINFO_TYPE] @ get machine type
teq r3, r1 @ matches loader number?
beq 2f @ found
add r5, r5, #SIZEOF_MACHINE_DESC @ next machine_desc
cmp r5, r6
blo 1b
mov r5, #0 @ unknown machine
2: mov pc, lr


//即在arch/arm/kernel/vmlinux.lds中
  __arch_info_begin = .;
   *(.arch.info.init)
  __arch_info_end = .;
//为架构相关的初始化
//. = 0xC0000000 + 0x00008000;从这个虚拟地址增长而来
//.arch.info.init在include/asm-arm/mach/Arch.h中定义(我没有找到这个文件)
//给代码附上一种属性


分区在代码中写死了,在启动内核中有一些信息,在内核中搜索"bootloader"可以知道在那些文件中有
在arch/arm/palt-s3c24xx/common-smdk.c中有定义

0 0