精华内容
下载资源
问答
  • 【单选题】下面if语句统计满足“性别( gender)为...print(s2)的运行结果是【单选题】以下关于异常处理ty语句块的说法,正确的是(【单选题】下面 Python循环体执行的次数与其他不同的是【单选题】执行下列 Python语...

    【单选题】下面if语句统计满足“性别( gender)为男、职称(rank)为副教授、年龄(age)小于40岁”条件的人数,正确的语句为( )

    【单选题】Python语句s1=[4,5,6];s2=s1;s1[1]=0;print(s2)的运行结果是

    【单选题】以下关于异常处理ty语句块的说法,不正确的是(

    【单选题】下面 Python循环体执行的次数与其他不同的是

    【单选题】执行下列 Python语句将产生的结果是 x = 2; y = 2.0 if(x==y): print("Equal") else: print("Not Equal")

    【单选题】如果python程序中包括零除运算,解释器将在运行时抛出( )错误信息

    【单选题】发挥药效最快的给药途径是( )

    【单选题】常用康复护理技术不包括技术( )

    【单选题】皮内注射是将药液注入( )

    【单选题】下面程序段求两个数x和y中的大数( )是不正确的

    【单选题】Python语句d={1:'a',2:'b',3:'c'}; print(len(d))的运行结果是

    【单选题】整型变量x中存放了一个两位数,要将这个两位数的个位数字和十位数字交换位置,例如,13变成31,正确的 Python表达式是

    【单选题】下列选项中,不属于 Python特点的是

    【单选题】Python程序中对于表达式123+’xyz’,解释器将抛出( )错误信息。

    【单选题】在python中,合法的标识符是

    【单选题】为了给整型变量xy赋初值5下面正确的python赋值语句是

    【单选题】( )是 Python官方的扩展库索引,所有人都可以下载第三方库或上传自己开发的库到其中。

    【单选题】Python语句 print(type(1/2)的输出结果是

    【单选题】Python语句 print(type(12)的输出结果是

    【单选题】下面if语句统计“成绩( score)优秀的男生以及不及格的男生”的人数,正确的语句为

    【单选题】以下for语句结构中,( )不能完成1~10的累加功能

    【单选题】以下 Python注释代码,不正确的是()

    【单选题】如果python程序中没有导入相关模块时,解释器将在运行时抛出( )错误

    【单选题】执行下列 Python语句将产生的结果是 i = 1 if(i):print (True) else: print (False)

    【单选题】Python表达式sqrt(4)*sqrt(9)的值为

    【单选题】Python语句x=car;y=2; print(x+y)的输出结果是

    【单选题】不属于小儿脑性瘫痪的高危因素是( )

    【单选题】Python语言属于

    【单选题】python语句a = [1,2,3,None,(),[],];print(len(a))的输出结果是

    【单选题】python 语句print(r" Good")的运行结果是

    【单选题】Python语句nums=set([1,2,2,3,3,3,4)];print(len(nums)的输出结果是

    【判断题】图书是指内容比较成熟,资料比较系统,没有完整装帧形式的出版物

    【单选题】为了给整型变量x,y、z赋初值10,下面正确的python赋值语句是

    【单选题】间歇导尿期间每日饮水量控制在( )以内。

    【判断题】“中图法”采用的是一种树状等级式目录结构

    【单选题】Python语句s={'a',1,'b',2} ;print(s['b'])的运行结果是

    【单选题】药物保管中,剧毒药瓶上的标签颜色是( )

    【单选题】Python程序中假设列表s=[1,2,3],如果语句中使用s[3],则解释器将抛出( )错误信息。

    【单选题】下列关于脑卒中患者翻身训练的说法中错误的是 ( )

    【单选题】python语句“f1 = lambda x:x*2;f2=lambda x:x**2;print(f1(f2(2))) “的程序运行结果是

    【单选题】康复医学的服务机构包括 ( )

    【单选题】Python语句 print(type(1J))的输出结果是

    【单选题】Python语句s= "hello’; print(s[1:3])的运行结果是

    【单选题】现代康复护理提倡的护理方式是( )

    【单选题】如果 Python程序中试图打开不存在的文件,解释器将在运行时抛出( )错误信息。

    【单选题】关于 Python字符串,下列说法错误的是

    【单选题】Python语句 print(chr(65)的运行结果是

    【单选题】python语句“f = lambda x,y:x*y;print(f(12,34)) “的程序运行结果是

    【单选题】Python表达式中,可以使用 ()控制运算的优先顺序

    【单选题】患者女性,43岁。中暑,体温41.5°C,遵医嘱灌肠为患者降温,正确的做法是( )

    展开全文
  • Linux 内核引导选项简介

    千次阅读 2017-02-23 20:20:41
    与设备有关的引导选项多如牛毛,需要你自己阅读内核的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,...

    概述

    内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"__setup()"函数设置的,少部分是通过"early_param()"或"module_param()"或"module_param_named()"之类的函数设置的,逗号前的部分就是引导选项的名称,后面的部分就是处理这些选项的函数名。

    [提示]你可以在源码树的根目录下试一试下面几个命令:

    grep -r '\b__setup *(' *
    grep -r '\bearly_param *(' *
    grep -r '\bmodule_param *(' *
    grep -r '\bmodule_param_named *(' *
    

    格式上,多个选项之间用空格分割,选项值是一个逗号分割的列表,并且选项值中不能包含空白。

    正确:ether=9,0x300,0xd0000,0xd4000,eth0  root=/dev/sda2
    错误:ether = 9, 0x300, 0xd0000, 0xd4000, eth0  root = /dev/sda2
    

    注意,所有引导选项都是大小写敏感的!

    在内核运行起来之后,可以通过 cat /proc/cmdline 命令查看当初使用的引导选项以及相应的值。

    内核模块

    对于模块而言,引导选项只能用于直接编译到核心中的模块,格式是"模块名.选项=值",比如"usbcore.blinkenlights=1"。动态加载的模块则可以在 modprobe 命令行上指定相应的选项值,比如"modprobe usbcore blinkenlights=1"。

    可以使用"modinfo -p ${modulename}"命令显示可加载模块的所有可用选项。已经加载到内核中的模块会在 /sys/module/${modulename}/parameters/ 中显示出其选项,并且某些选项的值还可以在运行时通过"echo -n ${value} > /sys/module/${modulename}/parameters/${parm}"进行修改。

    内核如何处理引导选项

    绝大部分的内核引导选项的格式如下(每个选项的值列表中最多只能有十项):

    name[=value_1][,value_2]...[,value_10]

    如果"name"不能被识别并且满足"name=value"的格式,那么将被解译为一个环境变量(比如"TERM=linux"或"BOOT_IMAGE=vmlinuz.bak"),否则将被原封不动的传递给 init 程序(比如"single")。

    内核可以接受的选项个数没有限制,但是整个命令行的总长度(选项/值/空格全部包含在内)却是有限制的,定义在 include/asm/setup.h 中的 COMMAND_LINE_SIZE 宏中(对于X86_64而言是2048)。

    内核引导选项精选

    由于引导选项多如牛毛,本文不可能涉及全部,因此本文只基于 X86_64 平台以及 Linux-3.13.2 精选了一些与设备无关的引导选项以及少部分与设备有关的引导选项,过时的选项、非x86平台选项、与设备有关的选项,基本上都被忽略了。

    [提示]内核源码树下的 Documentation/kernel-parameters.txt 和 Documentation/x86/x86_64/boot-options.txt 文件列出了所有可用的引导选项,并作了简要说明。

    标记说明

    并不是所有的选项都是永远可用的,只有在特定的模块存在并且相应的硬件也存在的情况下才可用。引导选项上面的方括号说明了其依赖关系,其中使用的标记解释如下:

    ACPI     开启了高级配置与电源接口(CONFIG_ACPI)支持
    AGP      开启了AGP(CONFIG_AGP)支持
    APIC     开启了高级可编程中断控制器支持(2000年以后的CPU都支持)
    APPARMOR 开启了AppArmor(CONFIG_SECURITY_APPARMOR)支持
    DRM      开启了Direct Rendering Manager(CONFIG_DRM)支持
    EFI      开启了EFI分区(CONFIG_EFI_PARTITION)支持
    EVM      开启了Extended Verification Module(CONFIG_EVM)支持
    FB       开启了帧缓冲设备(CONFIG_FB)支持
    HIBERNATION  开启了"休眠到硬盘"(CONFIG_HIBERNATION)支持
    HPET_MMAP    允许对HPET寄存器进行映射(CONFIG_HPET_MMAP)
    HW       存在相应的硬件设备
    IOMMU    开启了IOMMU(CONFIG_IOMMU_SUPPORT)支持
    IOSCHED  开启了多个不同的I/O调度程序(CONFIG_IOSCHED_*)
    IPV6     开启了IPv6(CONFIG_IPV6)支持
    IP_PNP   开启了自动获取IP的协议(DHCP,BOOTP,RARP)支持
    IP_VS_FTP    开启了IPVS FTP协议连接追踪(CONFIG_IP_VS_FTP)支持
    KVM      开启了KVM(CONFIG_KVM_*)支持
    LIBATA   开启了libata(CONFIG_ATA)驱动支持
    LOOP     开启了回环设备(CONFIG_BLK_DEV_LOOP)支持
    MCE      开启了Machine Check Exception(CONFIG_X86_MCE)支持
    MOUSE    开启了鼠标(CONFIG_INPUT_MOUSEDEV)支持
    MSI      开启了PCI MSI(CONFIG_PCI_MSI)支持
    NET      开启了网络支持
    NETFILTER    开启了Netfilter(CONFIG_NETFILTER)支持
    NFS      开启了NFS(网络文件系统)支持
    NUMA     开启了NUMA(CONFIG_NUMA)支持
    PCI      开启了PCI总线(CONFIG_PCI)支持
    PCIE     开启了PCI-Express(CONFIG_PCIEPORTBUS)支持
    PNP      开启了即插即用(CONFIG_PNP)支持
    PV_OPS   内核本身是半虚拟化的(paravirtualized)
    RAID     开启了软RAID(CONFIG_BLK_DEV_MD)支持
    SECURITY 开启了多个不同的安全模型(CONFIG_SECURITY)
    SELINUX  开启了SELinux(CONFIG_SECURITY_SELINUX)支持
    SLUB     开启了SLUB内存分配管理器(CONFIG_SLUB)
    SMP      开启了对称多处理器(CONFIG_SMP)支持
    TPM      开启了可信赖平台模块(CONFIG_TCG_TPM)支持
    UMS      开启了USB大容量存储设备(CONFIG_USB_STORAGE)支持
    USB      开启了USB(CONFIG_USB_SUPPORT)支持
    USBHID   开启了USB HID(CONFIG_USB_HID)支持
    VMMIO    开启了使用内存映射机制的virtio设备驱动(CONFIG_VIRTIO_MMIO)
    VT       开启了虚拟终端(CONFIG_VT)支持
    

    此外,下面的标记在含义上与上面的有所不同:

    BUGS    用于解决某些特定硬件的缺陷
    KNL     是一个内核启动选项
    BOOT    是一个引导程序选项
    

    标记为"BOOT"的选项实际上由引导程序(例如GRUB)使用,对内核本身没有直接的意义。如果没有特别的需求,请不要修改此类选项的语法,更多信息请阅读 Documentation/x86/boot.txt 文档。

    说明:下文中的 [KMG] 后缀表示 210, 220, 230 的含义。

    控制台与终端

    [KNL]
    console=设备及选项
    设置输出控制台使用的设备及选项。例如:ttyN 表示使用第N个虚拟控制台。其它用法主要针对嵌入式环境(Documentation/serial-console.txt)。
    [KNL]
    consoleblank=秒数
    控制台多长时间无操作后黑屏,默认值是600秒,设为0表示禁止黑屏。
    [HW]
    no_console_suspend
    永远也不要将控制台进入休眠状态。因为当控制台进入休眠之后,所有内核的消息就都看不见了(包括串口与VGA)。开启此选项有助于调试系统在休眠/唤醒中发生的故障。
    [VT]
    vt.default_utf8={0|1}
    是否将所有TTY都默认设置为UTF-8模式。默认值"1"表示将所有新打开的终端都设置为UTF-8模式。

    日志与调试

    earlyprintk=设备[,keep]
    使用哪个设备显示早期的引导信息,主要用于调试硬件故障。此选项默认并未开启,因为在某些情况下并不能正常工作。
    在传统的控制台初始化之前,在哪个设备上显示内核日志信息。不使用此选项,那么你将永远没机会看见这些信息。
    在尾部加上",keep"选项表示在真正的内核控制台初始化并接管系统后,不会抹掉本选项消息的显示。
    earlyprintk=vga 表示在VGA上显示内核日志信息,这是最常用的选项,但不能用于EFI环境。
    earlyprintk=efi v3.13新增,表示将错误日志写入EFI framebuffer,专用于EFI环境。
    earlyprintk=xen 仅可用于XEN的半虚拟化客户机。
    loglevel={0|1|2|3|4|5|6|7}
    设置内核日志的级别,所有小于该数字的内核信息(具有更高优先级的信息)都将在控制台上显示出来。这个级别可以使用 klogd 程序或者修改 /proc/sys/kernel/printk 文件进行调整。取值范围是"0"(不显示任何信息)到"7"(显示所有级别的信息)。建议至少设为"4"(WARNING)。[提示]级别"7"要求编译时加入了调试支持。
    [KNL]
    ignore_loglevel
    忽略内核日志等级的设置,向控制台输出所有内核消息。仅用于调试目的。
    [KNL]
    debug
    将引导过程中的所有调试信息都显示在控制台上。相当于设置"loglevel=7"(DEBUG)。
    [KNL]
    quiet
    静默模式。相当于设置"loglevel=4"(WARNING)。
    log_buf_len=n[KMG]
    内核日志缓冲区的大小。"n"必须是2的整数倍(否则会被自动上调到最接近的2的整数倍)。该值也可以通过内核配置选项CONFIG_LOG_BUF_SHIFT来设置。
    [KNL]
    initcall_debug
    跟踪所有内核初始化过程中调用的函数。有助于诊断内核在启动过程中死在了那个函数上面。
    kstack=N
    在内核异常(oops)时,应该打印出内核栈中多少个字(word)到异常转储中。仅供调试使用。
    [KNL]
    kmemleak={on|off}
    是否开启检测内核内存泄漏的功能(CONFIG_DEBUG_KMEMLEAK),默认为"on",仅供调试使用。
    检测方法类似于跟踪内存收集器,一个内核线程每10分钟(默认值)扫描内存,并打印发现新的未引用的对象的数量。
    [KNL]
    memtest=整数
    设置内存测试(CONFIG_MEMTEST)的轮数。"0"表示禁止测试。仅在你确实知道这是什么东西并且确实需要的时候再开启。
    norandmaps
    默认情况下,内核会随机化程序的启动地址,也就是每一次分配给程序的虚拟地址空间都不一样,主要目的是为了防止缓冲区溢出攻击。但是这也给程序调试增加了麻烦,此选项(相当于"echo 0 > /proc/sys/kernel/randomize_va_space")的目的就是禁用该功能以方便调试。
    [PNP]
    pnp.debug=1
    开启PNP调试信息(需要内核已开启CONFIG_PNP_DEBUG_MESSAGES选项),仅用于调试目的。也可在运行时通过 /sys/module/pnp/parameters/debug 来控制。
    show_msr=CPU数
    显示启动时由BIOS初始化的MSR(Model-Specific Register)寄存器设置。CPU数设为"1"表示仅显示"boot CPU"的设置。
    printk.time={0|1}
    是否在每一行printk输出前都加上时间戳,仅供调试使用。默认值是"0"(不添加)
    boot_delay=毫秒数
    在启动过程中,为每一个printk动作延迟指定的毫秒数,取值范围是[0-10000](最大10秒),超出这个范围将等价于"0"(无延迟)。仅用于调试目的。
    pause_on_oops=秒数
    当内核发生异常时,挂起所有CPU的时间。当异常信息太多,屏幕持续滚动时,这个选项就很有用处了。主要用于调试目的。

    异常检测与处理

    [MCE]
    mce=off
    彻底禁用MCE(CONFIG_X86_MCE)
    [MCE]
    mce=dont_log_ce
    不为已纠正错误(corrected error)记录日志。
    [MCE]
    mce=容错级别[,超时]
    容错级别(还可通过sysfs设置):
    0 在出现未能纠正的错误时panic,记录所有已纠正的错误
    1(默认值) 在出现未能纠正的错误时panic或SIGBUS,记录所有已纠正的错误
    2 在出现未能纠正的错误时SIGBUS或记录日志,记录所有已纠正的错误
    3 从不panic或SIGBUS,记录所有日志。仅用于调试目的。
    超时(单位是微秒[百万分之一秒]):在machine check时等待其它CPU的时长,"0"表示不等待。
    [ACPI]
    erst_disable
    禁用ERST(Error Record Serialization Table)支持。主要用于解决某些有缺陷的BIOS导致的ERST故障。
    [ACPI]
    hest_disable
    禁用HEST(Hardware Error Source Table)支持。主要用于解决某些有缺陷的BIOS导致的HEST故障。
    [KNL]
    nosoftlockup
    禁止内核进行软死锁检测
    [KNL]
    softlockup_panic={0|1}
    是否在检测到软死锁(soft-lockup)的时候让内核panic,其默认值由 CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE 确定
    [KNL]
    nowatchdog
    禁止硬死锁检测(NMI watchdog)
    [KNL,BUGS]
    nmi_watchdog={0|panic|nopanic}
    配置nmi_watchdog(不可屏蔽中断看门狗)。更多信息可查看"lockup-watchdogs.txt"文档。
    0 表示关闭看门狗;
    panic 表示出现看门狗超时(长时间没喂狗)的时候触发内核错误,通常和"panic="配合使用,以实现在系统出现锁死的时候自动重启。
    nopanic 正好相反,表示即使出现看门狗超时(长时间没喂狗),也不触发内核错误。
    unknown_nmi_panic
    在收到未知的NMI(不可屏蔽中断)时直接panic
    oops=panic
    在内核oops时直接panic(而默认是仅仅杀死oops进程[这样做会有很小的概率导致死锁]),而且这同样也会导致在发生MCE(CONFIG_X86_MCE)时直接panic。主要目的是和"panic="选项连用以实现自动重启。
    [KNL]
    panic=秒数
    内核在遇到panic时等待重启的行为:
    秒数>0 等待指定的秒数后重启
    秒数=0(默认值) 只是简单的挂起,而永不重启
    秒数<0 立即重启

    时钟(Timer)

    时钟(Timer)的功能有两个:(1)定时触发中断;(2)维护和读取当前时间。x86_64平台常见的时钟硬件有以下这些:
    RTC(Real Time Clock) 实时时钟的独特之处在于,RTC是主板上一块电池供电的CMOS芯片(精度一般只到秒级),RTC(Clock)吐出来的是"时刻"(例如"2014-2-22 23:38:44"),而其他硬件时钟(Timer)吐出来的是"时长"(我走过了XX个周期,按照我的频率,应该是10秒钟)。
    PIT(Programmable Interval Timer) PIT是最古老的时钟源,产生周期性的时钟中断(IRQ0),精度在100-1000Hz,现在基本已经被HPET取代。
    APIC Timer 这是PIT针对多CPU环境的升级,每个CPU上都有一个APIC Timer(而PIT则是所有CPU共享的),但是它经常有BUG且精度也不高(3MHz左右),所实际很少使用。
    ACPI Timer(Power Management Timer) 它唯一的功能就是为每个时钟周期提供一个时间戳,用于提供与处理器速度无关的可靠时间戳。但其精度并不高(3.579545MHz)。
    HPET(High Precision Event Timer) HPET提供了更高的精度(14.31818MHz)以及更宽的计数器(64位)。HPET可以替代前述除RTC之外的所有时钟硬件(Timer),因为它既能定时触发中断,又能维护和读取当前时间。一个HPET包含了一个固定频率的数值递增的计数器以及3-32个独立计数器,每个计数器又包含了一个比较器和一个寄存器,当两者数值相等时就会触发中断。HPET的出现将允许删除芯片组中的一些冗余的旧式硬件。2006年之后的主板基本都已支持HPET。
    TSC(Time Stamp Counter) TSC是位于CPU里面的一个64位寄存器,与传统的周期性时钟不同,TSC并不触发中断,它是以计数器形式存在的单步递增性时钟。也就是说,周期性时钟是通过周期性触发中断达到计时目的,如心跳一般。而单步递增时钟则不发送中断,取而代之的是由软件自己在需要的时候去主动读取TSC寄存器的值来获得时间。TSC的精度(纳秒级)远超HPET并且速度更快,但仅能在较新的CPU(Sandy Bridge之后)上使用。

    [HW,ACPI]
    acpi_skip_timer_override
    用于解决某些有缺陷的Nvidia nForce2 BIOS中的计时器覆盖问题(例如开启ACPI后频繁死机或时钟故障)。
    [HW,ACPI]
    acpi_use_timer_override
    用于解决某些有缺陷的Nvidia nForce5 BIOS中的计时器覆盖问题(例如开启ACPI后频繁死机或时钟故障)。
    [APIC]
    no_timer_check
    禁止运行内核中时钟IRQ源缺陷检测代码。主要用于解决某些AMD平台的CPU占用过高以及时钟过快的故障。
    pmtmr=十六进制端口号
    手动指定pmtimer(CONFIG_X86_PM_TIMER)的I/O端口(16进制值),例如:pmtmr=0x508
    acpi_pm_good
    跳过pmtimer(CONFIG_X86_PM_TIMER)的bug检测,强制内核认为这台机器的pmtimer没有毛病。用于解决某些有缺陷的BIOS导致的故障。
    [APIC]
    apicpmtimer
    使用pmtimer(CONFIG_X86_PM_TIMER)来校准APIC timer。此选项隐含了"apicmaintimer"。用于PIT timer彻底坏掉的场合。
    [APIC]
    apicmaintimer
    noapicmaintimer
    apicmaintimer 将APIC timer用于计时(而不是PIT/HPET中断)。这主要用于PIT/HPET中断不可靠的场合。
    noapicmaintimer 不将APIC timer用于计时(而是使用PIT/HPET中断)。这是默认值。但有时候依然需要明确指定。
    [APIC]
    lapic_timer_c2_ok
    按照ACPI规范的要求,local APIC Timer 不能在C2休眠状态下关闭,但可以在C3休眠状态下关闭。但某些BIOS(主要是AMD平台)会在向操作系统报告CPU进入C2休眠状态时,实际进入C3休眠状态。因此,内核默认采取了保守的假定:认为 local APIC Timer 在C2/C3状态时皆处于关闭状态。如果你确定你的BIOS没有这个问题,那么可以使用此选项明确告诉内核,即使CPU在C2休眠状态,local APIC Timer 也依然可用。
    [APIC]
    noapictimer
    禁用CPU Local APIC Timer
    enable_timer_pin_1
    disable_timer_pin_1
    开启/关闭APIC定时器的PIN1,内核将尽可能自动探测正确的值。但有时需要手动指定以解决某些有缺陷的ATI芯片组故障。
    clocksource={jiffies|acpi_pm|hpet|tsc}
    强制使用指定的时钟源,以代替内核默认的时钟源。
    jiffies 最差的时钟源,只能作为最后的选择。
    acpi_pm [ACPI]符合ACPI规范的主板都提供的硬件时钟源(CONFIG_X86_PM_TIMER),提供3.579545MHz固定频率,这是传统的硬件时钟发生器。
    hpet 一种取代传统"acpi_pm"的高精度硬件时钟源(CONFIG_HPET),提供14.31818MHz固定频率。2007年以后的芯片组一般都支持。
    tsc TSC(Time Stamp Counter)的主体是位于CPU里面的一个64位TSC寄存器,与传统的以中断形式存在的周期性时钟不同,TSC是以计数器形式存在的单步递增性时钟,两者的区别在于,周期性时钟是通过周期性触发中断达到计时目的,如心跳一般。而单步递增时钟则不发送中断,取而代之的是由软件自己在需要的时候去主动读取TSC寄存器的值来获得时间。TSC的精度更高并且速度更快,但仅能在较新的CPU(Sandy Bridge之后)上使用。
    [KNL]
    highres={"on"|"off"}
    启用(默认值)还是禁用高精度定时器模式。主要用于关闭主板上有故障的高精度时钟源。
    nohpet
    禁用HPET timer(CONFIG_HPET)
    [HPET_MMAP]
    hpet_mmap
    v3.13新增,默认允许对HPET寄存器进行映射,相当于开启了内核CONFIG_HPET_MMAP_DEFAULT选项。需要注意的是,某些包含HPET硬件寄存器的页中同时还含有其他不该暴露给用户的信息。
    notsc
    tsc=reliable
    tsc=noirqtime
    设置TSC时钟源的属性。
    notsc 表示不将TSC用作"wall time"时钟源,主要用于不能在多个CPU之间保持正确同步的SMP系统。
    tsc=reliable 表示TSC时钟源是绝对稳定的,关闭启动时和运行时的稳定性检查。用于在某些老旧硬件/虚拟化环境使用TSC时钟源。
    tsc=noirqtime 不将TSC用于统计进程IRQ时间。主要用于在RDTSC速度较慢的CPU上禁止内核的CONFIG_IRQ_TIME_ACCOUNTING功能。
    关于"TSC时钟源",详见"clocksource="选项的说明。

    中断

    常见的中断控制器有两种:传统的8259A和新式的APIC,前者也被称为"PIC"。8259A只适合单CPU的场合,而APIC则能够把中断传递给系统中的每个CPU,从而充分挖掘SMP体系结构的并行性。所以8259A已经被淘汰了。APIC系统由3部分组成:APIC总线(前端总线)、IO-APIC(南桥)、本地APIC(CPU)。每个CPU中集成了一个本地APIC,负责传递中断信号到处理器。而IO-APIC是系统芯片组中一部分,负责收集来自I/O设备的中断信号并发送到本地APIC。APIC总线则是连接IO-APIC和各个本地APIC的桥梁。

    [SMP,APIC]
    noapic
    禁止使用IO-APIC(输入输出高级可编程输入控制器),主要用于解决某些有缺陷的BIOS导致的APIC故障。
    [APIC]
    nolapic
    disableapic
    禁止使用local APIC。主要用于解决某些有缺陷的BIOS导致的APIC故障。"nolapic"是为了保持传统习惯的兼容写法,与"disableapic"的含义相同。
    [APIC]
    nox2apic
    关闭x2APIC支持(CONFIG_X86_X2APIC)
    [APIC]
    x2apic_phys
    在支持x2apic的平台上使用physical模式代替默认的cluster模式。
    [KNL]
    threadirqs
    强制线程化所有的中断处理器(明确标记为IRQF_NO_THREAD的除外)
    [SMP,APIC]
    pirq=
    手动指定mp-table的设置。此选项仅对某些有缺陷的、具备多个IO-APIC的高端主板有意义。详见Documentation/x86/i386/IO-APIC.txt文档
    [HW]
    irqfixup
    用于修复简单的中断问题:当一个中断没有被处理时搜索所有可用的中断处理器。用于解决某些简单的固件缺陷。
    [HW]
    irqpoll
    用于修复高级的中断问题:当一个中断没有被处理时搜索所有可用的中断处理器,并且对每个时钟中断都进行搜索。用于解决某些严重的固件缺陷。

    ACPI

    高级配置与电源管理接口(Advanced Configuration and Power Interface)是提供操作系统与应用程序管理所有电源管理接口,包括了各种软件和硬件方面的规范。2004年推出3.0规范;2009年推出4.0规范;2011年推出5.0规范。2013年之后新的ACPI规格将由UEFI论坛制定。ACPI可以实现的功能包括:电源管理;性能管理;配置与即插即用;系统事件;温度管理;电池管理;SMBus控制器;嵌入式控制器。

    [HW,ACPI]
    acpi={force|off|noirq|strict|rsdt|nocmcff|copy_dsdt}
    ACPI的总开关。
    force 表示强制启用ACPI(即使BIOS中已关闭);
    off 表示强制禁用ACPI(即使BIOS中已开启);
    noirq 表示不要将ACPI用于IRQ路由;
    strict 表示严格要求系统遵循ACPI规格(降低兼容性);
    rsdt 表示使用老旧的RSDT(Root System Description Table)代替较新的XSDT(Extended System Description Table);
    copy_dsdt 表示将DSDT(Differentiated System Description Table)复制到内存中。
    更多信息可参考Documentation/power/runtime_pm.txt以及"pci=noacpi"。
    [HW,ACPI]
    acpi_backlight={vendor|video}
    选择屏幕背光亮度调节驱动。
    video(默认值)表示使用通用的ACPI video.ko驱动(CONFIG_ACPI_VIDEO),该驱动仅可用于集成显卡。
    vendor表示使用厂商特定的ACPI驱动(thinkpad_acpi,sony_acpi等)。
    详见Documentation/acpi/video_extension.txt文档。
    [HW,ACPI]
    acpi_os_name="字符串"
    告诉ACPI BIOS操作系统的名称。
    常用于哄骗有缺陷的BIOS,让其以为运行的是Windows系统而不是Linux系统。
    "Linux" = Linux
    "Microsoft Windows" = Windows 98
    "Windows 2000" = Windows 2000
    "Windows 2001" = Windows XP
    "Windows 2001 SP2" = Windows XP SP2
    "Windows 2001.1" = Windows Server 2003
    "Windows 2001.1 SP1" = Windows Server 2003 SP1
    "Windows 2006" = Windows Vista
    "Windows 2006 SP1" = Windows Vista SP1
    "Windows 2006.1" = Windows Server 2008
    "Windows 2009" = Windows 7 / Windows Server 2008 R2
    "Windows 2012" = Windows 8 / Windows Server 2012
    "Windows 2013" = Windows 8.1 / Windows Server 2012 R2
    [HW,ACPI]
    acpi_osi="字符串"
    对于较新的内核(Linux-2.6.23之后)而言,当BIOS询问内核:"你是Linux吗?",内核都会回答"No",但历史上(Linux-2.6.22及更早版本)内核会如实回答"Yes",结果造成很多BIOS兼容性问题(主要是电源管理方面)。具体故事的细节请到内核源码文件drivers/acpi/osl.c中搜索"The story of _OSI(Linux)"注释。
    此选项用于修改内核中的操作系统接口字符串(_OSI string)列表默认值,这样当BIOS向内核询问:"你是xxx吗?"的时候,内核就可以根据修改后的列表中是否存在"xxx"回答"Yes"或"No"了,主要用于解决BIOS兼容性问题导致的故障(例如屏幕亮度调整)。
    acpi_osi="Linux"表示添加"Linux";
    acpi_osi="!Linux"表示删除"Linux";
    acpi_osi=!* 表示删除所有字符串(v3.13新增),可以和多个acpi_osi="Linux"格式联合使用;
    acpi_osi=! 表示删除所有内置的字符串(v3.13新增),可以和多个acpi_osi="Linux"格式联合使用;
    acpi_osi= 表示禁用所有字符串,仅可单独使用(不能联合使用)。
    [HW,ACPI]
    acpi_serialize
    强制内核以串行方式执行AML(ACPI Machine Language)字节码。用于解决某些有缺陷的BIOS导致的故障。
    [ACPI]
    acpi_enforce_resources={strict|lax|no}
    检查驱动程序和ACPI操作区域(SystemIO,SystemMemory)之间资源冲突的方式。
    strict(默认值)禁止任何驱动程序访问已被ACPI声明为"受保护"的操作区域,这是最安全的方式,可以从根本上避免冲突。
    lax允许驱动程序访问已被ACPI声明的保护区域(但会显示一个警告)。这可能会造成冲突,但是可以兼容某些老旧且脑残的驱动程序(例如某些硬件监控驱动)。
    no表示根本不声明任何ACPI保护区域,也就是完全允许任意驱动程序访问ACPI操作区域。
    [ACPI]
    pnpacpi=off
    禁用ACPI的即插即用功能,转而使用古董的PNPBIOS来代替。

    休眠与唤醒

    [HW,ACPI]
    acpi_sleep={s3_bios,s3_mode,s3_beep,s4_nohwsig,old_ordering,nonvs,sci_force_enable}
    ACPI休眠选项。
    (1)s3_bios和s3_mode与显卡有关。计算机从S3状态(挂起到内存)恢复时,硬件需要被正确的初始化。这对大多数硬件都不是问题,但因为显卡是由BIOS初始化的,内核无法获取必要的恢复信息(仅存在于BIOS中,内核无法读取),所以这里就提供了两个选项,以允许内核通过两种不同的方式来恢复显卡,更多细节请参考Documentation/power/video.txt文档。
    (2)s3_beep主要用于调试,它让PC喇叭在内核的实模式入口点被调用时发出响声。
    (3)s4_nohwsig用于关闭ACPI硬件签名功能,某些有缺陷的BIOS会因为这个原因导致从S4状态(挂起到硬盘)唤醒时失败。
    (4)old_ordering用于兼容古董级的ACPI 1.0 BIOS
    (5)nonvs表示阻止内核在挂起/唤醒过程中保存/恢复ACPI NVS内存信息,主要用于解决某些有缺陷的BIOS导致的挂起/唤醒故障。
    (6)sci_force_enable表示由内核直接设置SCI_EN(ACPI模式开关)的状态,主要用于解决某些有缺陷的BIOS导致的从S1/S3状态唤醒时的故障。
    [HIBERNATION]
    noresume
    禁用内核的休眠到硬盘功能(CONFIG_HIBERNATION),也就是不从先前的休眠状态中恢复(即使该状态已经被保存在了硬盘的swap分区上),并且清楚先前已经保存的休眠状态(如果有的话)。
    [HIBERNATION]
    hibernate={noresume|nocompress}
    设置休眠/唤醒属性:
    noresume 表示禁用唤醒,也就是在启动过程中无视任何已经存在的休眠镜像,完全重新启动。
    nocompress 表示禁止对休眠镜像进行压缩/解压。
    [HIBERNATION]
    resume={ /dev/swap | PARTUUID=uuid | major:minor | hex }
    告诉内核被挂起的内存镜像存放在那个磁盘分区(默认值是CONFIG_PM_STD_PARTITION)。
    假定内存镜像存放在"/dev/sdc15"分区上,该分区的 UUID=0123456789ABCDEF ,其主设备号是"8",次设备号是"47",那么这4种表示法应该分别这样表示:
    resume=/dev/sdc15 (这是内核设备名称,有可能与用户空间的设备名称不同)
    resume=PARTUUID=0123456789ABCDEF
    resume=08:47
    resume=082F
    [HIBERNATION]
    resume_offset=整数
    指定swap header所在位置的偏移量(单位是PAGE_SIZE),偏移量的计算基准点是"resume="分区的起点。
    仅在使用swap文件(而不是分区)的时候才需要此选项。详见Documentation/power/swsusp-and-swap-files.txt文档
    [HIBERNATION]
    resumedelay=秒数
    在读取resume文件(设备)之前延迟的秒数,主要用于等待那些反应速度较慢的异步检测的设备就绪(例如USB/MMC)。
    [HIBERNATION]
    resumewait
    在resume设备没有就绪之前无限等待,主要用于等待那些反应速度较慢的异步检测的设备就绪(例如USB/MMC)。

    温度控制

    [HW,ACPI]
    thermal.act=摄氏度
    -1 禁用所有"主动散热"标志点(active trip point)
    正整数 强制设置所有的最低"主动散热"标志点的温度值,单位是摄氏度。
    详见Documentation/thermal/sysfs-api.txt文档。
    [HW,ACPI]
    thermal.psv=摄氏度
    -1 禁用所有"被动散热"标志点(passive trip point)
    正整数 强制设置所有的"被动散热"标志点的温度值,单位是摄氏度。
    详见Documentation/thermal/sysfs-api.txt文档。
    [HW,ACPI]
    thermal.crt=摄氏度
    -1 禁用所有"紧急"标志点(critical trip point)
    正整数 强制设置所有的"紧急"标志点的温度值,单位是摄氏度。
    详见Documentation/thermal/sysfs-api.txt文档。
    [HW,ACPI]
    thermal.nocrt=1
    禁止在ACPI热区(thermal zone)温度达到"紧急"标志点时采取任何动作。
    [HW,ACPI]
    thermal.off=1
    彻底关闭ACPI热量控制(CONFIG_ACPI_THERMAL)
    [HW,ACPI]
    thermal.tzp=整数
    设置ACPI热区(thermal zone)的轮询速度:
    0(默认值) 不轮询
    正整数 轮询间隔,单位是十分之一秒。

    CPU节能

    [KNL]
    nohz={on|off}
    启用/禁用内核的dynamic ticks特性。默认值是"on"。
    [KNL,BOOT]
    nohz_full=CPU列表
    在内核"CONFIG_NO_HZ_FULL=y"的前提下,指定哪些CPU核心可以进入完全无滴答状态。
    "CPU列表"是一个逗号分隔的CPU编号(从0开始计数),也可以使用"-"界定一个范围。例如"0,2,4-7"等价于"0,2,4,5,6,7"
    [注意](1)"boot CPU"(通常都是"0"号CPU)会无条件的从列表中剔除。(2)这里列出的CPU编号必须也要同时列进"rcu_nocbs=..."选项中。
    [HW,ACPI]
    processor.nocst
    不使用_CST方法检测C-states,而是用老旧的FADT方法检测。
    [HW,ACPI]
    processor.max_cstate={0|1|2|3|4|5|6|7|8|9}
    无视ACPI表报告的值,强制指定CPU的最大C-state值(必须是一个有效值):C0为正常状态,其他则为不同的省电模式(数字越大表示CPU休眠的程度越深/越省电)。"9"表示无视所有的DMI黑名单限制。
    [KNL,HW,ACPI]
    intel_idle.max_cstate=[0|正整数]
    设置intel_idle驱动(CONFIG_INTEL_IDLE)允许使用的最大C-state深度。"0"表示禁用intel_idle驱动,转而使用通用的acpi_idle驱动(CONFIG_CPU_IDLE)
    idle=poll
    idle=halt
    idle=nomwait
    对CPU进入休眠状态的额外设置。
    poll 从根本上禁用休眠功能(也就是禁止进入C-states状态),可以略微提升一些CPU性能,但是却需要多消耗许多电力,得不偿失。不推荐使用。
    halt 表示直接使用HALT指令让CPU进入C1/C1E休眠状态,但是不再继续进入C2/C3以及更深的休眠状态。此选项兼容性最好,唤醒速度也最快。但是电力消耗并不最低。
    nomwait 表示进入休眠状态时禁止使用CPU的MWAIT指令。MWAIT是专用于Intel超线程技术的线程同步指令,有助于提升CPU的超线程效能,但对于不具备超线程技术的CPU没有意义。
    [提示]可以同时使用halt和nomwait,也就是"idle=halt idle=nomwait"(但不是:idle=halt,nomwait)
    intel_pstate=disable
    禁用 Intel CPU 的 P-state 驱动(CONFIG_X86_INTEL_PSTATE),也就是Intel CPU专用的频率调节器驱动

    PCI与PCIE

    [PCI]
    pci=选项[,选项...]
    指定各种PCI子系统选项:
    earlydump 在内核做出任何改变之前,首先转储出PCI配置空间。主要用于调试目的。
    off 不检测PCI总线,也就是关闭所有PCI设备。
    conf1 强制使用"PCI配置机制1"(目前的事实标准)
    conf2 强制使用"PCI配置机制2"(已被抛弃的老古董)
    noaer [PCIE]禁止使用CONFIG_PCIEAER功能(PCI Express Root Port Advanced Error Reporting)
    nodomains 禁止支持多个PCI root domain(也就是PCI总线域[PCI segment])
    nommconf 禁止使用通过MMCONFIG(CONFIG_PCI_MMCONFIG)方式访问PCI配置空间,MMCONFIG是PCI Express引入的新总线枚举方式。
    check_enable_amd_mmconf 在 AMD family 10h CPU 上检查并启用正确配置的MMIO以访问PCI配置空间
    nomsi [MSI]在全系统范围内禁止MSI中断(CONFIG_PCI_MSI)的使用
    noioapicquirk [APIC]禁止屏蔽任何boot中断(CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS),以确保boot IRQ永远可用。应该永远不需要使用此选项。
    ioapicreroute [APIC]允许将boot IRQ重新路由到主IO-APIC(相当于开启CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS),用于修复某些芯片组bug(在某些情况下会发送多余的"boot IRQ")。
    noioapicreroute [APIC]禁止将boot IRQ重新路由到主IO-APIC(相当于关闭CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS),不建议使用此项。
    rom 为扩展ROM分配地址空间。使用此选项要小心,因为某些设备在ROM与其它资源之间共享地址译码器。
    norom 即使BIOS没有为扩展ROM分配地址空间,也禁止内核为扩展ROM分配地址空间。
    nobar 即使BIOS没有为BAR分配地址空间,也禁止内核为BAR分配地址空间。
    irqmask=0xMMMM 指定允许自动分配到PCI设备的IRQ位掩码,目的是为了避免使用那些被ISA设备占用的IRQ。
    pirqaddr=0xAAAAA 如果PIRQ表(通常情况下由BIOS生成)在F0000h-100000h范围之外,此选项可用于明确指定其物理地址。
    lastbus=N 通过扫描N号总线来扫描全部总线。如果内核不能找到第二条总线,可以通过此方法明确告知其位置。
    assign-busses 总是使用内核自己生成的PCI总线号码替代固件自己生成的值。
    usepirqmask 优先使用可能存在于BIOS $PIR表中的IRQ掩码。某些有缺陷的BIOS需要这个选项(例如HP Pavilion N5400和Omnibook XE3笔记本)。此选项仅在noioapicreroute(相当于关闭CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS)的前提下有效。
    noacpi 不为IRQ路由或PCI扫描使用ACPI
    use_crs 使用来自ACPI的PCI主桥的窗口信息。在2008年之后的BIOS上,这是默认值,如果需要明确使用此项,请当做bug上报开发者。
    nocrs 忽略来自ACPI的PCI主桥的窗口信息,如果需要明确使用此项,请当做bug上报开发者。
    routeirq 对所有PCI设备使用IRQ路由。这个通常是由内核的pci_enable_device()函数完成,所以此项仅为那些忘记调用此函数的驱动提供的临时解决方案。
    skip_isa_align 不对齐ISA IO起始地址,这样就可以处理更多的PCI卡
    noearly 不做任何"early type 1"扫描,这样许多针对主板缺陷的检测将被禁止,同时某些IOMMU驱动也会失效。仅用于解决某些有缺陷的主板故障。
    bfsort 按照宽度优先(breadth-first)的顺序对PCI设备进行排序。目的是为了以与2.4内核兼容的方式获取设备序号。
    nobfsort 不按宽度优先(breadth-first)的顺序对PCI设备进行排序。
    pcie_bus_tune_off 不对PCIe MPS(Max Payload Size)进行调整,而是使用BIOS配置好的默认值。
    pcie_bus_safe 将每个设备的MPS都设为root complex下所有设备支持的MPS中的最大值
    pcie_bus_perf 将设备的MPS设为其上级总线允许的最大MPS,同时将MRRS(Max Read Request Size)设为能支持的最大值(但不能大于设备或总线所支持的MPS值)
    pcie_bus_peer2peer 将每个设备的MPS都设为最安全的"128B",以确保支持所有设备之间的点对点DMA,同时也能保证热插入(hot-added)设备能够正常工作,但代价是可能会造成性能损失。
    cbiosize=nn[KMG] 从CardBus桥的IO窗口中保留的固定长度的总线空间(bus space),默认值是256B。
    cbmemsize=nn[KMG] 从CardBus桥的内存窗口中保留的固定长度的总线空间(bus space),默认值是64MB。
    resource_alignment=[对齐规则@][域:]总线:插槽.功能[; ...] 为重新分配已对齐的内存资源指定对齐方式与设备。如果未指定对齐规则,那么将使用PAGE_SIZE作为对齐规则。也可以通过指定PCI-PCI桥来扩展资源窗口(resource windows)。
    ecrc={bios|on|off} 启用/禁用PCIe ECRC(事务层的端对端CRC校验)。默认值是"bios"(使用BIOS/固件的设定)。
    hpiosize=nn[KMG] 为热插拔桥的IO窗口保留的固定总线空间的大小,默认值是256B。
    hpmemsize=nn[KMG] 为热插拔桥的内存窗口保留的固定总线空间的大小,默认值是2MB。
    realloc={on|off} 当BIOS分配的PCI桥资源太小而无法满足所有子设备的需求时,是否由内核重新分配PCI桥资源。没有默认值(内核的默认值为"undefined")
    realloc 等价于"realloc=on"
    noari 不使用PCIe ARI
    pcie_scan_all 扫描所有可能的PCIe设备。默认只在每个PCIe下游端口扫描一个设备。
    [PCIE]
    pcie_hp=nomsi
    禁止PCIe本地热插拔使用MSI(CONFIG_PCI_MSI),这将导致所有PCIe端口使用INTx中断提供热插拔服务。
    [PCIE]
    pcie_ports={auto|native|compat}
    PCIe端口处理方式:
    auto 由BIOS来决定是否使用关联在PCIe端口上的本地PCIe服务(PME, hot-plug, AER)
    native 无条件的使用关联在PCIe端口上的本地PCIe服务(PME, hot-plug, AER)
    compat 禁用PCIe端口驱动,同时将PCIe端口当做PCI-to-PCI桥处理。
    [PCIE]
    pcie_aspm={off|force}
    强制启用/禁用PCIe Active State Power Management(CONFIG_PCIEASPM)。内核的默认值取决于内核"Default ASPM policy"的配置。
    off 强制禁用
    force 即使设备声明不支持ASPM也强制启用(可能会导致系统锁死)。
    [PCIE]
    pcie_pme=nomsi
    禁止本地PCIe PME信号使用MSI(CONFIG_PCI_MSI),这将导致所有PCIe root端口使用INTx中断提供所有服务。

    LIBATA

    [LIBATA]
    libata.noacpi
    在libata驱动休眠/唤醒过程中禁止使用ACPI。主要用于解决某些有缺陷的BIOS导致的硬盘假死问题。
    [LIBATA]
    libata.dma=整数
    控制DMA特性的使用
    libata.dma=0 表示完全禁止所有SATA/PATA端口使用DMA
    libata.dma=1 表示仅允许SATA/PATA硬盘使用DMA
    libata.dma=2 表示仅允许ATAPI(CDROM)使用DMA
    libata.dma=4 表示仅允许CF卡使用DMA
    上述1,2,4实际上是位掩码,可以组合使用,例如 libata.dma=3 表示允许硬盘和CDROM使用DMA,但是禁止CF卡使用DMA
    [LIBATA]
    libata.ignore_hpa={0|1}
    是否忽略HPA(Host Protected Area)的限制。"0"(默认值)表示不忽略;"1"表示忽略(也就是可以使用整个磁盘空间)
    [LIBATA]
    libata.force=PORT[.DEVICE]:VAL,PORT[.DEVICE]:VAL,...
    手动强制指定libata的配置。
    其中的"PORT[.DEVICE]"是libata驱动在控制台上以相同格式显示出来的ATA ID字符串(PORT和DEVICE都是十进制数字),下面是两个实例("1.00","2.00"):
    ata1.00: ATAPI: VBOX CD-ROM, 1.0, max UDMA/133
    ata2.00: ATA-6: VBOX HARDDISK, 1.0, max UDMA/133
    
    如果不指定DEVICE部分,那么就表示适用于该PORT端口上的所有设备。
    VAL部分用来强制设定设备属性:
    40c, 80c, short40c, unk, ign, sata 这些都用于指定线缆类型
    1.5Gbps, 3.0Gbps 这些都用于指定SATA连接速度
    noncq, ncq 关闭还是开启NCQ功能
    dump_id 转储IDENTIFY数据
    pio[0-7], mwdma[0-4], udma[0-7](或者这么写也一样:udma[16,25,33,44,66,100,133]) 数据传输模式
    nohrst, nosrst, norst 只禁止硬重置,只禁止软重置,同时禁止硬重置和软重置
    rstonce 在热拔连接恢复(hot-unplug link recovery)过程中仅尝试一次重置
    atapi_dmadir 开启 ATAPI DMADIR bridge 支持
    disable 禁用该设备

    键盘/鼠标/触摸板

    [HW]
    atkbd.set={2|3}
    设置atkbd驱动(CONFIG_KEYBOARD_ATKBD)的键盘类型:2(默认值)表示AT键盘;3 表示PS/2键盘。
    [HW]
    atkbd.reset
    在初始化AT或PS/2键盘时重置键盘状态。常用于解决从休眠状态唤醒后键盘失效的故障。
    [HW]
    atkbd.softraw={0|1}
    当键盘按键被按下时,是返回原始的扫描码(Scancode)还是经过转换之后的键码(Keycode)。常用于解决某些功能键(例如Fn键)故障。
    0 表示返回原始的扫描码(Scancode)
    1(默认值)表示返回转换之后的键码(Keycode)
    [USBHID]
    usbhid.mousepoll=毫秒数
    USB鼠标的轮询时间间隔,单位是毫秒。默认值是"10",也就是每秒轮询100次,相当于100Hz
    [MOUSE]
    mousedev.tap_time=毫秒数
    手指触碰和离开触摸板的最大时间间隔,只有小于此间隔的触碰才会被当成鼠标左键单击。此选项仅对工作在绝对模式的触摸板有意义。
    [MOUSE]
    mousedev.xres=正整数
    mousedev.yres=正整数
    触摸板的水平(X)/垂直(Y)方向的分辨率。

    USB

    [USB]
    nousb
    禁用USB子系统(CONFIG_USB_SUPPORT)
    [USB]
    usbcore.authorized_default={-1|0|1}
    USB设备的默认授权规则:
    -1(默认值) 对除无线USB之外的设备默认授权
    0 对所有设备都默认不授权
    1 对所有设备都默认授权
    [USB]
    usbcore.autosuspend=秒数
    让USB设备(新检测到的设备以及空闲设备)进入自动休眠前的延迟秒数。默认为2秒。
    如果将秒数设为负数,则表示永不进入自动休眠状态。
    [USB]
    usbcore.initial_descriptor_timeout=毫秒数
    等待设备回应初始化64位USB_REQ_GET_DESCRIPTOR请求的超时时间。默认值是"5000",也就是5秒。
    [USB]
    usbcore.blinkenlights={0|1}
    是否让所有的USB集线器(HUB)上的LED指示灯闪烁。默认值"0"表示不闪烁,"1"表示闪烁。
    [USB]
    usbcore.usbfs_snoop={0|1}
    是否在在日志中记录所有的usbfs traffic信息。默认值"0"表示不记录,"1"表示记录。
    [USB]
    usbcore.old_scheme_first={0|1}
    是否优先使用老旧的USB设备初始化方法。默认值"0"表示不优先使用。
    [USB]
    usbcore.use_both_schemes={0|1}
    是否在第一种USB设备初始化方法失败之后,继续尝试第二种方法。默认值"1"表示继续尝试第二种方法。
    [USB]
    usbcore.usbfs_memory_mb=[0-2047]
    由usbfs分配的缓存上限。取值范围是[0-2047],默认值是"16",单位是"MB"。
    [UMS]
    usb-storage.delay_use=秒数
    在扫描新USB存储设备上的逻辑单元(Logical Unit)前暂停的秒数。默认值是"5"秒。
    [UMS]
    usb-storage.quirks=VID:PID:Flags[,VID:PID:Flags]...
    设置一系列的修正项(quirk),用于增补或者改写内核内置的unusual_devs列表内容。该列表用于修正各种有缺陷的USB存储设备的怪毛病。
    多个修正项之间用逗号分隔,修正项的格式是"VID:PID:Flags",其中VID和PID的含义分别是4位16进制数表示的"Vendor ID"与"Product ID"。
    而Flags则是一组字符的组合,其中的每个字符都对应一个具有特定含义的修正(quirk)标记:
    a = SANE_SENSE (收集超过18字节的传感器数据)
    b = BAD_SENSE (不收集超过18字节的传感器数据)
    c = FIX_CAPACITY (无条件的将设备报告的扇区数(容量)减少一个扇区)
    d = NO_READ_DISC_INFO (不使用 READ_DISC_INFO 命令)
    e = NO_READ_CAPACITY_16 (不使用 READ_CAPACITY_16 命令)
    h = CAPACITY_HEURISTICS (如果设备报告的扇区数(容量)是奇数,那么就减少一个扇区)
    i = IGNORE_DEVICE (不绑定此设备)
    l = NOT_LOCKABLE (不要尝试锁定/解锁可弹出媒体)
    m = MAX_SECTORS_64 (每次传输最大不超过64个扇区(32KB)的数据)
    n = INITIAL_READ10 (强制重试初始的 READ(10) 命令(如果最初一次读取失败的话))
    o = CAPACITY_OK (完全信任设备报告的扇区数(容量))
    p = WRITE_CACHE (默认开启设备写入缓存[不怕数据丢失的风险])
    r = IGNORE_RESIDUE (不相信设备报告的[容量]剩余值)
    s = SINGLE_LUN (此设备只有一个逻辑单元(Logical Unit))
    w = NO_WP_DETECT (不检测设备是否有写保护)
    例如:usb-storage.quirks=0419:aaf5:rl,0421:0433:rc
    [USB]
    uhci-hcd.ignore_oc={0|1}
    是否忽略"电流超限"(overcurrent)事件。
    0(默认值) 不忽略
    1 忽略。某些有缺陷的主板会在USB端口未连接任何设备时,报告很多虚假的"电流超限"事件。设为"1"之后可以避免在内核日志中出现大量的"电流超限"警告,但同时,真实的"电流超限"事件也会被一并忽略。

    IOMMU

    IOMMU非常类似于MMU,主要有如下功能:(1)IO地址转换[在64位系统上支持32位设备];(2)分散-聚集(scatter-gather)支持[简化驱动程序的编写];(3)DMA重映射与IRQ重映射[简化了IO设备的虚拟化]。
    Linux内核当前的DMA映射有如下4种具体实现:
    (1)在内存不足3G的机器上,根本不使用任何IOMMU功能,因为根本没必要。内核消息:"PCI-DMA: Disabling IOMMU"
    (2)基于GART(CONFIG_GART_IOMMU)的硬件IOMMU。内核消息:"PCI-DMA: using GART IOMMU"
    (3)如果内存大于3G同时机器上又没有IOMMU硬件(或者用了"iommu=soft"),那么就使用软件模拟的IOMMU(CONFIG_BOUNCE)。内核消息:"PCI-DMA: Using software bounce buffering for IO (SWIOTLB)"
    (4)基于IBM Calgary硬件的IOMMU,仅用于IBM pSeries/xSeries系列服务器。内核消息:"PCI-DMA: Using Calgary IOMMU"

    [IOMMU]
    iommu={off,force,noforce,soft}
    通用IOMMU设置:
    off 彻底关闭IOMMU功能
    force 强制使用硬件IOMMU,即使硬件可能有缺陷(例如VIA芯片组)或者根本没有必要这样做(例如内存不足3G)。
    noforce(默认) 在内存不足3G的机器上,不使用硬件IOMMU,因为根本没有必要。
    soft(Intel平台的默认值) 使用通过软件模拟的IOMMU(SWIOTLB),同时禁止使用硬件IOMMU(即使存在)。
    [IOMMU]
    iommu=[SIZE][,allowed][,fullflush|nofullflush][,leak[=NUM]][,memaper[=N]|noaperture][,noagp][,merge|nomerge][,forcesac][,panic][,allowdac|nodac][,calgary]
    仅适用于硬件IOMMU(GART与Calgary)的设置:
    SIZE 重映射区域的大小,单位是字节。
    allowed 含义与"force"相同,即使硬件可能有缺陷(例如VIA芯片组)也强制使用硬件IOMMU
    fullflush(默认) 每次分配时都刷新IOMMU
    nofullflush 不刷新IOMMU
    leak=NUM 开启IOMMU泄漏跟踪(CONFIG_IOMMU_LEAK),NUM是的泄漏页数(默认值是20)。
    memaper=N 在RAM中分配的固有窗口(own aperture)的大小,算法是 2N*32MB,N的默认值是"1",也就是64MB。
    noaperture 禁止IOMMU使用AGP的"aperture"。
    noagp 不初始化AGP驱动,使用完全的"aperture"。
    merge 强制"scatter-gather"合并,隐含了"force",这是一个实验性选项。
    nomerge 禁止"scatter-gather"合并
    forcesac 对于少于40位的掩码强制使用单地址周期(single-address cycle),这是一个实验性选项。
    panic 当IOMMU益处时,允许panic
    allowdac 将32位PCI地址用两个时钟周期推入64位地址,这就是DAC的作用。
    nodac 禁用DAC,也就是所有4GB以上的DMA将强制通过IOMMU(硬件的或模拟的)
    calgary 使用IBM Calgary IOMMU
    swiotlb=页数[,force]
    仅适用于软件IOMMU(CONFIG_BOUNCE)的设置:
    页数 为"IO bounce buffer"预先保留的页数,每个页的大小是128K
    force 强制所有IO都透过软件IOMMU
    [AMD-IOMMU]
    amd_iommu={fullflush|off|force_isolation}
    向AMD IOMMU驱动(CONFIG_AMD_IOMMU)传递选项
    fullflush 表示当IO/TLB项被取消映射的时候立即刷新IO/TLB项(严格模式,速度较慢),否则将仅在IO/TLB项被重用之前进行刷新(宽松模式,速度更快)
    off 表示彻底禁用AMD IOMMU功能
    force_isolation 表示为所有设备强制启用IOMMU隔离(映射),这样IOMMU驱动就不再需要自己去发起隔离请求。注意:此选项不会覆盖"iommu=pt"
    [Intel-IOMMU]
    intel_iommu={on,off,igfx_off,forcedac,strict,sp_off}
    Intel-IOMMU驱动(CONFIG_INTEL_IOMMU)的主要功能就是DMA重映射,该选项用于设置其特性。
    on 开启Intel-IOMMU驱动
    off 关闭Intel-IOMMU驱动
    igfx_off 关闭Intel集成显卡的DMA重映射功能(默认值为开启)
    forcedac 强制PCI设备使用DAC,而禁止进行地址转换(默认值为允许)
    strict 禁止批量刷写IOTLB(默认值为允许)
    sp_off 关闭super page支持(默认值为开启)
    [Intel-IOMMU]
    intremap={on,off,nosid,no_x2apic_optout}
    设置中断重映射功能:
    on(默认值)开启中断重映射
    off 关闭中断重映射
    nosid 重映射时不对SID(Source ID)做检查
    no_x2apic_optout 无视BIOS的设置,强制禁用x2APIC特性,主要用于解决某些对x2APIC支持有缺陷的BIOS导致的故障

    虚拟化

    [PV_OPS]
    noreplace-paravirt
    禁止使用内核通用的半虚拟化接口paravirt_ops,主要用于解决某些在Virtual PC上安装或运行Linux的故障。
    [VMMIO]
    virtio_mmio.device=size@baseaddr:irq[:id]
    实例化virtio-mmio设备(CONFIG_VIRTIO_MMIO)。可以多次使用以实例化多个设备。
    size 大小(可以使用K,M,G后缀)
    baseaddr 物理基准地址(physical base address)
    irq 中断号(将会被传递给request_irq())
    id(可选) platform设备号(device id)
    例子:virtio_mmio.device=1K@0x100b0000:48:7
    [KVM]
    kvm.ignore_msrs={0|1}
    是否忽略客户机对未经处理的MSR(unhandled MSR)的访问。"0"(默认值)表示不忽略但是会注入#GP;"1"表示忽略。
    [KVM]
    kvm.mmu_audit={0|1}
    是否允许在运行时对KVM MMU进行审计。"0"(默认值)表示禁止审计;"1"表示允许审计。
    [KVM,AMD]
    kvm-amd.nested={0|1}
    是否允许嵌套虚拟化(在虚拟机内再创建虚拟机)。"0"表示禁止嵌套;"1"(默认值)表示允许嵌套。
    [KVM,AMD]
    kvm-amd.npt={0|1}
    是否允许客户机使用嵌套页表(Nested Page Table)。"0"表示禁止使用;"1"(默认值)表示允许使用。
    [KVM,Intel]
    kvm-intel.ept={0|1}
    是否允许客户机使用扩展页表(Extended Page Table)。"0"表示禁止使用;"1"(默认值)表示允许使用。
    [KVM,Intel]
    kvm-intel.emulate_invalid_guest_state={0|1}
    是否允许仿真无效的客户机状态。"0"(默认值)表示禁止仿真;"1"表示允许仿真。
    [KVM,Intel]
    kvm-intel.flexpriority={0|1}
    是否允许使用FlexPriority技术(TPR[Task Priority Register] shadow)。"0"表示禁止使用;"1"(默认值)表示允许使用。
    [KVM,Intel]
    kvm-intel.nested={0|1}
    是否允许VMX嵌套(nVMX)。"0"(默认值)表示禁止;"1"表示允许。
    [KVM,Intel]
    kvm-intel.unrestricted_guest={0|1}
    是否允许使用"unrestricted guest"技术。"0"表示禁止使用;"1"(默认值)表示允许使用。
    [KVM,Intel]
    kvm-intel.vpid={0|1}
    是否允许使用"Virtual Processor Identification"(tagged TLB)技术。"0"表示禁止使用;"1"(默认值)表示允许使用。

    内存

    [KNL,BOOT]
    mem=nn[KMG]
    强制指定内核使用多少数量的内存。仅在你想限定内存使用量时,才需要指定这个选项。同时为了避免PCI设备使用指定范围之外的内存,你还应该配合"memmap="一起使用。
    [KNL]
    memmap=exactmap
    表示将要使用随后的"memmap=..."等选项进行精确的E820内存映射(因为有时候E820报告的并不准确),同时禁止内核进行任何自动的探测。比如对于一个4G内存的机器可能是:"memmap=exactmap memmap=640K@0 memmap=4095M@1M"。
    [KNL]
    memmap=nn[KMG]@ss[KMG]
    强制只使用从ss开始的nn长度的特定内存区域。可以多次使用以指定多个区域。
    [KNL,ACPI]
    memmap=nn[KMG]#ss[KMG]
    强制将从ss开始的nn长度的特定内存区域标记为ACPI数据。
    [KNL,ACPI]
    memmap=nn[KMG]$ss[KMG]
    强制保留(不使用)从ss开始的nn长度的特定内存区域。
    [KNL,BUGS]
    reserve=起点,长度[,起点,长度]...
    禁止设备驱动程序自动探测某些iomem区域,因为某些设计不良的硬件会导致自动探测失败或出错。此外,还可以用于人为禁止内核初始化某些端口上的设备。
    内核会将此处指定的iomem区域标记为"reserved"(意为"已经在此处找到设备"),从而将该区域保留。
    因为设备驱动不应该去侦测标记为"reserved"的区域,除非另一个启动选项明确地指示它这样做,所以此选项经常和其它启动选项一起使用:
    用"reserve="保留一段区域禁止所有其他驱动的探测,同时再明确指定一个驱动去检测被保留的区域。例如:
    reserve=0x300,32  blah=0x300
    的意思是:除了允许"blah"驱动探测 0x300 之外,禁止任何其他驱动探测 0x300-0x31f 区域。
    绝大部份的机器都不需要此选项。只有真正有缺陷的硬件或特殊情况才会需要使用它。
    [注意]每个"reserve="选项最多可以指定4个保留区域,如果你有异常复杂的需求,可以使用多重"reserve="来指定。
    reservelow=nn[K]
    设置为BIOS保留的底端地址空间数量。
    memory_corruption_check={0|1}
    是否开启低位内存脏数据检查(CONFIG_X86_CHECK_BIOS_CORRUPTION)。某些有bug的BIOS经常会在执行系统休眠/唤醒之类动作的时候,破坏内存中前64k的内容。如果始终检查到错误,那么就应该通过"memmap="选项来避免使用这段内存。
    memory_corruption_check_size=字节数
    低位内存脏数据检查(CONFIG_X86_CHECK_BIOS_CORRUPTION)的内存范围。默认值是"64K",表示"0-64K"这个内存范围。
    memory_corruption_check_period=秒数
    低位内存脏数据检查(CONFIG_X86_CHECK_BIOS_CORRUPTION)的周期。默认值是60秒。设为"0"则表示禁止这种周期性的检查。
    [KNL,BOOT]
    vmalloc=nn[KMG]
    强制指定vmalloc区域的大小。可用于增加vmalloc区域的最小尺寸(x86默认128MB),也可以用于减少vmalloc的大小,增加更多的空间用于直接映射内核RAM。
    [SLUB]
    slub_min_order=整数
    slub_max_order=整数
    SLUB页块最小与最大order数(默认值分别是"0"与"3"),当然slub_min_order必须小于slub_max_order。每一个slab需要2order个物理页框。过高的值可能会导致内存溢出错误。详见Documentation/vm/slub.txt
    [SLUB]
    slub_min_objects=整数
    每个slab的最小object总数目(默认值是"4")。详见Documentation/vm/slub.txt
    [SLUB]
    slub_nomerge
    禁止合并大小相近的多个slab,主要用于调试目的。
    [KNL]
    dhash_entries=正整数
    设置内核目录项缓存中哈希表默认项数。仅供内核专家使用。
    [KNL]
    ihash_entries=正整数
    内核会在内存中缓存一定数量的inode结构来加速文件访问,每个inode对应一个文件(不同于文件系统中的inode概念),包含文件访问权限/属主/组/大小/生成时间/访问时间/最后修改时间等信息。这些inode保存在一个哈希表中。
    这个值用于指定这个哈希表的最大项数。你可以根据自己硬盘上可能被访问的文件数量对默认值进行调整(注意需要考虑哈希值的碰撞)。仅供内核专家使用。
    [KNL]
    transparent_hugepage={always|madvise|never}
    设置透明大内存页(CONFIG_TRANSPARENT_HUGEPAGE)的默认用法:
    always 表示总是对所有应用程序启用透明大内存页支持
    madvise 表示仅对明确要求该特性的程序启用
    never 表示彻底禁用。
    其默认值由内核的编译时设置决定。详见"Documentation/vm/transhuge.txt"文档。
    [HW]
    default_hugepagesz={2M|1G}
    默认的HugeTLB页大小。若未指定,那么其默认值就是CPU自身的默认值。
    大多数现代计算机体系结构提供对多页面大小的支持,比如X86_64支持4K和2M(要求CPU带有"pse"标记)以及1G(要求CPU带有"pdpe1gb"标记)。
    因此Linux将物理内存划分成许多固定大小的页面(默认为4K),每个页对应一个page结构,这些结构组成一个mem_map[]数组。TLB(Translation Lookaside Buffer)是虚拟地址到物理地址的翻译缓冲区,这种缓冲区在处理器上是很宝贵的,操作系统总是尝试将有限的TLB资源发挥到极致。特别是能够轻松获得若干G内存的时候(大于4G),这种优化就显得尤为关键。而HugeTLB特性则允许将某些页的尺寸增大到2MB或1GB,从而大大减小TLB的尺寸,提高缓冲区的命中率,进而提升内存性能。
    [HW]
    hugepagesz={2M|1G}
    指定HugeTLB页的大小,通常与"hugepages="联合使用(可使用多次),为不同尺寸的大页分别预留不同的数量。
    例如:hugepagesz=2M hugepages=128 hugepagesz=1G hugepages=8
    注意:1GB的大页只能在命令行上使用"hugepages="预先分配,且分配之后不可在运行时释放。
    [HW]
    hugepages=正整数
    在启动时分配的HugeTLB页数量,仅在内核开启了CONFIG_HUGETLBFS之后有效。
    gbpages
    nogbpages
    是否允许内核页表对大小为1GB的Hugepages进行直接映射(CONFIG_DIRECT_GBPAGES)。当"CONFIG_DIRECT_GBPAGES=y"时,默认值是"gbpages"。
    vdso={0|1|2}
    vdso=0 禁用VDSO(Virtual Dynamic Shared Object)映射
    vdso=1 启用VDSO(Virtual Dynamic Shared Object)映射,这是"CONFIG_COMPAT_VDSO=n"时的默认值。
    vdso=2 将VDSO(Virtual Dynamic Shared Object)映射到旧式的确定性地址,这是"CONFIG_COMPAT_VDSO=y"时的默认值。
    vdso32={0|1|2}
    vdso32=0 禁用32位VDSO(Virtual Dynamic Shared Object)映射
    vdso32=1 启用32位VDSO(Virtual Dynamic Shared Object)映射,这是"CONFIG_COMPAT_VDSO=n"时的默认值。
    vdso32=2 将32位VDSO(Virtual Dynamic Shared Object)映射到旧式的确定性地址,这是"CONFIG_COMPAT_VDSO=y"时的默认值。

    MTRR与PAT

    enable_mtrr_cleanup
    disable_mtrr_cleanup
    开启/关闭MTRR cleanup(CONFIG_MTRR_SANITIZER)特性。
    mtrr_chunk_size=nn[KMG]
    用于"MTRR cleanup"(CONFIG_MTRR_SANITIZER)功能,设置允许的最大连续块尺寸(也就是uncacheable项)。
    mtrr_gran_size=nn[KMG]
    用于"MTRR cleanup"(CONFIG_MTRR_SANITIZER)功能,设置MTRR块的粒度(每块的大小)。默认值是"1"。较大的值可以防止小的对齐耗尽MTRR。
    mtrr_spare_reg_nr=N
    用于"MTRR cleanup"(CONFIG_MTRR_SANITIZER)功能,设置备用MTRR项的编号。也就是告诉内核reg0N可以被清理或改写(参见"/proc/mtrr"文件),默认值是"1"。
    nopat
    禁用PAT支持(CONFIG_X86_PAT)。主要用于解决某PAT故障导致的无法正常启动或者显卡驱动不能正常工作的问题。

    图形与显示

    [AGP]
    agp={off|try_unsupported}
    off 表示关闭内核的AGP(CONFIG_AGP)支持;
    try_unsupported 表示尝试驱动那些不受支持的芯片(可能会导致系统崩溃或数据错误)
    [HW,DRM]
    gamma=浮点数
    设置显示器的Gamma值。
    video.brightness_switch_enabled={0|1}
    [背景知识]如果ACPI video.ko驱动(CONFIG_ACPI_VIDEO)能够收到用户通过键盘热键触发的ACPI事件(这需要固件的帮助),video.ko将会把收到的ACPI事件转化为一个"key"类型输入事件,并通过其创建的输入设备发送到用户空间,这样用户空间的工具就可以通过sysfs接口去修改显示器的亮度。这是传统的做法。
    但是从v3.13内核开始,新增了此选项,并且其默认值为"1",表示video.ko驱动除了向用户空间传递事件之外,还要自己在内核层去改变显示器的亮度。
    如果设为"0"则表示不在内核层改变显示器的亮度,依然留给用户层的工具去通过sysfs接口修改。
    详见Documentation/acpi/video_extension.txt文档。
    [DRM]
    i915.invert_brightness={-1|0|1}
    反转显示器背光亮度控制变量(brightness)的含义。
    通常情况下,brightness的值为"0"表示关闭背光(全黑),随着brightness的值增大到最大值,表示最大亮度。
    但是通过这个选项,可以反转brightness的含义,让"0"表示最亮,而随着brightness值的递增亮度逐渐降低,直到最大值关闭背光(全黑)。
    -1 表示绝不反转其含义,也就是"0"始终表示关闭,最大值始终表示最亮。
    0 表示内核不对此变量的含义加以干预,使用机器自身的默认含义。
    1 表示强制反转其含义,也就是"0"始终表示最亮,最大值始终表示关闭。
    此选项常用于解决某些使用Intel集显/核显(CONFIG_DRM_I915)的电脑在启动时黑屏的问题。
    [FB]
    logo.nologo
    在系统启动时不显示Linux的企鹅标志图(企鹅数=CPU核心数)

    网络

    [IPV6]
    ipv6.disable={0|1}
    ipv6.disable_ipv6={0|1}
    是否在所有网络接口上禁用IPv6支持:0(默认值)表示在所有网络接口上开启IPv6支持;1 表示在所有网络接口上关闭IPv6支持。建议使用"ipv6.disable=1"(彻底禁用ipv6内核模块)
    [IPV6]
    ipv6.autoconf={0|1}
    是否在所有网络接口上开启IPv6地址自动配置。
    0 表示禁止自动配置,这样就只有IPv6回环地址(::1)和"link-local"地址会被自动添加到网络接口上。如果你不想从路由器公告(Router Advertisements)中的地址前缀自动生成IPv6地址,可以使用此项。
    1(默认值) 表示在所有网络接口上开启IPv6地址自动配置
    [IP_PNP]
    ip=[client-ip:server-ip:gateway-ip:netmask:hostname:device:]autoconf[:dns0-ip:dns1-ip]
    此选项告诉内核如何在启动过程中配置网卡的IP地址及路由表(而不是在启动完成后依赖用户空间的脚本去配置)。仅在内核已启用了CONFIG_IP_PNP的前提下有效。通常用于需要将NFS挂载为根文件系统(CONFIG_ROOT_NFS)的场合。
    此选项有以下4种用法:
    (1)ip={off|none}或者没有使用"ip"选项。这是默认值,表示彻底关闭自动配置功能。
    (2)ip={dhcp|bootp|rarp|any} 表示内核全自动完成所有配置工作(也就是将所有字段设为各自的默认值)。各选项的含义参见下面对autoconf字段的说明。
    (3)将autoconf字段设为{off|none}之一,并明确指定所有其它字段。表示全静态配置,也就是手动指定各字段的值(禁止自动检测)。
    (4)将autoconf字段设为{dhcp|bootp|rarp|any}之一,并明将部分字段留空(字段分割符":"不能省略)。表示半自动配置,也就是将留空的字段设为各自的默认值(自动检测),而将手动指定的字段设为指定的值(禁止自动检测)。
    各字段的说明如下:
    client-ip NFS客户端IP地址。若留空,其默认值将通过自动检测获取。
    server-ip NFS服务器IP地址。该字段仅在需要将NFS挂载为根文件系统(root=/dev/nfs)的时候才是必须的。如果使用RARP检测client-ip并且此字段非空,那么将仅接受指定服务器的应答。若留空,其默认值将通过自动检测获取(也就是自动配置服务器的地址)。
    gateway-ip 网关的IP地址。仅在NFS服务器位于不同子网的时候才是必须的。若留空,其默认值将通过自动检测获取。
    netmask 子网掩码。若留空,其默认值将通过自动检测获取(根据client-ip所属的地址类型[A/B/C之类])。
    hostname NFS客户端的主机名。若留空,其默认值将通过自动检测获取(client-ip的ASCII表示形式)。
    device 使用的网卡。若留空,其默认值将通过自动检测获取:若有多个网卡,那么将通过所有网卡同时发送自动配置请求包,并将最先接收到应答的网卡设为默认网卡。
    autoconf 自动配置方式。{off|none}表示不使用自动配置(必须手动指定个字段的值);{dhcp|bootp|rarp}分别表示只使用DHCP/BOOTP/RARP协议进行自动配置(当然内核必须支持指定的协议);"any"表示使用内核支持的所有自动配置协议(同时发送不同协议的自动配置请求包,以最先接收到的应答为准)。 dns0-ip 主DNS服务器IP地址。若留空,其默认值将通过自动检测获取。其值将通过 /proc/net/pnp 导出到用户空间。在嵌入式系统上,/etc/resolv.conf 常常是到 /proc/net/pnp 的软连接。
    dns1-ip 辅DNS服务器IP地址。其它同上。
    [KNL,NET]
    rhash_entries=正整数
    设置内核路由缓冲区哈希表的大小,仅供内核网络专家使用。
    [KNL,NET]
    thash_entries=正整数
    设置内核允许使用的TCP链接哈希表的大小。
    [KNL,NET]
    uhash_entries=正整数
    设置内核允许使用的UDP/UDP-Lite链接哈希表的大小。
    [NETFILTER]
    nf_conntrack.acct={0|1}
    是否允许对连接追踪(CONFIG_NF_CONNTRACK)流进行记账。"0"(默认值)表示禁止记账,"1"表示允许记账。

    块设备与磁盘阵列

    blkdevparts=
    手动设置块设备分区表(而不是从块设备读取),主要用于嵌入式环境或分区表损坏恢复的场合。详情参见Documentation/block/cmdline-partition.txt文档
    [EFI]
    gpt
    强制将拥有有效GPT签名但同时又包含无效"保护MBR"的磁盘当做GPT格式的磁盘。
    [IOSCHED]
    elevator={"bfq"|"cfq"|"deadline"|"noop"}
    指定默认的IO调度器
    [LOOP]
    loop.max_loop=[0-256]
    在系统启动时无条件的预先创建的回环(loopback)设备数,默认值由CONFIG_BLK_DEV_LOOP_MIN_COUNT决定。如果你使用util-linux-2.21以上版本,建议设为"0"(loop设备将通过/dev/loop-control动态创建)。
    [HW,RAID]
    raid={autodetect|noautodetect,partitionable|part}
    明确向内核的MD驱动(CONFIG_BLK_DEV_MD)传递RAID配置属性
    autodetect|noautodetect 表示内核是否应该自动检测RAID模式(CONFIG_MD_AUTODETECT)。如果关闭了自动检测,那么必须使用"md="明确告诉内核RAID模式及配置。
    partitionable|part 两者含义相同,都表示内核应该将组装之后得到的RAID设备视为"可分区"设备。
    [HW,RAID]
    md=N,dev0,dev1,...
    明确向内核的MD驱动(CONFIG_BLK_DEV_MD)传递RAID配置信息,并将列出的设备(dev0,dev1,...)组装为 /dev/mdN 阵列(表现为一个块设备文件)。
    建议仅在根文件系统位于RAID上的情况下使用这个选项。其他非根文件系统的RAID最好在系统启动后(挂载完根之后)再组装。
    N 可以是 0,1,2,3,...,255 中的任意一个整数,表示被创建的md设备的编号,例如:
    md=2,/dev/sda,/dev/sdb,/dev/sdc,/dev/sdd
    表示将 /dev/sda,/dev/sdb,/dev/sdc,/dev/sdd 组装成 /dev/md2 块设备(至于RAID级别之类的信息则由存储在超级块中的元数据提供)。
    [提示]2.6.28之前的老版本内核对创建的阵列还有所谓"可分区阵列"和"不可分区阵列"的区别,具体表现是:如果在N前加上字母"d",则表示所创建的阵列是一个可分区阵列,否则就是不可分区阵列。不过现在已经没有这个区别了,所有创建的阵列都是可分区的,因此"d"也就没有存在的必要了。

    根文件系统

    [KNL]
    root=字符串
    指定根文件系统的所在位置。通常这是一个必须明确设置的选项。
    "字符串"可以使用如下几种形式:
    XXxx 一个16进制数,其中"XX"是主设备号,"xx"是次设备号。例如"/dev/sdc15"(主设备号是"8",次设备号是"47"),可以表示成"082F"。
    /dev/nfs 表示使用由nfsroot选项指定的NFS磁盘,仅在根文件系统位于NFS文件系统上的时候才使用。
    /dev/disk 表示一块完整的无分区块设备。比如:/dev/md0 /dev/loop0 /dev/sdb /dev/mmcblk0
    /dev/diskN 表示disk磁盘的第N(十进制)个分区。这是最常见的用法,比如:/dev/sda2 /dev/ubda1 /dev/xvda13
    /dev/diskpN 含义与上面的一样,也表示disk磁盘的第N(十进制)个分区,但是用于disk本身以数字结尾的情况(避免混淆)。比如:/dev/md0p3 /dev/emd/0p2 /dev/mmcblk0p1
    PARTUUID=00112233-4455-6677-8899-AABBCCDDEEFF 仅用于EFI/GPT格式的磁盘,表示分区表中UUID值为"00112233-4455-6677-8899-AABBCCDDEEFF"的分区。[提示]可以使用blkid查看"PARTUUID"。
    PARTUUID=SSSSSSSS-PP 仅用于传统的MSDOS分区表。"SSSSSSSS"是用16进制表示的32位"NT disk signature","PP"是用16进制表示的分区号。比如:PARTUUID=97531ACF-02 可能相当于 /dev/sda2 
    PARTUUID=XXXX/PARTNROFF=N 表示以UUID="XXXX"的分区为基准,偏移N个分区。假定 /dev/sdb5 的UUID=XXXX,那么 PARTUUID=XXXX/PARTNROFF=3 就表示 /dev/sdb8 ,而 PARTUUID=XXXX/PARTNROFF=-3 则表示 /dev/sdb2
    major:minor 由一对十进制数组成,其中major是主设备号,minor是次设备号。例如"/dev/sdc15"(主设备号是"8",次设备号是"47"),可以表示成"8:47"。
    LABEL=??? 表示卷标为"???"的分区。比如:root=LABEL=/ 。不过这种格式并不被内核直接支持,仅是发行版通过initramfs中的脚本添加了这种格式的支持而已。所以并不通用。
    [KNL]
    rootfstype=文件系统类型
    指定根文件系统的类型。例如:"xfs"或"ext4"之类
    [KNL]
    rootflags=挂载选项
    设置根文件系统的挂载选项,比如"noatime,ro"。各种不同的文件系统所能使用的选项各不相同,可以参考 mount 程序的选项。
    [KNL]
    ro
    rw
    以只读(ro)/读写(rw)模式挂载根文件系统
    [KNL]
    rootdelay=秒数
    在挂载根文件系统前延迟多少秒,主要用于等待那些反应速度较慢的异步检测的设备就绪(例如USB/MMC/FireWire)。
    [KNL]
    rootwait
    在根文件系统就绪之前无限等待。主要用于等待那些反应速度较慢的异步检测的设备就绪(例如USB/MMC/FireWire)。

    系统初始化(init)

    [KNL]
    init=文件全路径
    指定内核挂载根文件系统后运行的第一个用户空间程序的绝对路径。默认为"/sbin/init"。
    [KNL]
    rdinit=全路径
    设置从initramfs中运行的第一个用户空间程序的绝对路径,默认为"/init"。
    [注意]一旦使用了initramfs并且成功的运行了其中的"/init",所有"init"以及与根文件系统相关的选项(包括"nfsroot")对内核而言都将失效。
    initramfs中的脚本必须自己分析各个内核引导选项(/proc/cmdline)并完成根文件系统的挂载与切换,当然也包括启动真正的"init"进程。
    [KNL]
    S
    以单用户模式运行"init"。注意,这不是一个真正的内核选项,只是给initramfs中的脚本用的。所以并不通用。

    NFS(网络文件系统)

    [NFS]
    lockd.nlm_grace_period=秒数
    为NFS锁管理器指定宽限时间,单位是秒。取值范围在[0-240]?
    [NFS]
    lockd.nlm_tcpport=端口号
    为NFS锁管理器指定TCP端口
    [NFS]
    lockd.nlm_timeout=秒数
    为NFS锁管理器指定默认超时时间,单位是秒。默认值是10秒。取值范围在[3-20]?
    [NFS]
    lockd.nlm_udpport=端口号
    为NFS锁管理器指定UDP端口
    [NFS]
    nfsroot=[server-ip:]root-dir[,nfs-options]
    指定NFS根文件系统的位置。如果没有设置此选项,那么将使用"/tftpboot/本机IP"(默认值)作为根文件系统,并使用默认的NFS挂载选项。
    server-ip NFS服务器IP地址。其默认值是"ip"选项中的server-ip字段的值。
    root-dir 作为根文件系统挂载的NFS服务器的目录。如果其中包含"%s",那么将会被替换为本机IP地址的ASCII表示形式。
    nfs-options 标准的NFS文件系统挂载选项(例如"ro"),多个选项之间使用逗号分隔。下面是默认使用的值:
      port     = 由NFS服务器的portmap守护进程给出
      rsize    = 4096
      wsize    = 4096
      timeo    = 7
      retrans  = 3
      acregmin = 3
      acregmax = 60
      acdirmin = 30
      acdirmax = 60
      flags    = hard,nointr,noposix,cto,ac
    
    [NFS]
    nfsrootdebug
    在启动过程中,在内核日志里显示详细的NFS相关的调试信息(挂载选项、服务器IP地址、根文件系统路径等),以方便调试和故障诊断。
    [NFS]
    nfs.callback_tcpport=端口号
    设置NFSv4回复通道(callback channel)监听的TCP端口
    [NFS]
    nfs.cache_getent=路径
    设置用于更新NFS客户端缓存项的程序的路径。默认值是"/sbin/nfs_cache_getent"。
    [NFS]
    nfs.cache_getent_timeout=秒数
    尝试更新缓存项超时秒数,超过指定时间仍未更新成功则视为更新失败。默认值是15秒。
    [NFS]
    nfs.idmap_cache_timeout=秒数
    设置idmapper缓存项的最大寿命,单位是秒。
    [NFS]
    nfs.enable_ino64={0|1}
    是否开启64位inode号。"0"表示NFS客户端将会为readdir()与stat()系统调用模拟一个32位inode号(而不是返回真实的64位inode号)。"1"(默认值)表示返回真实的64位inode号。
    [NFSv4.1]
    nfs.max_session_slots=正整数
    设置NFS客户端尝试和服务器端协商的最大会话slot数。这也同时限定了客户端能够像服务器端发送的最大并发RPC请求数。默认值是64。将此值设置为比max_tcp_slot_table_limit大是没有价值的。
    [NFSv4]
    nfs.nfs4_unique_id=字符串
    指定NFSv4客户端插入到nfs_client_id4字符串中的额外的唯一标识字符串。这通常是一个在系统安装时自动生成的UUID。
    [NFSv4.1]
    nfs.send_implementation_id={0|1}
    是否在exchange_id请求中包含客户端实现识别信息(implementation identification information)。"0"表示不发送,默认值"1"表示发送。
    [NFSv4]
    nfs.recover_lost_locks={0|1}
    v3.12新增。是否尝试恢复服务器上由于租约超时而丢失的锁。需要注意的是,这样做很有可能会导致数据错误,因为无法保证超时后的锁文件未被更改。默认值"0"表示不做这样的尝试,而"1"则表示尝试恢复(这是v3.11及之前内核的默认行为)。
    [NFSv4]
    nfs.nfs4_disable_idmapping={0|1}
    默认值"1"表示在使用了"sec=sys"挂载选项的情况下,RPC身份认证和NFS操作都使用数字化的uid/gid。这会导致idmapping被禁用,从而让NFSv2/v3向NFSv4的迁移变得更加容易。客户端将会自动检测不支持此种操作模式的服务器,并回退到使用idmapper的模式。"0"表示禁止这种行为。
    [NFSv4]
    nfsd.nfs4_disable_idmapping={0|1}
    默认值"1"表示NFSv4服务器与那些使用auth_sys的客户端之间只使用数字化的uid/gid(包括发送与接收),从而让NFSv2/v3向NFSv4的迁移变得更加容易。"0"表示禁止这种行为。

    模块功能

    nomodule
    禁用内核模块加载功能(CONFIG_MODULES)。
    [KNL]
    module.sig_enforce
    强制内核在加载模块时检查模块签名(CONFIG_MODULE_SIG),并且只接受具有合法签名的模块。如果内核开启了CONFIG_MODULE_SIG_FORCE,那么无论是否使用此选项,都将强制检查模块的签名。

    安全

    no_file_caps
    要求内核无视文件的权限。这样,执行文件的唯一途径就只有:由root去执行或者setuid root
    noexec={on|off}
    noexec32={on|off}
    是否允许将某部分内存映射为"禁止执行",这是一种防止数据缓冲区溢出攻击的保护措施(也就是WinXP SP2曾经大力宣传的数据执行保护功能),建议保持默认值"on"。
    [说明]noexec对32bit代码以及64bit代码都有约束力,而noexec32只针对32bit代码。
    nosmap
    禁用SMAP(CONFIG_X86_SMAP)支持。SMAP是Intel从Haswell微架构开始引入的一种新特征,用途是禁止内核因为自身错误意外访问用户空间的数据,以避免一些内核漏洞所导致的安全隐患。
    nosmep
    禁用SMEP(Supervisor Mode Execution Prevention)支持。SMEP与SMAP类似,也是Intel从Haswell微架构开始引入的一种新特征,用途是禁止内核因为自身错误意外执行用户空间的代码。以避免一些内核漏洞所导致的安全隐患。
    nordrand
    即使CPU支持(CONFIG_ARCH_RANDOM),也禁止内核使用RDRAND指令(不过用户空间依然可以使用此指令)。由于很多人怀疑RDRAND指令所依赖的硬件随机数生成器所使用的加密标准(NIST SP800-90)被NSA植入了后门,所以提供了该选项以禁用它,不过大神Torvalds不以为然
    vsyscall={emulate|native|none}
    控制vsyscall系统调用(调用固定的地址0xffffffffff600x00)的行为。大多数静态链接的可执行程序和老旧的Glibc会使用这个系统调用。因为vsyscall始终位于固定的地址,所以很容易被攻击者利用。
    emulate(默认值) 捕捉vsyscalls系统调用,并对其进行安全的模拟。这是比较安全的选项,但效率并不最高。
    native 将vsyscall系统调用直接转变成本地syscall指令,这比模拟方式效率稍微高一些。但是很容易被攻击。
    none 完全禁用vsyscall系统调用。这是最安全的选项,但是有可能会导致系统工作异常。
    [EVM]
    evm="fix"
    不管当前的完整性状态如何,都允许更新"security.evm"。
    [SECURITY]
    security={selinux|smack|tomoyo|apparmor|yama}
    选择启用的安全模块。仅在内核同时开启了多个安全模块的情况下才有意义。
    [SELINUX]
    selinux={0|1}
    是否在启动时就开启SELinux功能(CONFIG_SECURITY_SELINUX_BOOTPARAM):"0"表示关闭,"1"表示开启。
    默认值由内核在编译时确定(CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE)。
    即使设为"1",随后也可以通过 /selinux/disable 在加载安全策略前禁止SELinux功能。
    [SELINUX]
    enforcing={0|1}
    是否在启动时强制启用SELinux规则。
    "0"(默认值)表示仅仅做记录违规操作日志而不真正拒绝违规操作;
    "1"表示真正拒绝违规操作并做记录违规操作日志。
    该选项还可以在运行时通过 /selinux/enforce 进行修改
    [SELINUX]
    checkreqprot={0|1}
    设置"checkreqprot"标记的初始值。
    "0"表示由内核强制执行检查保护(包括其中隐含的所有执行保护)
    "1"表示由应用程序自己主动请求执行检查保护
    默认值由内核在编译时确定,也可以在运行时通过 /selinux/checkreqprot 修改
    [APPARMOR]
    apparmor={0|1}
    是否在启动时就开启AppArmor功能(CONFIG_SECURITY_APPARMOR):"0"表示关闭,"1"表示开启。
    默认值由内核在编译时确定(CONFIG_SECURITY_APPARMOR_BOOTPARAM_VALUE)。

    多CPU与CPU间调度

    SMP(对称多处理器)系统中,所有的CPU共享全部资源(总线,内存,I/O等),最大的特点就是所有资源共享,多个CPU之间没有区别。NUMA(非一致内存访问)的基本特征是具有多个CPU节点,每个CPU节点由多个CPU组成,并且具有独立的本地内存与I/O槽口等。因此,虽然每个CPU都可以访问整个系统的内存,但是访问本地节点内存的速度远远高于访问其它节点的内存。详见《SMP/NUMA/MPP体系结构对比》

    [SMP]
    nosmp
    强制禁用SMP,这是个已被反对使用的旧选项
    [SMP]
    maxcpus=整数
    最大允许使用的CPU核心数。"0"表示禁用SMP特性(等价于已被反对使用的旧"nosmp"选项),同时也禁用IO APIC;正整数"n"表示最大允许使用n个CPU核心。
    [SMP]
    nr_cpus=正整数
    允许SMP内核支持的最大CPU核心数(等价于CONFIG_NR_CPUS)。配合CPU热插拔(CONFIG_HOTPLUG_CPU),可在运行时增加CPU数目。
    cpu0_hotplug
    强制允许CPU0(boot CPU)热插拔(CONFIG_BOOTPARAM_HOTPLUG_CPU0)。下列特性必须依赖于cpu0,所此选项应谨慎使用:
    (1)从休眠状态(S3,S4)唤醒以及从运行状态进入休眠状态
    (2)PIC中断,也就是某些情况下,关机和重启也会依赖于cpu0
    [SMP]
    additional_cpus=整数
    最大允许热插拔的CPU数量。默认值由BIOS决定。相见Documentation/x86/x86_64/cpu-hotplug-spec
    [NUMA]
    numa={off|noacpi}
    off 关闭NUMA支持,也就是让所有内存都只属于同一个节点。
    noacpi 不为NUMA解析ACPI SRAT表
    [KNL]
    numa_balancing={enable|disable}
    启用/禁用NUMA均衡(CONFIG_NUMA_BALANCING),其默认值由CONFIG_NUMA_BALANCING_DEFAULT_ENABLED决定
    [KNL,BOOT]
    numa_zonelist_order={zone|node|default}
    设置NUMA的zonelist顺序。这里设置的值还可以在运行中通过sysctl来修改。详见Documentation/sysctl/vm.txt
    [KNL,SMP]
    isolcpus=CPU编号列表
    将列表中的CPU从内核SMP平衡和调度算法中剔除。
    [注意]提出后并不是绝对不能再使用该CPU的,操作系统仍然可以强制指定特定的进程使用哪个CPU(可以通过taskset来做到)。
    该选项的目的主要是用于实现特定cpu只运行特定进程的目的。
    CPU编号从"0"开始计数,列表的表示方法有三种:
    numA,numB,...,numN
    numA-numN
    以及上述两种表示方法的组合:
    numA,...,numM-numN
    例如:0,3,4-7,9
    [KNL,SMP]
    relax_domain_level={-1|0|1|2|3|4|5}
    设置CPUSET调度域(sched domain)的默认级别。大于此级别的调度域层次将禁用闲时均衡和唤醒均衡,而其余级别的调度域都开启。
    -1(默认值) 使用系统的默认值(取决于不同的硬件架构)或者由其他的请求确定,也就是不人为指定默认级别。
    0 禁用所有调度域的闲时均衡和唤醒均衡
    1 超线程域(siblings),也就是同一个物理核心内的不同超线程
    2 核域(cores),也就是同一个物理CPU中不同的核心
    3 节点域(node),对于NUMA系统来说就是同一个NUMA节点内,对于non-NUMA系统来说这是整个系统范围
    4 节点组域(chunk of node),仅适用于NUMA系统,表示在一组特定的NUMA节点范围内
    5 全系统(system wide),全部系统范围内
    详见Documentation/cgroups/cpusets.txt文档

    控制组(Control Group)

    Cgroup(CONFIG_CGROUPS)是一种进程管理机制,也是内核的资源分配框架。

    [KNL]
    cgroup_disable="控制器名称"
    禁用cgroup中特定的控制器名称。目前只支持一个"memory"控制器。
    noautogroup
    禁止自动创建进程组(CONFIG_SCHED_AUTOGROUP),服务器环境可以考虑使用此选项。
    [KNL]
    swapaccount={0|1}
    是否统计换入(swap in)内存的资源。"0"表示不统计,"1"表示统计。详见Documentation/cgroups/memory.txt文档。

    EFI/UEFI

    noefi
    禁用EFI支持(CONFIG_EFI)。
    [EFI]
    add_efi_memmap
    将EFI内存映像包括在内核的可用物理内存映像之中
    pstore.backend=efivars
    将"efivars"(CONFIG_EFI_VARS_PSTORE)用作pstore内存文件系统的后端。

    杂项

    [IP_VS_FTP]
    ports=portA,portB,...
    IPVS(IP Virtual Server) FTP帮助模块所使用的端口,最多允许指定8个。默认值是"21"。
    io_delay={0x80|0xed|udelay|none}
    设置IO延迟方式
    0x80(CONFIG_IO_DELAY_0X80) 传统的Linux IO延迟方式,久经考验,也最安全
    0xed(CONFIG_IO_DELAY_0XED) 基于0xed端口的IO延迟方式,主要是为了避免和基于0x80端口的主板诊断卡冲突
    udelay(CONFIG_IO_DELAY_UDELAY) 使用内核端udelay()函数作为延迟方法(简单的延迟2微秒).可以不占用任何IO端口空间.
    none(CONFIG_IO_DELAY_NONE) 不使用任何port-IO延迟机制.只要你的机器不是老古董,这个应该是首选.
    [KNL]
    reboot=[mode][,type][,force]
    指定系统重启的方式:
    mode 用于指定重启模式,可以使用如下2种模式之一:warm(热重启[跳过内存检测]), cold(冷重启[检测并重新初始化所有硬件])
    type 用于指定重启类型,可以使用如下4种类型之一:bios(为热重启使用CPU reboot vector), acpi(优先使用FADT中的ACPI RESET_REG,若失败再转kbd), kbd(使用键盘控制器冷重启,这是默认值), triple, efi(优先使用EFI提供的reset_system运行时服务,若失败再转kbd)
    结尾的"force"表示在重启时不停用其它的CPU,在某些情况下可以让reboot更可靠。
    [KNL]
    reset_devices
    强制驱动程序在初始化底层设备的过程中重置设备
    [KNL]
    rcu_nocbs=
    在"CONFIG_RCU_NOCB_CPU=y"的情况下,指定哪些CPU是No-CB CPU
    [KNL]
    nodelayacct
    禁止在针对每个进程的统计信息中包含进程等候系统资源(cpu,IO同步,内存交换等)所花费的时间,相当于禁用CONFIG_TASK_DELAY_ACCT模块。
    [KNL]
    sysfs.deprecated={0|1}

    为了兼容旧版本的应用程序而保留过时的sysfs特性(CONFIG_SYSFS_DEP



    from: http://www.jinbuguo.com/kernel/boot_parameters.html

    展开全文
  • gcc 警告选项

    千次阅读 2011-06-18 18:25:00
    p, li { white-space: pre-wrap; }警告选项 警告是针对程序结构的诊断信息...下列选项控制GNU CC产生的警告的数量和类型:-fsyntax-only检查程序中的语法错误,但是产生输出信息.-w禁止所有警告信息.-Wno-import禁止所

    p, li { white-space: pre-wrap; }

    警告选项

     

    警告是针对程序结构的诊断信息,程序不一定有错误,而是存在风险,或者可能存在错误.

    下列选项控制GNU CC产生的警告的数量和类型:

    -fsyntax-only

    检查程序中的语法错误,但是不产生输出信息.

    -w

    禁止所有警告信息.

    -Wno-import

    禁止所有关于#import的警告信息.

    -pedantic

    打开完全服从ANSI C标准所需的全部警告诊断;拒绝接受采用了被禁止的语法扩展的程序.

    无论有没有这个选项,符合ANSI C标准的程序应该能够被正确编译(虽然极少数程序需要`-ansi' 选项).然而,如果没有这个选项,某些GNU扩展和传统C特性也得到支持.使用这个选项可以拒绝这些程序.没有理由 使用这个选项,他存在只是为了满足一些书呆子(pedant).

    对于替选关键字(他们以`__'开始和结束) `-pedantic'不会产生警告信息.

     

    Pedantic 也不警告跟在__extension__后面的表达式.不过只应该在系统头文件中使用这种转义措施,应用程序最好 避免.

    -pedantic-errors

    该选项和`-pedantic'类似,但是显示错误而不是警告.

    -W

    对下列事件显示额外的警告信息:

    *

    非易变自动变量(nonvolatile automatic variable)可能在调用longjmp时发生改变. 这些警告仅在优化编译时发生.

    编译器只知道对setjmp的调用,他不可能知道会在哪里调用longjmp,事实上一个信号处理例程可以在程序的任何地点调用他.其结果是,即使程序没有问题,你也可能会得到警告,因为无法在可能出现问题 的地方调用longjmp.

    *

    既可以返回值,也可以不返回值的函数. (缺少结尾的函数体被看作不返回函数值)例如,下面的函数将导致这种警告:

    foo (a)

    {

    if (a > 0)

    return a;

    }

     

     

    由于GNU CC不知道某些函数永不返回(含有abort和longjmp),因此有可能出现 虚假警告.

    *

    表达式语句或逗号表达式的左侧没有产生作用(side effect).如果要防止这种警告,应该把未使用的表达式强制转换 为void类型.例如,这样的表达式`x[i,j]'会导致警告,而`x[(void)i,j]'就不会.

    *

    无符号数用`>'或`<='和零做比较.

    -Wimplicit-int

    警告没有指定类型的声明.

    -Wimplicit-function-declaration

    警告在声明之前就使用的函数.

    -Wimplicit

    同-Wimplicit-int和-Wimplicit-function-declaration.

    -Wmain

    如果把main函数声明或定义成奇怪的类型,编译器就发出警告.典型情况下,这个

     

    函数用于外部连接, 返回int数值,不需要参数,或指定两个参数.

    -Wreturn-type

    如果函数定义了返回类型,而默认类型是int型,编译器就发出警告.同时警告那些

     

    不带返回值的 return语句,如果他们所属的函数并非void类型.

    -Wunused

    如果某个局部变量除了声明就没再使用,或者声明了静态函数但是没有定义,或者某条语句的运算结果显然没有使用, 编译器就发出警告.

    -Wswitch

    如果某条switch语句的参数属于枚举类型,但是没有对应的case语句使用枚举元素,编译器 就发出警告. ( default语句的出现能够防止这个警告.)超出枚举范围的case语句同样会 导致这个警告.

    -Wcomment

    如果注释起始序列`/*'出现在注释中,编译器就发出警告.

    -Wtrigraphs

    警告任何出现的trigraph (假设允许使用他们).

    -Wformat

    检查对printf和scanf等函数的调用,确认各个参数类型和格式串中的一致.

    -Wchar-subscripts

    警告类型是char的数组下标.这是常见错误,程序员经常忘记在某些机器上char有

     

    符号.

    -Wuninitialized

    在初始化之前就使用自动变量. 这些警告只可能做优化编译时出现,因为他们需要数据流信息,只有做优化的时候才估算数据流信息.如果不指定 `-O'选项,就不会出现这些警告.

    这些警告仅针对等候分配寄存器的变量.因此不会发生在声明为volatile的变量上面,不会发生在已经 取得地址的变量,或长度不等于1, 2, 4, 8字节的变量.同样也不会发生在结构,联合或数组上面,即使他们在 寄存器中. 注意,如果某个变量只计算了一个从未使用过的值,这里可能不会警告.因为在显示警告之前,这样的计算已经被 数据流分析删除了. 这些警告作为可选项是因为GNU CC还没有智能到判别所有的情况,知道有些看上

     

    去错误的代码其实是正确的.下面是 一个这样的例子:

    {

    int x;

    switch (y)

    {

    case 1: x = 1;

    break;

    case 2: x = 4;

    break;

    case 3: x = 5;

    }

    foo (x);

    }

     

     

    如果y始终是1, 2或3,那么x总会被初始化,但是GNU CC不知道这一点.下面是另一个普遍案例:

    {

    int save_y;

    if (change_y) save_y = y, y = new_y;

    ...

    if (change_y) y = save_y;

    }

     

     

    这里没有错误,因为只有设置了save_y才使用他.

    把所有不返回的函数定义为volatile可以避免某些似是而非的警告.

    -Wparentheses

    在某些情况下如果忽略了括号,编译器就发出警告.

    -Wtemplate-debugging

    当在C++程序中使用template的时候,如果调试(debugging)没有完全生效,编译器就发出警告. (仅用于C++).

    -Wall

    结合所有上述的`-W'选项.通常我们建议避免这些被警告的用法,我们相信,恰当结合宏的使用能够 轻易避免这些用法。

    剩下的`-W...'选项不包括在`-Wall'中,因为我们认为在必要情况下,这些被编译器警告 的程序结构,可以合理的用在"干净的"程序中.

    -Wtraditional

    如果某些程序结构在传统C中的表现和ANSI C不同,编译器就发出警告.

    *

    宏参出现在宏体的字符串常量内部.传统C会替换宏参,而ANSI C则视其为常量的一部分.

    *

    某个函数在块(block)中声明为外部,但在块结束后才调用.

    *

    switch语句的操作数类型是long.

    -Wshadow

    一旦某个局部变量屏蔽了另一个局部变量,编译器就发出警告.

    -Wid-clash-len

    一旦两个确定的标识符具有相同的前len个字符,编译器就发出警告.他可以协助你开发一些将要在某些 过时的,危害大脑的编译器上编译的程序.

    -Wpointer-arith

    任何语句如果依赖于函数类型的大小(size)或者void类型的大小,编译器就发出警告. GNU C为了 便于计算void

     

    *指针和函数指针,就把这些类型的大小定义为1.

    -Wcast-qual

    一旦某个指针强制类型转换以便移除类型修饰符时,编译器就发出警告.例如,如果把const char * 强制转换为普通的char *时,警告就会出现.

    -Wcast-align

    一旦某个指针类型强制转换时,导致目标所需的地址对齐(alignment)增加,编译器就发出警告.例如,某些机器上 只能在2或4字节边界上访问整数,如果在这种机型上把char *强制转换成int *类型, 编译器就发出警告.

    -Wwrite-strings

    规定字符串常量的类型是const char[length],因此,把这样的地址复制给

     

    non-const char *指针将产生警告.这些警告能够帮助你在编译期间发现企图写入字符串常量 的代码,但是你必须非常仔细的在声明和原形中使用const,否则他们只能带来麻烦;所以我们没有让 `-Wall'提供这些警告.

    -Wconversion

    如果某函数原形导致的类型转换和无函数原形时的类型转换不同,编译器就发出警告.这里包括定点数和浮点数的 互相转换 ,改变定点数的宽度或符号,除非他们和缺省声明(default promotion)相同.

    -Waggregate-return

    如果定义或调用了返回结构或联合的函数,编译器就发出警告. (从语言角度你可以返回一个数组,然而同样会 导致警告.)

    -Wstrict-prototypes

    如果函数的声明或定义没有指出参数类型,编译器就发出警告. (如果函数的前向引用说明指出了参数类型,则允许后面 使用旧式风格的函数定义,而不会产生警告.)

    -Wmissing-prototypes

    如果没有预先声明函数原形就定义了全局函数,编译器就发出警告.即使函数定义自身提供了函数原形也会产生这个警告. 他的目的是检查没有在头文件中声明的全局函数.

    -Wmissing-declarations

    如果没有预先声明就定义了全局函数,编译器就发出警告.即使函数定义自身提供了函数原形也会产生这个警告.这个选项 的目的是检查没有在头文件中声明的全局函数.

    -Wredundant-decls

    如果在同一个可见域某定义多次声明,编译器就发出警告,即使这些重复声明有效并且毫无差别.

    -Wnested-externs

    如果某extern声明出现在函数内部,编译器就发出警告.

    -Wenum-clash

    对于不同枚举类型之间的转换发出警告(仅适用于C++).

    -Wlong-long

    如果使用了long long 类型就发出警告.该警告是缺省项.使用`-Wno-long-long' 选项能够防止这个警告. `-Wlong-long'和`-Wno-long-long'仅在 `-pedantic'之下才起作用.

    -Woverloaded-virtual

    (仅适用于C++.)在继承类中,虚函数的定义必须匹配虚函数在基类中声明的类型特征(type signature).当 继承类声明了某个函数,它可能是个错误的尝试企图定义一个虚函数,使用这个选项能够产生警告:就是说,当某个函数和基类 中的虚函数同名,但是类型特征不符合基类的任何虚函数,编译器将发出警告.

    -Winline

    如果某函数不能内嵌(inline),无论是声明为inline或者是指定了-finline-functions 选项,编译器都将发出警告.

    -Werror

    视警告为错误;出现任何警告即放弃编译.

     

    转自:

    http://news.csdn.net/n/20050520/21445.html

     

    展开全文
  • JDK 14如期发布,16个新特性快速预览

    千次阅读 2020-03-18 08:44:17
    模式匹配允许程序中的通用逻辑,即从对象有条件地提取组件,可以更简洁,更安全地表示。 这是JDK 14的预览语言功能。 动机 几乎每个程序都包含某种逻辑,这些逻辑结合了对表达式是否具有某种类型或...

    JDK 14已经于2020年3月17日如期发布。本文介绍JDK 14特性。

    JEP 305: instanceof的模式匹配(预览)

    通过对instanceof运算符进行模式匹配来增强Java编程语言。 模式匹配允许程序中的通用逻辑,即从对象中有条件地提取组件,可以更简洁,更安全地表示。 这是JDK 14中的预览语言功能。

    动机

    几乎每个程序都包含某种逻辑,这些逻辑结合了对表达式是否具有某种类型或结构的测试,然后有条件地提取其状态的组件以进行进一步处理。例如,以下是在Java程序中常见的instanceof-and-cast用法:

    if (obj instanceof String) {
        String s = (String) obj;
        // 使用s
    }
    

    上述示例中,为了能够安全地将obj转为我们期望的String类型,需要通过instanceof运算符对obj进行类型判断。这里发生了三件事:

    • 测试obj是否是一个String
    • 将obj转换为String
    • 声明新的局部变量s,以便我们可以使用字符串值。

    这种模式很简单,并且所有Java程序员都可以理解,但是由于一些原因,它不是最优的。

    • 语法乏味
    • 同时执行类型检测和类型转换并不是必要的
    • String类型在程序中出现了3次,这混淆了后面更重要的逻辑
    • 重复的代码容易滋生错误

    在JDK 14中,上述代码可以改为下面的方式:

    if (obj instanceof String s) {
        // 使用s
    }
    

    这样整个代码看上去更加简洁。

    描述

    类型测试模式由指定类型的谓词和单个绑定变量组成。在下面的代码中,短语String是类型测试模式:

    if (obj instanceof String s) {
        // 使用s
    } else {
        // 不能使用s
    }
    

    如果obj是String的实例,则将其强制转换为String并分配给绑定变量s。绑定变量在if语句的true块中,而不在if语句的false块中。

    与局部变量的范围不同,绑定变量的范围由包含的表达式和语句的语义确定。例如,在此代码中:

    if (!(obj instanceof String s)) {
        .. s.contains(..) ..
    } else {
        .. s.contains(..) ..
    }
    

    true块中的s表示封闭类中的字段,false块中的s表示由instanceof运算符引入的绑定变量。

    当if语句的条件变得比单个instanceof更复杂时,绑定变量的范围也会相应地增长。 例如,在此代码中:

    if (obj instanceof String s && s.length() > 5) {.. s.contains(..) ..}
    

    绑定变量s在&&运算符右侧以及true块中。仅当instanceof成功并分配给s时,才评估右侧。

    另一方面,在此代码中:

    if (obj instanceof String s || s.length() > 5) {.. s.contains(..) ..}
    

    绑定变量s不在||右侧的范围内运算符,也不在true块的范围内。s指的是封闭类中的一个字段。

    Joshua Bloch的经典著作Effective Java中有一段代码示例:

    @Override public boolean equals(Object o) { 
        return (o instanceof CaseInsensitiveString) && 
                ((CaseInsensitiveString) o).s.equalsIgnoreCase(s); 
    }
    

    这段代码可以使用新的语法写成:

    @Override public boolean equals(Object o) { 
        return (o instanceof CaseInsensitiveString cis) &&
                cis.s.equalsIgnoreCase(s); 
    }
    
    

    这个特性很有意思,因为它为更为通用的模式匹配打开了大门。模式匹配通过更为简便的语法基于一定的条件来抽取对象的组件,而instanceof刚好是这种情况,它先检查对象类型,然后再调用对象的方法或访问对象的字段。

    JEP 343: 打包工具(孵化)

    该特性旨在创建一个用于打包独立Java应用程序的工具。

    动机

    许多Java应用程序需要以一流的方式安装在本机平台上,而不是简单地放置在类路径或模块路径上。对于应用程序开发人员来说,交付简单的JAR文件是不够的。他们必须提供适合本机平台的可安装软件包。这允许以用户熟悉的方式分发,安装和卸载Java应用程序。例如,在Windows上,用户希望能够双击一个软件包来安装他们的软件,然后使用控制面板删除该软件。在macOS上,用户希望能够双击DMG文件并将其应用程序拖到Application文件夹中。

    打包工具还可以帮助填补其他技术的空白,例如Java Web Start(已从JDK 11中删除)和pack200(已在JDK 11中弃用,可能在以后的版本中删除)。开发人员可以使用jlink将JDK分解为所需的最小模块集,然后使用打包工具生成一个压缩的、可安装的映像,该映像可以部署到目标计算机。

    为了以前满足这些要求,JDK 8分发了一个名为javapackager的打包工具。但是,作为删除JavaFX的一部分,该工具已从JDK 11中删除。

    描述

    jpackage工具将Java应用程序打包到特定于平台的程序包中,该程序包包含所有必需的依赖项。该应用程序可以作为普通JAR文件的集合或作为模块的集合提供。受支持的特定于平台的软件包格式为:

    • Linux:deb和rpm
    • macOS:pkg和dmg
    • Windows:MSI和EXE

    默认情况下,jpackage会以最适合其运行系统的格式生成一个软件包。

    以下是基本用法:

    $ jpackage --name myapp --input lib --main-jar main.jar
    

    用法

    1. 基本用法:非模块化应用

    假设你有一个由JAR文件组成的应用程序,所有应用程序都位于lib目录下,并且主类在lib/main.jar中。下列命令

    $ jpackage --name myapp --input lib --main-jar main.jar
    

    将以本地系统的默认格式打包应用程序,并将生成的打包文件保留在当前目录中。如果main.jar中的MANIFEST.MF文件没有Main-Class属性,我们必须显式地指定主类:

    $ jpackage --name myapp --input lib --main-jar main.jar --main-class myapp.Main
    

    打包的名称是myapp。要启动该应用程序,启动器将从输入目录复制的每个JAR文件都放在JVM的类路径上。

    如果希望生成默认格式以外的软件安装包,可以使用–type选项。例如要在macOS上生成pkg文件(而不是dmg文件),我们可以使用下面的命令:

    $ jpackage --name myapp --input lib --main-jar main.jar --type pkg
    

    2. 基本用法:模块化应用

    如果你有一个模块化应用程序,该应用程序由lib目录中的模块化JAR文件和/或JMOD文件组成,并且主类位于myapp模块中,则下面的命令

    $ jpackage --name myapp --module-path lib -m myapp
    

    能够将其打包。如果myapp模块无法识别主类,则必须明确指定:

    $ jpackage --name myapp --module-path lib -m myapp/myapp.Main
    

    JEP 345: G1的NUMA内存分配优化

    通过实现可识别NUMA的内存分配,提高大型计算机上的G1性能。

    动机

    现代的多插槽计算机越来越多地具有非统一的内存访问(non-uniform memory access,NUMA),即内存与每个插槽或内核之间的距离并不相等。插槽之间的内存访问具有不同的性能特征,对更远的插槽的访问通常具有更大的延迟。

    并行收集器中通过启动-XX:+UseParallelGC能够感知NUMA,这个功能已经实现了多年了,这有助于提高跨多插槽运行单个JVM的配置的性能。其他HotSpot收集器没有此功能,这意味着他们无法利用这种垂直多路NUMA缩放功能。大型企业应用程序尤其倾向于在多个多插槽上以大堆配置运行,但是它们希望在单个JVM中运行具有可管理性优势。 使用G1收集器的用户越来越多地遇到这种扩展瓶颈。

    描述

    G1的堆组织为固定大小区域的集合。一个区域通常是一组物理页面,尽管使用大页面(通过 -XX:+UseLargePages)时,多个区域可能组成一个物理页面。

    如果指定了+XX:+UseNUMA选项,则在初始化JVM时,区域将平均分布在可用NUMA节点的总数上。

    在开始时固定每个区域的NUMA节点有些不灵活,但是可以通过以下增强来缓解。为了为mutator线程分配新的对象,G1可能需要分配一个新的区域。它将通过从NUMA节点中优先选择一个与当前线程绑定的空闲区域来执行此操作,以便将对象保留在新生代的同一NUMA节点上。如果在为变量分配区域的过程中,同一NUMA节点上没有空闲区域,则G1将触发垃圾回收。要评估的另一种想法是,从距离最近的NUMA节点开始,按距离顺序在其他NUMA节点中搜索自由区域。

    该特性不会尝试将对象保留在老年代的同一NUMA节点上。

    此分配政策中不包括Humongous区。对于这些区,将不做任何特别的事情。

    JEP 349: JFR事件流

    公开JDK Flight Recorder数据以进行连续监视。

    动机

    HotSpot VM通过JFR产生的数据点超过500个,但是使用者只能通过解析日志文件的方法使用它们。

    用户要想消费这些数据,必须开始一个记录并停止,将内容转储到磁盘上,然后解析记录文件。这对于应用程序分析非常有效,但是监控数据却十分不方便(例如显示动态更新数据的仪表盘)。

    与创建记录相关的开销包括:

    • 发出在创建新记录时必须发生的事件
    • 写入事件元数据(例如字段布局)
    • 写入检查点数据(例如堆栈跟踪)
    • 将数据从磁盘存储复制到单独的记录文件

    如果有一种方法,可以在不创建新记录文件的情况下,从磁盘存储库中读取正在记录的数据,就可以避免上述开销。

    描述

    jdk.jfr模块里的jdk.jfr.consumer包,提供了异步订阅事件的功能。用户可以直接从磁盘存储库读取记录数据,也可以直接从磁盘存储流中读取数据,而无需转储记录文件。可以通过注册处理器(例如lambda函数)与流交互,从而对事件的到达进行响应。

    下面的例子打印CPU的总体使用率,并持有锁10毫秒。

    try (var rs = new RecordingStream()) {
      rs.enable("jdk.CPULoad").withPeriod(Duration.ofSeconds(1));
      rs.enable("jdk.JavaMonitorEnter").withThreshold(Duration.ofMillis(10));
      rs.onEvent("jdk.CPULoad", event -> {
        System.out.println(event.getFloat("machineTotal"));
      });
      rs.onEvent("jdk.JavaMonitorEnter", event -> {
        System.out.println(event.getClass("monitorClass"));
      });
      rs.start();
    }
    

    RecordingStream类实现了接口jdk.jfr.consumer.EventStream,该接口提供了一种统一的方式来过滤和使用事件,无论源是实时流还是磁盘上的文件。

    public interface EventStream extends AutoCloseable {
      public static EventStream openRepository();
      public static EventStream openRepository(Path directory);
      public static EventStream openFile(Path file);
    
      void setStartTime(Instant startTime);
      void setEndTime(Instant endTime);
      void setOrdered(boolean ordered);
      void setReuse(boolean reuse);
    
      void onEvent(Consumer<RecordedEvent> handler);
      void onEvent(String eventName, Consumer<RecordedEvent handler);
      void onFlush(Runnable handler);
      void onClose(Runnable handler);
      void onError(Runnable handler);
      void remove(Object handler);
    
      void start();
      void startAsync();
    
      void awaitTermination();
      void awaitTermination(Duration duration);
      void close();
    }
    

    创建流的方法有3种:

    • EventStream::openRepository(Path)从磁盘存储库中构造一个流。这是一种可以直接通过文件系统监视其他进程的方法。磁盘存储库的位置存储在系统属性jdk.jfr.repository中,可以使用API读取到。
    • EventStream::openRepository()方法执行进程内监控。与RecordingStream不同,它不会开始录制。相反,仅当通过外部方式(例如,使用JCMD或JMX)启动记录时,流才接收事件。
    • EventStream::openFile(Path)从记录文件中创建流,扩充了已经存在的RecordingFile类。

    该接口还可用于设置缓冲的数据量,以及是否应按时间顺序对事件进行排序。为了最大程度地降低分配压力,还可以选择控制是否应为每个事件分配新的事件对象,或者是否可以重用以前的对象。我们可以在当前线程中启动流,也可以异步启动流。

    JVM每秒一次将线程本地缓冲区中存储的事件定期刷新到磁盘存储库。 一个单独的线程解析最近的文件,直到写入数据为止,然后将事件推送给订阅者。 为了保持较低的开销,仅从文件中读取活动订阅的事件。 要在刷新完成后收到通知,可以使用EventStream::onFlush(Runnable)方法注册处理程序。 这是在JVM准备下一组事件时将数据聚合或推送到外部系统的机会。

    JEP 352: 非易失性映射字节缓冲区

    添加新的特定于JDK的文件映射模式,以便可以使用FileChannel API创建引用非易失性内存(non-volatile memory,NVM)的MappedByteBuffer实例。

    动机

    NVM为应用程序程序员提供了在程序运行过程中创建和更新程序状态的机会,而减少了输出到持久性介质或从持久性介质输入时的成本。这对于事务程序特别重要,在事务程序中,需要定期保持不确定状态以启用崩溃恢复。

    现有的C库(例如Intel的libpmem)为C程序提供了对基层NVM的高效访问。他们还以此为基础来支持对各种持久性数据类型的简单管理。当前,由于频繁需要进行系统调用或JNI调用来调用原始操作,从而确保内存更改是持久的,因此即使仅使用Java中的基础库也很昂贵。同样的问题限制了高级库的使用,并且由于C中提供的持久数据类型分配在无法从Java直接访问的内存中这一事实而加剧了这一问题。与C或可以低成本链接到C库的语言相比,这使Java应用程序和中间件(例如Java事务管理器)处于严重的劣势。

    该特性试图通过允许映射到ByteBuffer的NVM的有效写回来解决第一个问题。由于Java可以直接访问ByteBuffer映射的内存,因此这可以通过实现与C语言中提供的客户端库等效的客户端库来解决第二个问题,以管理不同持久数据类型的存储。

    描述

    1. 初步变更

    该JEP使用了Java SE API的两个增强功能:

    • 支持implementation-defined的映射模式
    • MppedByteBuffer::force方法以指定范围

    2. 特定于JDK的API更改

    • 通过新模块中的公共API公开新的MapMode枚举值

    一个公共扩展枚举ExtendedMapMode将添加到jdk.nio.mapmode程序包:

    package jdk.nio.mapmode;
    . . .
    public class ExtendedMapMode {
        private ExtendedMapMode() { }
    
        public static final MapMode READ_ONLY_SYNC = . . .
        public static final MapMode READ_WRITE_SYNC = . . .
    }
    

    在调用FileChannel::map方法创建映射到NVM设备文件上的只读或读写MappedByteBuffer时,可以使用上述的枚举值。如果这些标志在不支持NVM设备文件的平台上传递,程序会抛出UnsupportedOperationException异常。在受支持的平台上,仅当目标FileChannel实例是从通过NVM设备打开的派生文件时,才能传递这些参数。在任何其他情况下,都会抛出IOException异常。

    • 发布BufferPoolMXBean,用于跟踪MappedByteBuffer统计信息

    JEP 358: 友好的空指针异常

    精确描述哪个变量为null,提高JVM生成的NullPointerException的可用性。

    动机

    每个Java开发人员都遇到过NullPointerException(NPE)问题。NPE几乎可以出现在程序的任意位置,因此尝试捕获和修复它们是不可能的。下面的代码:

    a.i = 99;
    

    JVM会打印出方法名、文件名和NPE异常的行数:

    Exception in thread "main" java.lang.NullPointerException
        at Prog.main(Prog.java:5)
    

    使用这个错误报告,开发人员可以定位到a.i = 99;并推断对象a是null。但是对于更复杂的代码,不使用调试器就无法确定哪个变量为空。假设下面的代码中出现了一个NPE:

    a.b.c.i = 99;
    

    仅仅使用文件名和行数,并不能精确定位到哪个变量为null,是a、b还是c?

    访问数组也会发生类似的问题。假设此代码中出现一个NPE:

    a[i][j][k] = 99;
    

    文件名和行号不能精确指出哪个数组组件为空。是a还是a[i]a[i][j]

    一行代码可能包含多个访问路径,每个访问路径都可能是NPE的来源。假设此代码中出现一个NPE:

    a.i = b.j;
    

    文件名和行号并不能确定哪个对象为空,是a还是b?

    NPE也可能在方法调用中传递,看下面的代码:

    x().y().i = 99;
    

    文件名和行号不能指出哪个方法调用返回null。是x()还是y()?

    描述

    JVM在程序调用空引用的位置抛出NPE异常,通过分析程序的字节码指令,JVM可以精确判断哪个变量为空,并在NPE中描述详细信息(根据源代码)。包含方法名、文件名和行号的null-detail消息将显示在JVM的消息中。

    例如a.i = 99;的NPE异常可能是如下格式:

    Exception in thread "main" java.lang.NullPointerException: 
            Cannot assign field "i" because "a" is null
        at Prog.main(Prog.java:5)
    

    在更复杂的a.b.c.i = 99;语句中,NPE消息会包含导致空值的完整访问路径:

    Exception in thread "main" java.lang.NullPointerException: 
            Cannot read field "c" because "a.b" is null
        at Prog.main(Prog.java:5)
    

    同样,如果数组访问和赋值语句a[i][j][k] = 99;引发NPE:

    Exception in thread "main" java.lang.NullPointerException:
            Cannot load from object array because "a[i][j]" is null
        at Prog.main(Prog.java:5)
    

    类似地,a.i = b.j;会引发NPE:

    Exception in thread "main" java.lang.NullPointerException:
            Cannot read field "j" because "b" is null
        at Prog.main(Prog.java:5)
    

    JEP 359: record(预览)

    通过record增强Java编程语言。record提供了一种紧凑的语法来声明类,这些类是浅层不可变数据的透明持有者。

    动机

    我们经常听到这样的抱怨:“Java太冗长”、“Java规则过多”。首当其冲的就是充当简单集合的“数据载体”的类。为了写一个数据类,开发人员必须编写许多低价值、重复且容易出错的代码:构造函数、访问器、equals()、hashCode()和toString()等等。

    尽管IDE可以帮助开发人员编写数据载体类的绝大多数编码,但是这些代码仍然冗长。

    从表面上看,将Record是为了简化模板编码而生的,但是它还有“远大”的目标:modeling data as data(将数据建模为数据)。record应该更简单、简洁、数据不可变。

    描述

    record是Java的一种新的类型。同枚举一样,record也是对类的一种限制。record放弃了类通常享有的特性:将API和表示解耦。但是作为回报,record使数据类变得非常简洁。

    一个record具有名称和状态描述。状态描述声明了record的组成部分。例如:

    record Point(int x, int y) { }
    

    因为record在语义上是数据的简单透明持有者,所以记录会自动获取很多标准成员:

    • 状态声明中的每个成员,都有一个 private final的字段;
    • 状态声明中的每个组件的公共读取访问方法,该方法和组件具有相同的名字;
    • 一个公共的构造函数,其签名与状态声明相同;
    • equals和hashCode的实现;
    • toString的实现。

    限制

    records不能扩展任何类,并且不能声明私有字段以外的实例字段。声明的任何其他字段都必须是静态的。

    records类都是隐含的final类,并且不能是抽象类。这些限制使得records的API仅由其状态描述定义,并且以后不能被其他类实现或继承。

    在record中额外声明变量

    也可以显式声明从状态描述自动派生的任何成员。可以在没有正式参数列表的情况下声明构造函数(这种情况下,假定与状态描述相同),并且在正常构造函数主体正常完成时调用隐式初始化(this.x=x)。这样就可以在显式构造函数中仅执行其参数的验证等逻辑,并省略字段的初始化,例如:

    record Range(int lo, int hi) {
      public Range {
        if (lo > hi)  /* referring here to the implicit constructor parameters */
          throw new IllegalArgumentException(String.format("(%d,%d)", lo, hi));
      }
    }
    

    JEP 361: Switch Expressions (标准)

    扩展switch可以使其应用于语句或表达式。扩展switch使其可以用作语句或表达式,以便两种形式都可以使用传统的“case … :”标签(带有贯穿)或“… ->”标签(不带有贯穿),还有另一个新语句,用于从switch表达式产生值。这些更改将简化日常编码,并为在交换机中使用模式匹配提供了方法。这些功能在JDK 12和JDK 13中是属于预览语言功能,在JDK 14中正式称为标准。

    动机

    当我们准备增强Java编程语言以支持模式匹配(JEP 305)时,现有switch语句的一些不规则性(长期以来一直困扰着用户)成为了障碍。下面的代码中,众多的break语句使代码变得冗长,这种“视觉噪声”通常掩盖了更多的错误。

    switch (day) {
        case MONDAY:
        case FRIDAY:
        case SUNDAY:
            System.out.println(6);
            break;
        case TUESDAY:
            System.out.println(7);
            break;
        case THURSDAY:
        case SATURDAY:
            System.out.println(8);
            break;
        case WEDNESDAY:
            System.out.println(9);
            break;
    }
    

    我们建议引入一种新形式的switch标签“case L ->”,以表示如果匹配标签,则只执行标签右边的代码。switch标签允许在每种情况下使用逗号分隔多个常量。现在可以这样编写以前的代码:

    switch (day) {
        case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
        case TUESDAY                -> System.out.println(7);
        case THURSDAY, SATURDAY     -> System.out.println(8);
        case WEDNESDAY              -> System.out.println(9);
    }
    

    switch标签“case L ->”右侧的代码被限制为表达式、代码块或throw语句。这样局部变量的范围在本块之内,而传统的switch语句局部变量的作用域是整个模块!

    switch (day) {
        case MONDAY:
        case TUESDAY:
            int temp = ...     // The scope of 'temp' continues to the }
            break;
        case WEDNESDAY:
        case THURSDAY:
            int temp2 = ...    // Can't call this variable 'temp'
            break;
        default:
            int temp3 = ...    // Can't call this variable 'temp'
    }
    

    许多现有的switch语句实质上是对switch表达式的模拟,其中每个分支要么分配给一个公共目标变量,要么返回一个值:

    int numLetters;
    switch (day) {
        case MONDAY:
        case FRIDAY:
        case SUNDAY:
            numLetters = 6;
            break;
        case TUESDAY:
            numLetters = 7;
            break;
        case THURSDAY:
        case SATURDAY:
            numLetters = 8;
            break;
        case WEDNESDAY:
            numLetters = 9;
            break;
        default:
            throw new IllegalStateException("Wat: " + day);
    }
    

    上面的表述是复杂、重复且容易出错的。代码设计者的意图是为每天计算numLetters。这段代码可以改写成下面这段形式,更加清晰和安全:

    int numLetters = switch (day) {
        case MONDAY, FRIDAY, SUNDAY -> 6;
        case TUESDAY                -> 7;
        case THURSDAY, SATURDAY     -> 8;
        case WEDNESDAY              -> 9;
    };
    

    描述

    1. “case L ->”标签

    除了传统的“case L :”标签外,还定义了一种更简洁的形式:“case L ->”标签。如果表达式匹配了某个标签,则仅执行箭头右侧的表达式或语句;否则将不执行任何操作。

    static void howMany(int k) {
        switch (k) {
            case 1  -> System.out.println("one");
            case 2  -> System.out.println("two");
            default -> System.out.println("many");
        }
    }
    

    下面的代码:

    howMany(1);
    howMany(2);
    howMany(3);
    

    将会打印:

    one
    two
    many
    

    2. Switch表达式

    JDK 14扩展了switch语句,使其可以应用于表达式中。例如上述的howMany方法可以重写为如下形式:

    static void howMany(int k) {
        System.out.println(
            switch (k) {
                case  1 -> "one";
                case  2 -> "two";
                default -> "many";
            }
        );
    }
    

    在通常情况下,switch表达式如下所示:

    T result = switch (arg) {
        case L1 -> e1;
        case L2 -> e2;
        default -> e3;
    };
    

    3. 通过yield产生值

    大多数switch表达式在“case L->”标签的右侧都有一个表达式。如果需要一个完整的块,JDK 14引入了一个新的yield语句来产生一个值,该值成为封闭的switch表达式的值。

    int j = switch (day) {
        case MONDAY  -> 0;
        case TUESDAY -> 1;
        default      -> {
            int k = day.toString().length();
            int result = f(k);
            yield result;
        }
    };
    

    JEP 362: 弃用Solaris和SPARC端口

    不建议使用Solaris/SPARC,Solaris/x64和Linux/SPARC端口,以在将来的发行版中删除它们。

    动机

    放弃对这些端口的支持将使OpenJDK社区中的贡献者能够加速新功能的开发,这些新功能将推动平台向前发展。

    JEP 363: 移除CMS垃圾收集器

    移除CMS(Concurrent Mark Sweep)垃圾收集器。

    动机

    在两年多以前的JEP 291中,就已经弃用了CMS收集器,并说明会在以后的发行版中删除,以加快其他垃圾收集器的发展。在这段时间里,我们看到了2个新的垃圾收集器ZGC和Shenandoah的诞生,同时对G1的进一步改进。G1自JDK 6开始便成为CMS的继任者。我们希望以后现有的收集器进一步减少对CMS的需求。

    描述

    此更改将禁用CMS的编译,删除源代码中gc/cms目录的内容,并删除仅与CMS有关的选项。尝试使用命令-XX:+UseConcMarkSweepGC开启CMS会收到以下警告:

    Java HotSpot(TM) 64-Bit Server VM warning: Ignoring option UseConcMarkSweepGC; \
    support was removed in <version>
    

    VM将使用默认收集器继续执行。

    JEP 364: macOS系统上的ZGC(实验)

    将ZGC垃圾收集器移植到macOS。

    动机

    尽管我们希望需要ZGC可伸缩性的用户使用基于Linux的环境,但是在部署应用程序之前,开发人员通常会使用Mac进行本地开发和测试。 还有一些用户希望运行桌面应用程序,例如带有ZGC的IDE。

    描述

    ZGC的macOS实现由两部分组成:

    • 支持macOS上的多映射内存。 ZGC设计大量使用彩色指针,因此在macOS上我们需要一种将多个虚拟地址(在算法中包含不同颜色)映射到同一物理内存的方法。我们将为此使用mach microkernel mach_vm_remap API。堆的物理内存在单独的地址视图中维护,在概念上类似于文件描述符,但位于(主要是)连续的虚拟地址中。该内存被重新映射到内存的各种ZGC视图中,代表了算法的不同指针颜色。
    • ZGC支持不连续的内存保留。在Linux上,我们在初始化期间保留16TB的虚拟地址空间。我们假设没有共享库将映射到所需的地址空间。在默认的Linux配置上,这是一个安全的假设。但是在macOS上,ASLR机制会侵入我们的地址空间,因此ZGC必须允许堆保留不连续。假设VM实现使用单个连续的内存预留,则共享的VM代码也必须停止。如此一来,is_in_reserved(),reserved_region()和base()之类的GC API将从CollectedHeap中删除。

    JEP 365: Windows系统上的ZGC(实验)

    将ZGC垃圾收集器移植到Windows系统上。

    描述

    ZGC的大多数代码库都是平台无关的,不需要Windows特定的更改。现有的x64负载屏障支持与操作系统无关,也可以在Windows上使用。需要移植的特定于平台的代码与如何保留地址空间以及如何将物理内存映射到保留的地址空间有关。用于内存管理的Windows API与POSIX API不同,并且在某些方面不太灵活。

    Windows实现的ZGC需要进行以下工作:

    • 支持多映射内存。 ZGC使用彩色指针需要支持堆多重映射,以便可以从进程地址空间中的多个不同位置访问同一物理内存。在Windows上,分页文件支持的内存为物理内存提供了一个标识(句柄),该标识与映射它的虚拟地址无关。使用此标识,ZGC可以将同一物理内存映射到多个位置。
    • 支持将分页文件支持的内存映射到保留的地址空间。 Windows内存管理API不如POSIX的mmap/munmap灵活,尤其是在将文件支持的内存映射到以前保留的地址空间区域中时。为此,ZGC将使用Windows概念的地址空间占位符。 Windows 10和Windows Server版本1803中引入了占位符概念。不会实现对Windows较早版本的ZGC支持。
    • 支持映射和取消映射堆的任意部分。 ZGC的堆布局与其动态调整堆页面大小(以及重新调整大小)相结合,需要支持映射和取消映射任意堆粒子。此要求与Windows地址空间占位符结合使用时,需要特别注意,因为占位符必须由程序显式拆分/合并,而不是由操作系统自动拆分/合并(如在Linux上)。
    • 支持提交和取消提交堆的任意部分。 ZGC可以在Java程序运行时动态地提交和取消提交物理内存。为了支持这些操作,物理内存将被划分为多个分页文件段并由其支持。每个分页文件段都对应一个ZGC堆粒度,并且可以独立于其他段进行提交和取消提交。

    JEP 366: 弃用Parallel Scavenge和Serial Old垃圾收集算法的组合

    弃用Parallel Scavenge和Serial Old垃圾收集算法的组合。

    动机

    有一组GC算法的组合很少使用,但是维护起来却需要巨大的工作量:并行年轻代GC(ParallelScavenge)和串行老年代GC(SerialOld)的组合。用户必须使用-XX:+UseParallelGC -XX:-UseParallelOldGC来启用此组合。

    这种组合是畸形的,因为它将并行的年轻代GC算法和串行的老年代GC算法组合在一起使用。我们认为这种组合仅在年轻代很多、老年代很少时才有效果。在这种情况下,由于老年代的体积较小,因此完整的收集暂停时间是可以接受的。但是在生产环境中,这种方式是非常冒险的:年轻代的对象容易导致OutOfMemoryException。此组合的唯一优势是总内存使用量略低。我们认为,这种较小的内存占用优势(最多是Java堆大小的约3%)不足以超过维护此GC组合的成本。

    描述

    除了弃用选项组合-XX:+UseParallelGC -XX:-UseParallelOldGC外,我们还将弃用选项-XX:UseParallelOldGC,因为它唯一的用途是取消选择并行的旧版GC,从而启用串行旧版GC。

    因此,任何对UseParallelOldGC选项的明确使用都会显示弃用警告。

    JEP 367: 移除Pack200工具和API

    删除java.util.jar软件包中的pack200和unpack200工具以及Pack200 API。这些工具和API在Java SE 11中已经被注明为不推荐,并明确打算在将来的版本中删除它们。

    动机

    Pack200是JSR 200在Java SE 5.0中引入的一种JAR文件压缩方案。其目标是“减少Java应用程序打包,传输和交付的磁盘和带宽需求”。开发人员使用一对工具pack200和unpack200压缩和解压缩其JAR文件。在java.util.jar包中提供了一个API。

    删除Pack200的三个原因:

    • 从历史上看,通过56k调制解调器缓慢下载JDK阻碍了Java的采用。 JDK功能的不断增长导致下载量膨胀,进一步阻碍了采用。使用Pack200压缩JDK是缓解此问题的一种方法。但是,时间已经过去了:下载速度得到了提高,并且JDK 9为Java运行时(JEP 220)和用于构建运行时的模块(JMOD)引入了新的压缩方案。因此,JDK 9和更高版本不依赖Pack200。 JDK 8是在构建时用pack200压缩的最新版本,在安装时用unpack200压缩的最新版本。总之,Pack200的主要使用者(JDK本身)不再需要它。
    • 除了JDK,Pack200还可以压缩客户端应用程序,尤其是applet。某些部署技术(例如Oracle的浏览器插件)会自动解压缩applet JAR。但是,客户端应用程序的格局已经改变,并且大多数浏览器都放弃了对插件的支持。因此,Pack200的主要消费者类别(在浏览器中运行的小程序)不再是将Pack200包含在JDK中的驱动程序。
    • Pack200是一项复杂而精致的技术。它的文件格式与类文件格式和JAR文件格式紧密相关,二者均以JSR 200所无法预料的方式发展。(例如,JEP 309向类文件格式添加了一种新的常量池条目,并且JEP 238在JAR文件格式中添加了版本控制元数据。)JDK中的实现是在Java和本机代码之间划分的,这使得维护变得很困难。 java.util.jar.Pack200中的API不利于Java SE平台的模块化,从而导致在Java SE 9中删除了其四种方法。总的来说,维护Pack200的成本是巨大的,并且超过了其收益。包括在Java SE和JDK中。

    描述

    JDK最终针对的JDK功能发行版中将删除以前用@Deprecated(forRemoval = true)注解的java.base模块中的三种类型:

    • java.util.jar.Pack200
    • java.util.jar.Pack200.Packer
    • java.util.jar.Pack200.Unpacker

    包含pack200和unpack200工具的jdk.pack模块先前已使用@Deprecated(forRemoval = true)进行了注解,并且还将在此JEP最终针对的JDK功能版本中将其删除。

    JEP 368: Text Blocks(二次预览)

    Java语言增加文本块功能。文本块是多行字符串文字,能避免大多数转义。

    动机

    在Java中,HTML, XML, SQL, JSON等字符串对象都很难阅读和维护。

    1. HTML

    使用one-dimensional的字符串语法:

    String html = "<html>\n" +
                  "    <body>\n" +
                  "        <p>Hello, world</p>\n" +
                  "    </body>\n" +
                  "</html>\n";
    

    使用two-dimensional文本块语法:

    String html = """
                  <html>
                      <body>
                          <p>Hello, world</p>
                      </body>
                  </html>
                  """;
    

    2. SQL

    使用one-dimensional的字符串语法:

    String query = "SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`\n" +
                   "WHERE `CITY` = 'INDIANAPOLIS'\n" +
                   "ORDER BY `EMP_ID`, `LAST_NAME`;\n";
    

    使用two-dimensional文本块语法:

    String query = """
                   SELECT `EMP_ID`, `LAST_NAME` FROM `EMPLOYEE_TB`
                   WHERE `CITY` = 'INDIANAPOLIS'
                   ORDER BY `EMP_ID`, `LAST_NAME`;
                   """;
    

    3. 多语言示例

    使用one-dimensional的字符串语法:

    ScriptEngine engine = new ScriptEngineManager().getEngineByName("js");
    Object obj = engine.eval("function hello() {\n" +
                             "    print('\"Hello, world\"');\n" +
                             "}\n" +
                             "\n" +
                             "hello();\n");
    

    使用two-dimensional文本块语法:

    ScriptEngine engine = new ScriptEngineManager().getEngineByName("js");
    Object obj = engine.eval("""
                             function hello() {
                                 print('"Hello, world"');
                             }
                             
                             hello();
                             """);
    

    描述

    文本块是Java语言的新语法,可以用来表示任何字符串,具有更高的表达能力和更少的复杂度。

    文本块的开头定界符是由三个双引号字符(""")组成的序列,后面跟0个或多个空格,最后跟一个行终止符。内容从开头定界符的行终止符之后的第一个字符开始。

    结束定界符是三个双引号字符的序列。内容在结束定界符的第一个双引号之前的最后一个字符处结束。

    与字符串文字中的字符不同,文本块的内容中可以直接包含双引号字符。允许在文本块中使用\",但不是必需的或不建议使用。

    与字符串文字中的字符不同,内容可以直接包含行终止符。允许在文本块中使用\n,但不是必需或不建议使用。例如,文本块:

    """
    line 1
    line 2
    line 3
    """
    

    等效于字符串文字:

    "line 1\nline 2\nline 3\n"
    

    或字符串文字的串联:

    "line 1\n" +
    "line 2\n" +
    "line 3\n"
    

    JEP 370: 外部存储器API(孵化)

    引入一个API,以允许Java程序安全有效地访问Java堆之外的外部内存。

    动机

    许多Java的库都能访问外部存储,例如Ignite、mapDB、memcached及Netty的ByteBuf API。这样可以:

    • 避免垃圾回收相关成本和不可预测性
    • 跨多个进程共享内存
    • 通过将文件映射到内存中来序列化、反序列化内存内容。

    但是Java API却没有提供一个令人满意的访问外部内存的解决方案。

    Java 1.4中引入的ByteBuffer API允许创建直接字节缓冲区,这些缓冲区是按堆外分配的,并允许用户直接从Java操作堆外内存。但是,直接缓冲区是有限的。

    开发人员可以从Java代码访问外部内存的另一种常见途径是使用sun.misc.Unsafe API。Unsafe有许多公开的内存访问操作(例如Unsafe::getInt和putInt)。使用Unsafe访问内存非常高效:所有内存访问操作都定义为JVM内在函数,因此JIT会定期优化内存访问操作。然而根据定义,Unsafe API是不安全的——它允许访问任何内存位置(例如,Unsafe::getInt需要很长的地址)。如果Java程序了访问某些已释放的内存位置,可能会使JVM崩溃。最重要的是,Unsafe API不是受支持的Java API,并且强烈建议不要使用它。

    虽然也可以使用JNI访问内存,但是与该解决方案相关的固有成本使其在实践中很少适用。整个开发流程很复杂,因为JNI要求开发人员编写和维护C代码段。 JNI本质上也很慢,因为每次访问都需要Java到native的转换。

    在访问外部内存时,开发人员面临一个难题:应该使用安全但受限(可能效率较低)的方法(例如ByteBuffer),还是应该放弃安全保证并接受不受支持和危险的Unsafe API?

    该JEP引入了受支持的,安全且有效的外部内存访问API。并且设计时就充分考虑了JIT优化。

    描述

    外部存储器访问API引入了三个主要的抽象:MemorySegment,MemoryAddress和MemoryLayout。

    MemorySegment用于对具有给定空间和时间范围的连续内存区域进行建模。可以将MemoryAddress视为段内的偏移量,MemoryLayout是内存段内容的程序描述。

    可以从多种来源创建内存段,例如本机内存缓冲区,Java数组和字节缓冲区(直接或基于堆)。例如,可以如下创建本机内存段:

    try (MemorySegment segment = MemorySegment.allocateNative(100)) {
       ...
    }
    

    上述代码将创建大小为100字节的,与本机内存缓冲区关联的内存段。

    内存段在空间上受限制;任何试图使用该段来访问这些界限之外的内存的尝试都会导致异常。正如使用try-with-resource构造所证明的那样,片段在时间上也是有界的。也就是说,它们已创建,使用并在不再使用时关闭。关闭段始终是一个显式操作,并且可能导致其他副作用,例如与该段关联的内存的重新分配。任何访问已关闭的内存段的尝试都将导致异常。空间和时间安全性检查对于确保内存访问API的安全性至关重要。

    通过获取内存访问var句柄可以取消引用与段关联的内存。这些特殊的var句柄具有至少一个强制访问坐标,类型为MemoryAddress,即发生取消引用的地址。它们是使用MemoryHandles类中的工厂方法获得的。要设置本机段的元素,我们可以使用如下所示的内存访问var句柄:

    VarHandle intHandle = MemoryHandles.varHandle(int.class);
    
    try (MemorySegment segment = MemorySegment.allocateNative(100)) {
       MemoryAddress base = segment.baseAddress();
       for (int i = 0 ; i < 25 ; i++) {
            intHandle.set(base.offset(i * 4), i);
       }
    }
    

    参考引用

    展开全文
  • Visual Studio 2005 的新 DataSet 特性

    千次阅读 2007-04-18 14:08:00
    http://dev.csdn.net/develop/article/82/82837.shtm 简介在之前的 ADO.NET 2.0 的新 DataSet 特性 这篇文章,我讨论了即将对 ADO.NET DataSet 类及其相关类(例如 DataSet、DataTable 和 DataView...
  • 以下选项的叙述,正确的是循环队列有队头和队尾两个指针,因此,循环队列是非线性结构在循环队列,只需要队头指针就能反映队列元素的动态变化情况在循环队列,只需要队尾指针就能反映队列元素的动态变化...
  • GCC 预处理器选项

    千次阅读 2012-10-10 09:26:56
    GCC 预处理器选项 文章来源: 文章作者: 发布时间:2007-08-09...下列选项针对C预处理器,预处理器用在正式编译以前,对C 源文件进行某种处理. 如果指定了`-E'选项, GCC只进行预处理工作.下面的某些选项必须和`
  • Gcc优化选项

    万次阅读 2016-10-31 22:54:50
    gcc默认提供了5级优化选项的集合: -O0:无优化(默认)。 -O和-O1:使用能减少目标文件大小以及执行时间并且不会使编译时间明显增加的优化。 在编译大型程序的时候会显著增加编译时内存的使用和时间。 -O2: 此选项...
  • Python语言的特点有哪些Python 是目前最流行的语言之一,从云计算、大数据到人工智能,Python 无处不在,Python 人才...阅读一个良好的 Python 程序就感觉像是在读英语一样,尽管这个英语的要求非常严格。Python ...
  • 【多选题】下面哪些是Python语言的特点()【单选题】马丁在《舞蹈概论》规定的第一个原则是下面哪一项:()【判断题】原生态舞蹈就是作品形态舞蹈。【单选题】from the【简答题】1.综合经营服务项目的策划书的主要...
  • 2006年4月全国计算机等级考试二级笔试试卷C语言程序设计一、选择题((1)-(1O)每题2分...(1)下列选项中不属于结构化程序设计方法的是A)自顶向下 B)逐步求精C)模块化 D)可复用(2)两个或两个以上模块之间关联的紧密程度称为
  • gcc警告选项汇总

    万次阅读 2018-04-18 14:19:33
    请求或取消警告的选项 ...警告是诊断消息,报告的结构本质上不是错误的,但是有风险或表明可能有错误。...以下与语言无关的选项不会启用特定的警告,但会控制GCC生成的诊断...检查代码的语法错误,但除此之外...
  • JavaScript的高级特性及特别对象、属性和方法一,编写构造函数可以使用 new 运算符结合像 Object()、Date() 和 Function() 这样的预定义的构造函数来创建对象并对其初始化。面向对象的编程其强有力的特征是...
  • 在 Eclipse 开发 Apache Derby 应用程序

    千次阅读 2005-07-04 06:24:00
    在 Eclipse 开发 Apache Derby 应用程序级别: 中级Gilles Roux (groux@us.ibm.com) 信息管理软件工程师, IBM2005 年 2 月 在开发 Apache Derby 应用程序的过程需要执行很多任务,例如创建和连接数据库,编写 ...
  • c++程序设计基础(第五版)(上) 习题与解答

    万次阅读 多人点赞 2019-09-09 20:06:44
    C++程序设计基础(第5版)(上) 习题与解答 第1章练习题 同步练习1.1 一、选择题 1.一个最简单的C++程序,可以只有一个( )。 (A)库函数 (B)自定义函数 (C)main函数 (D)空函数 2.函数名是( ),用于...
  • Linux内核配置选项简介

    千次阅读 2019-03-12 23:17:12
    目录 General setup常规设置 Enable loadable module support可加载模块...Processor type and features中央处理器(CPU)类型及特性 Power management and ACPI options电源管理和ACPI选项 Bus options (PCI et...
  • 选择合适的JDBC驱动程序

    千次阅读 2004-08-18 16:21:00
    如果你了解JDBC驱动程序各个特性指标的具体含义,或者了解到底哪些特性才值得重视,要从大量的驱动程序中选择最合适的一个并容易。本文将助你一臂之力。 概述 说到数据库驱动程序,可以借用喜剧演员Rodney ...
  • delphi 各新版本特性收集

    千次阅读 2015-09-01 21:32:18
    delphi 各新版本特性收集   Delphi XE6新增了一些特性并增强了原有的功能,主要有以下几个方面:   IDE(整合开发环境)   Internet XML(扩展标记语言) Compiler(编译器) COM/Active X ...
  • gcc 的部分优化选项

    千次阅读 2014-01-10 11:45:52
    CFLAGS 与 CXXFLAGS CFLAGS 表示用于 C 编译器的选项,CXXFLAGS 表示用于 C++ 编译器的选项。...大多数程序和库在编译时默认的优化级别是"2"(使用"-O2"选项)并且带有调试符号来编译,也就是 CFLAGS="-
  • Delphi 6 新特性-IDE部分(中文)

    千次阅读 2001-07-14 13:22:00
    Delphi 6 新特性原著:Borland Corporation翻译:Musicwind®开始日期:2001-07-13结束日期:2001-07-14 (完成IDE特性部分) 声明:以下文章的内容取自Delphi 6附带的帮助文件。版权所有Borland Corporation。翻译...
  • java 程序设计题库

    万次阅读 2019-06-18 09:25:00
    答题要求:单选题,每题只有一个正确答案,选择正确给分,正确给分。...2、以下的选项中能正确表示Java语言的一个整型常量的是( B ) A、12. B、-20 C、1,000 D、4 5 6 3、下列的变量定义...
  • HTML5新特性详解

    千次阅读 2017-03-16 09:13:19
    ,请注意:更新清单列出的某个文件并意味着浏览器会重新缓存该资源。清单文件本身必须进行更改,一般是加一个注释,注释的内容是日期,想更新了,改一下日期。 由程序来更新应用缓存 ,这个稍微靠谱一点。 ...
  • ASP.NET程序设计复习题

    千次阅读 2019-12-23 22:18:48
    一.填空题 (1)ASPX网页的代码储存模式有两种,它们是代码分离模式和单一模式。...(3)请将下列数据(nn )在TextBox 控件显示出来。 Double nn = 4512.6; TextBox1.Text =nn.Tostring(); (4)下面是一个...
  • delphi 应用程序开发工具

    千次阅读 2016-07-07 15:02:20
    应用程序开发工具 Delphi,是Windows平台下著名的快速应用程序开发工具(Rapid Application Development,简称RAD)。它的前身,即是DOS时代盛行一时的“BorlandTurbo Pascal”,最早的版本由美国Borland...
  • Microsoft Windows作业系统提供了许多工具让服务器端之主从式应用程序部份的实作变得更容易。如您所知,一个服务器即是一个履行服务器端义务的Windows应用程序。事实上,Microsoft BackOffice Logo程序即要求服务器...
  • 自考C++程序设计试题2009年10月

    千次阅读 2016-03-09 22:16:18
    在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内。错选、多选或未选均无分。 1.对C++主函数描述正确的是( ) A.名称为main,可为多个 B.名称限,可为
  •   微信小程序是一种需要下载安装即可使用的全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有“用完即走,不用关心是否安装太多应用”的使用体验。   微信小程序做成了一个开放式的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,977
精华内容 7,590
关键字:

下列选项中不属于程序的特性