linux 2.6源代码情景分析笔记之系统启动2
linux/arch/i386/boot/compressed/head.S
在setup()结束后,此函数就被移动到物理地址0x00100000处或者0x00001000处,这取决于内核映像是被高装载到ram中还是低装载到ram中。
解读函数:
startup_32:
cld
cli
movl $(__BOOT_DS),%eax
movl %eax,%ds
movl %eax,%es
movl %eax,%fs
movl %eax,%gs
lss stack_start,%esp
其中的boot_ds内存中已经有谈及。初始化了段寄存器和一个临时队栈。
xorl %eax,%eax
1: incl %eax # check that A20 really IS enabled
movl %eax,0x000000 # loop forever if it isn't
cmpl %eax,0x100000
je 1b
测试A20是否真的置位。前面在切换到保护模式之前,已经将A20引脚正式置位,不然每个物理地址第21位都会被cpu看作0.此时再验证。
xorl %eax,%eax
movl $_edata,%edi
movl $_end,%ecx
subl %edi,%ecx
cld
rep
stosb
用0填充_edata和_end符号标识的内核未初始化数据区。在linux填充ram时分几个部分。符号_text对应于物理地址0x00100000,表示内核代码的第一个字节的地址。内核代码的结束位置由另外一个类似的符号_etext表示。内核数据分两组,初始化的数据和没初始化的数据。初始化的数据在_etext后开始,在_edata处结束。紧接着是未初始化的数据并以_end结束。这些
相关文档:
例一:发送Signaling Packet:
Signaling Command是2个Bluetooth实体之间的L2CAP层命令传输。所以得Signaling Command使用CID 0x0001.
多个Command可以在一个C-frame(control frame)中发送。
如果要直接发送Signaling Command.需要建立SOCK_RAW类型的L2CAP连接Socket。这样才有机会自己填充Command Code,Identi ......
内核使用的基本数据类型主要有: int : 标准的C语言整数类型 u32 : 32位整数类型 pid_t : 特定内核对象pid的类型 在不同CPU体系结构上,C语言的数据类型所占用的空间是不一样的。在x86系列结构下,数据类型占用的字节数如下表所示: arch char short int long ptr ......
前面利用开发板带的现成的东西step by step让Linux 2.4.19在开发板上跑起来了,对于开发的流程也有了一定的认识。现在想对每一步进行详细深入的探讨,好好学习一下,把笔记记录下来,省得忘记了。有些内容是从看过的书中摘要过来的,大部分是自己实践后的心得。我想记得详细点,也好为后面总结打好基础。
------- ......