看视频做的笔记——内核
来源:互联网 发布: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源码
make uImage 时
(1).config 生成 autoconf.h(被源代码使用)
(结果 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中
bl __lookup_processor_type @ r5=procinfo r9=cpuid
//读出寄存器,看内核是否支持
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中
//为架构相关的初始化
//. = 0xC0000000 + 0x00008000;从这个虚拟地址增长而来
//.arch.info.init在include/asm-arm/mach/Arch.h中定义(我没有找到这个文件)
//给代码附上一种属性
分区在代码中写死了,在启动内核中有一些信息,在内核中搜索"bootloader"可以知道在那些文件中有
在arch/arm/palt-s3c24xx/common-smdk.c中有定义
0 0
- 看视频做的笔记——内核
- 看视频做笔记
- 看视频如何做笔记
- 我看肖老师的《明日世界-云端计算下的程序设计需求》视频时,做的简单笔记
- 看django视频笔记
- 看视频笔记----文件系统
- javascript看视频笔记
- 看项目做笔记
- 低头看—SQL视频
- 看的oracle数据库视频 记的一点笔记
- 看尚学堂马士兵JSP的视频笔记
- 看了后盾网thinkphp3.1.3视频的一些笔记~~~
- 走进软考(1)— 完成看视频和看教程的时代
- 以前看《perl24》书做的部分笔记(zz)
- 看儿子的视频
- 看儿子的视频
- 看视频的体会
- 机器学习中的内核方法 李政轩的视频笔记
- make: *** [depend] 错误 2
- dnw在linux下的安装方法
- Kernel 配置问题集
- OCP-1Z0-051 第74题 oracle单行函数
- Linux Kernel Makefiles
- 看视频做的笔记——内核
- linux超级终端minicom的使用方法[…
- android:inputType参数类型说明
- 编译busybox是遇到的问题--- [netw…
- 看视频笔记----文件系统
- 驱动中使用class_device_create()…
- Linux基础: 解密module_init幕后…
- version magic '2.6.30.4 mod_unlo…
- linux2.6关于中断的一些入门介绍