我的最新日志

  • RHEL 5 Install Key

    2008-1-25

    Server:

    * Red Hat Enterprise Linux (Server including virtualization):
       2515dd4e215225dd

      + Red Hat Enterprise Linux Virtualization Platform:
        49af89414d147589

    Client:

    * Red Hat Enterprise Linux Desktop:
       660266e267419c67

      + Red Hat Enterprise Linux Desktop + Workstation Option:
        da3122afdb7edd23

      + Red Hat Enterprise Linux Desktop + Workstation + DualOS Option
        (Virtualization):
        7fcc43557e9bbc42

      + Red Hat Enterprise Linux Desktop + DualOS Option (Virtualization):
        fed67649ff918c77

  • debian etch r1 挂载ntfs 正确显示中文

    2007-12-14

    我的fstab
    # /etc/fstab: static file system information.
    #
    # <file system> <mount point>   <type>  <options>       <dump>  <pass>
    proc            /proc           proc    defaults        0       0
    /dev/sda3       /               ext3    defaults,errors=remount-ro 0       1
    /dev/sda4       none            swap    sw              0       0
    /dev/hda        /media/cdrom0   udf,iso9660 user,noauto     0       0
    /dev/sda1       /media/c        auto    auto,nls=utf8,user,umask=0        0       0
    /dev/sda5       /media/d        auto    auto,nls=utf8,user,umask=0        0       0
    /dev/sda6       /media/e        auto    auto,nls=utf8,user,umask=0        0       0


    显示中文的问题解决了  可是ntfs分区还是不可写 于是尝试了用ntfs-3g,遇到库依赖的问题  很郁闷 等我有时间研究好了  贴上来分享
  • Debian:“没有可用的公钥”

    2007-3-24

    今天做了一个update出现问题:
    databackup:~# aptitude update
    读取:1 http://debian.cn99.com testing Release.gpg [378B]
    命中 http://debian.cn99.com testing Release
    命中 http://debian.cn99.com testing/main Packages/DiffIndex
    命中 http://debian.cn99.com testing/main Sources/DiffIndex
    读取:2 http://security.debian.org stable/updates Release.gpg [189B]
    命中 http://security.debian.org stable/updates Release
    忽略 http://security.debian.org stable/updates/main Packages/DiffIndex
    忽略 http://security.debian.org stable/updates/main Packages
    命中 http://security.debian.org stable/updates/main Packages
    已下载 2B,耗时 10s (0B/s)
    正在读取软件包列表... 完成
    W: 以下 key ID 没有可用的公钥:
    A70DAF536070D3A1
    W: 您可能需要运行 apt-get update 来解决这些问题

    google一下在国外网站发现这样的解决办法:
    办法1:
    # gpg --recv-key A70DAF536070D3A1
    # gpg --export A70DAF536070D3A1 | apt-key add -
    不成功。
    办法2
    用如下命令
    gpg --keyserver wwwkeys.eu.pgp.net --recv-keys A70DAF536070D3A1 && apt-key add /root/.gnupg/pubring.gpg && apt-get update
    成功!

  • uboot 在 ARM s3c2410 上移植过程

    2006-12-21

    总述
    u-boot是德国DENX小组的开发用于多种嵌入式CPU的bootloader程序,在LINUX下可以通过CVS来得到当前正在开发的u-boot软件。当前版本号:u-boot 1.0.2,见include/version.h中的定义。
    #cvs –dserver:anonymous@cvs.sourceforge.net:/cvsroot/u-boot login
    #cvs –z3 –d server:anonymous@cvs.sourceforge.net:/cvsroot/u-boot checkout –P u-boot
    本文讲述S3C2410中u-boot的移植过程:S3C2410的硬件配置是:
    l CPU:S3C2410
    l NOR: 16M,INTEL EP28F128J3A
    l SDRAM:64M, MICRON 48LC16M16A2-75 B
    l DM9000AVICOM (10/100M) 网卡
    l USB HOST一个
    配置自已的主板
    l 阅读Makefile文件,在Makefile文件中添加两行:
    s3c2410_config: unconfig
    @./mkconfig $(@:_config=) arm arm920t s3c2410
    其中ARM是CPU的种类, arm920t是ARM CPU对应的代码目录,s3c2410是自已主板对应的目录。
    l 在board目录中建立s3c2410目录,复制smdk2410目录中的内容(cp smdk2410/* s3c2410)。
    l 在include/configs/目录下复制smdk2410.h(cp smdk2410.h s3c2410.h)
    l 修改ARM编译器的目录名及前缀
    本人ARM编译器的目录是在:/opt/host/armv4l/bin/armv4l-unknown-linux-
    把CROSS-COMPILE = arm-linux- 改为实际目录:如
    CROSS-COMPILE = /opt/host/armv4l/bin/arm4l-unknown-linux-
    l 完成之后,可以测试一下你的配置:
    #make s3c2410_config
    #make
    编译应该在processor.h中出错
    l 修改processor.h中:
    union debug_insn
    {
    u32 arm;
    u16 thumb;
    }
    修改成:
    union debug_insn
    {
    u32 arm_mode;
    u16 thumb_mode;
    }
    l 编译成功,编译好的程序同smdk2410一样。
    l 注:如果第一次修改后编译没有在processor.h中出错,而在examples目录出错,认真检查以上修改(修改的内容不正确),并在examples目录中运行touch命令(不运行touch还会出错,可能uboot Makefile没有写好,没查原因),再编译。
    生成最基本的u-boot, 没有功能,只能起动
    l 修改程序连接地址:
    在board/s3c2410中有一个config.mk文件,用于设置程序连接的起始地址,因为会在u-boot中增加功能,所以留下6M的空间,修改33F80000为33A00000。
    l 为了以后能用uboot的GO命令执行修改过的用loadb或tftp下载的u-boot:在board/s3c2410的memsetup.S中标记符”0:”上加入五句:
    l mov r3, pc
    l ldr r4, =0x3FFF0000
    l and r3, r3, r4 //以上三句得到实际起动的内存地址
    l aad r0, r0, r3 //用GO命令调试uboot时,启动地址在RAM
    l add r2, r2, r3 //把初始化内存信息的地址,加上实际起动地址
    u 0标记符0, 原来存在的标记符)
    l 用SJF软件通过jtag口下载编译的u-boot, 启动!读取环境块时CRC出错,然后进入SMDK#。
    l 把MIZI vivi中的PrintHexWord, PrintWord拷过来, 这样可以在调试汇编时可以打印一些信息,但其中有的PrintHexNibble中有缺陷,ldr r0, [r2, r0] 应改为ldrb r0, [r2, r0],这样可以在四字节对齐的系统中使用。
    INTEL nor flash操作功能
    l INTEL 的28F128,在board目录中找到CMI主板有此FLASH,把cmi中flash.c拷到s3c2410目录代换原来的flash.c。
    l cmi中的flash.c在写入时要交换字节,所以删除它的write_short()和wirte_buff()函数,把ep7312主板目录中flash.c的wirte_word()和wirite_buff()函数复制过来。把flash.c中的FLASH_BASE0_PRELIM改为CFG_FLASH_BASE。把FLASH_BLOCK_SIZE改为0x20000,(E28F128J3A flash中块的大小是128K)。
    l 把s3c2410.h中的flash内容由原来的:
    1. #define PHYS_FLASH_1 0x00000000 /* Flash Bank #1 */
    2. #define CFG_FLASH_BASE PHYS_FLASH_1
    3. #define CONFIG_AMD_LV400 1
    4. #if 0
    5. #define CONFIG_AMD_LV800 1
    6. #endif
    7. #define CFG_MAX_FLASH_BANKS 1 /* max number of memory banks */
    8. #ifdef CONFIG_AMD_LV800
    9. #define PHYS_FLASH_SIZE 0x00100000 /* 1MB */
    10. #define CFG_MAX_FLASH_SECT (19) /* max number of sectors on one chip */
    11. #define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x0F0000) /* addr of environment */
    12. #endif
    13. #ifdef CONFIG_AMD_LV400
    14. #define PHYS_FLASH_SIZE 0x00080000 /* 512KB */
    15. #define CFG_MAX_FLASH_SECT (11) /* max number of sectors on one chip */
    16. #define CFG_ENV_ADDR (CFG_FLASH_BASE + 0x070000)
    改为:
    1. #define PHYS_FLASH_1 0x00000000 /* Flash Bank #1 */
    2. #define PHYS_FLASH_SIZE 0x01000000 /* 16 MB */
    3. ##define CFG_FLASH_PROTECTION
    4. define CFG_FLASH_BASE PHYS_FLASH_1
    5. #define CFG_MONITOR_BASE PHYS_FLASH_1
    6. #define CFG_MAX_FLASH_BANKS 1/* max number of memory banks */
    7. #define CFG_MAX_FLASH_SECT 128/* max number of sectors on one chip */
    8. #define CFG_FLASH_ERASE_TOUT (2*CFG_HZ) /* Timeout for Flash Erase */
    9. #define CFG_FLASH_WRITE_TOUT (2*CFG_HZ) /* Timeout for Flash Write */
    10. #define CFG_ENV_IS_IN_FLASH 1
    11. #define CFG_ENV_ADDR (PHYS_FLASH_1 + 0x60000)
    12. #define CFG_ENV_SIZE 0x20000 /* Total Size of Environment Sector */
    l 把cmd_mem.c中的cmd_get_data_size函数的default_size全改为1, 默认以字节显示,更直观,并且不会出现地址对齐错(data abort)。而在do_mem_mw()及mod_mem()中加入:
    if(addr2info(addr) != NULL)
    {
    printf(“can’t wirte or modify in flash! Use cp instead. ”);
    return 0;
    }
    以使mw和mm命令不能修改flash中的数据,而只开放cp修改flash中的数据。
    l 改board/s3c2410/flash.c中的flash_erase(),把start = get_timer(0)移到for(), 以去掉flash_erase timeout 错误。
    设置FLASH和SDRAM时序
    根据28F128J3A-150,这是一150ns的flash, 所以把flash时序设为最慢。把s3c2410设成202.8MHZ, 并且工作在异步模式, 修改memsetup.S。
    实现网卡功能
    本人的网卡是DM9000,在uboot中没有相应的驱动,所以自已写了一个网卡驱动。
    1. 把驱动拷到drivers/dm9000.c
    2. 在drivers/Makefile中加入dm9000.o
    3. 在lib_arm/board.c中修改CS8900=>DM9000
    4. 在include/configs/s3c2410中加入以下几句
    #define CONFIG_DRIVER_DM9000 1 /* we have a CS8900 on-board */
    #define DM9000_BASE 0x08000000
    #define DM9000_BUS16 1 /* the Linux driver does accesses as shorts */
    #define CONFIG_ETHADDR 08:00:3e:26:0a:5b
    #define CONFIG_NETMASK 255.255.255.0
    #define CONFIG_IPADDR 192.168.2.120
    #define CONFIG_SERVERIP 192.168.2.122
    实现USB功能
    1. 在include/configs/s3c2410中的CONFIG_COMMANDS中加入:
    l CFG_CMD_USB |
    l CFG_CMD_FAT |
    2. 并在文件中加入以下设置:
    l #define CONFIG_USB_OHCI
    l #define CONFIG_USB_STORAGE
    l #define CONFIG_USB_KEYBOARD
    l #define CONFIG_DOS_PARTITION
    l #define CFG_DEVICE_DEREGISTER
    l #define CONFIG_SUPPORT_VFAT
    l #define LITTLEENDIAN
    3. 这时usb start 和 usb info等功能正常,而其它一些功能不正常。
    4. 功能fatls 不正常,修改fs/fat/fat.c
    l 没有把VFAT的UNICODE字符转换过来,加入UNICODE字符转换函数。Uni2ansi(), 增加slot2str()的cp936版, 增加一个toshort()。
    l 加入#define cp936
    l 在fat_getenv()中有一个对齐错误,修改fat.h使fatbuff字对齐。
    l 在do_fat_read()中加入两句,以消除列根目录错误。
    l 在board/cmd_fat.c中加入两句,以消除没有usb storage设备时的错误:
    if(!dev_desc)
    printf(“Not init storage usb device: usb start usb info usb scan ”);
    5. 修改fs/fat/fat.c
    get_cluster()函数中加入 if(size / FS_BLOCK_SIZE > 0), 以防读文件时不能成功读出。
    引导LINUX
    现在我们可以引导LINUX了。
    l 要引导bzip2的linux核,把CFG_MALLOC_SIZE改为大于4M
    l 把编译好的LINUX内存,通过uboot/tools/mkp_w_picpath转换成uboot格式
    1. mkp_w_picpath -A arm -O linux -T kernel -C bzip2 -a 30000000 -e 30008000 -n 'linux kernel' -d vmlinux1.bz2 c
    2. mkp_w_picpath -A arm -O linux -T kernel -C gzip -a 30000000 -e 30008000 -n 'linux kernel' -d vmlinux.gz b
    3. mkp_w_picpath -A arm -O linux -T ramdisk -C gzip -a 0 -e 0 -n 'init ramdisk' -d ramdisk.p_w_picpath.gz ramdisk
    l 在include/configs/s3c2410.h中加入:
    1. #define CONFIG_BOOTARGS "initrd=0x30800000,0x200000 root=/dev/ram init=/linuxrc console=ttyS0,115200"
    2. #define CONFIG_BOOTFILE "vmlinux_for_uboot.gz"
    3. #define CONFIG_BOOTCOMMAND "bootm 0x80000 0x1a0000"
    0x80000为内核在flash中的位置。
    0x1a0000为ramdisk.p_w_picpath.gz在flash中的内容。
    4. #define CFG_LOAD_ADDR 0x30800000 /* default load address */
    l 在lib_arm/armlinux.c的do_bootm_linux中加入:
    1. memcpy ((char *)CFG_LOAD_ADDR, (char *)data, len);
    2. data = CFG_LOAD_ADDR;
    把ramdisk复制到0x30800000位置的RAM中
    3. 定义以下配置,把信息传入LINUX核心的TAG区
    #define CONFIG_SETUP_MEMORY_TAGS
    #define CONFIG_INITRD_TAG
    #define CONFIG_CMDLINE_TAG


    常用U-BOOT命令介绍
    1. ?得到所有命令列表
    2. help: help usb, 列出USB功能的使用说明
    3. ping:注:只能开发板PING别的机器
    4. setenv: 设置互环境变量:
    5. setenv serverip 192.168.0.1
    6. setenv ipaddr 192.168.0.56
    7. setenv bootcmd ‘tftp 32000000 vmlinux; kgo 32000000’
    8. saveenv: 保存环境变量
    9. 在设置好环境变量以后, 保存变量值
    10. tftp: tftp 32000000 vmlinux, 把server(IP=环境变量中设置的serverip)中/tftpdroot/ 下的vmlinux通过TFTP读入到物理内存32000000处。
    11. kgo: 起动没有压缩的linux内核,kgo 32000000
    12. bootm:起动UBOOT TOOLS制作的压缩LINUX内核, bootm 3200000
    13. protect: 对FLASH进行写保护或取消写保护, protect on 1:0-3(就是对第一块FLASH的0-3扇区进行保护),protect off 1:0-3取消写保护
    14. erase: 删除FLASH的扇区, erase 1:0-2(就是对每一块FLASH的0-2扇区进行删除)
    15. cp: 在内存中复制内容, cp 32000000 0 40000(把内存中0x32000000开始的0x40000字节复制到0x0处)
    16. mw: 对RAM中的内容写操作, mw 32000000 ff 10000(把内存0x32000000开始的0x10000字节设为0xFF)
    17. md: 修改RAM中的内容, md 32000000(内存的起始地址)
    18. usb:
    l usb start: 起动usb 功能
    l usb info: 列出设备
    l usb scan: 扫描usb storage(u 盘)设备
    19. fatls:列出DOS FAT文件系统, 如:fatls usb 0列出第一块U盘中的文件
    20. fatload: 读入FAT中的一个文件,如:fatload usb 0:0 32000000 aa.txt
    21. 把USB中的aa.txt 读到物理内存0x32000000处!
    22. flinfo: 列出flash的信息
    23. loadb: 准备用KERMIT协议接收来自kermit或超级终端传送的文件。
    24. nfs: nfs 32000000 192.168.0.2:aa.txt , 把192.168.0.2(LINUX 的NFS文件系统)中的NFS文件系统中的aa.txt 读入内存0x32000000处。





    个人感觉用这些写好的bootloader是初学者的专利,有了经验,^_^,强了!就编自己的板子的bootloader那个爽啊!!
  • MISRA--作为工业标准的C编程规范(推荐)

    2006-12-21

    MISRA--作为工业标准的C编程规范(嵌入式c开发者必读)

    MISRA--作为工业标准的C编程规范

      MISRA (The Motor Industry Software Reliability Association 汽车工业软件可靠性联会) 是位于英国的一个跨国汽车工业协会,其成员包括了大部分欧美汽车生产商。其核心使命是为汽车工业提供服务和协助,帮助厂方开发安全的、高可靠性的嵌入式软件。这个组织最出名的成果是所谓的MISRA C Coding Standard,这一标准中包括了127条C语言编码标准,通常认为,如果能够完全遵守这些标准,则你的C代码是易读、可靠、可移植和易于维护的。最近很多嵌入式开发者都以MISRA C来衡量自己的编码风格,比如著名的uC/OS-II就得意地宣称自己99%遵守MISRA标准。而《嵌入式开发杂志》也专门载文号召大家学习。编码规范通常是一个公司自定的“土政策”,居然有人去做标准,而且还得到广泛的认可,这不禁引起我强烈的兴趣。可惜这份标准的文本需要花钱去买,而且短短几十页,要价非常昂贵。MISRA在网上公布了一些文档,其中有关于MISRA C Coding Standard的Clarification报告,从中间你可以大致猜到MISRA标准本身是什么。我仔细阅读了这些文档,并且通过阅读其他一些介绍性文档,大致了解了MISRA标准的主要内容。这些条款确有过人之处,对于C/C++语言工程项目的代码质量管理能够起到良好的指导性作用,对于大部分软件开发企业来说,在MISRA的基础上适当修改就可以形成自己的规范。当然其中也有一些过于严苛的东西,这就需要各个开发部门灵活处理了。我个人的体会,编码规范虽然很简单,但是要完全执行,不折不扣,需要开发部门有很高的组织性和纪律性,并且有很好的代码评审机制。因此,如果能够严格地遵守编码规范,本身就是一个开发部门实力的证明。

    这里不可能将所有规则一一列出(事实上正式文本我一条也没看到),只列出一些比较有意思的条款,让大家有机会了解MISRA的风格。具体的内容,感兴趣的朋友可以自己到www.misra.org.uk去了解。

    Rule 1. 严格遵循ANSI C89标准,不允许任何扩展。

    Rule 3. 如果要嵌入汇编语言,则必须将所有汇编语句包装在C函数里,而且这些函数中只有汇编语句,没有常规C语句。
     
    Rule 7. 不得使用三元操作符(? : )

    Rule 10. 不得残留被注释掉的废代码。

    Rule 11. 所有标识符不超过31字符。

    Rule 12. 不同名空间中的变量名不得相同。
          例如:
            typedef struct MyStruct {... } MyStruct; (违规)

            struct Person {
              char* name;
              ...
            };

            char name[32]; (违规)

    Rule 13. 不得使用char, int, float, double, long等基本类型,应该用自己定义的类型显示表示类型的大小,如CHAR8, UCHAR8, INT16, INT32, FLOAT32, LONG64, ULONG64等。

    Rule 14. 不得使用类型char,必须显示声明为unsigned char或者signed char。

    Rule 18. 所有数字常数应当加上合适的后缀表示类型,例如51L, 42U, 34.12F等。

    Rule 19. 禁止使用八进制数。(因为086U这样的常数很容易引起误解)。

    Rule 21. 不得定义与外部作用域中某个标识符同名的对象,以避免遮盖外部作用域中的标识符。

    Rule 23. 具有文件作用域的对象尽量声名为static的。

    Rule 24. 在同一个编译单元中,同一个标识符不应该同事具有内部链接和外部链接的声名。

          这里我略作说明:
       
          我们通常将一些放在头文件里的变量声名为“外部链接”的,如:
          extern UINT32 g_count; // 俗话叫变量声明(对应于变量定义,不分配实际空间)

          对于“使用”这个变量的.c文件来说,这很好,因为g_count始终保持外部链接性质。可是对于定义g_count(实际分配空间)的.c文件来说,如果包含了上述的头文件,则在这个编译单元里就发生了内部链接和外部链接的冲突。解决办法是,定义g_count的文件尽量不要包含声名g_count的头文件。个人感觉这不是任何时候都做得到的,尤其是在对付遗留代码的时候。

    Rule 25. 具有外部链接性质的标识符应该只声明一次。

    Rule 27. 外部对象不得在多个文件中声名。

    Rule 28. 禁止使用register关键字。

    Rule 29. 自动对象(栈对象)使用前必须赋初值。

    Rule 33. 操作符&&和||的右侧表达式不得具有副作用(side-effect)。
          也就是说,象 if (x == 20 && ++y == 19)这样的表达式被禁止。

    Rule 35. 在返回布尔值的表达式中不得出现赋值操作。
          也就是说,我们常用的 if (!(fp = fopen("fname", "r"))) { /* error */ }
          被禁止。

    Rule 37. 不得对有符号数施加位操作,例如 1 << 4 将被禁止,必须写 1UL << 4;

    Rule 39. 不得对有符号表达式施加一元 "-" 操作符。

    Rule 40. 不得对有副作用的表达式施加sizeof操作符。

    Rule 42. 除了循环控制语句,不得使用逗号表达式。

    Rule 44. 禁止冗余的显式转型。比如: double pi = (double) 3.1416F;

    Rule 45. 禁止从任意类型到指针的强制转型,禁止从指针到任意类型的强制转型。
          例如:void* p = (void*)0xFFFF8888UL;

    Rule 49. 显示测试值是否为零。

    Rule 50. 不得显式判断浮点数的相等性和不等性。

    Rule 52. 不得遗留“永远不会用到”的代码。

    Rule 53. 所有非空语句必须具有副作用。

    Rule 55. 除了switch语句,不得使用标号(label)。

    Rule 56. 不得使用goto.

    Rule 57. 不得使用continue。

    Rule 58. 除了switch语句,不得使用break.

    Rule 59. if, else if, else, while, do..while, for语句块必须使用{}括起。

    Rule 60. 任何if..else if 语句,最后必须有一个收尾的else。例如:
          if (ans == 'Y') {
          ...
          }
          else if (ans == 'N') {
          ...
          }
          else if (ans == 'C') {
          ...
          }
          else {
          ;
          }

    Rule 67. 循环计数器的值不得在循环体内修改。

    Rule 70. 禁止任何直接和间接的递归函数调用。

    Rule 82. 每个函数只能有一个推出点。

    Rule 86. 如果一个函数可能返回错误信息,则调用后必须加以测试。

    Rule 92. 不应该使用#undef

    Rule 95. 不得将宏作为参数传给宏函数

    Rule 98. 在一个宏定义中,#或##符号只能出现一次。

    Rule 101. 禁止指针运算(代之以数组下标运算)。

    Rule 102. 禁止超过两级的指针。

    Rule 104. 禁止使用指向函数的非常量指针。

    Rule 106. 不得将栈对象的地址传给外部作用域的对象。

    ********************************************************************
    后面的规则针对实时嵌入式系统,对其他类型的开发未必适用,如:

    Rule 118. 禁止使用动态堆分配(也就是不得使用malloc, calloc和realloc)。

    Rule 119. 禁止使用errno。

    Rule 120. 禁止使用offsetof.

    Rule 121. 禁止使用<locale.h>

    Rule 122. 禁止使用setjmp, longjmp.

    Rule 123. 禁止使用<signal.h>

    Rule 124. 禁止使用<stdio.h>(不能用printf, scanf了!)

    Rule 125. 禁止使用atoi, atof, atol。(这个我很赞成,建议使用strtol, strtod等函数)

    Rule 126. 禁止使用abort, exit, getenv。

    Rule 127. 禁止使用<time.h>
  • 绅士不好做啊

    2006-12-21

    1.如何做一个中国绅士
    现代新女性喜欢的新好男人,其实就是一种具有绅士风度的男人。那么,什么样的男人才是现在女子心目中的绅士呢?看完本文,相信只要贯以施之,你很快就会成为女友心目中的中国绅士了。

    中国绅士的八个细节:
    一、有一双干净修长的手,修剪整齐的指甲。
    二、在对待爱情的态度上不会思虑过重,敢于去爱。
    三、天天换衬衫,保持领口和袖口的平整和清洁,有的还会使用袖扣。
    四、腰间不悬挂物品,诸如手机、呼机等。
    五、在与女士相处时,对女士加以照顾。
    六、吃饭时从不发出声音。
    七、较常人使用礼貌用语更为频繁。
    八、偏爱心灵的宁静及充满对恋人的激情。

    中国绅士的八大破绽:
    一、手形清洁美观,可是一旦进入需要脱鞋的房间,空气中就会产生一种异样的气味。
    二、在对待爱情的态度上思虑过重,并拿不定主意选择。
    三、戴名牌手表时,手腕扬得飞扬跋扈。
    四、虽然天天换衬衫,但总是系同一条领带。
    五、腰间虽然没有悬挂手机和呼机,但是在公共场合常常大声对着手机说话。
    六、尽管对女士尊重异常,但是在与同性朋友相处时反差过大,判若两人。
    七、吃饭时不发出声音,但喝汤时却引人侧目。
    八、虽然较常人使用礼貌用语更为频繁,但是频繁到了令人起皮的程度

    2.男人绅士风度的七条要领:男人彬有礼往往可以表现文明社会男士的道德风范,也可以看出一个男士的受教育程度。有的男士因与女友相处不得要领, 结果不欢而散。其实,男士的风度不仅应表现在与女友的交往中,还应表现在日常生活中对女士的态度上。


    (1)您应该先向所遇到的熟悉的女士微微点头打招呼。如果某位女士向您走来,请您记住,如果她主动伸出手,您才能与她握手。

    (2)在公共场所偶然遇到熟悉的女士互相问好时,可以不握手,但必须把手从口袋里拿出来,把烟从嘴上拿下来,如果吃着东西要停止咀嚼,当然,女士也一样。男士在大街上随便让女士停下脚步是有失体面的,哪怕是熟人。如有急事当然可以例外。

    (3)如果您与女伴走在街上遇到熟人,您不能把女伴晾在一边没完没了地与熟人交谈。您可以把熟人介绍给女伴,但是如果您必须与熟人谈什么事情而且三言两语说不清楚,可以另约时间见面或打电话联系。

    (4)如果某女士坐您开的车,您一定要打开车门让女士先坐在副驾驶的位置上,您再坐到自己的位置上。女士下车的时候, 您要先下车,为女士打开车门。在车内探过身子打开车门的做法不雅观。当然,也不能让女士自己取出行李物品。

    (5)在咖啡馆或饭店与熟悉的女士会面时,要从座位上略略欠身以示欢迎。如果女士走近您,要站起来与其交谈。

    (6)晚会上您的女友要去卫生间稍事整理,您可以把她送到大厅,但要小心地绕行,以免打扰正在跳舞的人。

    (7)晚会结束后,如果有条件要开自己的车或打的送女友回家,别忘了谢谢女友接受邀请参加晚会。一般是看着女友走近楼门或家门。更礼貌的做法是,从汽车里出来,把女友送到她的家门口。


    上周,有位同学就“绅士风度和淑女风范”谈了自己的看法。那位同学讲得很好,对大家对我都有启发。为了使同学们对这一问题加深认识,更为了使同学们逐步形成绅士风度和淑女风范的良好修养,今天,我也谈谈关于“绅士风度和淑女风范”。

    什么是“绅士风度和淑女风范”?

    关于绅士风度和淑女风范,不同的国度,不同的时代,不同的书籍,有不同的解说。但各种不同解说,都呈现出内涵丰富,互相交叉的现象。由于我们不是专门的研究者,所以,我们不需要将它分得清清楚楚,只需要懂得基本要求就足够了。那么,绅士风度和淑女风范的基本要求究竟是什么呢?

    大致可以作这样的理解:1、对外界事物始终保持冷静客观的公正态度,有是非分明的界限和分寸,行为上极力地避免一切类型的粗鲁和暴力;2、注重自我价值和尊严,但不做过分的事情,善于尊重他人,从不冒犯别人,即使有必要做出对抗性的竞争时,也一定能坚持公平条件,决不占他人便宜,更不会无条件地接受任何好处;3、温和、亲切、热情、自尊自重而不轻浮;大方、得体、沉稳、谦逊、宽容而不斤斤计较;既善解人意,又富有见地,勇于承担责任而不咄咄逼人或强加于人。

    把以上三个方面的内涵概括起来,还可以理解为:彬彬有礼,待人谦和,;知识渊博,谈吐文雅;衣冠得体,举止文明;修养高雅,健康向上;博爱他人,尊重他人;远离不良嗜好;建立良好的人际关系。如果把这个概括说得再明白一点,就是政教处和班主任及任课老师经常说的规范和文明。只要你的言行规范了,文明了,你也就具有了作为学生的绅士风度和淑女风范了。

    同学们,为了使大家能更深入地领悟绅士风度和淑女风范,下面我举几个例子。

    第一个例子:在英国,电话亭是男女分开用的。人们眼前常会出现这样一种情形:一边是男士排着长队等着打电话,另一边却空空荡荡,电话正闲着。这种现象的确让我们感到这些英国男士太呆板,太不会变通了。但仔细想想,你也应该感受到这种情形恰恰表现了英国历经几百年培养起来的绅士风度已经成为了人们自觉恪守的规矩。

    第二个例子:在丹麦,有位男孩和祖母一起出行。当小男孩争着上车时,他的祖母一把抓住他的衣领说“女士优先”。这个例子说明绅士风度教育必须从小事做起,必须从儿童力争抓起。

    第三个例子:在瑞士,一位中国学者向行人问路之后,正走着,有个儿童追上来说“先生请等一下再走”。这位中国学者听下来说“从这边不对吗?”那位儿童说“先生,请您有点耐心”。等第一位指路人走远了,小男孩才说“刚才那人说错了,我不能马上告诉你,因为我怕他面子过不去啊”。这么小的孩子就懂得如何尊重人的感受,真是一位少年绅士啊!

    同学们,以上说的是什么叫绅士风度和淑女风范。下面,我简要地说说在校园内如何培养绅士风度和淑女风范。

    走路时,抬头挺胸,款款而行,不要跑行,更不要追逐;如果人多或者上下楼梯,请靠右单行,不要并排行走,不要拥挤,不要抢道。

    说话时,落落大方,口齿清楚,不要扭扭捏捏,吞吞吐吐,当然也不要大喊大叫,如果是对话,请不要中途打断别人,强行插话。

    受到表扬时,保持平静,不要眉飞色舞;受到批评时,保持冷静,不要表扬出无所谓的样子,更不能横鼻子竖眼睛听不进去。如果批评不当,可以于事后平静地讲述原因,不可以当面顶撞。处理杂物时,要走到垃圾箱跟前投放,而不要远远地抛掷过去,更不要随地乱扔。


    「绅」,本是表示等级身分的一种服饰,指的是古代士大夫束在外衣的大带,「古之仕者,重绅插笏(音忽)。」由绅的涵义引申为「束绅之士」,简称为「绅士」,并进而特指有一定地位和身分的士大夫阶层。

    但古代士大夫仅指当官的读书人。随著科举制度的发展,到了明清之际,谋取功名的读书人不断增多,很多人虽然取得功名身分,却不能为官。所以,人们就把那些不曾为官的科举士子统称为「士」。当时,绅与士有著本质的区别。到了近代,这种区别逐渐消除,无论当官不当官,一概称之为「绅士」。

    在近代社会中,绅士有著特殊的地位,非官而近官,非民而近民,是高於平民的一个封建等级阶层;甚至男士行谊得体,彬彬有礼,也称绅士。

  • Linux系统简介

    2006-12-14

    嵌入式Linux的版本
    实时Linux(RT Linux)
    RT Linux是美国新墨西哥州大学计算机系研制开发的。它在底层实现了添加Linux实时特性支持。RT Linux在通常的Linux内核的下层实现了一个简单的实时内核,而通常的linux把这个实时内核作为优先级最低的任务,但所有实时任务的优先级都应高于Linux本身以及Linux下的一般任务。经过加入实时处理后,RT Linux就完全能够达到硬实时系统的性能指标。

    uClinux
    uClinux是在Linux Kernel 2.0之后出现的一个Linux的变种,目标是将Linux应用于没有内存管理单元MMU (Memory Management Units)的处理器。由于uClinux是在Linux的基础之上添加了对没有MMU的微处理器的支持,所以它一方面继承了Linux的大部分优点,例如稳定性、各种网络协议栈的支持以及不同类型的文件系统支持等等;另一方面支持很多常用的嵌人式微控制器系统。

    普通Linux
    www.kernel.org
    V2.4
    V2.6
    对进程调度进行了改进,软实时操作系统,并且支持无MMU的CPU

    Arm Linux
    http://www.arm.linux.org.uk/

    PPC Linux
    http://www.linuxppc.org

    MIPS Linux
    http://linuxmips.ichilton.co.uk

    SH Linux
    http://linuxsh.cjb.net


    进程的基本概念
    linux中每一个进程由一个task_struct结构描述,定义于 includelinuxsched.h.也就是PCB.其中包含了系统用来管理进程的所有信息:进程状态,调度信息(优先级),各种标识,IPC有关信息,时间和定时信息,文件系统西信息,VM信息,页面信息,环境context等. (宏内核)

    一个进程包含两种结构:用户态下的数据和堆栈;内核态的堆栈和task_struct.task_struct和内核栈存放在一个8K大小的内存块中,其低地址存放task_struct,然后由高到低是内核态的堆栈。当一个进程在CPU上执行的时候,通过将当前堆栈指针低13位清0来得到指向当前进程task_struct的指针(因为内存块大小是8K,低13位清0就是该内存块的最低地址)。由current宏来实现,指向当前CPU上运行的进程的task_struct.

    State 进程执行时它根据情况改变状态
    Running 进程在运行 ( 是系统的当前进程 ) 或者准备运行(等待被安排到系统的一个 CPU 上) Waiting 进程在等待一个事件或资源。 Linux 区分两种类型的等待进程:可中断和不可中断的,可中断的等待进程可以被信号中断,而不可中断的等待进程直接等待硬件条件,不能被任何情况中断。
    Stopped 进程停止了,通常是接收到了一个信号。正在调试的进程可以在停止状态。 Zombie 终止的进程。

    进程的组织形式:linux中进程分为用户进程和内核线程,都有自己的task_struct.linux用以下几种方式来管理进程:

      a.进程链表:linux为每一种状态的进程都维护了一个双向链表,这样可以更方便管理。
      b.TASK_RUNNING状态链表:当内核要寻找一个新的进程在CPU上运行的时候,必须寻找能立即投入运行的进程,也就是TASK_RUNNING状态的进程。
      c.等待队列:等待队列同TASK_RUNNING队列不同,它有自己特殊的结构。等待队列表示一组睡眠的进程,当某个条件为真的时候由内核唤醒它们。
      d.task数组空闲表项的链表:当一个进程创建或撤消的时候,task数组必须被更新。线性的搜索太低效,内核就维护了一个非循环双向链表,包含 task数组中的空闲项。当创建一个进程的时候直接从这个链表取走第一个表项;当删除一个进程的时候将空闲表项加入链表的第一项。
      e.HASH表:在linux中的HASH表叫做pidhash,因为是由进程的PID映射的。它由PIDHASH_SZ个元素组成,表项是指向task_struc的指针。对于HASH的冲突,将各由冲突的表项连成双向链表。

    其中a,e是针对系统中所有进程的,而b,c,d是将具有同一状态的进程组织起来。

    Linux的进程调度
    在linux中进程的优先级是动态的,调度程序跟踪并适时调整进程的优先级。在linux中进程是抢占式的,而内核是非抢占的(2.4内核)。

    *所谓进程是抢占的也就是说如果有一个进程进入TASK_RUNNING状态,内核将检查它的优先级是否大于current的优先级,若大于,则 current被中断,并用调度程序选择一个进程运行(注意!不一定是刚刚那个TASK_RUNNING进程,但通常是这样)。当然,在一个进程时间片到期的时候也可以被抢占。
    *所谓内核非抢占是说内核态下的进程不能被随意中断,以保证内核态进程数据的完整和有效。也避免了一些同步的问题。

    linux所选择的进程调度算法将CPU时间划分为时期,在一个时期内,每一个进程有一个指定的时间片。通常每个进程的时间片不相等。当一个进程的时间片用完时,将被调度。在一个时期内进程也可以多次被调度,只要它的时间片还没有用完。当所有进程都用完他们的时间片的时候,这个时期结束。调度算法重新计算每个进程的时间片,开始一个新的时期。

    那linux在什么情况下才进行调度呢?
    1.进程状态的改变。例如RUNING->STOPPED。
    2.当前进程时间片用完。
    3.设备驱动程序。
    4.进程丛中断,异常,系统调用返回的时候。
    对于其中的1,进程要调用exit(),wait()等函数,这些函数自动调用调度程序;对于3,当驱动程序执行长而重复的任务时候直接调用调度程序。在每次反复循环中都由驱动程序检查need_resched的值,如果有必要就调用调度程序。。而对于2和4,由于都是从中断或调用返回,最终都要调用 ret_from_sys_call(),有这个函数进行判断,有必要就进行调度。

    Linux的进程的切换
    进程的切换主要包括地址空间的转换和上下文的切换。先说上下文切换
    在操作系统课程中我们学过每一个进程的TSS段都保存了它的硬件上下文(hardwarecontext),当由中断触发进行进程切换的时候,CUP会自动将任务门中的段选择符装入TR寄存器,使TR指向新的TSS,完成任务切换。但由于硬件自动装入和切换会带来很多不必要的开销,所以linux选择了用软件来实现进程切换。TSS在linux中没有实际作用,只是在内核初始化的时候设置一个TSS,以后全部用这个TSS,只是通过更换其中的部分内容来切换进程。linux进程切换主要是通过切换每一个任务在TSS中的内核栈指针SS0和ESP0来实现的。具体的切换依赖于switch_to()这个宏

    下面说地址空间的切换:主要由includeasm-i386Mmu_context.h
    static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, struct task_struct *tsk, unsigned cpu)

    当中断发生时也有上下文的切换,但是没有地址空间的切换。

    Linux的进程的创建
    在 Linux 系统中,没有一个进程是和其他进程完全无关的。系统中的每一个进程,除了初始的进程之外,都有一个父进程。新进程不是创建的,而是拷贝,或者说从前一个进程克隆的( cloned )。每一个进程的 task_struct 中都有指向它的父进程和兄弟进程(拥有相同的父进程的进程)以及它的子进程的的指针。在 Linux 系统中你可以用 pstree 命令看到正在运行的进程的家庭关系。
    init(1)-+-crond(98)
    |-emacs(387)
    |-gpm(146)
    |-inetd(110)
    |-kerneld(18)
    |-kflushd(2)
    |-klogd(87)
    |-kswapd(3)
    |-login(160)---bash(192)---emacs(225)
    |-lpd(121)

    程序与进程
    执行文件可以由许多格式甚至可以是一个脚本文件( script file )。脚本文件必须用合适的解释程序识别并运行。例如 /bin/sh 解释 shell script 。通常, Linux 支持的二进制文件是 a.out 和 ELF 。可执行文件不需要完全读入内存,而使用叫做 demand loading 的技术。当进程使用执行映像的一部分的时候它才被调入内存,未被使用的映像可以从内存中废弃。

    ELF Shared Libraries ( ELF 共享库) 动态连接的映像,反过来,不包含运行所需的所有的代码和数据。其中一些放在共享库并在运行的时候连接到映像中。当运行时动态库连接到映像中的时候,动态连接程序( dynamic linker )也要使用 ELF 共享库的表。 Linux 使用几个动态连接程序, ld.so.1 , libc.so.1 和 ld-linux.so.1 ,都在 /lib 目录下.

    Linux的内存管理,虚拟内存可以提供以下的功能:
    >>       广阔的地址空间:系统的虚拟内存可以比系统的实际内存大很多倍。
    >>       进程的保护:系统中的每一个进程都有自己的虚拟地址空间。这些虚拟地址空间是完全分开的,这样一个进程的运行不会影响其他进程。并且,硬件上的虚拟内存机制是被保护的,内存不能被写入,这样可以防止迷失的应用程序覆盖代码的数据。
    >>       内存映射:内存映射用来把文件映射到进程的地址空间。在内存映射中,文件的内容直接连接到进程的虚拟地址空间。
    >>       公平的物理内存分配:内存管理系统允许系统中每一个运行的进程都可以公平地得到系统的物理内存。
    >>       共享虚拟内存:虽然虚拟内存允许进程拥有自己单独的虚拟地址空间,但有时可能会希望进程共享内存。

    Linux的内存管理,内核空间和用户空间
    linux内核采用了分段机制,使得虚拟地址和线性地址总是一致,因此,linux的虚拟地址空间为0-4G字节。Linux将这4G字节的空间分为两部分。将最高的1G字节(从0XC0000000到 0XFFFFFFFF),供内核使用,称为“内核空间”。而将较低的3G字节(从0X00000000到0XBFFFFFFF),供各个进程使用,称为 “用户空间”。因为每个进程可以通过系统调用进入内核,因此,linux内核由系统的所有进程共享。

    Linux的内存管理,内核空间和用户空间
    linux内核采用了分段机制,使得虚拟地址和线性地址总是一致,因此,linux的虚拟地址空间为0-4G字节。Linux将这4G字节的空间分为两部分。将最高的1G字节(从0XC0000000到 0XFFFFFFFF),供内核使用,称为“内核空间”。而将较低的3G字节(从0X00000000到0XBFFFFFFF),供各个进程使用,称为 “用户空间”。因为每个进程可以通过系统调用进入内核,因此,linux内核由系统的所有进程共享。

    网络
    The BSD Socket Interface ( BSD socket 接口)   这是一个通用的接口,不仅仅支持多种形式的联网,也是一种进程间通讯机制。一个 socket 描述了通讯连接的一端,两个通讯进程每一个都会有一个 socket ,描述它们之间通讯连接的自己部分。 Socket 可以想象成一种特殊形式的管道,但是和管道不同, socket 对于可以容纳的数据量没有限制。 Linux 支持几种类型的 socket ,这些类叫做 address families (地址族)。这是因为每一类都有自己通讯寻址方式。 UNIX Unix domain sockets,
    INET The Internet address family supports communications via TCP/IP protocols
    AX25 Amateur radio X25IPX Novell
    IPXAPPLETALK
    Appletalk DDP
    X25 X25
  • 内核代码介绍

    2006-12-14

    Linux内核源代码是公开的,标准内核可以在以下网站上得到:
    ftp://ftp.kernel.org/pub/
    http://www.kernel.org/pub/

    针对某一类型CPU,同样有相应的patch
    ARM:ftp://ftp.arm.linux.org.uk/

    Linux内核源代码包含以下子目录:
    >>     arch-这个目录包含与体系结构相关的代码。对每个支持的体系结构(MIPS,ARM,386,等等),在"arch"下有一个相应的子目录。每个体系结构的子目录下有四个主要的子目录:
    >>     kernel, 包含与体系结构相关的内核代码
    >>     mm, 包含体系结构相关的内存管理代码
    >>     lib, 包含与体系结构相关的库代码 (vsprintf 等等)
    >>     mach- (目标平台目录), 包含基于此体系结构平台相关的代码
    >>     documentation-包含内核的文档
    >>     drivers-包含设备驱动代码。每类设备有相应的子目录,如char, block, net, 等等
    >>     fs-包含文件系统的代码。对每个支持的文件系统(ext2, proc,JFFS2 等等) 有相应的子目录
    >>     include-包含内核的头文件,对每一种体系结构,分别有相应的子目录asm-*
    >>     init-包含内核的初始化代码
    >>     kernel-包含内核代码
    >>     lib-包含内核的库代码
    >>     mm-包含内核管理代码
    >>     net-包含和网络相关代码

    内核编译

    oldconfig
    default configuration
    arch/cpu/defconfig
    #make oldconfig

    config
    text based interactive configuration
    #make config

    menuconfig
    Text based menu driven
    #make menuconfig

    xconfig
    X GUI based (tcl/tk)
    #make xconfig

    save configuration
    .config
    Source code generation based on new configuration

    menu creation
    arch/cpu/config.in and other Config.in files

    下面是和嵌入式有关的linux操作 我的学业~

    编译环境(2.4.x):.config, Makefile,ld脚本
    Make dep
    Make menuconfig
    Make zImage
    Make modules

    Make dep建立文件的依赖关系
    make menuconfig来配置内核(根据各个目录的config.in来决定,最开始的config.in是最顶层的Makefile配置下的ARCH目录下的config.in),config.in生成最顶层的.config,提供给每个目录下的Makefile来决定变异那些文件。

    最顶层的Makefile决定总体的一下变量,最重要的有:
    ARCH := arm

    HOSTCC       = gcc
    HOSTCFLAGS     = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer

    CROSS_COMPILE   = arm-linux-
    每个目录下的Makefile来决定哪些模块被编译:
    O_TARGET := misc.o

    export-objs               := mcp-core.o mcp-sa1100.o ucb1x00-core.o

    obj-$(CONFIG_MCP)           += mcp-core.o
    obj-$(CONFIG_MCP_SA1100)     += mcp-sa1100.o
    obj-$(CONFIG_MCP_UCB1200)     += ucb1x00-core.o
    obj-$(CONFIG_MCP_UCB1200_AUDIO) += ucb1x00-audio.o
    obj-$(CONFIG_MCP_UCB1200_TS)   += ucb1x00-ts.o

    include $(TOPDIR)/Rules.make

    Arch/arm/Makefile也很总要,决定一些总要的参数
    ifeq ($(CONFIG_CPU_32),y)
    PROCESSOR     = armv
    TEXTADDR       = 0xC0008000
    LDSCRIPT       = arch/arm/vmlinux-armv.lds.in
    endif

    内核的链接:arch/arm/vmlinux-armv(o).lds.in, vmlinux.lds
    /* ld script to make ARM Linux kernel
    * taken from the i386 version by Russell King
    * Written by Martin Mares <mj@atrey.karlin.mff.cuni.cz>
    */
    OUTPUT_ARCH(arm)
    ENTRY(stext)
    SECTIONS
    {
        . = TEXTADDR;
        .init : {               /* Init code and data       */
              _stext = .;
              __init_begin = .;
                    *(.text.init)
              __proc_info_begin = .;
                    *(.proc.info)
    http://blog.lupaworld.com/p_w_picpath/code_editor/rm.gif
              __init_end = .;
        }

        /DISCARD/ : {             /* Exit code and data       */
              *(.text.exit)
              *(.data.exit)
              *(.exitcall.exit)
        }

        .text : {               /* Real text segment         */
        …

    熟悉内核编译环境

    熟悉.config文件
    a.最顶层的config.in文件(arch/arm目录下,arm由最顶层的Makefile决定)
    b.各级目录下的config.in文件
    c.最后生成的.config文件(arch/arm/def-configs/)
    熟悉Makefile文件
    a.最顶层的Makefile文件
    b./arch/arm/Makefile
    c.其它目录的Makefile(主要是driver目录下的)
    熟悉vmlinux.lds文件 (arch/arm/目录下)
  • 内核配置选项

    2006-12-14

    Linux的内核配置程序提供了一系列配置选项。对于每一个配置选项,用户可以回答"y"、"m"或"n"。其中"y"表示将相应特性的支持或设备驱动程序编译进内核;"m"表示将相应特性的支持或设备驱动程序编译成可加载模块,在需要时,可由系统或用户自行加入到内核中去;"n"表示内核不提供相应特性或驱动程序的支持。由于内核的配置选项非常多,本文只介绍一些比较重要的选项。
    ① Code maturity level options(代码成熟度选项)
     Prompt for development and/or incomplete code/drivers (CONFIG_EXPERIMENTAL) [N/y/?] 如果用户想要使用还处于测试阶段的代码或驱动,可以选择“y”。如果想编译出一个稳定的内核,则要选择“n”。
    ② Processor type and features(处理器类型和特色)
     Processor family (386, 486/Cx486, 586/K5/5x86/6x86, Pentium/K6/TSC, PPro/6x86MX) [PPro/6x86MX] 选择处理器类型,缺省为Ppro/6x86MX。
     Maximum Physical Memory (1GB, 2GB) [1GB] 内核支持的最大内存数,缺省为1G。
     Math emulation (CONFIG_MATH_EMULATION) [N/y/?] 协处理器仿真,缺省为不仿真。
     MTRR (Memory Type Range Register) support (CONFIG_MTRR) [N/y/?]
    选择该选项,系统将生成/proc/mtrr文件对MTRR进行管理,供X server使用。
     Symmetric multi-processing support (CONFIG_SMP) [Y/n/?] 选择“y”,内核将支持对称多处理器。
    ③ Loadable module support(可加载模块支持)
     Enable loadable module support (CONFIG_MODULES) [Y/n/?] 选择“y”,内核将支持加载模块。
     Kernel module loader (CONFIG_KMOD) [N/y/?] 选择“y”,内核将自动加载那些可加载模块,否则需要用户手工加载。
    ④ General setup(一般设置)
     Networking support (CONFIG_NET) [Y/n/?] 该选项设置是否在内核中提供网络支持。
     PCI support (CONFIG_PCI) [Y/n/?] 该选项设置是否在内核中提供PCI支持。
     PCI access mode (BIOS, Direct, Any) [Any] 该选项设置Linux探测PCI设备的方式。选择“BIOS”,Linux将使用BIOS;选择“Direct”,Linux将不通过BIOS;选择 “Any”,Linux将直接探测PCI设备,如果失败,再使用BIOS。
     Parallel port support (CONFIG_PARPORT) [N/y/m/?] 选择“y”,内核将支持平行口。
    ⑤ Plug and Play configuration(即插即用设备支持)
     Plug and Play support (CONFIG_PNP) [Y/m/n/?] 选择“y”,内核将自动配置即插即用设备。
     ISA Plug and Play support (CONFIG_ISAPNP) [Y/m/n/?] 选择“y”,内核将自动配置基于ISA总线的即插即用设备。
    ⑥ Block devices(块设备)
     Normal PC floppy disk support (CONFIG_BLK_DEV_FD) [Y/m/n/?] 选择“y”,内核将提供对软盘的支持。
     Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support (CONFIG_BLK_DEV_IDE) [Y/m/n/?] 选择“y”,内核将提供对增强IDE硬盘、CDROM和磁带机的支持。
    ⑦ Networking options(网络选项)
     Packet socket (CONFIG_PACKET) [Y/m/n/?] 选择“y”,一些应用程序将使用Packet协议直接同网络设备通讯,而不通过内核中的其它中介协议。
     Network firewalls (CONFIG_FIREWALL) [N/y/?] 选择“y”,内核将支持防火墙。
     TCP/IP networking (CONFIG_INET) [Y/n/?] 选择“y”,内核将支持TCP/IP协议。
     The IPX protocol (CONFIG_IPX) [N/y/m/?] 选择“y”,内核将支持IPX协议。
     Appletalk DDP (CONFIG_ATALK) [N/y/m/?] 选择“y”,内核将支持Appletalk DDP协议。
    ⑧ SCSI support(SCSI支持)
    如果用户要使用SCSI设备,可配置相应选项。
    ⑨ Network device support(网络设备支持)
    Network device support (CONFIG_NETDEVICES) [Y/n/?] 选择“y”,内核将提供对网络驱动程序的支持。
    Ethernet (10 or 100Mbit)(10M或100M以太网)
    在该项设置中,系统提供了许多网卡驱动程序,用户只要选择自己的网卡驱动就可以了。此外,用户还可以根据需要,在内核中加入对FDDI、PPP、SLIP和无线LAN(Wireless LAN)的支持。
    ⑩ Character devices(字符设备)
     Virtual terminal (CONFIG_VT) [Y/n/?] 选择“y”,内核将支持虚拟终端。
     Support for console on virtual terminal (CONFIG_VT_CONSOLE) [Y/n/?]
    选择“y”,内核可将一个虚拟终端用作系统控制台。
     Standard/generic (dumb) serial support (CONFIG_SERIAL) [Y/m/n/?]
    选择“y”,内核将支持串行口。
     Support for console on serial port (CONFIG_SERIAL_CONSOLE) [N/y/?]
    选择“y”,内核可将一个串行口用作系统控制台。
    Filesystems(文件系统)
     Quota support (CONFIG_QUOTA) [N/y/?] 选择“y”,内核将支持磁盘限额。
     Kernel automounter support (CONFIG_AUTOFS_FS) [Y/m/n/?] 选择“y”,内核将提供对automounter的支持,使系统在启动时自动 mount远程文件系统。
     DOS FAT fs support (CONFIG_FAT_FS) [N/y/m/?] 选择“y”,内核将支持DOS FAT文件系统。
     ISO 9660 CDROM filesystem support (CONFIG_ISO9660_FS) [Y/m/n/?]
    选择“y”,内核将支持ISO 9660 CDROM文件系统。
     NTFS filesystem support (read only) (CONFIG_NTFS_FS) [N/y/m/?]
    选择“y”,用户就可以以只读方式访问NTFS文件系统。
     /proc filesystem support (CONFIG_PROC_FS) [Y/n/?] /proc是存放Linux系统运行状态的虚拟文件系统,该项必须选择“y”。
     Second extended fs support (CONFIG_EXT2_FS) [Y/m/n/?] EXT2是Linux的标准文件系统,该项也必须选择“y”。
    Network File Systems(网络文件系统)
     NFS filesystem support (CONFIG_NFS_FS) [Y/m/n/?] 选择“y”,内核将支持NFS文件系统。
     SMB filesystem support (to mount WfW shares etc.) (CONFIG_SMB_FS)
    选择“y”,内核将支持SMB文件系统。
     NCP filesystem support (to mount NetWare volumes) (CONFIG_NCP_FS)
    选择“y”,内核将支持NCP文件系统。
    Partition Types(分区类型)
    该选项支持一些不太常用的分区类型,用户如果需要,在相应的选项上选择“y”即可。
    Console drivers(控制台驱动)
    VGA text console (CONFIG_VGA_CONSOLE) [Y/n/?] 选择“y”,用户就可以在标准的VGA显示方式下使用Linux了。
       Sound(声音) Sound card support (CONFIG_SOUND) [N/y/m/?] 选择“y”,内核就可提供对声卡的支持。
    Kernel hacking(内核监视)
    Magic SysRq key (CONFIG_MAGIC_SYSRQ) [N/y/?] 选择“y”,用户就可以对系统进行部分控制。一般情况下选择“n”。
  • 嵌入式硬件基础

    2006-12-14

    硬件设计流程:元器件选型-〉原理图编制-〉印制板-〉样板试制-〉硬件功能测试 -〉第二版设计 (外壳配合)-〉第三版设计

    元器件选型:
    1.CPU选择
    ARM,X86,PPC,MIPS …
    PXA255,S3C2410,MX21 …
    主要考虑因素:
    功能:CPU的频率,CPU的外部接口,CPU的硬件加速功能等等
    大小、工艺及功耗:手持移动,带电源工作,芯片封装及工艺难度
    调试工具的支持:是否有较好的调试工具进行支持
    RTOS的支持:是否适合RTOS的选择,是否需要进行RTOS的大规模移植
    价格、出货量及技术支持:S3c2410

    我自己用的是S3c2410好像很多人都用 ^_^ 以后的工作也和这有关 ~

    2.外围器件选择
    主要考虑因数:
    功能
    价格
    封装,功耗,体积
    RTOS配合程度及产商技术支持
    存储部件:SRAM,SDRAM,NOR FLASH,NAND FLASH
          DDR,EEPROM
    网卡:     cs8900,dm9000
    音频&ts: ucb1400,uda1314ts
    LCD:       sharp,三星,Epson …
                TFT,STN,黑白

    原理图绘制  用户手册
    好的系统软件工程师应该能读懂原理图
    优秀的系统软件工程师应该能参与原理图的设计及器件选择

    印制板
    需要注意六层板以上的工艺

我的最新图片

Open Toolbar