2009年4月30日 星期四

2009年4月23日 星期四

Linux init call

[linux-2.6.28.3]
在 Linux kernel 中做 init call 的做法..很有趣..
在 link script 中加入幾個section..

include/asm-generic/vmlinux.lds.h
#define INITCALLS \
*(.initcallearly.init) \
VMLINUX_SYMBOL(__early_initcall_end) = .; \
*(.initcall0.init) \
*(.initcall0s.init) \
*(.initcall1.init) \
*(.initcall1s.init) \
*(.initcall2.init) \
*(.initcall2s.init) \
*(.initcall3.init) \
*(.initcall3s.init) \
*(.initcall4.init) \
*(.initcall4s.init) \
*(.initcall5.init) \
*(.initcall5s.init) \
*(.initcallrootfs.init) \
*(.initcall6.init) \
*(.initcall6s.init) \
*(.initcall7.init) \
*(.initcall7s.init)

arch/x86/kernel/vmlinux_32.lds.S
.initcall.init : AT(ADDR(.initcall.init) - LOAD_OFFSET) {
__initcall_start = .;
INITCALLS
__initcall_end = .;
}

include/linux/init.h
#define __define_initcall(level,fn,id) \
static initcall_t __initcall_##fn##id __used \
__attribute__((__section__(".initcall" level ".init"))) = fn

/*
* Early initcalls run before initializing SMP.
*
* Only for built-in code, not modules.
*/
#define early_initcall(fn) __define_initcall("early",fn,early)

/*
* A "pure" initcall has no dependencies on anything else, and purely
* initializes variables that couldn't be statically initialized.
*
* This only exists for built-in code, not for modules.
*/
#define pure_initcall(fn) __define_initcall("",fn,0)

#define core_initcall(fn) __define_initcall("1",fn,1)
#define core_initcall_sync(fn) __define_initcall("1s",fn,1s)
#define postcore_initcall(fn) __define_initcall("2",fn,2)
#define postcore_initcall_sync(fn) __define_initcall("2s",fn,2s)
#define arch_initcall(fn) __define_initcall("3",fn,3)
#define arch_initcall_sync(fn) __define_initcall("3s",fn,3s)
#define subsys_initcall(fn) __define_initcall("4",fn,4)
#define subsys_initcall_sync(fn) __define_initcall("4s",fn,4s)
#define fs_initcall(fn) __define_initcall("5",fn,5)
#define fs_initcall_sync(fn) __define_initcall("5s",fn,5s)
#define rootfs_initcall(fn) __define_initcall("rootfs",fn,rootfs)
#define device_initcall(fn) __define_initcall("6",fn,6)
#define device_initcall_sync(fn) __define_initcall("6s",fn,6s)
#define late_initcall(fn) __define_initcall("7",fn,7)
#define late_initcall_sync(fn) __define_initcall("7s",fn,7s)

init/main.c
static void __init do_initcalls(void)
{
initcall_t *call;

for (call = __early_initcall_end; call < __initcall_end; call++)
do_one_initcall(*call);

/* Make sure there is no pending stuff from the initcall sequence */
flush_scheduled_work();
}

static void __init do_pre_smp_initcalls(void)
{
initcall_t *call;

for (call = __initcall_start; call < __early_initcall_end; call++)
do_one_initcall(*call);
}


Bootchart

看 Linux 開機 flow 的好工具~~
Bootchart

當然還其它類似的工具..
如~
bootchart-lite
ubootchart

主要寫這個 blog 是每次我都會忘掉.. bootchart.jar 要怎麼產生~ @@

bash> ant jar

這樣子就行了..

記得要裝 Apache Ant

2009年4月13日 星期一

ACPI個鬼~~

最近比較常幫 Linux 那邊在試一些 power saving 的東西
在 PC 下.. 主要都是透過 ACPI 來做 power management
所以對 ACPI 又接觸了一些~~

Linux ACPI FAQ

有提到怎麼利用 Linux 下的 console 來 debug ASL code
我們也可以自己把 BIOS 的 DSDT 換掉..來做測試

ACPI 還蠻有趣的..不過 spec 大了點..
嗯..Revision 3.0a 有 624頁~~


2009年4月9日 星期四

2009年4月1日 星期三

Kernel Modesetting (KMS)

將原本 X server 設定 graphics mode 的工作(在 X server's DDX drivers 中)..搬到 kernel 來做..
還蠻有趣的.. 在 2.6.29 中己加入~~

下面是一些相關的link
Kernel Modesetting and Memory Management