易截截图软件、单文件、免安装、纯绿色、仅160KB

linux启动(转载)

各section的位置分布看内核的链接脚本
D:\KIDE\target\kernel-version\cgel3.0\linux\include\asm-generic\vmlinux.lds.h
D:\KIDE\target\kernel-version\cgel3.0\linux\arch\powerpc\kernel\vmlinux.lds.S
Kernel镜像起始地址KERNELBASE = 0xc000 0000,这意味着内核代码和内核全局变量等的地址空间在3g-4g的地方,
而Kernel实际被boot解压到ram的0地址处。这意味着在内核没有开启mmu,将自己映射到3g开始的地址空间前,所有访问的函数地址、全局变量都要减去0xc0000000这个偏移量。
boot跳转点,kernel入口函数_start所在文件
D:\KIDE\target\kernel-version\cgel3.0\linux\arch\powerpc\kernel\head_32.S
链接脚本的起始符号_stext就是从这个文件开始,各类异常处理入口也在这个文件里。
保存boot传过来的r3,r4到r31和r30,给r24赋0;
r3:扁平设备树首地址,物理地址。
r4中是什么?可能是被boot解压的首地址,603好像没用到。
r24干什么的?多核初始化使用,放的是核的编号
执行early_init:
early_init位于.init.text段,这是一个c语言的函数,堆栈指针r1未见到在之前的代码中指定,应该是延用的boot跳过来时使用的值。
reloc_offset这个函数比较巧妙,使用一个链接时确定的绝对地址,利用相对跳转到那里得到当前运行的实际地址,计算差值从而求出当前kernel被解压的地方距离0xc000 0000的偏移。
这要是保证即使kenel没有被boot解压到0地址,代码也能正常运行。
清bss段,注意如何确定现在的Bss段起始地址。在kernel没有把自己映射到0xc0000000时,所有的全局符号访问都要算偏移。
memset_io比普通的memset多了flush cache的操作,保证写到ram中。
SPRN_PVR是处理器的version register,identify_cpu函数根据读出的SPRN_PVR值在全局结构体数组cpu_specs中匹配cpu类型,cc是ppc603.
匹配成功,cur_cpu_spec指向cpu_specs中ppc603那一数组成员。
do_feature_fixups这个函数先解释他的后两个入参,__start___ftr_fixup是__ftr_fixup段的起始地址,__stop___ftr_fixup是__ftr_fixup段的结束地址。
__ftr_fixup这个段的内容其实是一个数组,每个数组成员是一个结构体,该结构体描述了某段代码的起始地址,结束地址,还有特殊的值及掩码作为标识。
使用BEGIN_FTR_SECTION,END_FTR_SECTION_IFSET这两个宏包住的汇编代码会在__ftr_fixup段里记录这段汇编代码的相关位置及标识信息。
这两个宏包住的代码都是一些和cpu特性相关的代码


相关文档:

如何从Windows轻松过渡到Linux?

引:
Linux操作系统是由Linus Torvalds先生在1991年创建的,之后不断获得互联网上众多程序员的自愿支持,经过十几年的发展,如今已经成为继Windows之后的第二大电脑操作系统软件。
你是否对Linux有充分的了解呢?作为一种平台,Linux首先获得了沉溺于某种癖好之士和黑客们的
青睐。Linux操作系统是由Linus
Torvalds先生 ......

用Linux下的LVS软件实现Linux集群







用Linux下的LVS软件实现Linux集群















德英


  

发表于2010年03月15日 18:22
阅读( ......

Linux GCC make文件的写法2

文件在两个文件夹:
inc/hello.h
main/hello.c, main.c, Makefile
文件内容:
hello.h
void hello(char name[]);

hello.c
#include <stdio.h>
void hello(char name[])
{
printf("Hello %s!\n", name);
}

main.c
#include <stdio.h>
#include "../inc/hello.h"
// The second
int main( ......

Linux GCC make文件的写法3

 包含3个文件夹
目录组织结构如下:
inc/hello.h
main/main.c, Makefile
src/hello.c
文件内容如下:
hello.h:
void hello(char name[]);
main.c:
#include <stdio.h>
#include "../inc/hello.h"
// The second hello.h should in ""
int main()
{
hello("GCC");
printf("Haha Linux Ub ......

Linux查看硬件信息

在LINUX环境开发驱动程序,首先要探测到新硬件,接下来就是开发驱动程序。
常用命令整理如下:
用硬件检测程序kudzu探测新硬件:service kudzu start ( or restart)
查看CPU信息:cat /proc/cpuinfo
查看板卡信息:cat /proc/pci
查看PCI信息:lspci (相比cat /proc/pci更直观)
查看内存信息 ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号