Hello world!

欢迎使用 WordPress。这是您的第一篇日志。您可以编辑它或是删除它,然后开始写您自己的博客。

Posted in 未分类 | 1 Comment

谢谢你,橙子帮

   记不太清楚具体的时间了,06年年中的时候灰灰菜论坛复活了,无意中我也成为橙子帮的一员,虽然后面论坛又关闭,不过一群朋友在QQ上依然有联系,之间发生了好多事情,我的QQ上也多了一个组----橙子帮,QQ群里也有一个橙子帮的群,师傅,XX,师姐,师妹,师叔等等,我一直把他/她们当成一群可亲可敬的人,而我在群里也大部分扮演欢乐豆的角色,在带给大家快乐的同时,我也很快乐,他/她们给了我很多快乐的时间,不过今天我要说,别了,橙子帮!谢谢你,橙子帮!
  
   也许之间发生了很多事情,但当今天看到橙子一本正经的说不甩我,说要把我逐出师门的时候,我的眼眶湿润了,也许是我太冲动,也许是我不成熟,但既然我留在这里带给你的只是烦恼,那我就选择离开吧,在看到一个"滚....."之后,我点了退出群,然后把橙子帮的人也拉入了黑名单,接着把另外的几个群也退了........不过我会永远记住你们这些朋友的,永远记得生日时候师傅送的棕子,XX认真的要帮我介绍工作,跟师妹的斗嘴,还有忧郁漂亮的师姐,可爱的树叶MM,可亲的一秘大哥,整天喊着想橙子的3.5,还有有一面之缘为情所困的小黑,可爱的PP,亲切的00======.......

   或许这只是个导火索,最近一直比较头疼,头疼QQ,放在上面的时间和注意力太多了,一直想找个时间好好整理下,一年就这样过去了,原来的一年之约时间到了,可是我没有脸面再去提这件事,但我必须忘记该忘记的,必须有全新的生活....在专业上,我已经落后我同学一大截,原来的自豪感全无,吃老本的感觉..工作也不见起色,有点混日子过的感觉.过一天算一天,无斗志,无激情.无聊????

   整理整理.............................

  

Posted in 未分类 | 2 Comments

一个为难了好久的错误(关于C)

 最近在改进程序,遇到一个问题,找了二天,今天上午终于发现了原因,不知道算不算粗心的问题

 是一个if语句,判断一个变量累加到一定值后进行的处理,并且有其他的判断
 
原来是这样的 
if(i++ == 5 && 0==j)
{
  i=0;
  .....
}


结果if语句老是得不到执行,今天再试验了下发现不是不执行,而是执行的时间要很久,分析了下是i大于了5,以致于得溢出后再累加等于5才执行括号里面的语句,暂时改成i++>=5,正常了

再分析了下,原来是当i++刚好等于5的时候,后面的j不等于0,于是不执行i的清零动作,在下次累加之后i就大于5了,然后得溢出后才能再次执行。

分析得到这个原因,把上面语句改下即可
if(0==j && i++ == 5)
{
  i=0;
  .....
}
结果正确
以后得注意这点,如果把累加放到判断里面,放在条件判断的最后判断位置。。

Posted in 硬件 | 3 Comments

(转)AT91RM9200开发笔记:为Linux-2.6.20添加MTD驱动

 开发板上只有Nor Flash,所以为了实现层次文件系统,需要为Linux2.6.20增加Nor Flash MTD驱动支持。其实工作量并不大,因为已经有现成的程序可供参考。

 

    MTD的驱动程序都集中在drivers/mtd里面。我们需要做的,仅仅是在drivers/mtd/maps下增加自己的分区表。因为有参考的代码,所以比较容易。

 

(1)构建配置选项

 

    首先,根据edb7312.c构建自己的mtd分区表驱动。

 






$cd drivers/mtd/maps/
$cp edb7312.c at91rm9200.c


 

    然后,修改Kconfig,增加自己的配置选项。


 





//拷贝过EDB7312稍作修改即可
config MTD_AT91RM9200
        tristate "CFI Flash device mapped on AT91RM9200"
        depends on ARM && MTD_CFI
        help
          This enables access to the CFI Flash on the ATMEL AT91RM9200DK board.
          If you have such a board, say 'Y' here.


 

    最后,修改Makefile,增加编译项目。

 






obj-$(CONFIG_MTD_EDB7312) += edb7312.o
obj-$(CONFIG_MTD_AT91RM9200) += at91rm9200.o


 

    这样,自己建立的MTD分区表驱动就可以编译进内核了。

 

(2)修改分区表信息

 

    因为第一步的工作中,at91rm9200.c实际上还是edb7312.c的内容,所以需要根据自己的开发板nor flash的配置做一下修改。

 






#include <linux/module.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <asm/io.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/map.h>

#ifdef CONFIG_MTD_PARTITIONS
#include <linux/mtd/partitions.h>
#endif

#define WINDOW_ADDR 0x10000000 /* physical properties of flash */
#define WINDOW_SIZE 0x00800000 /* intel 28F640J3A 8MB */
#define BUSWIDTH 2 /* data bus width 16bits */
/* can be "cfi_probe", "jedec_probe", "map_rom", NULL }; */
#define PROBETYPES { "cfi_probe", NULL }

#define MSG_PREFIX "AT91RM9200-NOR:" /* prefix for our printk()'s */
#define MTDID "at91rm9200-%d" /* for mtdparts= partitioning */

static struct mtd_info *mymtd;

struct map_info at91rm9200nor_map = {
        .name = "NOR flash on AT91RM9200DK",
        .size = WINDOW_SIZE,
        .bankwidth = BUSWIDTH,
        .phys = WINDOW_ADDR,
};

#ifdef CONFIG_MTD_PARTITIONS

/*
 * MTD partitioning stuff
 */

static struct mtd_partition at91rm9200nor_partitions[5] =
{
        {
                
// U-boot 128KB
                .name = "U-boot",
                .size = 0x20000,
                .offset = 0
        },
        {
                
// uImage 2MB
                .name = "Kernel",
                .size = 0x200000,
                .offset = 0x20000
        },
        {
                
// RootFS 3MB
                .name = "RootFS",
                .size = 0x300000,
                .offset = 0x220000
        },
        {
                
// UserFS
                .name = "Jffs2",
                .size = 0x2C0000,
                .offset = 0x520000
        },
        {
                
// Parameters
                .name = "Parameters",
                .size = 0x20000,
                .offset = 0x7E0000
        },
};

static const char *probes[] = { NULL };

#endif

static int mtd_parts_nb = 0;
static struct mtd_partition *mtd_parts = 0;

int __init init_at91rm9200nor(void)
{
        static const char *rom_probe_types[] = PROBETYPES;
        const char **type;
        const char *part_type = 0;

        printk(KERN_NOTICE MSG_PREFIX "0x%08x at 0x%08xn",
               WINDOW_SIZE, WINDOW_ADDR);
        at91rm9200nor_map.virt = ioremap(WINDOW_ADDR, WINDOW_SIZE);

        if (!at91rm9200nor_map.virt) {
                printk(MSG_PREFIX "failed to ioremapn");
                return -EIO;
        }

        simple_map_init(&at91rm9200nor_map);

        mymtd = 0;
        type = rom_probe_types;
        for(; !mymtd && *type; type++) {
                mymtd = do_map_probe(*type, &at91rm9200nor_map);
        }
        if (mymtd) {
                mymtd->owner = THIS_MODULE;

#ifdef CONFIG_MTD_PARTITIONS
                mtd_parts_nb = parse_mtd_partitions(mymtd, probes, &mtd_parts, 0);
                if (mtd_parts_nb > 0)
                  part_type = "detected";

                if (mtd_parts_nb == 0)
                {
                        mtd_parts = at91rm9200nor_partitions;
                        mtd_parts_nb = ARRAY_SIZE(at91rm9200nor_partitions);
                        part_type = "static";
                }
#endif
                add_mtd_device(mymtd);
                if (mtd_parts_nb == 0)
                  printk(KERN_NOTICE MSG_PREFIX "no partition info availablen");
                else
                {
                        printk(KERN_NOTICE MSG_PREFIX
                               "using %s partition definitionn", part_type);
                        add_mtd_partitions(mymtd, mtd_parts, mtd_parts_nb);
                }
                return 0;
        }

        iounmap((void *)at91rm9200nor_map.virt);
        return -ENXIO;
}

static void __exit cleanup_at91rm9200nor(void)
{
        if (mymtd) {
                del_mtd_device(mymtd);
                map_destroy(mymtd);
        }
        if (at91rm9200nor_map.virt) {
                iounmap((void *)at91rm9200nor_map.virt);
                at91rm9200nor_map.virt = 0;
        }
}

module_init(init_at91rm9200nor);
module_exit(cleanup_at91rm9200nor);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Marius Groeger <mag@sysgo.de>");
MODULE_DESCRIPTION("Generic configurable MTD map driver");


 

(3)配置内核

 

    增加MTD,和相应的文件系统的支持。

 

    Devices Drivers --->

            Memory Technology Devices (MTD) --->

                 <*> Memory Technology Device(MTD) support

                 <*> MTD partitioning support

                 <*> Direct char device access to MTD devices

                 <*> Caching block device access to MTD devices

                 RAM/ROM/Flash chip drivers --->

                     <*> Detect flash chips by Common Flash Interface(CFI) probe

                     <*> Support for Intel/Sharp flash chips

                 Mapping drivers for chip access --->

                     <*> CFI Flash device mapped on AT91RM9200

    File Systems --->

           Miscellaneous filesystems --->

                这里选择cramfs或者Jffs2的支持。

 

(4)编译,然后加载

 

    make Image编译,然后制作成uImage。

 






TOPDIR=$($(which pwd))
TMP=$TOPDIR/linux.bin
TARGET=$TOPDIR/uImage

arm-linux-objcopy -O binary -S vmlinux $TMP && gzip -v9 $TMP &&
mkimage -n 'RAM disk' -A arm -O linux -T kernel -C gzip
        -a 0x20008000 -e 0x20008000 -d $TMP.gz $TARGET &&
cp $TARGET /mnt/hgfs/common &&
rm -f $TMP*


 

    这是JFFS2作为根文件系统的信息:

 






AT91RM9200-NOR:0x00800000 at 0x10000000
NOR flash on AT91RM9200DK: Found 1 x16 devices at 0x0 in 16-bit bank
 Intel/Sharp Extended Query Table at 0x0031
Using buffer write method
cfi_cmdset_0001: Erase suspend on write enabled
AT91RM9200-NOR:using static partition definition
Creating 5 MTD partitions on "NOR flash on AT91RM9200DK":
0x00000000-0x00020000 : "U-boot"
0x00020000-0x00220000 : "Kernel"
0x00220000-0x00520000 : "RootFS"
0x00520000-0x007e0000 : "Jffs2"
0x007e0000-0x00800000 : "Parameters"


 





JFFS2 notice: (1) jffs2_build_xattr_subsystem: complete building xattr subsystem, 0 of xdatum (0 unchecked, 0 orphan) and 0 of xref (0 dead, 0 orphan) found.
VFS: Mounted root (jffs2 filesystem).
Freeing init memory: 100K
init started: BusyBox v1.9.1 (2008-03-15 15:28:44 CST)
starting pid 710, tty '': '/etc/init.d/rcS'


 

    可以看到MTD分区信息。进入shell界面,然后查看/proc/mtd,如下:

 






[root@lqm ~]#cat /proc/mtd
dev: size erasesize name
mtd0: 00800000 00020000 "NOR flash on AT91RM9200DK"
mtd1: 00020000 00020000 "U-boot"
mtd2: 00200000 00020000 "Kernel"
mtd3: 00300000 00020000 "RootFS"
mtd4: 002c0000 00020000 "Jffs2"
mtd5: 00020000 00020000 "Parameters"


 

    可以看到加载是正确的。

 





 

附:MAC地址全零的解决








/*
 * Set the ethernet MAC address in dev->dev_addr
 */

static void __init get_mac_address(struct net_device *dev)
{
        #if 0
        /* Check Specific-Address 1 */
        if (unpack_mac_address(dev, at91_emac_read(AT91_EMAC_SA1H), at91_emac_read(AT91_EMAC_SA1L)))
                return;
        /* Check Specific-Address 2 */
        if (unpack_mac_address(dev, at91_emac_read(AT91_EMAC_SA2H), at91_emac_read(AT91_EMAC_SA2L)))
                return;
        /* Check Specific-Address 3 */
        if (unpack_mac_address(dev, at91_emac_read(AT91_EMAC_SA3H), at91_emac_read(AT91_EMAC_SA3L)))
                return;
        /* Check Specific-Address 4 */
        if (unpack_mac_address(dev, at91_emac_read(AT91_EMAC_SA4H), at91_emac_read(AT91_EMAC_SA4L)))
                return;
        #endif

        static char def_mac[] = {0x36, 0xB9, 0x04, 0x00, 0x24, 0x80};
        memcpy(dev->dev_addr, def_mac, 6);
        printk(KERN_ERR "at91_ether: Your bootloader did not configure a MAC address.n");
}


 

    位置是drivers/net/arm/at91_ether.c。这样就获得临时解决了。如果不想显示Your bootloader did not configure a MAC address.的提示,那么在memcpy(dev->dev_addr, def_mac, 6);后面添加return;就可以了。
Posted in 嵌入式系统 | Leave a comment

Linux 2.6.20.x内核编译配置选项简介(转)

内容目录
1. Code maturity level options 2
2. General setup 常规安装选项 2
3. Loadable module support 引导模块支持 5
4. Block layer 6
5. Processor type and features 处理器类型及特性 8
6. Power management options (ACPI, APM) 17
7. Bus options (PCI, PCMCIA, EISA, MCA, ISA) 总线选项 22
8. Executable file formats 24
9. Networking support 网络支持。 25
10. Device Drivers 设备驱动 47
11. File systems 文件系统 82
12. Instrumentation Support 测试用的支持项目 86
13. Kernel hacking 内核调试。 86
14. Security options 安全选项。 88
15. Cryptographic options 密码选项。 88
16. Library routines 常规的库。 95



说明1:
文字中的Y表示选择进内核。M表示编成模块。N表示不选择。有的只能选Y,有的只能选M。
在make menuconfig 下,*表示Y,M表示M,空白表示N。
make xconfig下,√ 表示Y,· 表示M,空白表示N。

说明2:
菜单中,有的选项你选了Y才出现,有的选了Y,它反而不会出现。有的选项根本不会提供选择。所以我提供的菜单项应该不是最完整的设置选项。如果你碰到了新的选项,你可以认真看它的英文说明,或者通过上网搜索、在论坛提问等方式来了解它。


1. Code maturity level options
代码完成等级选项
1.1. Prompt for development and/or incomplete code/drivers
对开发中的或者未完成的代码和驱动进行提示。
LINUX下的很多东西,比如网络设备、文件系统、网络协议等等,它们的功能、稳定性、或者测试等级等等还不能够符合大众化的要求,还处于开发之中。这就 是所谓的阿尔法版本:最初开发版本;接下来的是BETA版本,公开测试版本。如果这是阿尔法版本,那么开发者为了避免收到诸如“为何这东西不工作”的信件 的麻烦,常常不会让它发布出去。但是,积极的测试和使用阿尔法版本对软件的开发是非常好的。你只需要明白它未必工作得很好,在某些情况有可能会出问题。汇 报详细的出错情况对开发者很有帮助。
这个选项同样会让一些老的驱动的可用。很多老驱动在将来的内核中已经被代替或者被移除。除非你想要帮助软件的测试,或者开发软件,或者你的机器 需要这些特性,否则你可以选N,那样你会在配置菜单中得到较少的选项。如果你选了Y,你将会得到更多的阿尔法版本的驱动和代码的配置菜单。
2. General setup 常规安装选项
2.1. Local version - append to kernel release
在你的内核后面加上一串字符来表示版本。这些字符在你使用uname -a 命令时会显示出来。你的字符最多不能超过64位。
2.2. Automatically append version information to the version string (LOCALVERSION_AUTO)
自动生成版本信息。这个选项会自动探测你的内核并且生成相应的版本,使之不会和原先的重复。这需要Perl的支持。
由于在编译的命令make-kpkg 中我们会加入- - append-to-version 选项来生成自定义版本,所以这里选N。
2.3. Support for paging of anonymous memory (swap)
这个选项将使你的内核支持虚拟内存,也就是让你的计算机好象拥有比实际内存更多的内存空间用来执行很大的程序。这个虚拟内存在LINUX中就是SWAP分区。除非你不想要SWAP分区,否则这里必选Y。
2.4. System V IPC (IPC:Inter Process Communication)
中间过程连接是一组功能和系统调用,使得进程能够同步和交换信息。这通常来说是好事,有一些程序只有你选择了Y才能运行 。特别地,你想在LINUX下运行 DOS仿真程序,你必须要选Y。
你可以用info ipc 命令来了解IPC。
一定要选Y。
2.4.1. IPC Namespaces (IPC_NS)
IPC命名空间,命名空间的作用是区别同名的东西,就比如李宁和张宁,都叫“宁”,加个姓才能区分。这个选项也是为不同的服务器提供IPC的多命名,达到一个IPC提供多对象支持的目的。不清楚的话选N。
2.5. POSIX Message Queues 可移植操作系统接口信息队列
可移植操作系统接口信息队列是IPC的一部分,在通信队列中有较高的优先权来保持通信畅通。如果你想要编译和运行在Solaris操作系统上写的 POSIX信息队列程序,选Y,同时你还需要 mqueue 库来支持这些特性。它是作为一个文件系统存在(mqueue),你可以mount它。为保证以后的不同程序的协同稳定,如果不清楚,选Y。
2.6. BSD Process Accounting BSD进程统计
如果你选Y,用户级别的程序就可以通过特殊的系统调用方式来通知内核把进程统计信息记录到一个文件,当这个进程存在的时候,信息就会被内核记录进文件。信息通常包括建立时间、所有者、命令名称、内存使用、控制终端等。这对用户级程序非常有用。所以通常选Y是一个好主意。
2.6.1. BSD Process Accounting version 3 file format
选Y,统计信息将会以新的格式(V3)写入,这格式包含进程ID和父进程。注意这个格式和以前的 v0/v1/v2 格式不兼容,所以你需要升级相关工具来使用它。
2.7. Export task/process statistics through netlink (EXPERIMENTAL)
处于实验阶段的功能。通过通用的网络输出工作/进程的相应数据,和BSD不同的是,这些数据在进程运行的时候就可以通过相关命令访问。和BSD类似,数据将在进程结束时送入用户空间。如果不清楚,选N。
2.8. UTS Namespaces
通用终端系统的命名空间。它允许容器,比如Vservers利用UTS命名空间来为不同的服务器提供不同的UTS。如果不清楚,选N。
2.9. Auditing support 审计支持(AUDIT)
允许审计的下层能够被其他内核子系统使用,比如SE-Linux,它需要这个来进行登录时的声音和视频输出。没有 CONFIG_AUDITSYSCALL 时(即下一个选项)无法进行系统调用。
2.9.1. Enable system-call auditing support (AUDITSYSCALL)
允许系统莫道不消魂独立地或者通过其他内核的子系统,调用审计支持,比如SE-Linux。要使用这种审计的文件系统来查看特性,请确保 INOTIFY 已经被设置。
上一项的子选项,两项要选就都选。我并不清楚审计的意义,可能是为了调用其他内核的东西吧。所以就都选了,因为我机器上还有个官方2.6.15-27内核。
2.10. Kernel .config support
这个选项允许.config文件(即编译LINUX时的配置文件)保存在内核当中。
它提供正在运行中的或者还在硬盘中的内核的相关配置选项。可以通过内核镜像文件 kernel image file 用命令 script scripts/extract-ikconfig 来提取出来,作为当前内核重编译或者另一个内核编译的参考。如果你的内核在运行中,可以通过/proc/config.gz文件来读取。下一个选项提供这 项支持。
看起来好像是一个不错的功能,可以把编译时的 .config文件保存在内核中,以供今后参考调用。用来重编译和编译其他的内核的时候可以用上。你是一个编译内核的狂人的话,这项要选上(比如我,不过我总是会备份所有的 .config 文件)。
2.10.1. Enable access to .config through /proc/config.gz
上一项的子项,可以通过/proc/config.gz 访问当前内核的.config 。新功能,上一项选的话这个就选上吧。
2.11. Cpuset support
多CPU支持。这个选项可以让你建立和管理CPU集群,它可以动态地将系统分割在各个CPU和内存节点中,在各个节点是独立运行的。这对大型的系统尤其有效。
如果不清楚,选N。
2.12. Kernel->user space relay support (formerly relayfs)
内核系统区和用户区进行传递通讯的支持。这个选项在特定的文件系统中提供数据传递接口支持,它可以提供从内核空间到用户空间的大批量的数据传递工具和设施。
如果不清楚,选N。
2.13. Initramfs source file(s)
没有可选项。
2.14. Optimize for size (Look out for broken compilers!)
这个选项将在GCC命令后用 "-Os" 代替 "-O2"参数,这样可以得到更小的内核。警告:某些GCC版本会导致错误。如果有错,请升级你的GCC。
如果不清楚,选N。
这是优化内核大小的功能,没必要选。一个编译好的内核才7-10多M,大家不会少这么点空间吧。选上了可能会出一些问题。最好不选。
2.15. Configure standard kernel features (for small systems)
这个选项可以让内核的基本选项和设置无效或者扭曲。这是用于特定环境中的,它允许“非标准”内核。你要是选它,你一定要明白自己在干什么。
这是为了编译某些特殊用途的内核使用的,例如引导盘系统。通常你可以不选择这一选项,你也不用关心他的子选项。
3. Loadable module support 引导模块支持
3.1. Enable loadable module support
这个选项可以让你的内核支持模块,模块是什么呢?模块是一小段代码,编译后可在系统内核运行时动态的加入内核,从而为内核增加一些特性或是对某种 硬件进行支持。一般一些不常用到的驱动或特性可以编译为模块以减少内核的体积。在运行时可以使用modprobe命令来加载它到内核中去(在不需要时还可 以移除它)。一些特性是否编译为模块的原则是,不常使用的,特别是在系统启动时不需要的驱动可以将其编译为模块,如果是一些在系统启动时就要用到的驱动比 如说文件系统,系统总线的支持就不要编为模块,否则无法启动系统。在启动时不用到的功能,编成模块是最有效的方式。你可以查看MAN手册来了解: modprobe, lsmod, modinfo, insmod 和 rmmod.
如果你选了这项,你可能需要运行 "make modules_install" 命令来把模块添加到/lib/modules/目录下,以便 modprobe 可以找到它们。
如果不清楚,选Y。
3.2. Module unloading
这个选项可以让你卸载不再使用的模块,如果不选的话你将不能卸载任何模块(有些模块一旦加载就不能卸载,不管是否选择了这个选项)。
如果不清楚,选Y。
3.2.1. Forced module unloading
这个选项允许你强行卸除模块,即使内核认为这不安全。内核将会立即移除模块,而不管是否有人在使用它(用rmmod -f 命令)。这主要是针对开发者和冲动的用户提供的功能。
如果不清楚,选N。
3.3. Module versioning support (MODVERSIONS)
有时候,你需要编译模块。有时候,你需要编译模块。选这项会添加一些版本信息,来给编译的模块提供独立的特性,以使不同的内核在使用同一模块时区别于它原有的模块。这有时可能会有点用。
如果不清楚,选N。
3.4. Source checksum for all modules
这个功能是为了防止你在编译模块时不小心更改了内核模块的源代码但忘记更改版本号而造成版本冲突。
如果不清楚,选N。
3.5. Automatic kernel module loading
允许内核自动加载模块。一般情况下,如果我们的内核在某些任务中要使用一些被编译为模块的驱动或特性时,我们要先使用modprobe命令来加载它,内核才能使用。不过,如果你选择了这个选项,在内核需要一些模块时它可以自动调用modprobe命令来加载需要的模块。
如果不清楚,选Y。
4. Block layer
块设备。
4.1. Enable the block layer (BLOCK)
这选项使得块设备可以从内核移除。如果不选,那么 blockdev 文件将不可用,一些文件系统比如 ext3 将不可用。这个选项会禁止 SCSI 字符设备和 USB 储存设备,如果它们使用不同的块设备。
选Y,除非你知道你不需要挂载硬盘和其他类似的设备。不过此项无可选项。
4.1.1. Support for Large Block Devices (LBD)
如果你要用大于2TB的硬盘,选这个。
4.1.2. Support for tracing block io actions
对块设备进行跟踪和分析的功能。
4.1.3. Support for Large Single Files (LSF)
大文件支持。如果你准备建的文件大于2TB,选这个。
4.1.4. IO Schedulers 磁盘I/O调度器
I/O是输入输出带宽控制,主要针对硬盘,是核心的必須的东西。这里提供了三个IO调度器。
4.1.4.1. Anticipatory I/O scheduler
抢先式 I/O 调度方式是默认的磁盘调度方式。它对于大多数环境通常是比较好的选择。但是它和Deadline I/O 调度器相比有点大和复杂,它有时在数据调入时会比较慢。
4.1.4.2. Deadline I/O scheduler
Deadline I/O调度器简单而又紧密,在性能上和抢先式调度器不相上下,在一些数据调入时工作得更好。至于在单进程I/O磁盘调度上,它的工作方式几乎和抢先式调度器相同,因此也是一个好的选择。
看介绍这个好像比上面的更好,可以试试。不过按照我的平衡观点,好东西都会带来问题。
4.1.4.3. CFQ I/O scheduler
CFQ调度器尝试为所有进程提供相同的带宽。它将提供平等的工作环境,对于桌面系统很合适。
4.1.4.4. Default I/O scheduler 选择默认的I/O调度器
我选了Anticipatory I/O scheduler。
我这样理解上面三个IO调度器:抢先式是传统的,它的原理是一有响应,就优先考虑调度。如果你的硬盘此时在运行一项工作,它也会暂停下来先响应用户。
期限式则是:所有的工作都有最终期限,在这之前必须完成。当用户有响应时,它会根据自己的工作能否完成,来决定是否响应用户。
CFQ则是平均分配资源,不管你的响应多急,也不管它的工作量是多少,它都是平均分配,一视同仁的。
5. Processor type and features 处理器类型及特性
5.1. Symmetric multi-processing support (SMP) 对称多处理器支持。
这将支持有多CPU的系统。如果你的系统只有一个CPU,选N。反之,选Y。
如果你选N,内核将会在单个或者多个CPU的机器上运行,但是只会使用一个CPU。如果你选Y,内核可以在很多(但不是所有)单CPU的机器上运行,在这样的机器,你选N会使内核运行得更快。
注意如果你选Y,然后在Processor family选项中选择"586" or "Pentium" ,内核将不能运行在486构架的机器上。同样的,多CPU的运行于PPro构架上的内核也无法在 Pentium 系列的板上运行。
使用多CPU机器的人在这里选Y,通常也会在后面的选项“Enhanced Real Time Clock Support”中选Y。如果你在这选Y,"Advanced Power Management" 的代码将不可用。
如果不清楚,选N。
5.2. Subarchitecture Type 子构架类型
5.2.1. PC-compatible
选这个如果你的机器是标准PC
5.2.2. AMD Elan
注意,如果你是 K6/Athlon/Opteron处理器不要选这个
5.2.3. Voyager
5.2.4. NUMAQ (IBM/Sequent)
5.2.5. Summit/EXA (IBM x440)
5.2.6. SGI 320/540 (Visual Workstation)
5.2.7. Generic architecture (Summit, bigsmp, ES7000, default)
5.2.8. Support for Unisys ES7000 IA32 series
5.3. Processor family
处理器类型。针对自己的CPU类型,选取相应的选项。
这里是处理器的类型。这里的信息主要目的是用来优化。为了让内核能够在所有X86构架的CPU上运行(虽然不是最佳速度),在这你可以选386。
内核不会运行在比你选的构架还要老的机器上。比如,你选了Pentium构架来优化内核,它将不能在486构架上运行。
如果你不清楚,选386。
5.3.1. - "386"
5.3.2. - "486"
5.3.3. - "586"
5.3.4. - "Pentium-Classic"
5.3.5. - "Pentium-MMX"
5.3.6. - "Pentium-Pro"
5.3.7. - "Pentium-II"
5.3.8. - "Pentium-III"
5.3.9. - "Pentium-4"
5.3.10. - K6, K6-II and K6-III
5.3.11. - "Athlon" K7 (Athlon/Duron/Thunderbird).
5.3.12. -Opteron/Athlon64/Hammer/K8
5.3.13. - "Crusoe"
5.3.14. - "Efficeon"
5.3.15. - "Winchip-C6"
5.3.16. - "Winchip-2"
5.3.17. - "Winchip-2A"
5.3.18. - "GeodeGX1"
5.3.19. - "Geode GX/LX"
5.3.20. - "CyrixIII/VIA C3"
5.3.21. - VIA C3-2 "Nehemiah".
5.4. Generic x86 support
通用X86支持。
除了对上面你选择的X86 CPU进行优化,它还对更多类型X86 CPU的进行优化。这将会使内核在其他的X86 CPU上运行得更好。
对于供应商来说,他们非常需要这些功能,因为他们需要更通用的优化支持。
这个选项提供了对X86系列CPU最大的兼容性,用来支持一些少见的x86构架的CPU。如果你的CPU能够在上面的列表中找到,就里就不用选了。
5.5. HPET Timer Support
HPET时钟支持
允许内核使用 HPET 。HPET 是代替当前8254的下一代时钟,全称叫作高精度事件定时器。你可以安全地选Y。但是,HEPT只会在支持它的平台和BIOS上运行。如果不支持,8254将会激活。
选N,将继续使用8254时钟。
5.6. Maximum number of CPUs (2-255)
设置最高支持的CPU数,无法选择。我的显示为8。
5.7. SMT (Hyperthreading) scheduler support
超线程调度器支持
超线程调度器在某些情况下将会对 Intel Pentium 4 HT系列有较好的支持。
如果你不清楚,选N。
5.8. Multi-core scheduler support
多核调度机制支持,双核的CPU要选。
多核心调度在某些情况下将会对多核的CPU系列有较好的支持。
如果你不清楚,选N。
5.9. Preemptible Kernel 抢先式内核。
一些优先级很高的程序可以先让一些低优先级的程序执行,即使这些程序是在核心态下执行。从而减少内核潜伏期,提高系统的响应。当然在一些特殊的点的内核是不可抢先的,比如内核中的调度程序自身在执行时就是不可被抢先的。这个特性可以提高桌面系统、实时系统的性能。
下面有三个选项:
5.9.1. No Forced Preemption (Server) 非强迫式抢先。
这是传统的LINUX抢先式模型,针对于高吞吐量设计。它同样在很多时候会提供很好的响应,但是也可能会有较长的延迟。
如果你是建立服务器或者用于科学薄雾浓云愁永昼运算,选这项,或者你想要最大化内核的原始运算能力,而不理会调度上的延迟。
5.9.2. Voluntary Kernel Preemption (Desktop) 自动式内核抢先
这个选项通过向内核添加更多的“清晰抢先点”来减少内核延迟。这些新的抢先点以降低吞吐量的代价,来降低内核的最大延迟,提供更快的应用程序响 应。这通过允许低优先级的进程自动抢先来响应事件,即使进程在内核中进行系统调用。这使得应用程序运行得更“流畅”,即使系统已经是高负荷运转。
如果你是为桌面系统编译内核,选这项。
5.9.3. Preemptible Kernel (Low-Latency Desktop) 可抢先式内核(低延迟桌面)
这个选项通过使所有内核代码(非致命部分)编译为“可抢先”来降低内核延迟。
这通过允许低优先级进程进行强制抢先来响应事件,即使这些进程正在进行系统调用或者未达到正常的“抢先点”。这使得应用程序运行得更加“流畅”即使系统已经是高负荷运转。代价是吞吐量降低,内核运行开销增大。
选这项如果你是为桌面或者嵌入式系统编译内核,需要非常低的延迟。
如果你要最快的响应,选第三项。我认为万物是平衡的,低延迟意味着系统运行不稳定,因为过多来响应用户的要求,所以我选第二个。
5.10. Preempt The Big Kernel Lock
抢先式大内核锁(早期Linux用于支持SMP系统时所采用的非细粒度锁)
这个选项通过让大内核锁变成“可抢先”来降低延迟。
选Y如果你在构建桌面系统。如果你不清楚,选N。
5.11. Machine Check Exception 机器例外检查
机器例外检查允许处理器在检测到问题(比如过热、组件错误)时通知内核。内核根据问题的严重程度来决定下一步行为,比如在命令行上打印告警信息, 或者关机。你的处理器必须是 Pentium或者更新版本才能支持这个功能。 用cat /proc/cpuinfo来检测你的 CPU是否有mce 标志。
注意一些老的 Pentium 系统存在设计缺陷,会提供假的MCE事件,所以在所有P5处理器上MCE被禁用,除非在启动选项上明确 "mce"参数。同样地,如果MCE被编译入内核并在非标准的机器上导致错误,你可以用"nomce"启动参数来禁用MCE。
MCE功能会自动忽视非MCE处理器,比如386和486,所以几乎所有人都可以在这里选Y。
5.11.1. Check for non-fatal errors on AMD Athlon/Duron / Intel Pentium 4
检测AMD Athlon/Duron / Intel Pentium 4的非致命错误
允许这项特性,系统将会启动一个计时器,每5秒进行检测。非致命问题会自动修正(但仍然会记录下来),如果你不想看到这些信息,选N。这些信息可以让你发现要损坏的硬件,或者是非标准规格硬件(比如:超频的)。
这个功能只会在特定的CPU上起作用。
5.11.2. check for P4 thermal throttling interrupt.
检测P4节能器中断
当P4进入节能状态时,打印信息。
5.12. Toshiba Laptop support 东芝笔记本支持。
这个选项是针对Toshiba笔记本的,可以用来访问Toshiba的系统管理模式,可以直接设置BIOS。不过要注意它只在 Toshiba自己的 BIOS中起作用。假如你有一台Toshiba笔记本,而它的BIOS是Phoenix的,那这个选项仍然是无用的。
5.13. Dell laptop support
DELL笔记本支持。功能同上
5.14. Enable X86 board specific fixups for reboot
X86板的重启修复功能。
这将打开芯片或者主板上的重启修复功能 ,从而能够使之正常工作。这功能仅仅在一些硬件和BIOS的特定组合上需要。需要这项功能的征兆是重启时使系统卡死或者挂起。
目前,这个修复功能仅仅支持Geode GX1/CS5530A/TROM2.1.的组合。
选Y如果你需要这项功能,目前,选Y是安全的,即使你不需要它。否则,选N。
5.15. /dev/cpu/microcode - Intel IA32 CPU microcode support
是否支持Intel IA32架构的CPU。这个选项将让你可以更新Intel IA32系列处理器的微代码,显然你需要到网上去下载最新的代码,LINUX不提供这些代码。当然你还必须在文件系统选项中选择/dev file system support才能正常的使用它。如果你把它译为模块 ,它将是 microcode。
IA32主要用于高于4GB的内存。详见下面的“高内存选项”。
5.16. /dev/cpu/*/msr - Model-specific register support
是否打开CPU特殊功能寄存器的功能。这个选项桌面用户一般用不到,它主要用在Intel的嵌入式CPU中的,这个寄存器的作用也依赖与不同的CPU类型而有所不同,一般可以用来改变一些CPU原有物理结构的用途,但不同的CPU用途差别也很大。
5.17. /dev/cpu/*/cpuid - CPU information support
是否打开记录CPU相关信息功能。这会在/dev/cpu中建立一系列的设备文件,用以让过程去访问指定的CPU。
5.18. High Memory Support (4GB) 高容量内存支持
LINUX能够在X86系统中使用64GB的物理内存。但是,32位地址的X86处理器只能支持到4GB大小的内存。这意味着,如果你有大于4GB的物理内存,并非都能被内核“永久映射”。这些非永久映射内存就称为“高阶内存”。
如果你编译的内核永远都不会运行在高于1G内存的机器上,选OFF(默认选项,适合大多数人)。这将会产生一个"3GB/1GB"的内存空间划 分,3GB虚拟内存被内核映射以便每个处理器能够“看到”3GB的虚拟内存空间,这样仍然能够保持4GB的虚拟内存空间被内核使用,更多的物理内存能够被 永久映射。
如果你有1GB-4GB之间的物理内存,选4GB选项。如果超过4GB,那么选择64GB。这将打开 Intel 的物理地址延伸模式(PAE)。PAE将在IA32处理器上执行3个层次的内存页面。PAE是被LINUX完全支持的,现在的Intel处理器 (Pentium Pro 和更高级的)都能运行PAE模式。注意:如果你选64GB,那么在不支持PAE的CPU上内核将无法启动。
你机器上的内存能够被自动探测到,或者你可以用类似于"mem=256M"的参数强制给内核指定内存大小。
5.18.1. off 如果不清楚,选OFF。
5.18.2. 4GB 选这项如果你用的是32位的处理器,内存在1-4GB之间。
5.18.3. 64GB 选这项如果你用的是32位的处理器,内存大于4GB。
5.19. Memory model 内存模式
5.19.1. Flat Memory 平坦内存模式。
这个选项允许你改变内核在内部管理内存的一些方式。大多数用户在这只会有一个选项:Flat Memory。这是普遍的和正确的选项。
一些用户的机器有更高级的特性,比如 NUMA 和内存热拔插,那将会有不同的选项。Discontiguous Memory(非接触式内存模式)是一个更成熟、更好的测试系统。但是对于内存热拔插系统不太合适,会被"Sparse Memory"代替。如果你不清楚"Sparse Memory"和"Discontiguous Memory"的区别,选后者。
如果不清楚,就选Flat Memory。
5.19.2. Sparse Memory 稀疏内存模式。
这对某些系统是唯一选项,包括内存热拔插系统。这正常。
对于其他系统,这将会被Discontiguous Memory选项代替。这个选项提供潜在的更好的特性,可以降低代码复杂度,但是它是新的模式,需要更多的测试。
如果不清楚,选择"Discontiguous Memory" 或 "Flat Memory"。
我的机器上只有这两个选项,我选Flat Memory。
5.20. 64 bit Memory and IO resources (EXPERIMENTAL)
64位内存和IO资源
这个选项将使内存和IO资源变成64位的。
实验选项,可以让内存和I/O变为64位。我的总线是32位的,所以还是不选了。选了不知道会不会出错。
5.21. Math emulation
数学仿真
LINUX可以仿真一个数学协处理器(用来进行浮点运算),如果你没有的话。486DX 和 Pentium 处理器内建有数学协处理器。486SX和386的没有,除非你专门加过487DX 或者387协处理器。所有人都需要协处理器或者这个仿真。
如果你没有数学协处理器,你需要在这选Y。如果你有了协处理器还在这选Y,你的协处理器仍然被用到。这意味着如果你打算把编译的内核用在不同的机器上,选Y是明智的选择。
如果不清楚,选Y,这将使内核增加66KB,无伤大雅。
5.22. MTRR (Memory Type Range Register) support
内存类型区域寄存器
在 Intel P6 系列处理器(Pentium Pro, Pentium II 和更新的)上,MTRR将会用来规定和控制处理器访问某段内存区域的策略。
如果你在PCI或者AGP总线上有VGA卡,这将非常有用。例如可将MTTR设为在显存的地址范围上使用“write-combining”策 略,这样CPU可以在PCI/AGP总线爆裂之前将多次数据传输集合成一个大的数据传输,这样可以提升图像的传送速度2.5倍以上。选Y,会生成文件 /proc/mtrr,它可以用来操纵你的处理器的MTRR。典型地,X server 会用到。
这段代码有着通用的接口,其他CPU的寄存器同样能够使用该功能。Cyrix 6x86, 6x86MX和 M II处理器有ARR ,它和 MTRR有着类似的功能。AMD K6-2/ K6-3有两个MTRR, Centaur C6有8个MCR允许复合写入。所有这些处理器都支持这段代码,你可以选Y如果你有以上处理器。
选Y同样可以修正SMP BIOS的问题,它仅为第一个CPU提供MTRR,而不为其他的提供。这会导致各种各样的问题,所以选Y是明智的。
你可以安全地选Y,即使你的机器没有MTRR。这会给内核增加9KB。
5.23. Boot from EFI support
EFI启动支持
这里允许内核在EFI平台上使用储存于EFI固件中的系统设置启动。这也允许内核在运行时使用EFI的相关服务。
这个选项只在有EFI固件的系统上有用,它会使内核增加8KB。另外,你必须使用最新的ELILO 登录器才能使内核采用EFI的固件设置来启动(GRUB和LILO完全不知道EFI是什么东西)。即使你没有EFI,却选了这个选项,内核同样可以启动。
大家应该用的是GRUB,所以选上这个也没什么用。
5.24. Enable kernel irq balancing (IRQBALANCE) 中断平衡。
这个选项使系统进行中断平衡。
如果你是双核CPU,如果不选这项,那么中断负荷都在第一个CPU上,其他的CPU可能得不到中断。
5.25. Use register arguments (REGPARM) 寄存器参数使用。
使用寄存器参数
用‘-mregparm=3’的参数编译内核。这使 gcc 使用更高效的应用程序二进制接口(ABI)来跳过编译时的前三个调用寄存器参数。这使得代码编译更精巧更快速。
如果你不选这个选项,默认的ABI将会使用。
如果不清楚,选Y。
5.26. Enable seccomp to safely compute untrusted bytecode (SECCOMP)
允许SECCOMP(快速计算)安全地运算非信任代码。
这个内核特性在程序出现数码错误,需要重新对非信任的代码进行运算时非常有效。它使用管道或者其他传输方式,使文件描述进程支持读/写的系统调用,这样可以利用SECCOMP隔离那些程序本身的空间。
一旦 seccomp 通过/proc/<pid>/seccomp运行,它将不能停止,任务也只能进行一些安全的被seccomp认证的系统调用。
如果不清楚,选Y。只有嵌入式系统选N。
5.27. Timer frequency 时钟频率
允许设置时钟频率。
这是用户定义的时钟中断频率 100HZ-1000 HZ ,不过 100 HZ 对服务器和NUMA系统更合适,它们不需要很快速的响应用户的要求,因为时钟中断会导致总线争用和缓冲打回。注意在SMP环境中,时钟中断由变量 NR_CPUS * Hz定义在每个CPU产生。
其实和前面的抢先式进程差不多,就是多少频率来响应用户要求。我选了250HZ的。要快点的可以选1000HZ的。但是还是那句话,一切是平衡的。机器过快响应你,它自己的活就不知道做得好不好了。
5.27.1. 100 HZ (HZ_100)
100 HZ是传统的对服务器、SMP 和 NUMA的系统选项。这些系统有比较多的处理器,可以在中断较集中的时候分担中断
5.27.2. 250 HZ (HZ_250)
250 HZ对服务器是一个好的折衷的选项,它同样在SMP 和 NUMA 系统上体现出良好的反应速度。
5.27.3. 1000 HZ (HZ_1000)
1000 HZ对于桌面和其他需要快速事件反应的系统是非常棒的。
5.28. kexec system call (KEXEC) 快速重启调用。
kexec 系统调用
kexec是一个用来关闭你当前内核,然后开启另一个内核的系统调用。它和重启很像,但是它不访问系统固件。由于和重启很像,你可以启动任何内核,不仅仅是LINUX。
kexec这个名字是从 exec 系统调用来的。它只是一个进程,可以确定硬件是否正确关闭,所以如果这段代码没能正确为你进行初始化工作,请不要奇怪。它对设备的热拔插会有点帮助。由于它对硬件接口会乱写点东西,所以我没什么好的建议给你。
Linus本人都没话说,估计是受害不浅。我们当然不能上当,选N!
5.29. Support for hot-pluggable CPUs (EXPERIMENTAL)
对热拔插CPU的支持
选Y,可以做个实验,把CPU关闭和打开,也可以中止SMP系统。CPU可以通过/sys/devices/system/cpu 来进行控制。
5.30. Compat VDSO support (COMPAT_VDSO)
Compat VDSO 支持
如果你运行的是最新的glibc(GNU C函数库)版本( 2.3.3 或更新),选N,这样可以移除高阶的VDSO 映射,使用随机的 VDSO。
如果不清楚,选Y。
5.31. Firmware Drivers 固件驱动。
固件就是你板上的BIOS、各种显卡芯片之类的已经固化好的记录某些特定数据的东西。
5.31.1. BIOS Enhanced Disk Drive calls determine boot disk
BIOS加强磁盘功能,确定启动盘。
选y或M,如果你要使用BIOS加强磁盘服务功能来确定BIOS用哪个磁盘来启动。启动后这个信息会反映在系统文件中。
这个选项是实验性的,而且已经被确认在某些未测试选项下会启动失败。很多磁盘控制器的BIOS供应商都不支持这个特性。
5.31.2. BIOS update support for DELL systems via sysfs
用于DELL机器的BIOS升级支持。
5.31.3. Dell Systems Management Base Driver (DCDBAS)
DELL系统管理器的基本驱动。
6. Power management options (ACPI, APM)
电源管理选项(ACPI、APM)
6.1. Power Management support
电源管理支持
电源管理意味着你电脑上的某一部分在不用的时候可以关闭或者休眠。这领域有两个竞争对手:APM和ACPI。如果你需要两者之一,请把这里选上,再把下面的相关内容选上。
电源管理对于使用电池的笔记本相当重要。如果你有笔记本,请参照几个网站上的说明。
注意,即使你在这选N,在X86构架的机器上,LINUX会发出 hlt 指令如果没有任务,因此会让处理器休眠,达到节电的目的。
6.1.1. Legacy Power Management API (PM_LEGACY)
电源管理继承接口
为pm_register() (电源管理寄存器)和同类寄存器提供支持。
如果不清楚,选Y。
6.1.2. Power Management Debug Support
电源管理调试支持
这个选项提供详细的电源管理调试信息。当你调试和报告电源管理漏洞的时候非常有用,有点像电源管理的“中断”支持。
6.1.3. Driver model /sys/devices/.../power/state files (DEPRECATED)
驱动模式文件 /sys/devices/.../power/state (不赞成使用)
这个驱动模式通过系统文件类型启动,试图来给电源管理设备提供用户空间连通装置。这个特性从来没有能很好地工作过,除非是用来进行测试,否则它处在被移除之列。我们不清楚用通用的方法能否进行各种各样的设备电源管理,目前是专用的总线和驱动来替代相关功能。
6.2. ACPI Support 高级电源配置接口支持
高级电源设置接口(ACPI)支持需要整合了ACPI的平台(固件/硬件),并且这个平台要支持操作系统和电源管理软件的设置。这个选项会给你的内核增加70KB。
LINUX ACPI提供了相当强大的电源接口,甚至可以取代一些传统的设置和电源管理接口,包括PNP BIOS(即插即用BIOS)规范,MPS(多处理器规范),和APM(高级电源管理)规范。如果ACPI和APM同时被选上,先被系统调用的起作用。
6.2.1. AC Adapter AC 交流电源适配器
这个驱动给AC 交流电源适配器提供支持,它指示出系统是否在AC下工作。如果你的系统可以在AC和电池状态下切换,选Y。
6.2.2. Battery 电池
这个驱动通过/proc/acpi/battery 提供电池信息。如果你有使用电池的移动系统,选Y。
6.2.3. Button 按钮
这个驱动通过电源、休眠、锁定按钮来提交事件。后台程序读取/proc/acpi/event 来运行用户要求的事件,比如关机。这对软件控制关机是必要的。
6.2.4. Video (ACPI_VIDEO) 视频
提供ACPI对主板上的集成显示适配器的扩展支持驱动。详见ACPI2.0驱动范例,附录B,它提供了基本支持,比如定义视频的启动设备、返回EDID信息或者设置视频传输等等。
注意这仅仅是文字上的信息而已。它可能(或许不可能)在你的集成显卡设备上运行。
6.2.5. Generic Hotkey (EXPERIMENTAL) 通用热键。
实验中的整合式热键驱动。
如果不清楚,选N。
6.2.6. 05.03.05、<*> Fan 风扇
这个驱动对ACPI风扇设备提供支持,允许用户模式的程序进行风扇的基本控制(开、关、状态显示)
6.2.7. Dock
提供ACPI Docking station支持
Docking station是笔记本的扩展坞,就是用来扩展笔记本电脑功能的底座,通过接口和插槽,它可以连接多种外部设备(驱动器、大屏幕显示器、键盘、打印机、扫 描仪……)。可以弥补轻薄笔记本电脑本身携带附件较少的缺陷,这种设计让用户在办公室里能够享受到台式机一样的便利和舒适,在移动办公时又能发挥笔记本的 便携性。
6.2.8. Processor 处理器
这个驱动以空闲管理者方式给LINUX安装ACPI,使用ACPI C2 和 C3处理器状态来节约电能,如果你的系统支持的话。一些CPU频率调节的驱动需要这个功能。
6.2.8.1. Thermal Zone
温控区域
ACPI温控区域驱动。大多数笔记本和台式机支持ACPI温控区域。强烈要求你选Y,否则你的处理器可能会坏掉。
6.2.9. ASUS/Medion Laptop Extras
华硕笔记本扩展支持
6.2.10. IBM ThinkPad Laptop Extras
IBM笔记本扩展支持
6.2.11. Toshiba Laptop Extras
Toshiba笔记本扩展支持
6.2.12. (0) Disable ACPI for systems before Jan 1st this year 千年虫
6.2.13. Debug Statements
调试语句
ACPI驱动可以自定义报告详细的错误信息。选Y开启这项功能,这将让你的内核增加50KB。
6.2.14. ACPI0004,PNP0A05 and PNP0A06 Container Driver
ACPI0004,PNP0A05 和PNP0A06 容器驱动
这里允许物理上对CPU和内存的插入和移除。这对一些系统,比如NUMA,非常有用,这些系统支持ACPI基本的物理拔插。
如果选择M,这个驱动可以通过命令:"modprobe acpi_container"加入。
6.2.15. Smart Battery System
袖珍电池系统
这个驱动对袖珍电池系统提供支持,依赖于I2C (在选项Device Drivers ---> I2C support) 。袖珍电池非常古老,也非常稀少,对于今天的ACPI支持的电池规范来说。
6.3. APM (Advanced Power Management) BIOS Support
高级电源管理BIOS支持。(APM)
ACPI和APM就好比XP和LINUX。我用了ACPI,这个就只编成模块放着,万一要用到再加模块。不清楚的可以先在机器上用ps -A|less看看有没有这个相关的进程。我的只有ACPID。
没有认真研究过下面的选项,也不列出来糊弄人了。要是用到APM的可以自己研究。
6.4. CPU Frequency scaling
6.4.1. CPU Frequency scaling
CPU变频控制
CPU变频控制允许你在运行中改变CPU的时钟速度。这是对于节约电能来说是一个不错的主意,因为CPU频率越低,它消耗的电能越少。
注意这个驱动不会自动改变CPU的时钟速度,你要么允许动态的频率调节器(看下面),要么使用用户工具。
如果不清楚,选N。
6.4.2. Enable CPUfreq debugging
是否允许调试CPU改变主频的功能,如果要调试,还需要在启动时加上参数。cpufreq.debug=<value> 1:变频技术的内核调试 2:变频技术的驱动调试 3:变频技术的调节器调试
6.4.3. CPU frequency translation statistics CPU频率统计功能
6.4.4. CPU frequency translation statistics details CPU频率统计功能(详细)
6.4.5. Default CPUFreq governor (performance) 默认的主频调节,圆括号内的是你选择的结果,这里表示以性能为主。
6.4.5.1. performance 性能优先
6.4.5.2. userspace 用户定义,可以设定频率。
6.4.6. 'performance' governor性能调节器
6.4.7. 'powersave' governor 节约电能调节器。
6.4.8. 'userspace' governor for userspace frequency scaling 用户自定义调节器。
6.4.9. 'ondemand' cpufreq policy governor 自动调节主频。
6.4.10. 'conservative' cpufreq governor 传统方式调节
6.4.11. CPUFreq processor drivers 变频驱动模块
6.4.12. ACPI Processor P-States driver 报告处理器的状态。
6.4.13. AMD Mobile K6-2/K6-3 PowerNow! AMD移动版K6处理器的变频驱动。
6.4.14. AMD Mobile Athlon/Duron PowerNow! AMD移动版毒龙、雷乌的变频驱动。
6.4.15. Cyrix MediaGX/NatSemi Geode Suspend Modulation Cyrix处理器的变频驱动。
6.4.16. Intel Enhanced SpeedStep Intel的移动变频技术支持。
6.4.16.1. Use ACPI tables to decode valid frequency/voltage pairs 使用BIOS中的主频/电压参数。
6.4.16.2. Built-in tables for Banias CPUs 迅驰一代的主频/电压参数。
笔记本 : 什么是迅驰技术
2003年3月英特尔正式发布了迅驰移动计算技术,英特尔的迅驰移动计算技术并非以往的处理器、芯片组等 单一产品形式,其代表了一整套移动计算解决方案,迅驰的构成分为三个部分:奔腾M处理器、855/915系列芯片组和英特尔PRO无线网上,三项缺一不可 共同组成了迅驰移动计算技术。
奔腾M首次改版叫Dothan
在两年多时间里,迅驰技术经历了一次改版和一次换代。初期迅驰中奔腾M处理器的核心代号为Bannis,采用130纳米工艺,1MB高速二级缓 存, 400MHz前端总线。迅驰首次改版是在2004年5月,采用90纳米工艺Dothan核心的奔腾M处理器出现,其二级缓存容量提供到2MB,前端总线仍 为400MHz,它也就是我们常说的Dothan迅驰。首次改版后,Dothan核心的奔腾M处理器迅速占领市场,Bannis核心产品逐渐退出主流。虽 然市场中流行着将Dothan核心称之为迅驰二代,但英特尔官方并没有给出明确的定义,仍然叫做迅驰。也就是在Dothan奔腾M推出的同时,英特尔更改 了以主频定义处理器编号的惯例,取而代之的是一系列数字,例如:奔腾M 715/725等,它们分别对应1.5GHz和1.6GHz主频。首次改版中,原802.11b无线网卡也改为了支持802.11b/g规范,网络传输从 11Mbps提供至14Mbps.
新一代迅驰Sonoma
迅驰的换代是2005年1月19日,英特尔正式发布基于Sonoma平台的新一代迅驰移动计算技术,其构成组件中,奔腾M处理器升级为 Dothan核心、 90纳米工艺、533MHz前端总线和2MB高速二级缓存,处理器编号由奔腾M 730—770,主频由1.60GHz起,最高2.13GHz。915GM/PM芯片组让迅驰进入了PCI-E时代,其中915GM整合了英特尔 GMA900图形引擎,让非独立显卡笔记本在多媒体性能上有了较大提高。915PM/GM还支持单通道DDR333或双通道DDR2 400/533MHz内存,性能提供同时也降低了部分功耗。目前Sonoma平台的新一代迅驰渐渐成为市场主流。
6.4.17. Intel Speedstep on ICH-M chipsets (ioport interface) Intel ICH-M移动南桥芯片组的支持
6.4.18. Intel Pentium 4 clock modulation P4处理器的时钟模块支持。
6.4.19. Transmeta LongRun Transmeta处理器的支持。
6.4.20. VIA Cyrix III Longhaul VIA Cyrix处理器的支持。
6.4.21. shared options
6.4.22. /proc/acpi/processor/../performance interface (deprecated) 从/proc/acpi/processor/../performance获得CPU的变频信息。
6.4.23. Relaxed speedstep capability checks
不全面检测Intel Speedstep,有的系统虽然支持Speedstep技术,却无法通过全面的检测。
7. Bus options (PCI, PCMCIA, EISA, MCA, ISA) 总线选项

7.1. PCI support
PCI总线支持(一定要进内核,不能编成模块)
找找你的主板资料,看看你用的是不是PCI主板。PCI是总线系统的名称,是CPU用来与其他设备进行通信的通道。其他总线系统有ISA、EISA、MCA和VESA。如果你有PCI,选Y。否则,选N。
7.1.1. PCI access mode (Any)
PCI访问模式
在PCI系统中,BIOS可以检测PCI设备和确定它们的设置。但是,一些老的PCI主板有BIOS问题,如果这里选上会让系统当机。同时,一些嵌入式的基于PCI系统没有任何BIOS。LINUX可以在不使用BIOS的情况下尝试直接检测PCI硬件。
选上这个以后,你可以设定LINUX如果检测PCI设备。如果你选择"BIOS",BIOS会用到。你选 "Direct", BIOS不会用到。如果你选"MMConfig",PCI加速的 MMCONFIG 会用到。如果你选"Any" ,内核先用 MMCONFIG ,然后 "Direct",最后才是"BIOS"如果前面的都无法工作。如果不清楚,选"Any"。
7.1.1.1. BIOS
7.1.1.2. MMConfig
7.1.1.3. Direct
7.1.1.4. Any
7.1.2. PCI Express support
PCI Express 支持
这里自动支持 PCI Express 端口总线。用户可以选择 Native Hot-Plug support, Advanced Error Reporting support,
Power Management Event support,Virtual Channel support 4个选项来支持 PCI Express 端口(启动或者切换)。
我的板是PCI Express。大家可以用lshw|less来看看自己的PCI是什么类型。
7.1.2.1. Root Port Advanced Error Reporting support
高级启动错误报告支持。
7.1.3. Message Signaled Interrupts (MSI and MSI-X)
信息信号中断
这允许设备驱动开启MSI。MSI允许一个设备用非装订内存写入方式在自己的PCI总线中产生一个中断,而不是常规的IRQ针脚中断。
在内核启动时,用 'pci=nomsi'选项可以禁用PCI MSI中断。这将在整个系统禁用MSI。
如果不知道怎么做,选N。
7.1.4. Interrupts on hypertransport devices
高速传输设备中断
允许高速传输设备使用中断。
如果不清楚,选Y。
7.2. ISA support ISA总线
看看你主板上是否有ISA插槽。ISA是比较老的总线,现已基本被PCI取代。如果你没有老式的ISA设备,可以不选这项。不过我估计你的主板上 应该会有ISA总路。因为我的INTEL 945板都还有一路,接老式打印机用的。选上备用。如果你认为你永远都不会用到那一路的话,可以不选。
7.2.1. EISA support
扩展工业标准架构总线(EISA)是为IBM 微通道开发的项目。EISA总线可以为IBM 微通道提供一些特性,如果你在使用很老的卡。目前EISA很少用到,已经被PCI取代。选Y,如果你为ESIA系统编译内核。否则,选N。
7.2.2. MCA support
IBM PS/2上的总线,现已淘汰,建议关闭。微通道总线IBM的台式机和笔记本上可能会有这种总线,包括它的p系列、e系列、z系列机器上都用到了这种总线。
7.2.3. NatSemi SCx200 support
松下的一种半导体处理器的驱动。
7.3. PCCARD (PCMCIA/CardBus) support
一般只有笔记本电脑上才会有PCMCIA插槽,如果你是台式机的话,可以不选这一项,然后跳过这一部份。我的IBM机器是办公用的,经常会临时接一些乱七八糟的设备。我自己都不知道哪些设备需要什么模块。所以这里我都搞成模块,免得以后接上用不了,又得切换到XP下。
7.3.1. PCCard (PCMCIA/CardBus) support
PCI Hotplug Support
PCI热插拨支持
选Y,如果你的主板有PCI热拔插控制器,这允许你热拔插PCI卡。
选M,将编译为模块,叫做pci_hotplug。
如果不清楚,选N。
一般来讲只有服务器上会有热插拔的设备,如果你使用的是台式机,你可以不选择此项并跳过这一部份。
8. Executable file formats

可执行文件格式。
8.1. Kernel support for ELF binaries
ELF支持
ELF(可执行和可链接格式)是一种用来连接不同架构和操作系统的可执行文件、库函数格式。选Y,你的内核可以运行ELF二进制文件,这也使你的内核增大13KB。
ELF现在基本代替了传统的 a.out 格式(QMAGIC and ZMAGIC用到),因为它是可移植的(可移植不代表它可以直接运行在不同构架和操作系统上),而且建立相关运行库文件非常容易。很多新的可执行文件都用ELF格式发布,你在这里当然要选Y。
8.2. Kernel support for a.out and ECOFF binaries
对 a.out 和 ECOFF 二进制文件的支持
A.out (Assembler.OUTput)是一种二进制文件格式,它用在最早的UNIX版本中。LINUX在QMAGIC 和 ZMAGIC两个镜像中使用A.out,直到它最近被ELF取代。ELF的转变开始于1995年。这个选项主要是给研究历史的人提供感兴趣的信息,或者你 要是有那个年代的文件,你需要这个选项。
大多数人在这可以选N。如果你认为你有可能会用到这个格式,选M编译成模块。模块名为binfmt_aout。如果你系统的关键部件(比如/sbin/init 或者 /lib/ld.so)是 a.out 格式的的,你要在这选Y。
8.3. Kernel support for MISC binaries
内核对 MISC 二进制文件的支持
如果你在这选Y,它将可以将 wrapper-driven 二进制格式嵌入内核。当你使用一些程序的解释器时,比如 Java, Python, .NET或者Emacs-Lisp,或者当你经常通过DOS 仿真器运行DOS程序时,它将非常有用。当你在这个选项选Y,你可以简单地通过在shell打相应命令运行以上的程序,LINUX可以自动匹配正确的格 式。
要使用 binfmt_misc 你可能需要挂载它:
mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc
你可以选M作为模块,以后再加载,模块名为 binfmt_misc。如果你不知道怎么办,选Y。

Posted in 嵌入式系统 | Leave a comment

linux2.6内核编绎选项

设置内核.
$ph$bbr0~c~0  # cd /usr/src/linux
*Ix7E;wN}0  # make mrproper -----删除不必要的文件和目录.

 

  #make config(基于文本的最为传统的配置界面,不推荐使用)

 

  #make menuconfig(基于文本选单的配置界面,字符终端下推荐使用)

 

  #make xconfig(基于图形窗口模式的配置界面,Xwindow下推荐使用)

 

  #make oldconfig(如果只想在原来内核配置的基础上修改一些小地方,会省去不少麻烦)

 

  它们的目的是一样的,那就是生成一个.config文件

 

  这三个命令中,make xconfig的界面最为友好,如果你可以使用Xwindow,你就用这个好了,这个比较方便,也好设置。如果你不能使用Xwindow,那么就使用make menuconfig好了。界面虽然比上面一个差点,总比make config的要好多了。 LUPA开源社区'L%v l gQ-m0Y W/B
选择相应的配置时,有三种选择,它们分别代表的含义如下:

 

    Y--将该功能编译进内核 LUPA开源社区5t(DR LpN*^[
    N--不将该功能编译进内核
I#d'AhY&?    M--将该功能编译成可以在需要时动态插入到内核中的模块

 

face=Verdana>  如果使用的是make xconfig,使用鼠标就可以选择对应的选项。如果使用的是 make menuconfig,则需要使用空格键进行选取。你会发现在每一个选项前都有个括号, 但有的是中括号有的是尖括号,还有一种圆括号。用空格键选择时可以发现,中括号里要么是空,要么是"*",而尖括号里可以是空,"*"和"M"。这表示前者对应的项要么不要,要么编译到内核里;后者则多一样选择,可以编译成模块。而圆括号的内容是要你在所提供的几个选项中选择一项。

 


:yAr C0NOM3m `0附内核配置选项说明(这是我在网上找到的,还可以,有些也是不一样的,给你一个参考)

 

  代码成熟度选项:

 

Code maturity level options --->LUPA开源社区 B:A?9CB^J
[*] Prompt for development and/or incomplete code/drivers
n(F;Vr3Z&d0[*] Select only drivers expected to compile cleanly

 

  打开使用开发中、不完全的代码/驱动会让内核配置多出很多选项,由于我们需要使用一些正在开发中的功能,因此必需打开这一选项。LUPA开源社区3u,a#CU&Go!p
通用设置选项,

 

General setup --->

 

() Local version - append to kernel release
%p p(P T"n0Z}0这里填入的是64字符以内的字符串,你在这里填上的字符口串可以用uname -a命令看到。
E4NK0x3a;xYi0[*] Support for paging of anonymous memory (swap)
x^{kL'P0这是使用交换分区或者交换文件来做为虚拟内存的,当然要选上了。
.X Q/mxOVx0[*] System V IPC
}hdsQM(fkpv._6T:p%d |0表示系统5的Inter Process Communication,它用于处理器在程序之间同步和交换信息,如果不选这项,很多程序运行不起来LUPA开源社区K [0xPI*?"k
[*] POSIX Message QueuesLUPA开源社区GOs?5n
这是POSIX的消息队列,它同样是一种IPC。建议你最好将它选上
[/^8C X2|H`O0[*] BSD Process AccountingLUPA开源社区8Hmb_*l
这是充许用户进程访问内核将账户信息写入文件中的。这通常被认为是个好主意,建议你最好将它选上。
F#GEz!{%faQ0[*] BSD Process Accounting version 3 file format
XZy+f+x}_*?2D0[*] Sysctl supportLUPA开源社区N4hPTs!~hm2W+o
这个选项能不重新编译内核修改内核的某些参数和变量,如果你也选择了支持/proc,将能从/proc/sys存取可以影响内核的参数或变量。建议你最好将它选上
5dX&FC;ypKS :x 0[ ] Auditing support
7RA4f4y U*[9x0审记支持,用于和内核的某些子模块同时工作,例如SELinux。只有选择此项及它的子项,才能调用有关审记的系统调用
No8L2I2|/OS-M0(15) Kernel log buffer size (16 => 64KB, 17 => 128KB)LUPA开源社区,sH$?"w+~3aU;c H
内核日志缓存的大小,12 => 4 KB,13 => 8 KB,14 => 16 KB单处理器,15 => 32 KB多处理器,16 => 64 KB for x86 NUMAQ or IA-64,17 => 128 KB for S/390LUPA开源社区Y,X[@X,Wtt
[*] Support for hot-pluggable devicesLUPA开源社区i+a i ib8V;h-K|
是否支持热插拔的选项,肯定要选上LUPA开源社区+e-a)Y|pt^F.G
[*] Kernel Userspace Events
~u(C@.f0内核中分为系统区和用户区,这里系统区和用户区进行通讯的一种方式,选上。LUPA开源社区 Z"wj.Z.f xJ
[*] Kernel .config supportLUPA开源社区}#a!l&ng-H
将.config配置信息保存在内核中,选上它及它的子项使得其它用户能从/proc中得到内核的配置
9D ?d^;S_%V0[*] Enable access to .config through /proc/config.gzLUPA开源社区$M%[ u+nE8|n
[ ] Configure standard kernel features (for small systems) --->
Hx-b{8X4X&zocQ0这是为了编译某些特殊的内核使用的,通常你可以不选择这一选项,你也不用对它下面的子项操心了。LUPA开源社区 p~/?#`3b4^Pj'N
--- Configure standard kernel features (for small systems)
0k+z)eF7BS0[ ] Load all symbols for debugging/kksymoops
I3|C3qZ0b!V!t%M0是否装载所有的调试符号表信息,如果你不需要对内核调试,不需要选择此项。
)oSZ_6G$z6?4R"}7N*C0[*] Enable futex support
5R h2G_J+DA~:Z0不选这个内核不一定能正确的运行使用glibc的程序,当然要选上
t_b#Y^0[*] Enable eventpoll supportLUPA开源社区L&Y4bg)veZzh
不选这个内核将不支持事件轮循的系统调用,最好选上
{1QFF+a[0[*] Optimize for size
qQ r$E7c8l)L0这个选项使gcc使用-Os的参数而不是-O2的参数来优化编译,以获得更小尺寸的内核,建议选上。
y/Vkg5^Z0[*] Use full shmem filesystem
.c B"yP&b-PwB0除非你在很少的内存且不使用交换内存时,才不要选择这项
F5PM z+W i/IrD"X;t8M0(0) Function alignment
:g q9AA+Km,H {~(0) Label alignment
!|g2_fD;D0Z6@t0(0) Loop alignmentLUPA开源社区4x o8U!t(qV3C
(0) Jump alignment

 

可加载模块:LUPA开源社区A s'e!xrkVo T.R W
Loadable module support --->
%c#L7q,BQ _0[*] Enable loadable module support
7r9b9^ GiG3L:l0[*] Module unloadingLUPA开源社区M9o j$M{SHu n(u
不选这个功能,加载的模块就不能卸载LUPA开源社区ia HtvV
[ ] Forced module unloading
6XX b z!P5c0[ ] Module versioning support (EXPERIMENTAL)LUPA开源社区U+NTs h3OuQ
[ ] Source checksum for all modulesLUPA开源社区)]+?6~&I6Q[|
[*] Automatic kernel module loading

 

处理器类型及特性:
(qcdT IeFKQ0Processor type and features --->LUPA开源社区z"I3Q8Y9l%E
Subarchitecture Type (PC-compatible) --->
)P^: _ :D 0Processor family (Pentium-4/Celeron(P4-based)/Pentium-4 M/Xeon) --->
0Pjv+z e4i0[ ] Generic x86 supportLUPA开源社区'KUe8YL t;zX'P:e
这一选项针对x86系列的CPU使用更多的常规优化。如果你在上面一项选的是i386、i586之类的才选这个
sFl7V `0[*] HPET Timer SupportLUPA开源社区Q%S/l{,L+r3F/Pp+N
HPET是替代8254芯片的下一代时钟处理器。这里你可以安全的选上这一选项。如果硬件不支持的话,将仍使用8254时钟处理器LUPA开源社区E [?QP UC
[*] Symmetric multi-processing support
p_Q4AkaA0对称多处理器支持,在单CPU的机器上,不选这个选项会更快一些。由于超线程技术,看起来是两颗CPU,因些要选上这个选项LUPA开源社区;]9J2d$hd:bc6s
(1) Maximum number of CPUs (2-255) 支持的最大CPU数
2_4O(L&VK0[ ] SMT (Hyperthreading) scheduler support
;e0HG^8T0[*] Preemptible KernelLUPA开源社区|Y B q$cd
这个选项能使应用程序即使内核在高负载时也很可靠,建议最好选上
J,Qm;h6wT0[*] Machine Check ExceptionLUPA开源社区~yHOt k$C G
这个选项能让CPU检测到系统故障时通知内核,一般我用组装的台式机会选这项。LUPA开源社区o1[-? r ~ :D N
< > Toshiba Laptop supportLUPA开源社区.h%E:L4f[xz0b
< > Dell laptop supportLUPA开源社区:w}i X/s
< > /dev/cpu/microcode - Intel IA32 CPU microcode supportLUPA开源社区$"I:]8~$aJ
< > /dev/cpu/*/msr - Model-specific register supportLUPA开源社区 K Y)z-`T b
< > /dev/cpu/*/cpuid - CPU information supportLUPA开源社区 x6g!WC ~%?)H
Firmware Drivers --->LUPA开源社区pu |8? f$buP
< > BIOS Enhanced Disk Drive calls determine boot disk (EXPERIMENTAL)
'jG4[$u)N.iO P:7]-N:R0High Memory Support (4GB) --->
2r1^'B`Q+o4E R0[ ] Allocate 3rd-level pagetables from highmem
-B n8x6t1Pkg0[ ] Math emulationLUPA开源社区?5m{x~ Rg"D
[*] MTRR (Memory Type Range Register) supportLUPA开源社区K"n5hs#@tW yY
[ ] Boot from EFI support (EXPERIMENTAL)
]-L8f!M#Mf.M0[*] Enable kernel irq balancing
G$ucN&UG/v0[ ] Use register arguments (EXPERIMENTAL) LUPA开源社区9jj&W)}m!aDX
电源管理: LUPA开源社区&c k9s_^ b/V @
Power management options (ACPI, APM) ---> LUPA开源社区T+|!X j/OlG)F_
[*] Power Management support
E9d8ujb j:K#/Q oS0[ ] Power Management Debug Support
1Ik/nj `u[0[ ] Software Suspend (EXPERIMENTAL) LUPA开源社区 I0sT$o| w&slzS
ACPI (Advanced Configuration and Power Interface) Support --->
2_K-vn2@,M,|g&f0APM (Advanced Power Management) BIOS Support ---> LUPA开源社区 ] x1^?OvUfg
CPU Frequency scaling --->

 

ACPI (Advanced Configuration and Power Interface) Support --->
%^-e/v"?T t*s y)}0[*] ACPI Support LUPA开源社区/1ZQ bqpz z
这是一种电源管理方式,你可以看看你的BIOS是否支持。如果支持的话建议你选上这项 LUPA开源社区7qC1v-s$W p w
[ ] Sleep States (EXPERIMENTAL) LUPA开源社区3{M2ily2L7P&z"t
< > AC Adapter
(o2rk,vq S'[0< > Battery
$F O-Y1P7t4y0<*> Button 捕获Power、Sleep、Lid(我也不知道这是什么按钮)等按钮是否按下,并做相应的动作 LUPA开源社区2M;t)C!kkL3n&A
<*> Video 集成在板上的显卡的ACPI支持,对有些板卡可能不起作用 LUPA开源社区?v(s#sI4c+l i
< > Fan
(g|8W bc0<*> Processor
9l^3jIs#M7^0<*> Thermal Zone LUPA开源社区oF,I)wJ'K n
< > ASUS/Medion Laptop Extras LUPA开源社区3Y!~5P}AZ[
< > IBM ThinkPad Laptop Extras LUPA开源社区 Ff+h Rh WP6C.a{h
< > Toshiba Laptop Extras LUPA开源社区K0ch#sno/bB
(0) Disable ACPI for systems before Jan 1st this year LUPA开源社区rWyee1d
[ ] Debug Statements
gq^Oi y0[*] Power Management Timer Support

 

APM (Advanced Power Management) BIOS Support --->
;m&e3eUGn!mI0< > APM (Advanced Power Management) BIOS support
r`X.z@LvW0高级电源管理的支持,一般来说笔记本应该选上,台式机可以不选。
zy/jy SR)l0[ ] Ignore USER SUSPEND LUPA开源社区o F^,#Ea
[*] Enable PM at boot time
`F%o@"X0[ ] Make CPU Idle calls when idle
(qLT8}*F63]0[ ] Enable console blanking using APM LUPA开源社区 tF7g1n7M Bo1[
[ ] RTC stores time in GMT 按Unix的标准,硬件的时钟应该设为格林威治时间 LUPA开源社区8Pn@-@9Sh"W
[ ] Allow interrupts during APM BIOS calls LUPA开源社区u:f S;@6l(Bir
[*] Use real mode APM BIOS call to power off

 

[*] CPU Frequency scaling
C S+B2h hq!|Q0这一选项允许改变CPU的主频,使CPU在低负荷或使用电池时降低主频,达到省电的目的。 LUPA开源社区v-_$R LS:c
[ ] Enable CPUfreq debugging
;fPa0r;z D T0< > /proc/cpufreq interface (deprecated) LUPA开源社区3B8En'm$U4s
Default CPUFreq governor (performance) ---> LUPA开源社区h6FpYu.{8RI&V
--- 'performance' governor
,{q*C7M3t:TO,Y0<*> 'powersave' governor LUPA开源社区x7E+k9X_2r{
<*> 'userspace' governor for userspace frequency scaling
:`LT8eh$hFwh0[ ] /proc/sys/cpu/ interface (2.4. / OLD)
Ki6u;Y6Vh.h&?1't0<*> 'ondemand' cpufreq policy governor自动调节主频 LUPA开源社区 e!vE[J"WC K
<*> CPU frequency table helpers 多数的CPU需要这一项来调节主频
;|V.y*{MR0_0f,_0<*> ACPI Processor P-States driver 报告处理器的状态
(T uj4i&z.hp~0< > AMD Mobile K6-2/K6-3 PowerNow! LUPA开源社区 M+?M rg
< > AMD Mobile Athlon/Duron PowerNow!
,HKU.HY5P nc%f K0< > AMD Opteron/Athlon64 PowerNow!
0ju ^qX:za#Z0< > Cyrix MediaGX/NatSemi Geode Suspend Modulation
VflP0Me}P ]0<*> Intel Enhanced SpeedStep Intel的变频技术支持
#Ia ^ _ Q%z"~a J}0[ ] Use ACPI tables to decode valid frequency/voltage pairs
;A/Sll[9J9C G0--- Built-in tables for Banias CPUs LUPA开源社区*waU@ vfM'Wp
< > Intel Speedstep on ICH-M chipsets (ioport interface) LUPA开源社区.P3E Hj/@&W
< > Intel SpeedStep on 440BX/ZX/MX chipsets (SMI interface) LUPA开源社区s.J6uNCX#b
< > Intel Pentium 4 clock modulation
,g NE9A]}P b0< > nVidia nForce2 FSB changing LUPA开源社区~%j!iH|#R Gk
< > Transmeta LongRun LUPA开源社区@5z&syo1bc%Q%T
< > VIA Cyrix III Longhaul
0tHc`z$u`,B3yK0--- shared options LUPA开源社区J%`6r 2@ }!t'A;G h
[ ] /proc/acpi/processor/../performance interface (deprecated) LUPA开源社区)p~ J.r8}7k [jW;jj
[ ] Relaxed speedstep capability checks

 

总线类型: LUPA开源社区N'`O ^9f Z'Bw1f!B;l
[*] PCI support
+Gl"^2U*Z I0PCI access mode (Any) --->强列建议选Any,系统将优先使用MMConfig,然后使用BIOS,最后使用Direct检测PCI设备。 LUPA开源社区,nu.Qi.L'ap
[ ] Message Signaled Interrupts (MSI and MSI-X) LUPA开源社区A/g"k/x6rN2? {U
[ ] Legacy /proc/pci interface
$p6l6a7t*^)F@!x+B_0[ ] PCI device name database
psI{1}0[ ] ISA support
+m)j)Y2^Jt w0[*] EISA support
(sc|1K?*b0[*] Vesa Local Bus priming
%f-RQ1s{/_7j0[*] Generic PCI/EISA bridge LUPA开源社区&sI+e ?6Iv0x FJ+B5H
[*] EISA virtual root device LUPA开源社区 o ZI HgO"L#a @Y
[ ] EISA device name database LUPA开源社区q1c4p2r3WR-d;O&zO
[ ] MCA support LUPA开源社区c(oo]H}}a
< > NatSemi SCx200 support
a D ~U[wn-aG0PCCARD (PCMCIA/CardBus) support ---> LUPA开源社区"gCbss%t p.AXL`u:Q
PCI Hotplug Support --->

 

PCCARD (PCMCIA/CardBus) support --->一般只有笔记本电脑上才会有PCMCIA插槽,如果你是台式机的话,可以不选这一项,然后跳过这一部份。

 

PCI Hotplug Support ---> LUPA开源社区8[*}:c#TN"oO
< > Support for PCI Hotplug (EXPERIMENTAL)

 

一般来讲只有服务器上会有热插拔的设备,如果你使用的是台式机,你可以不选择此项并跳过这一部份。

 

可执行文件格式,

 

[*] Kernel support for ELF binaries LUPA开源社区S$Q`o7ZS%N
ELF是开放平台下最常用的二进制文件,它支持不同的硬件平台
%f9`c D-G9u0< > Kernel support for a.out and ECOFF binaries
_'O O-R}H0<*> Kernel support for MISC binaries

 

  此选项允许插入二进制的封装层到内核中,当使用Java、.NET、Python、Lisp等语言编写的程序时非常有用

 

  硬件设备相当复杂,看得偶头晕,大家针对自己的设备慎重选择(手边最好准备一本汉英字典:)如果想使用adsl,记得网络部分除了TCP/IP协议还得把ppp部分编译进内核,想当初偶就是把这个给忘了,郁闷了许久。

 

文件系统,
-M,W'T6q~/r0<*> Second extended fs support LUPA开源社区 WmK7O0Zv0]y
[*] Ext2 extended attributes
1I0q9VH0cF0[*] Ext2 POSIX Access Control Lists
7Fi:l!@ D1n.N%D3w_0[*] Ext2 Security Labels LUPA开源社区o4xS f.vu-n7S w%X
<*> Ext3 journalling file system support LUPA开源社区1XLoO2f5w }c$GL
[*] Ext3 extended attributes LUPA开源社区 u~H)sj;D
[*] Ext3 POSIX Access Control Lists
^~'|7K8lN6v0[*] Ext3 Security Labels LUPA开源社区eXM(Cpo%C g.l
[ ] JBD (ext3) debugging support
^J q`$S~0<*> Reiserfs support LUPA开源社区1V5LT-r#D
[ ] Enable reiserfs debug mode
B#Gg$H'e0[ ] Stats in /proc/fs/reiserfs LUPA开源社区Q1_ DOo"cG
[*] ReiserFS extended attributes
Bf,}!c8o/i{ uAU0[*] ReiserFS POSIX Access Control Lists
x/ELs__T%g0[*] ReiserFS Security Labels LUPA开源社区 I ~[)ee9@-h
JFS filesystem support
}?;rEMZ&f7u0[*] JFS POSIX Access Control Lists
V%d#TlB]^%O |0[ ] JFS debugging LUPA开源社区J!Z6{N7IRz
[ ] JFS statistics
z$FD[Ce0XFS filesystem support LUPA开源社区*Dm5T2]jWA
[*] Realtime support (EXPERIMENTAL)
.W8V VRHe0[*] Quota support LUPA开源社区0gD(s+ET8aN
[*] Security Label support
[Ya `eT[|J0[*] POSIX ACL support
T;t O ?a*X-u0< > Minix fs support LUPA开源社区-z(qY3Y/F'_$q
< > ROM file system support LUPA开源社区;g1J2~$j'L
[*] Quota support
/_8Xy!z/h4H(O0< > Old quota format support
9lKU4VL `t |0Quota format v2 support LUPA开源社区Ni4^,[] WT
[*] Dnotify support
InjH*S;H0< > Kernel automounter support
+Rr-N;]%S}8Eh8p0< > Kernel automounter version 4 support (also supports v3) LUPA开源社区)b?p8Bp?
CD-ROM/DVD Filesystems ---> LUPA开源社区6CYJ)X`6z q*X6V]
DOS/FAT/NT Filesystems --->
h;h z'RIPseudo filesystems --->
a YA] r$j0Miscellaneous filesystems ---> LUPA开源社区pu U k?"k
Network File Systems --->
8k^7T1Loa(F0Partition Types ---> LUPA开源社区4F0`O gL$l
Native Language Support ---> LUPA开源社区G Yn[(`_,]+Z$[
Profiling support ---> LUPA开源社区^j9N)`,Sx VD R#
Kernel hacking --->
m-C2I+`:Lx? oh0Security options ---> LUPA开源社区2}U]*u4t
Cryptographic options ---> LUPA开源社区4V~X b{`x R&d
Library routines --->

 

  这个东东你要是搞不来就不要搞,默认的也可以的。先学习一下怎么样编译内核,等成功了,有了经验了在改也没有事的!

 

编译内核: LUPA开源社区#a,Z/Q$xA+F9T
# cd /usr/src/linux
aV~4kgy[0# make dep -----链接程序代码与函数库. LUPA开源社区EY.x y7Ve?/O
# make clean -----删除不必要的模块和文件.
+O(T3yZ1q*@K0# make bzImage -----开始编译系统内核. LUPA开源社区;G1R.vbc+g m
# make modules -----开始编译外挂模块. LUPA开源社区!KzlK@ed
# make modules_install -----安装编译完成的模块.
g`8]KL [2[0要好常时间的,我洗了一件衣服,抽了N根白沙之后,总算完成了,好激动呀!
l6EQ)[e-D0# su - LUPA开源社区x+@o;TX9b P$mF
# /sbin/depmod -a -----创建模块的链接.

 
Posted in 未分类 | Leave a comment

解决gcc与uboot的soft,hardFP问题

昨天说到了想自己建立一个交叉编译环境来编译u-boot,但是失败。今天继续解决这个问题。[truncate]
    首先从网上找到了arm-linux-gcc3.4.1(http://www.handhelds.org/download/projects/toolchain/arm-linux-gcc-3.4.1.tar.bz2),安装成功。
    接着开始编译u-boot1.2。因为我打算以B2为基础增加自己的开发板,所以我首先尝试着编译B2。
    make distclean;make B2_config;make
    但是错误出现了:
    lib_arm/libarm.a(_udivsi3.o)(.text+0x8c):/home/qsg/u-boot-1.2.0/lib_arm/_udivsi3.S:67: relocation truncated to fit: R_ARM_PLT32 __div0
    lib_arm/libarm.a(_umodsi3.o)(.text+0xa 8) :/home/qsg/u-boot-1.2.0/lib_arm/_umodsi3.S:79: relocation truncated to fit: R_ARM_PLT32 __div0
    make: *** [u-boot] Error 1
    u-boot中著名的softfloat问题。
    根据网上的资料,我尝试着修改cpu/s3c44b0/config.mk中对应的-msoftfloat去掉,重新编译。错误依旧。
    后来在www.linuxforum.net上面找到vxworks告知的解决方法:自己编译一个arm-softfloat-linux-gnu-3.4.1。
    从http://kegel.com/crosstool/上面下载了一个最新的crosstoool(crosstool-0.43.tar.gz)。
    安装很简单,大致步骤如下(需要注意的是,crosstool不允许以root用户安装):
    我使用了它默认的配置,所以依次进行了如下操作:
    1、解压:tar zxf crosstool-0.43.tar.gz
    2、在/home/qsg/目录下创建downloads目录(这个目录用于存放安装中需要下载的软件包,如果你自己下载需要binutils,gcc,glibc,linux,linux-libc-headsers,glibc-linuxthreads,各个软件的版本可以从对应的gcc-X.X.X-glibc-X.X.X.dat文件中获得。如果你自己下载软件包将其放到downloads目录里面,安装程序就会略过下载过程,否则它会自动下载各个需要的软件包)。
    3、以root身份创建/opt/crosstool/,并将目录属主改为qsg(我以qsg这个用户进行安装):mkdir -p /opt/crosstool/;chown qsg:qsg /opt/crosstool/
    4、进入到crosstool目录,执行demo-arm-softfloat.sh:sh demo-arm-softfloat.sh。
    等段一个比较长的时间,工具链就安装成功。
    然后修改PATH:在命令行下执行export PATH=/opt/crosstool/gcc-3.4.5-glibc-2.3.6/arm-softfloat-linux-gnu/bin/:$PATH
    然后进入u-boot-1.2.0目录,修改Makefile文件,将使用的交叉编译器从arm-linux-改为arm-softfloat-linux-gnu-。
    重新编译B2,成功!接下来就是模仿B2开始加入自己的开发板了。因为我的开发板也是使用的S3C44B0,所以以B2为蓝本构建

Posted in 嵌入式系统 | Leave a comment

LINUX 设备驱动模板

Linux下的驱动程序虽然复杂,但是总结下来还是有很多的规律可寻。Linux下的设备驱动开始编程时显得比较容易,可以轻松地开始驱动编写,但是要把驱动写好也的确需要花一定的时间去研究。
1.设备驱动模板
设备驱动模板代码如例程5-4所示。
例程5 4  Mydriver.c




#include <linux/module.h>
#include <linux/config.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/miscdevice.h>
#include <linux/ioctl.h>
#include <linux/interrupt.h>
#include <linux/spinlock.h>
#include <linux/smp_lock.h>
#include <linux/poll.h>
#include <linux/sched.h>
#include <linux/ioport.h>
#include <linux/slab.h>
#include <asm/hardware.h>
#include <asm/io.h>
#include <asm/arch/irqs.h>
#include <asm/irq.h>
#include <asm/signal.h>
#include <asm/uaccess.h>
/*定义设备的从设备号*/
#define MYDRIVER_MINOR 174
/*定义设备相关数据结构*/
typedef struct _MYDRIVER_DEV
{
spinlock_t dev_lock;
wait_queue_head_t oWait;
int open_count;

}MYDRIVER_DEV, *PMYDRIVER_DEV;
/*定义设备状态数据结构*/
typedef struct _MYDRIVER_DEV_STATS
{
unsigned long rx_intrs;
unsigned long rx_errors;
unsigned long rx_blocks;
unsigned long rx_dropped;
unsigned long tx_intrs;
unsigned long tx_errors;
unsigned long tx_missed;
unsigned long tx_blocks;
unsigned long tx_dropped;
}MYDRIVER_DEV_STATS, * MYDRIVER_DEV_STATS;
unsigned int IntInit=0;
/*定义设备open接口函数*/
static int mydriver_open(struct inode *inode, struct file * filp)
{
int minor;
DBGPRINT("mydriver_openn");
minor = MINOR(inode->i_rdev);
if ( minor != MYDRIVER_MINOR ) { return -ENODEV; }

#ifdef MODULE
MOD_INC_USE_COUNT; /*打开使用次数累加*/
#endif

mydriver_dev.open_count++;
if ( mydriver_dev.open_count == 1 )
{
DBGPRINT("mydriver_open: first opnen");
/*第一次打开设备,在这里可以放些设备初始化代码*/
}
return 0;
}
/*定义设备close接口函数*/
static int mydriver_release(struct inode *inode, struct file *filp)
{
DBGPRINT("mydriver_releasen");
mydriver_dev.open_count--;
if ( mydriver_dev.open_count == 0 )
{
DBGPRINT("mydriver_release: last closen");
/*设备彻底关闭,这里可以放一些使设备休眠,或者poweroff的代码*/
}
#ifdef MODULE
MOD_DEC_USE_COUNT; /*打开次数递减*/
#endif
return 0;
}
/*定义设备read接口函数*/
static ssize_t mydriver_read(struct file *filp, char *buf, size_t size,
loff_t *offp)
{
if(size> 8192) size = 8192;
/* copy_to_user()*/
/*copy kernel space to user space. */
/*把数据从内核复制到用户空间的代码,可以根据实际添加*/
return size; /*返回字节数*/
}
/*定义设备write接口函数*/
static ssize_t mydriver_write(struct file *filp, const char *buf, size_t
size, loff_t *offp)
{
lock_kernel();
DBGPRINT("mydriver_writen");
if(size> 8192) size = 8192;
/*copy_from_user()*/
/*copy user space to kernel space. */ /*把数据从用户空间复制到内核空间*/
unlock_kernel();
return size; /*返回字节数*/
}
/*定义设备ioctl接口函数*/
static int mydriver_ioctl(struct inode *inode, struct file *filp, unsigned
int cmd, unsigned long arg)
{
int ret = 0;
DBGPRINT("mydriver_ioctl: cmd: 0x%xn", cmd);
switch(cmd)
{
case cmd1: /*命令字,注意幻数的使用*/
…..
break;
…..
case cmd3:
…..
break;
default:
DBGPRINT("mydriver_ioctl: bad ioctl cmdn");
ret = -EINVAL;
break;
}
return ret;
}
/*定义设备select函数接口*/
static unsigned int mydriver_poll(struct file *filp, poll_table *wait)
{
poll_wait(filp,&mydriver_dev.oWait,wait);
if(IntInit)
{
IntInit=0;
return POLLIN|POLLRDNORM; //可以写
}
else { return POLLOUT; //可以读 }
}
/*定义设备的file_operations*/
static struct file_operations mydriver_fops =
{
owner: THIS_MODULE,
open: mydriver_open,
release: mydriver_release,
read: mydriver_read,
write: mydriver_write,
ioctl: mydriver_ioctl,
poll: mydriver_poll,
};
/*定义设备结构体*/
static struct miscdevice mydriver_miscdev =
{
MYDRIVER_MINOR,
" mydriver ",
& mydriver_fops
};
/*定义设备init函数*/
int __init mydriver_init(void)
{
int ret;
DBGPRINT("mydriver_initn");
ret =misc_register(&mydriver_miscdev); //注意这里调用misc_register()来注册
if ( ret )
{
DBGPRINT("misc_register failed: 0x%xn", ret);
return ret;
}
memset(&mydriver_dev, 0, sizeof(mydriver_dev));
init_waitqueue_head(&mydriver_dev.oWait);
spin_lock_init(&mydriver_dev->dev_lock);
/*这里可以放一些硬件初始化的函数*/
return 0;
}
/*定义设备exit函数*/
void __exit mydriver_exit(void)
{
DBGPRINT("mydriver_exitn");
misc_deregister(&mydriver_miscdev); //注销misc dev
}
module_init(mydriver_init);
module_exit(mydriver_exit);
MODULE_LICENSE("GPL");
从上面的模板代码可以看出,设备驱动主要给上层提供file_operation和ioctl功能,实现上层对于底层设备的管理和读、写操作等。另外不同的设备调用的设备注册和注销函数有所不同,大家可以区分一下:misc_register()函数、register_chardev()函数、register_netdev()函数及misc_deregister()函数。也可以去分析一下deregister_chardev()函数和deregister_netdev() 函数的不同之处。
通常的设备驱动参照上面的模板就可以实现基本的框架了,当然还需要注意有关硬件的一些操作,包括初始化、参数设置、中断服务等。这些代码可以根据系统的设计放在driver_init里面,或者放在第一次打开的时候。
Posted in LINUX | 2 Comments

arm运行的第一个hello world!(内含jffs2映像制作)

今天下了班之后等到于涛开完会才走,问了下JFFS2文件系统的介绍,原来是用mkfs.jffs2.x86,而且还有许多命令,依次如下:
./mkfs.jffs2.x86 -r rootfs -o rootfs.img -e 0x20000

-r rootfs是指定要生成映像的源文件夹,rootfs文件夹下有许多文件,如:bin dev etc lib mnt proc root sbin sys tmp usr var
-o rootfs.img指定生成文件即映像文件rootfs.img
-e 0x20000 指定flash每页大小,由于用的nor flash每页为128K,即0x20000
这样把生成的映像文件下载到flash就可以了。不过文件有点大,有3M多,每次改动后都要重新烧的话太慢,虽然下载可以用TFTP,但担心flash的寿命,本来想直接都下到SDRAM再执行,但发现不行,下次研究一下有没有更好的办法

hello的程序我是放在usr/hello文件夹里
启动linux后,到hello文件夹下,可以找到二进制文件hello
输入./hello
终端输出
hello world!
源程序如下:
#include<stdio.h>
int main(void)
{
  printf("hello world!n");
  return 0;
}

之后用交叉绎工具编绎,生成二进制文件hello
arm-linux-gcc -o hello hello.c

终于可以静下心来好好看看应用程序的编写了。
不过还有一种方法即模块式加载,这个是在内核上编绎的,还没有研究好,下次再研究。先试着编几个程序跑跑再说。

Posted in 嵌入式系统 | Leave a comment

嵌入式还是找不着进入的大门

  板子终于没问题了,问题原来不是出在我的板子上,而是在RS232转TTL小板上,巧的是二个板都是断的同个信号线,但断的位置不同,但出来的现象一样。断的是连接到ARM的DRXD的线,导致ARM可以输出,但不能输入,所以一发送文件就卡在那了,程序起来了也不能从键盘输入,幸运的是终于好了,看来好事多磨啊。
 


  接下来就是研究嵌入式编程了,前段时间买了本ARM的书,但是基于2410的,看了大部门基础知识,但觉得不太合适现阶段的学习,昨天又去书城买了本:嵌入式Linux应用程序开发详解,应该算比较合适吧,但还是不知道怎么把PC上写的程序放到ARM板上运行,这是最关键的一步,应该是把文件系统的事情搞清楚就行了,还有内核好象于涛也做了些设置,下次问下他。好好看书。

  上个星期都没怎么睡好,而且上班都觉得没劲,只有星期五下了班打球的时候才有劲,周六一天就晚上的时候去买了些吃的,然后也开始下雨,星期天还是在下雨,和小关去的深圳购书中心买的这本书,碰到了锦生和吴程熙,锦生好瘦了啊!哎。。

   今天把这本书先粗略的看了一遍,先把能看懂的先看懂了先吸收了,加油。。
-------------------------------------------------------------------------------------------------
上个月公司其实没有什么很重要的事,总经理出差了半个月,我主要是负责文档的事情,因为程序基本上没什么改动了,硬件现在也主要是另外的人在做,上星期五终于把我要写的设计文档做好,算是上个项目的文档告一个段落。然后给下面的三个人写月总结评语又难倒了我,看来以后得做些工作记录才行,包括他们的。

本来这个月要出差佛山的,而且这次去了应该至少要半个月,我带一个人过去。不过华立那边表要20号才能生产出来,所以出差应该改在下个月初的样子,也刚好,圈,小芳还有虫子她们计划下个周末去西冲玩,到时候会有很多人,圈家老师,她弟,她表妹,虫子一对,虫子弟弟,小芳。好久没玩了。希望能放松下。

--------------------------------
最近一段时间只要一闲下来就乱想,所以我只好不让自己闲,看书,编程,不想学了就玩游戏,泡泡堂,CS,但晚上睡觉的时候还是难入睡,昨天就把手机里的十几首歌听完了才睡着。

-----------------
好好加油

Posted in 嵌入式系统 | Leave a comment