Linux Kernel
hzpeterchen
hzpeterchen@gmail.com
cn.linkedin.com/in/hzpeterchen/
展开
-
在系统初始化过程中始能终端串口输出
因为要移植kgdb, 需要串口在系统初始化的过程中就能使用,而以前的代码串口终端打印要到串口驱动初始化完成后才能生效.所以决定把在init/main.c里start_kernel的console_init给用起来,这样kgdb也可以用,调试串口驱动前的代码也可以用.下面是一些要点:1. console_init会执行放在*(.con_initcall.init)段里的代码,而conso原创 2010-02-04 09:55:00 · 802 阅读 · 0 评论 -
My Kernel patch
http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git&a=search&h=refs%2Fheads%2Fmaster&st=author&s=Peter+Chen原创 2011-02-18 10:24:00 · 567 阅读 · 0 评论 -
在没有打印以及ICE无法连接的情况下,如何知道kernel hang的位置
前提是reset板子不会照成memory被reset方法一(已测试):1. 打开你的System.map文件,找到symbol: __log_buf比如:806d6f88 b __log_buf这里的地址0x806d6f88是虚拟地址,不过是和物理地址一一对应的,一般双方只差一个最高4位的偏移。本例中__log_buf的物理地址是0x106d6f882. boo原创 2012-11-02 17:04:36 · 782 阅读 · 0 评论 -
内核启动的一些总结
1. arm linux boot flowmap_io is called very early, which is at paging_init the kernel_init will not go on running until kthreadd has created(complete(&kthreadd_done))__define_initcall is calle原创 2010-04-08 11:05:00 · 447 阅读 · 0 评论 -
Linux下timer延时的使用
因笔者工作在嵌入式平台上(非x386),下面给出的结论仅在arm平台上测试过。1. 在原子上下文,延迟应该少于100微秒。使用udelay2. 在非原子上下文延迟的使用0-100us: 使用udelay100us以上: 使用usleep_range20ms以上且不要求精确: 使用msleepmsleep不精确,完全可以用usleep_range代替。原创 2012-10-19 16:24:08 · 8235 阅读 · 2 评论 -
__raw_writel, writel_relaxed 和 writel的区别
因为对别的平台不了解,下面仅谈它们在ARM上的区别__raw_writel: 因为有volatile关键字, 所以编译器不会打乱多个__raw_writel的执行顺序。对于ARM而言,当多个写以代码的顺序到达相同设备时,执行的顺序也是被保证的,不过对于不同的设备,执行的顺序就不被保证了。write_relaxed: 在ARM平台上与__raw_writel一样,因为原创 2012-07-22 08:50:14 · 11952 阅读 · 1 评论 -
Linux的内存管理的一些总结
1. kmalloc:在arm平台上, kmalloc是以cache line的字节数对齐的,比如cortex A8, A15是64bytes 对齐,而cortex A9则是32bytes 对齐。2. 如何知道系统中可用的memorythe free memory is MemFree + Buffers + Cached + SwapFree3. 内存分配原创 2010-04-08 10:47:00 · 813 阅读 · 0 评论 -
Linux内核中USB充电器的解决方案
当前最新的内核(v3.5)对USB充电器的整体方案支持的不是太好,这里讨论的USB充电器的方案仅指软件方案,即充电器的检测需要由软件干预(比如读取USB PHY的寄存器), 同时电池的充电值根据充电器的不同类型,需要由软件来设置。 硬件检测充电器及硬件自动选择充电电流不在此讨论之列。软件的方案的好处是: 可以省去一个USB充电器的检测芯片以及使用更简单(便宜)的电池管理芯片,原创 2012-06-26 09:30:15 · 3443 阅读 · 0 评论 -
根文件系统是如何挂载的?
1. 创建虚拟文件系统(在ram中)。 fn: vfs_caches_init2. 根据u-boot bootargs的参数得到的设备名,比如/dev/mmcblk0p1到block class去找到主次设备号。fn: name_to_dev_t3. 挂载block设备上的分区到根文件系统。fn:prepare_namespace原创 2011-02-17 15:06:00 · 527 阅读 · 0 评论 -
ARM Linux相关
1. The page table at Arm LinuxIt is the New ARMv6 page table, with The Not-Global (nG) bit, The Shared (S) bit, The Execute-Never (XN) bit,Three access permission bits.The L1 base address is read原创 2010-04-08 10:52:00 · 584 阅读 · 0 评论 -
对内核高精度timer体系的一些分析
因为在vim下输入英文比较方便, 所以一般初稿都是用英文写的.下面的分析是基于最新的内核(2.6.33)的.there is not included at current platform commented #在kernel的time目录里,会根据不同的编译选项来选择不同的tick模式,一般为以下模式(arm)带#为没有编译进内核的.obn-$(CONFIG_GEN原创 2010-03-17 15:41:00 · 2378 阅读 · 0 评论 -
Kernel Memory Layout on ARM Linux
Start End Use --------------------------------------------------------------------------ffff8000 ffffffff copy_user_page / clear_user_page use.转载 2010-03-10 09:18:00 · 1580 阅读 · 1 评论 -
Linux Kernel API (2.6)
For UP system #protect share dataspin_lock/spin_unlock: protect the data during process context(and only at process context), and make sure your code bewteen lock/unlock is fast enough.There may原创 2010-02-26 09:39:00 · 591 阅读 · 0 评论 -
Kernel Preempt
在CONFIG_PREEMPT打开的情况下:#explicit preempt:Call schedule()#Implicit preempt1. The kernel return from interrupt2. The kernel return from the code that preemption is disabled.How to adjust the原创 2010-02-26 09:35:00 · 487 阅读 · 0 评论 -
在linux内核里有关共享中断的使用
以Linux2.6.32 arm内核为例: 注册:一般要使用中断,会在初始化函数或probe函数里调用request_irq申请中断, 如果是共享中断(两个IO共享一个物理中断号),要加上标志IRQF_SHARED调用关系为: request_irq->request_threaded_irq->__setup_irq, 在32的内核里如果你申请的中断是IRQF_SHARED|IR原创 2010-02-12 14:44:00 · 2790 阅读 · 1 评论 -
Linux Linker 的顺序
今天发现initramfs的产生比driver的加载早,感觉有点奇怪,仔细看了一下。1.init/initramfs.crootfs_initcall(populate_rootfs);2.include/linux/init.h#define pure_initcall(fn) __define_initcall(fn, 0原创 2015-11-05 16:49:01 · 688 阅读 · 0 评论