易截截图软件、单文件、免安装、纯绿色、仅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特性相关的代码


相关文档:

linux vi 命令大全

进入vi的命令
vi filename :打开或新建文件,并将光标置于第一行首
vi +n filename :打开文件,并将光标置于第n行首
vi + filename :打开文件,并将光标置于最后一行首
vi +/pattern filename:打开文件,并将光标置于第一个与pattern匹配的串处
vi -r filename :在上次正用vi编辑时发生系统崩溃,恢复filename
vi ......

linux定时器设置

10.5.2 精通定时器设置
函数alarm设置的定时器只能精确到秒,而以下函数理论上可以精确到微妙:
#include  <sys/select.h>
#include  <sys/itimer.h>
int getitimer(int which, struct itimerval *value);
int setitimer(int which, const struct itimerval
*value, struct itimerval *ovalue ......

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驱动之makefile详解

# If KERNELRELEASE is defined, we've been invoked from the
# kernel build system and can use its language.
ifneq ($(KERNELRELEASE),)
    obj-m := hello.o
# Otherwise we were called directly from the command
# line; invoke the kernel build system.
else
    ......

LINUX FREEBSD 文件系统结构


Linux
/ Linux文件系统的入口,也是处于最高一级的目录;
/bin 基础系统所需要的那些命令位于此目录,也是最小系统所需要的命令;比如 ls、cp、mkdir等命令;功能和/usr/bin类似,这个目录中的文件都是可执行的,普通用户都可以使用的命令。做为基础系统所需要的最基础的命令就是放在这里。
/boot Linux的内核及引导系 ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号