笔记

u-boot————————————————————————————————
1。解压缩
2.打补丁 patch -p(n) <补丁文件
3.配置 make 100ask14x0_config
4.编译 make

编译之后用oflash 烧写


u-boot 的功能
1. 硬件相关的初始化
关看门狗
初始化时钟
初始化sdram
烧写flash
网卡
usb
串口
从flash中读出内核
启动内核

从makefile中分析文件之间的关系

1.分析配置过程
make 100ask24x0_config
解析后相当于执行 mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c2440
mkconfig 为脚本文件
脚本里面 $0 为命令,后面的$1 $2 ……为参数  $#为参数的个数
> 表示新建一个文件, >> 表示追加一个文件
echo  "ARCH    = $2 " > config.mk
2.分析编译过程
1.第一个文件是 cpu/arm920t/start.s
2.连接脚本bord/100ask24x0/u-boot.lds   +  0x33f80000

u-boot 执行过程
 识别出哪一种nor flash 和 nand flash, 使可以读写
flash_init
nand_init
环境变量1.默认的,2.在flash上保持的
网卡
调色器

如果没有按空格
s=getenv("bootcmd");
bootcmd
读出内核   nand read.jhs 0x30007fc0, kernel
执行内核 boot 0x30007f0

按了空格,到达控制界面
循环等待命令,读入串口的数据,解析命令,指令命令

命令
1.输入命令字符串
2.根据命令执行函数(命令结构体)
分解命令,提取参数,是否重复,长的帮忙信息,短的帮助信息
链接脚本也可以传参数 _u_boot_cmd_start
U_BOOT_CMD宏 


增加hello 
1.增加命令结构体文件
2.在makefile中添加文件
3.make

读出内核
nand read.jffs2 0x30007fc0 kernel;
从nand读出内核,从kernel分区中读
用read.jffs2的时候不需要页对齐,块对齐
分区在配置文件源码中写死(启示位置,大小,)

启动内核
do_bootm 命令
flash上存的内核:uImage
头部 加 真正的内核
头部中有
in_load: 的加载地址
in_ep:入口地址
1.读出头部,看内核的加载地址是否需要移动
头部有64字节
2.启动do_bootm_linux
uboot 告诉内核一些参数,设置启动参数
跳到入口地址,启动内核
theKernel

怎么设置参数
1.在某个地址,按某种格式,保持数据
格式为 TAG,地址
setup_start_tag()
setup_memory_tags()
setup_commandline_tag()
setup_end_tag()

启动内核
theKernel(0, bd->bi_arch_number, bd->bi_boot_params);
bi_arch_number 机器id


kernel————————————————————————————————————————————

1.解压缩
2.打补丁   patch -p  < 补丁文件(-p 忽略目录)
3.配置
a。make menuconfig
b。使用默认的配置,在上面修改
在arch/arm/configs找到相似的配置文件xxx_defconfig
make xxx_defconfig(保持在 .config)
make menuconfig
c。使用厂家的提供的配置文件
把厂家的配置文件复制为 .config
4.编译  make uImage
编译一个内核给u-boot 用


没有根文件系统,启动到一定步骤之后就停止了

配置的结果是生成了.config
.config(里面有很多配置项)
等于y时将作为一个模块
配置项:CONFIG_DM9000
1.c源码:CONFIG_DM9000(宏)
2.子目录Makefile :drivers/net/Makefile
3.include/unfig/auto.conf
上面文件也来自于.config,会被顶层的makefile包含

4.include/linux/autoconf.h(宏来源于此)
根据.config生成上面文件
include/linux/autoconf.h在这个文件里面都会等于1

子目录Makefile
obj-y+=xxx.o(xxx会被编译进内核)
obj-m+=yyy.ko(yyy被编译为一个模块)

make vImage时
1.config 生成。outo.conf(被源代码使用)
2..config生成.auto.conf.h(被子目录makefile用)

分析makefile,第一个文件,连接脚本 

把下面的文件编译进内核
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 = a.o b.c = b.o
a.o 和 b.o被连接成ab.o


从顶层目录的makefile开始分析,会用到子目录的makefile

1.子目录的makefile obj-y +=
obj-m +=
2.make vImage
vImage :vmlinux
头部+真正的内核

makefile的分析结果
1.第一个文件 arch/arm/kernel/head.s
2.链接脚本 arch/arm/kernel/vmlinux.lds
指定内核发在那里
放的顺序

内核:
首先处理uboot传入的参数
判断:是否支持这个单板(uboot启动内核时传进来的机器id)
arm/arm/kernel/head.s
内核之前有自解压
连接:根文件系统
最终目的:应用程序

文件系统————————————————————————————————————————
1.u-boot :启动内核
2.内核:启动应用程序
挂接根文件系统
3.构建根文件系统

内核怎样启动第一个应用程序
1.open(/dev/console) 标准输出,标准输入,标准错误
(对用于)终端/dev/console,串口0
sys_dum(0),sysdup(0)
2.run_init_process(    )
如果有定义命令行init=xxx(u-boot传递的命令)   
就执行它,没有就向下执行


启动好后指令cp,ls等链接到busybox

内核首先启动init
init程序1.读取配置文件(a.应用程序,b.何时执行)
2。解析配置文件
3.执行用户程序


驱动————————————————————————————————————————————

应用程序 open, read ,write

应用程序
int main()
{
int fd1,fd2;
int val=1;

fd1 = open("/dev/led", O_RDWR);
write = open(fd1, &val, 4);

fd2 = open("hello,txt", O_RDWR);
write(fd2, &val, 4);
}

应用程序调入open, read,write(调用c库)
产生swi 中断
根据发生的异常的原因,调用处理函数,
sys_read,sys_open,sys_write(VFS,虚拟文件系统)
根据打开的不同文件找到不同的驱动


启动框架
app:open read write
1.写出led_open,
2.怎么告诉内核
a.定义一个file_operations结构
b.把结构告诉内核,注册
register_chrdev(major, "first_drv",)
c.谁来调用它,驱动的入口
int first_drv_init()
d.定义一个结构体
module_init(first_drv_init);

启动文件 字符文件
app open("/dev/xxx")
c_ _ _ _ _ _ major(主设备号) mior(此设备号)
程序根据属性c  主次设备号找到驱动

1.驱动    自动分配主设备号
手工指定
2.应用 open(“/dev/xxx”)根据系统信息创建节点 

写一个led的驱动
1.框架
2.完善, 硬件的操作
a。看原理图
b。看2440手册
c。写代码
单片机:物理地址
驱动:虚拟地址  用ioremap映射
怎么来的?
a.mknod /dev/xxx c 主设备号 次设备号
手工建立
b。自动创建  udev mdev
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值