-
Ubuntu中打开终端后会自动执行
~/
(用户)目录下.bashrc
中的指令; -
通常ZYNQ中BOOT.bin包含FSBL镜像、u-boot镜像(、PL端bitstream)。image.ub包含内核镜像、设备树dtb、INITRAMFS根文件系统;
-
操作系统(内核)本身就是一个裸机程序,与其它裸机程序和uboot无本质区别。
-
uboot经过编译生成的是u-boot(elf文件),在操作系统下是可以直接执行的,但是不能烧录下载。需要用到arm-linux-objcopy工具进行加工(主要是去掉一些无用的内容),得到u-boot.bin镜像(image)。镜像就是用来烧录到iNand中执行的。
-
linux内核经过编译后生成vmlinux或vmlinuz(elf)。嵌入式系统部署时烧录的Image是由vmlinux/vmlinuz经过arm-linux-objcopy工具制作的。Image原则上就可以直接被烧录到Flash上启动执行,但还是将Image进行压缩,并在文件开头加上一段自解压代码,得到zImage。
用于uboot启动的内核镜像uImage是将zImage通过uboot中的mkimage工具,在zImage前面加上64字节的uImage的头信息得到的。有些uboot也支持启动zImage。 -
刚烧录的系统中flash环境变量分区是空白的,uboot第一次运行时加载的环境变量是代码中设置的默认环境变量。使用saveenv命令时,会将DDR中的环境变量保存到flash环境变量分区中,下次开机会在环境变量relocate时将flash中的环境变量加载到DDR中。
default_environment在uboot源代码中被初始化为默认值,但在uboot的BL2 env_relocate代码会对flash中的环境变量分区进行CRC校验。若校验通过,这说明环境变量分区中有可用的环境变量,然后用此环境变量覆盖DDR中的default_environment。 -
uboot中的start.S的开头会占用16字节的空间(官方版uboot可能没有),这16个字节适配于sd_fusing中的mkbl1(mkbl1可能有不同的版本,其他的版本可能没有这16个字节的要求)。
-
根文件系统为操作系统启动提供了根目录和进程1的用户态init程序。
-
kernel的链接脚本vmlinux.lds并不是直接提供的,而是由arch/arm/kernel/vmlinux.lds.S这个汇编文件经过编译得到的。
因为汇编文件支持条件编译,这样的话可以灵活地得到链接脚本。 -
linux系统中,进程0是idle进程,为内核进程,所以在用户态的命令行中看不到;进程1是init进程(kernel_init),完成从内核态到用户态的转变,因此后续其他进程都可以工作在用户态;进程2是kthreadd,为linux内核的守护进程,保证linux内核能正常工作。
-
普通文件(- regular),包括文本文件;
目录文件(d directory);
字符设备文件(c character);
块设备文件(b block);
管道文件(p pipe);
套接字文件(s socket);
符号链接文件(l link)。 -
中断不参与进程调度,如果一旦在中断服务函数执行过程中休眠了,休眠了则意味着交出了CPU的使用权,CPU使用权则跑到了其它线程了,那么就不能再回到中断断点处了。
-
因为内核空间不能直接操作用户空间的内存,因此需要借助copy_to_user函数来完成内核空间的数据到用户空间的复制。copy_to_user函数原型如下:
static inline long copy_to_user(void __user *to, const void *from, unsigned long n)
参数to表示目的,参数from表示源,参数 n 表示要复制的数据长度。如果复制成功,返回值为0,如果复制失败则返回负数。
- 因为用户空间内存不能直接访问内核空间的内存,所以需要借助函数
copy_from_user
将用户空间的数据复制到内核空间中。 - 关于Linux内核的标准输出,内核设备树中根节点(
/
)的子节点chosen
中的stdio-path
属性拥有最高优先级,其次是bootargs
属性。如果U-Boot定义了bootargs
环境变量,则会通过fdt_setprop
函数在内核设备树的chosen
节点中将该环境变量覆写给bootargs
属性,也就是说U-Boot的环境变量bootargs
比内核根节点下chosen
节点的bootargs
拥有最高的优先级。
综上,标准输出优先级:内核设备树根节点下chosen
节点的stdio-path
属性 > U-Boot的环境变量bootargs
> 内核设备树根节点下chosen
节点的bootargs
属性 - Linux内核启动的时候会解析设备树中各个节点的信息,并且在根文件系统的
/proc/device-tree
目录下根据节点名字创建不同文件夹,如图:
- 用PC ping 正在运行U-boot的板卡会ping不通,是因为U-Boot为了精简,当外面ping自己的时候,不会返回数据包。如果板卡可以ping通PC就基本没问题。
- 中断不参与进程(线程)调度。