博文

关于asm-offsets的一些说明

对Kbuild里面的asm-offsets一直不太清楚,找到了一个RFC,并简单翻译了一下。详见http://marc.info/?l=linux-kernel&m=100219616028442&w=2 Almost every architecture generates Assembler values to map the offsets of fields in C structures, about the only exception is i386 and that is because its offsets are hard coded into entry.S. Every arch has done it differently, none of them have got it exactly right. 几乎所有的体系结构都会产生汇编的值去和C语言中的数据结构各个域的偏移相对应。但x86是一个例外,因为它的偏移是硬编码的,具体可以参考entry.S.没一种体系结构都是不一样的,但几乎没有一个能够对应的十分准确。 As part of kbuild 2.5 I am standardizing on one method for generating Assembler offsets. This change is required for kbuild 2.5 but it can be added to 2.4 without disturbing the current kbuild, I want to do this gradually now instead of a single massive change in kernel 2.5. I will be issuing per architecture changes for generating Assembler offsets against 2.4. 从kbuild2.5开始,我就开始做了一个标准化的方法去生成汇编的相对偏移。如果你的kbuild是2.4版本的,也可以是用kbuild2.5的这个标准化方法。我想逐步的把这个方法加入到2.5的Linux Kernel中,重点是针对各个架构的不同点。 The kbuild 2.5 method...

XEN-ARM定时器管理算法简要总结

/* XEN-ARM的定时器优先队列管理算法采用的是最小堆。关于最小堆的知识,请参考 《算法导论》第二版第6章堆。 下面是简要流程。欢迎讨论 */ /*初始化定时器*/ void __init timer_init(void) { static struct timer *dummy_heap; int i; open_softirq(TIMER_SOFTIRQ, timer_softirq_action); /* * All CPUs initially share an empty dummy heap. Only those CPUs that * are brought online will be dynamically allocated their own heap. */ SET_HEAP_SIZE(&dummy_heap, 0); SET_HEAP_LIMIT(&dummy_heap, 0); for ( i = 0; i < NR_CPUS; i++ ) { spin_lock_init(&timers[i].lock); timers[i].heap = &dummy_heap; } } /* 当软中断发生时,函数执行 在定时器优先队列中查找满足expires的定时器,从队列中摘除,然后执行之 */ static void timer_softirq_action(void) { int           cpu = smp_processor_id(); struct timer *t, **heap; s_time_t      now; void        (*fn)(void *); void         *data; DPRINTK(5, "%s:%d\n", __FUNCTION__, __LINE__); spin_lock_irq(&timers[cpu].lock); do { heap = timers[cpu].heap; now  = NOW(); //以此取定时器优先队列中最优先定时器 //然后执行其过程 while ( (GET_HEAP_SIZE(heap) != 0) && ( (t = heap[1])->expi...

gcc装载具体库的的方法总结

注:该总结主要来自: bugfly z 的buzz.感谢bugfly z,以及回帖的盆友,如果有不完善的地方,欢迎拍砖。 1.环境变量LD_PRELOAD LD_PRELOAD 后面接的是具体的库文件全路径,可以接多个 参考:http://blog.csdn.net/haoel/archive/2007/05/09/1602108.aspx 2.是方案1的变体。直接把库名加到列表加到/etc/ld.so.preload. 该方法会影响到系统里所有应用。 程序加载时,LD_PRELOAD加载路径优先级高于/etc/ld.so.preload 3. 环境变量LD_LIBRARY_PATH LD_LIBRARY_PATH 指定查找路径,这个路径优先级别高于系统预设的路径 假如现在需要在已有的环境变量上添加新的路径名,则采用如下方式: LD_LIBRARY_PATH=NEWDIRS:$LD_LIBRARY_PATH.(newdirs是新的路径串) 4. gcc 中的 -L 和 -l参数  -Wl参数 放在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接了,但如果库文件没放在这三个目录里,而是放在其他目录里,这时另外一个参数-L就派上用场了,比如常用的X11的库,它在/usr/X11R6/lib目录下,我们编译时就要用-L/usr/X11R6/lib -lX11参数,-L参数跟着的是库文件所在的目录名。 -Wl,表示后面的参数将传给link程序ld 5.LD程序硬编码了一些库搜索路径 查看方法: 00653000-0066e000 r-xp 00000000 08:07 1320479 /lib/ld-2.11.1.so 0066e000-0066f000 r--p 0001a000 08:07 1320479 /lib/ld-2.11.1.so 0066f000-00670000 rw-p 0001b000 08:07 1320479 /lib/ld-2.11.1.so $ strings /lib/ld-2.11.1.so | grep lib ... display library search paths /lib/ /usr/lib/ /lib/i486-linux-gnu/ /usr/lib/i486-linux-gnu/ ...

xenarm irq routine

/*  当一个异常出现以后,ARM微处理器会执行以下几步操作: (这些是中断发生时,自动处理的)  1、 将下一条指令的地址存入相应连接寄存器LR,以便程序在处理异常返回时能从正确的位置重新开始执行。若异常是从ARM状态进入,LR寄存器中保存的是下一 条指令的地址(当前PC+4或PC+8,与异常的类型有关);若异常是从Thumb状态进入,则在LR寄存器中保存当前 PC的偏移量,这样,异常处理程序就不需要确定异常是从何种状态进入的。例如:在软件中断异常SWI,指令MOV PC,R14_svc总是返回到下一条指令,不管SWI是在ARM状态执行,还是在Thumb状态执行。  2、将CPSR复制到相应的SPSR中。  3、根据异常类型,强制设置CPSR的运行模式位。  4、 强制PC从相关的异常向量地址取下一条指令执行,从而跳转到相应的异常处理程序处。还可以设置中断禁止位,以禁止中断发生.当有异常发生时,处理器会跳转 到对应的0xffff0000起始的向量处取指令,然后,通过b指令散转到异常处理代码.因为ARM中b指令是相对跳转,而 且只有+/-32MB的寻址范围,所以把__stubs_start~__stubs_end之间的异常处理代码复制到了0xffff0200起始处.这 里可直接用b指令跳转过去,这样比使用绝对跳转(ldr)效率高。   */         b       vector_undefined_instruction + stubs_offset         ldr     pc, .LCvswi + stubs_offset         b       vector_prefetch_abort + stubs_offset         b       vector_data_abort + stubs_offset         b       vector_addrexcptn + stubs_offset         b       vector_irq + stubs_offset         b       vector_FIQ + stubs_offset #define INSTALL_VECTOR_STUB(name, offset, mode, correction, branch_table)         ...

回顾2010

这一年就要过完了,照例要总结一下,这一年都做了一些什么。明年的这个时候应该都拿到offer了。等待毕业和入职了。每想到此,既兴奋又紧张。明年的一年又是紧张的一年,不知道系统能否顺利做完。 这一年最大的收获,应该是入了Linux的门,并且看了不少关于编译链接,计算机系统结构和操作系统方面的书。感觉羽翼一点点丰满,不过,当然距离大牛还有很长的路要走。 上半年的时候,基本上把精力都放在了Linux驱动方面了。看过了宋宝华的Linux驱动开发的书和Linux Device Driver,除此之外,还看了unstanding linux kenrel.和Linux kernel development. 下半年把精力都放在了项目上,移植了yaffs到xenarm上,并且将原来支持的128MB支持到了768MB,当然最大能够达到950MB。将xenheap的大小扩大到了64MB。这一块,我感觉,还是蛮有成就感。内存太小,肯定干不成事情。跑一个android,最少需要70MB以上的,原来的128MB一定是不够用的。特别是,当yaffs在xenarm里面跑成功以后,那种感觉是难以形容的。每看到自己写的代码,就像看到自己的孩子似的。现在的xenarm已经能够跑起来两个android了。不过缺点是,相关的设备虚拟化程度仍然不够。调度算法仍然不完整,调度两个android,明显bug太多,另外,由于设备虚拟化的问题,现在只能跑两个一模一样的系统。因为要公用nand嘛,nand里放的是root fs.在下半年,也看了一些书,这些书,增加了我的一些自信。《自己动手写OS-第二版》《程序员自我修养--链接装载与库》《代码揭秘》《CODE》其中前两本,给我的感觉很棒。除此之外,还看了PHP和SHELL方面的两本书,同时还看了正则表达式方面的书。当然,看过之后,没有怎么用,都忘记了,不过重新拾起来应该比较快。 去年的这个时候,我按照月份,把每个月所做的事情都列了一下。今年,想到此,便想到了在实验室每个月7号写的QA,我想也许是因为,我对QA已经恐惧了,所以,不写的那么具体了。总结一下,以告慰自己,又过了一年,没有虚度年华。

xenarm代码片段注释

ENTRY(ret_to_user)       test_all_events :         disable_irq     r1                      @ ensure IRQs are disabled               bl      get_irq_stat                    @ get softirq pending status         ldr     r1, [r0, #OFFSET_SOFTIRQ_PENDING]@指针操作,返回值放到r0中         ldr     r0, = 0xffff           tst     r1, r0                          @ bit mask check is needed!!!         beq     test_guest_events         enable_irq      r1                      @ sti       @ r1.. ok??????         bl      do_softirq         b       test_all_events /*  disable_irq r1         .macro  disable_irq, temp         msr     cpsr_c, #PSR_STATUS_I | PSR_MODE_SVC //只更改控制位0~8,禁止中断标志位         .endm   */ ENTRY(test_guest_events)         vcpu    r10                           @从在xenheap中堆栈页的最下部分得到vcpu结构         ldr     r11, [r10, #OFFSET_VCPU_INFO] @获得vcpu_info         ldrb    r9, [r11, #OFFSET_EVTCHN_UPCALL_MASK]     @r9为evtchn_upcall_mask         tst     r9, # 0xFF                                  @如果r9为非零则,bne...

like-linux系统链表原理简单分析

  1 /*   2  like-linux系统下链表结构分析   3  *在like-linux系统中,链表的可移植性比较好,并不像在大学学到的链表结构那样的死板。其原理在很多linux的讲解中都有描述。   4  *原理部分可以看一下李先静老师写的《系统程序员成长之路》一书。   5  *本文根据xenarm中的链表来具体得理一下在like-linux系统中的链表原理。   6     7  *因为时间有限,只是把相关宏定义简单扩展,并把代码做了注释和筛捡。没有成文,望各位看官见谅   8   */   9  10  11 /*  12  *定义了一个相关结构和spinlock  13   */  14 spinlock_t consistent_lock;  15 struct  arm_vm_region {  16          struct  list_head        vm_list;  17          unsigned   long            vm_start;  18          unsigned   long            vm_end;  19    ...