Linux-0.11内核编译
- 格式:pdf
- 大小:249.08 KB
- 文档页数:15
linux 0.11编译方法
Linux 0.11是Linux内核的一个早期版本,其编译方法相比现代版本有所不同。
下面是大致的编译步骤:
1.获取源代码
获取Linux 0.11的源代码。
这个版本的代码可以在历史存档中找到。
你可以从网络上找到存档并下载,或者使用像GitHub等代码托管平台上的存档。
2.准备编译环境
确保你的系统拥有合适的编译环境。
Linux 0.11是早期版本,可能需要特定的编译器和工具链。
一般来说,你需要安装合适版本的GCC编译器和相关的开发工具。
3.编辑Makefile
进入Linux 0.11源代码目录,在Makefile中设置适当的编译选项。
你可能需要调整编译器参数和其他配置,以适应你的系统环境。
4.运行编译命令
在Linux 0.11源代码目录中,运行适当的编译命令。
在这个版本中,可能有一个名为make或make all的命令可以启动编译过程。
5.处理编译错误
如果出现编译错误,需要根据错误信息进行调试和修复。
这个过程可能需要查看源代码,理解错误原因,并进行相应的修改。
6.生成内核镜像
一旦编译成功,你将会得到一个内核镜像文件。
这个文件可以用于启动系统。
请注意,Linux 0.11是一个非常早期的版本,其编译和构建流程可能相当复杂和不稳定。
同时,这个版本可能并不适用于现代硬件,可能需要进行适当的修改才能在当前系统上运行。
在学习和尝试编译早期版本的Linux内核时,请确保备份数据和系统,以免造成不可逆的损失。
linux内核编译教程Linux内核是开源操作系统Linux的核心部分,负责管理计算机的硬件资源和提供系统调用等基本功能。
编译Linux内核是根据自己的需求定制Linux系统的一个重要步骤。
本文将介绍如何编译Linux内核。
首先,要开始编译Linux内核,需要下载最新的内核源代码。
可以在Linux官网的下载页面找到相应的内核版本。
将源代码下载到本地后,解压缩到一个合适的位置。
接下来,需要安装一些必要的依赖包。
不同的Linux发行版可能有不同的依赖包名称,可以通过包管理器进行安装。
例如,对于Debian/Ubuntu系统,可以使用apt-get命令安装依赖包。
常见的依赖包包括gcc编译器、make工具、flex和bison等。
在安装完依赖包之后,进入解压缩后的内核源码目录。
可以通过cd命令切换到该目录。
在目录中可以找到一个名为.config 的文件,这是内核的配置文件。
可以通过复制现有的配置文件或者使用make menuconfig等命令进行配置。
配置完成后,可以开始编译内核了。
在内核源码目录中运行make命令,编译过程可能需要一些时间。
可以使用make命令的参数来设置编译的选项,例如使用-j参数指定并行编译的进程数,加快编译速度。
编译完成后,可以使用make modules_install命令安装内核模块。
然后,使用make install命令安装编译好的内核。
这些命令可能需要root权限才能执行。
安装完成后,需要更新系统的引导程序以启动新编译的内核。
具体的操作步骤可以根据不同的引导程序进行设置。
一般来说,需要编辑/boot/grub/grub.cfg文件,添加新内核的引导项。
最后,重启计算机,选择新编译的内核启动。
如果一切正常,系统将会以新内核启动。
在编译Linux内核的过程中,可能会遇到各种问题。
可以通过查找相关文档、咨询论坛或者向开发者社区寻求帮助来解决问题。
总之,编译Linux内核是一个复杂的过程,但通过理解以上步骤和不断实践,可以逐渐掌握这一技能,并根据自己的需求定制出适合的Linux系统。
1 linux内核编译详解一、内核简介内核,是一个操作系统的核心。
它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性。
linux的一个重要的特点就是其源代码的公开性,所有的内核源程序都可以在 /usr/ src/linux下找到,大部分应用软件也都是遵循GPL而设计的,你都可以获取相应的源程序代码。
全世界任何一个软件工程师都可以将自己认为优秀的代码加入到其中,由此引发的一个明显的好处就是Linux修补漏洞的快速以及对最新软件技术的利用。
而L inux的内核则是这些特点的最直接的代表。
想象一下,拥有了内核的源程序对你来说意味着什么?首先,我们可以了解系统是如何工作的。
通过通读源代码,我们就可以了解系统的工作原理,这在Windows下简直是天方夜谭。
其次,我们可以针对自己的情况,量体裁衣,定制适合自己的系统,这样就需要重新编译内核。
在Windows下是什么情况呢?相信很多人都被越来越庞大的Windows整得莫名其妙过。
再次,我们可以对内核进行修改,以符合自己的需要。
这意味着什么?没错,相当于自己开发了一个操作系统,但是大部分的工作已经做好了,你所要做的就是要增加并实现自己需要的功能。
在Windows下,除非你是微软的核心技术人员,否则就不用痴心妄想了。
二、内核版本号由于linux的源程序是完全公开的,任何人只要遵循GPL,就可以对内核加以修改并发布给他人使用。
Linux的开发采用的是集市模型(bazaar,与cathedral--教堂模型--对应),为了确保这些无序的开发过程能够有序地进行,Linux采用了双树系统。
一个树是稳定树(stable tree),另一个树是非稳定树(unstable tree)或者开发树(develop ment tree)。
一些新特性、实验性改进等都将首先在开发树中进行。
如果在开发树中所做的改进也可以应用于稳定树,那么在开发树中经过测试以后,在稳定树中将进行相同的改进。
General setup常规设置Local versio n - append to kernel release在内核版本后面加上自定义的版本字符串(小于64字符),可以用"uname -a"命令看到Automatically append version information to the versio n string 自动在版本字符串后面添加版本信息,编译时需要有perl以及git仓库支持Support for paging of anonymous memory (swap)使用交换分区或者交换文件来做为虚拟内存System V IPCSystem V进程间通信(IPC)支持,许多程序需要这个功能.必选,除非你知道自己在做什么POSIX Message QueuesPOSIX消息队列,这是POSIX IPC中的一部分BSD Process Accounting将进程的统计信息写入文件的用户级系统调用,主要包括进程的创建时间/创建者/内存占用等信息Export task/process statistics through netlink通过netlink接口向用户空间导出任务/进程的统计信息,与BSD ProcessAccounting的不同之处在于这些统计信息在整个任务/进程生存期都是可用的UTS NamespacesUTS名字空间支持,不确定可以不选Auditing support审计支持,某些内核模块(例如SELinux)需要它,只有同时选择其子项才能对系统调用进行审计Kernel .config support把内核的配置信息编译进内核中,以后可以通过scripts/extract-ikconfig脚本来提取这些信息Cpuset support只有含有大量CPU(大于16个)的SMP系统或NUMA(非一致内存访问)系统才需要它Kernel->user space relay support (formerly relayfs)在某些文件系统上(比如debugfs)提供从内核空间向用户空间传递大量数据的接口Initramfs source file(s)initrd已经被initramfs取代,如果你不明白这是什么意思,请保持空白Optimize for size (Look out for broken compilers!)编译时优化内核尺寸(使用"-Os"而不是"-O2"参数编译),有时会产生错误的二进制代码Enable extended accounting over taskstats收集额外的进程统计信息并通过taskstats接口发送到用户空间Configure standard kernel features (for small systems)配置标准的内核特性(为小型系统)Include all symbols in kallsyms在kallsyms中包含内核知道的所有符号,内核将会增大300KDo an extra kallsyms pass除非你在kallsyms中发现了bug并需要报告这个bug才打开该选项Loadable module support可加载模块支持Enable loadable module support打开可加载模块支持,如果打开它则必须通过"make modules_install"把内核模块安装在/lib/modules/中Module unloading允许卸载已经加载的模块Forced module unloading允许强制卸载正在使用中的模块(比较危险)Module versioning support允许使用其他内核版本的模块(可能会出问题)Source checksum for all modules为所有的模块校验源码,如果你不是自己编写内核模块就不需要它Block layer块设备层Enable the block layer块设备支持,使用硬盘/USB/SCSI设备者必选Support for Large Block Devices仅在使用大于2TB的块设备时需要Support for tracing block io actions块队列IO跟踪支持,它允许用户查看在一个块设备队列上发生的所有事件,可以通过blktrace程序获得磁盘当前的详细统计数据Support for Large Single Files仅在可能使用大于2TB的文件时需要IO SchedulersIO调度器Anticipatory I/O scheduler假设一个块设备只有一个物理查找磁头(例如一个单独的SATA硬盘),将多个随机的小写入流合并成一个大写入流,用写入延时换取最大的写入吞吐量.适用于大多数环境,特别是写入较多的环境(比如文件服务器)Deadline I/O scheduler使用轮询的调度器,简洁小巧,提供了最小的读取延迟和尚佳的吞吐量,特别适合于读取较多的环境(比如数据库)CFQ I/O scheduler使用QoS策略为所有任务分配等量的带宽,避免进程被饿死并实现了较低的延迟,可以认为是上述两种调度器的折中.适用于有大量进程的多用户系统Default I/O scheduler默认IO调度器Processor type and features中央处理器(CPU)类型及特性Symmetric multi-processing support对称多处理器支持,如果你有多个CPU或者使用的是多核CPU就选上.此时"Enhanced Real Time Clock Support"选项必须开启,"Advanced PowerManagement"选项必须关闭Subarchitecture Type处理器的子架构,大多数人都应当选择"PC-compatible"Processor family处理器系列,请按照你实际使用的CPU选择Generic x86 support通用x86支持,如果你的CPU能够在上述"Processor family"中找到就别选HPET Timer SupportHPET是替代8254芯片的新一代定时器,i686及以上级别的主板都支持,可以安全的选上Maximum number of CPUs支持的最大CPU数,每增加一个内核将增加8K体积SMT (Hyperthreading) scheduler support支持Intel的超线程(HT)技术Multi-core scheduler support针对多核CPU进行调度策略优化Preemption Model内核抢占模式No Forced Preemption (Server)适合服务器环境的禁止内核抢占Voluntary Kernel Preemption (Desktop)适合普通桌面环境的自愿内核抢占Preemptible Kernel (Low-Latency Desktop)适合运行实时程序的主动内核抢占Preempt The Big Kernel Lock可以抢占大内核锁,应用于实时要求高的场合,不适合服务器环境Machine Check Exception让CPU检测到系统故障时通知内核,以便内核采取相应的措施(如过热关机等) Check for non-fatal errors on AMD Athlon/Duron / IntelPentium 4每5秒检测一次这些cpu的非致命错误并纠正它们,同时记入日志check for P4 thermal throttling interrupt当P4的cpu过热时显示一条警告消息Enable VM86 support虚拟X86支持,在DOSEMU下运行16-bit程序或XFree86通过BIOS初始化某些显卡的时候才需要Toshiba Laptop supportToshiba笔记本模块支持Dell laptop supportDell笔记本模块支持Enable X86 board specific fixups for reboot修正某些旧x86主板的重起bug,这种主板基本绝种了/dev/cpu/microcode - Intel IA32 CPU microcode support使用不随Linux内核发行的IA32微代码,你必需有IA32微代码二进制文件,仅对Intel的CPU有效/dev/cpu/*/msr - Model-specific register support在多cpu系统中让特权CPU访问x86的MSR寄存器/dev/cpu/*/cpuid - CPU informatio n support能从/dev/cpu/x/cpuid获得CPU的唯一标识符(CPUID)Firmware Drivers固件驱动程序BIOS Enhanced Disk Drive calls determine boot disk 有些BIOS支持从某块特定的硬盘启动(如果BIOS不支持则可能无法启动),目前大多数BIOS还不支持BIOS update support for DELL systems via sysfs 仅适用于DELL机器Dell Systems Management Base Driver仅适用于DELL机器High Memory Support最高内存支持,总内存小于等于1G的选"off",大于4G的选"64G"Memory split如果你不是绝对清楚自己在做什么,不要改动这个选项Memory model一般选"Flat Memory",其他选项涉及内存热插拔64 bit Memory and IO resources使用64位的内存和IO资源Allocate 3rd-level pagetables from highmem在内存很多(大于4G)的机器上将用户空间的页表放到高位内存区,以节约宝贵的低端内存Math emulation数学协处理器仿真,486DX以上的cpu就不要选它了MTRR (Memory Type Range Register) support打开它可以提升PCI/AGP总线上的显卡2倍以上的速度,并且可以修正某些BIOS错误Boot from EFI supportEFI是一种可代替传统BIOS的技术(目前的Grub/LILO尚不能识别它),但是现在远未普及Enable kernel irq balancing让内核将irq中断平均分配给多个CPU以进行负载均衡,但是要配合irqbanlance守护进程才行Use register arguments使用"-mregparm=3"参数编译内核,将前3个参数以寄存器方式进行参数调用,可以生成更紧凑和高效的代码Enable seccomp to safely compute untrusted bytecode只有嵌入式系统可以不选Timer frequency内核时钟频率,桌面推荐"1000 HZ",服务器推荐"100 HZ"或"250 HZ"kexec system call提供kexec系统调用,可以不必重启而切换到另一个内核kernel crash dumps被kexec启动后产生内核崩溃转储Physical address where the kernel is loaded内核加载的物理地址,除非你知道自己在做什么,否则不要修改.在提供kexec系统调用的情况下可能要修改它Support for hot-pluggable CPUs对热插拔CPU提供支持Compat VDSO support如果Glibc版本大于等于2.3.3就不选,否则就选上Power management options电源管理选项Power Management support电源管理有APM和ACPI两种标准且不能同时使用.即使关闭该选项,X86上运行的Linux也会在空闲时发出HLT指令将CPU进入睡眠状态Legacy Power Management API传统的电源管理API,比如软关机和系统休眠等接口Power Management Debug Support仅供调试使用Driver model /sys/devices/.../power/state files 内核帮助文档反对使用该选项,即将被废除ACPI (Advanced Configuration and Power Interface) Support必须运行acpid守护程序ACPI才能起作用.ACPI是为了取代APM而设计的,因此应该尽量使用ACPI而不是APMAC Adapter如果你的系统可以在AC和电池之间转换就可以选Battery通过/proc/acpi/battery向用户提供电池状态信息,用电池的笔记本可以选Button守护程序捕获Power,Sleep,Lid按钮事件,并根据/proc/acpi/event做相应的动作,软件控制的poweroff需要它Video仅对集成在主板上的显卡提供ACPI2.0支持,且不是所有集成显卡都支持Generic Hotkey统一的热键驱动,建议不选Fan允许通过用户层的程序来对系统风扇进行控制(开,关,查询状态),支持它的硬件并不多Dock支持由ACPI控制的集线器(docking stations)Processor让ACPI处理空闲状态,并使用ACPI C2和C3处理器状态在空闲时节省电能,同时它还被cpufreq的"Performance-state drivers"选项所依赖Thermal Zone系统温度过高时可以利用ACPI thermal zone及时调整工作状态以避免你的CPU被烧毁ASUS/Medio n Laptop Extras ASUS笔记本专用,以提供额外按钮的支持,用户可以通过/proc/acpi/asus来打开或者关闭LCD的背光/调整亮度/定制LED的闪烁指示等功能IBM ThinkPad Laptop Extras IBM ThinkPad专用Toshiba Laptop Extras Toshiba笔记本专用Disable ACPI for systemsbefore Jan 1st this year 输入四位数的年份,在该年的1月1日前不使用ACPI的功能("0"表示一直使用)Debug Statements 详细的ACPI调试信息,不搞开发就别选Power ManagementTimer Support 这个Timer在所有ACPI兼容的平台上都可用,且不会受PM功能的影响,建议总是启用它.如果你在kernel log中看到了'many lost ticks'那就必须启用它ACPI0004,PNP0A05and PNP0A06Container Driver 支持内存和CPU的热插拔Smart BatterySystem 支持依赖于I2C的"智能电池".这种电池非常老旧且罕见,还与当前的ACPI标准兼容性差APM (Advanced Power Management) BIOS SupportAPM在SMP机器上必须关闭,一般来说当前的笔记本都支持ACPI,所以应尽量关闭该该选项Ignore USER SUSPEND只有NEC Versa M系列的笔记本才需要选择这一项Enable PM at boot time系统启动时即启用APM,选上这个选项能让系统自动的进行电源管理,但常常导致启动时死机Make CPU Idle calls when idle系统空闲时调用空闲指令(halt),只有老式的CPU才需要选它,且对于SMP系统必须关闭Enable console blanking using APM在屏幕空白时关闭LCD背光,事实上对所有的笔记本都无效RTC stores time in GMT将硬件时钟应该设为格林威治时间,否则视为本地时间.建议你使用GMT,这样你无须为时区的改变而担心Allow interrupts during APM BIOS calls 允许APM的BIOS调用时中断,IBM Thinkpad的一些新机器需要这项.如果休眠时挂机(包括睡下去就醒不来),可以试试它Use real mode APM BIOS call to power off 此驱动为某些有Bug的BIOS准备,如果你的系统不能正常关机或关机时崩溃,可以试试它CPU Frequency scaling允许动态改变CPU主频,达到省电和降温的目的,必须同时启用下面的一种governor才行Enable CPUfreq debugging允许对CPUfreq进行调试CPU frequency translation statistics通过sysfs文件系统输出CPU频率变换的统计信息CPU frequency translation statistics details输出详细的CPU频率变换统计信息Default CPUFreq governor默认的CPU频率调节器'performance' governor'性能'优先,静态的将频率设置为cpu支持的最高频率'powersave' governor'节能'优先,静态的将频率设置为cpu支持的最低频率'userspace' governor for userspace frequencyscaling既允许手动调整cpu频率,也允许用户空间的程序动态的调整cpu频率(需要额外的调频软件,比如cpufreqd)'ondemand' cpufreq policy governor '立即响应',周期性的考察CPU负载并自动的动态调整cpu频率(不需要额外的调频软件),适合台式机'conservative' cpufreq governor '保守',和'ondemand'相似,但是频率的升降是渐变式的(幅度不会很大),更适合用于笔记本/PDA/AMD64环境ACPI Processor P-States driver 将ACPI2.0的处理器性能状态报告给CPUFreq processor drivers以决定如何调整频率,该选项依赖于ACPI->Processor{省略的部分请按照自己实际使用的CPU选择}/proc/acpi/processor/../performance interface内核帮助文档反对使用该选项,即将被废除Relaxed speedstep capabilitychecks放松对系统的speedstep兼容性检查,仅在某些老旧的Intel系统上需要打开Bus options (PCI, PCMCIA, EISA, MCA, ISA)总线选项PCI supportPCI支持,如果使用了PCI或PCI Express设备就必选PCI access modePCI访问模式,强列建议选"Any"(系统将优先使用"MMConfig",然后使用"BIOS",最后使用"Direct"检测PCI设备)PCI Express supportPCI Express支持(目前主要用于显卡和千兆网卡)PCI Express Hotplug driver如果你的主板和设备都支持PCI Express热插拔就可以选上Use po lling mechanism for hot-plug events对热插拔事件采用轮询机制,仅用于测试目的Root Port Advanced Error Reporting support由PCI Express AER驱动程序处理发送到Root Port的错误信息Message Signaled Interrupts (MSI and MSI-X) PCI Express支持两类中断:INTx使用传统的IRQ中断,可以与现行的PCI总线的驱动程序和操作系统兼容;MSI则是通过inbound Memory Write触发和发送中断,更适合多CPU系统.可以使用"pci=nomsi"内核引导参数关闭MSIPCI Debugging将PCI调试信息输出到系统日志里Interrupts on hypertransport devices允许本地的hypertransport设备使用中断ISA support现在基本上没有ISA的设备了,如果你有就选吧MCA support微通道总线,老旧的IBM的台式机和笔记本上可能会有这种总线NatSemi SCx200 support在使用AMD Geode处理器的机器上才可能有PCCARD (PCMCIA/CardBus) supportPCMCIA卡(主要用于笔记本)支持Enable PCCARD debugging仅供调试16-bit PCMCIA support一些老的PCMCIA卡使用16位的CardBus32-bit CardBus support当前的PCMCIA卡基本上都是32位的CardBusCardBus yenta-compatible bridge support使用PCMCIA卡的基本上都需要选择这一项,子项请按照自己实际使用的PCMCIA卡选择{省略的部分请按照自己实际使用的PCMCIA卡选择} PCI Hotplug SupportPCI热插拔支持,如果你有这样的设备就到子项中去选吧Executable file formats可执行文件格式Kernel support for ELF binariesELF是开放平台下最常用的二进制文件格式,支持动态连接,支持不同的硬件平台.除非你知道自己在做什么,否则必选Kernel support for a.out and ECOFF binaries早期UNIX系统的可执行文件格式,目前已经被ELF格式取代Kernel support for MISC binaries允许插入二进制的封装层到内核中,使用Java,.NET,Python,Lisp等语言编写的程序时需要它Networking网络Networking options网络选项Network packet debugging在调试不合格的包时加上额外的附加信息,但在遇到Dos攻击时你可能会被日志淹没Packet socket这种Socket可以让应用程序(比如tcpdump,iptables)直接与网络设备通讯,而不通过内核中的其它中介协议Packet socket: mmapped IO让Packet socket驱动程序使用IO映射机制以使连接速度更快Unix domain sockets一种仅运行于本机上的效率高于TCP/IP的Socket,简称Unix socket.许多程序都使用它在操作系统内部进行进程间通信(IPC),比如X Window和syslogTransformatio n user configuratio n interface为IPsec(可在ip层加密)之类的工具提供XFRM用户配置接口支持Transformatio n sub po licy supportXFRM子策略支持,仅供开发者使用PF_KEY sockets用于可信任的密钥管理程序和操作系统内核内部的密钥管理进行通信,IPsec依赖于它TCP/IP networkingTCP/IP协议当然要选IP: multicasting群组广播,似乎与网格计算有关,仅在使用MBONE的时候才需要IP: advanced router高级路由,如果想做一个路由器就选吧IP: policy routing策略路由IP: equal cost multipath用于路由的基于目的地址的负载均衡IP: verbose route monitoring显示冗余的路由监控信息IP: kernel level autoconfiguratio n在内核启动时自动配置ip地址/路由表等,需要从网络启动的无盘工作站才需要这个东西IP: tunnelingIP隧道,将一个IP报文封装在另一个IP报文内的技术IP: GRE tunnels over IP基于IP的GRE(通用路由封装)隧道IP: multicast routing多重传播路由IP: ARP daemon support这东西尚处于试验阶段就已经被废弃了IP: TCP syncookie support抵抗SYN flood攻击的好东西,要启用它必须同时启用/proc文件系统和"Sysctl support",然后在系统启动并挂载了/proc之后执行"echo1 >/proc/sys/net/ipv4/tcp_syncookies"命令IP: AH transformatio nIPsec验证头(AH)实现了数据发送方的验证处理,可确保数据既对于未经验证的站点不可用也不能在路由过程中更改IP: ESP transformationIPsec封闭安全负载(ESP)实现了发送方的验证处理和数据加密处理,用以确保数据不会被拦截/查看或复制IP: IPComp transformationIPComp(IP静荷载压缩协议),用于支持IPsecIP: IPsec transport modeIPsec传输模式,常用于对等通信,用以提供内网安全.数据包经过了加密但IP头没有加密,因此任何标准设备或软件都可查看和使用IP头IP: IPsec tunnel modeIPsec隧道模式,用于提供外网安全(包括虚拟专用网络).整个数据包(数据头和负载)都已经过加密处理且分配有新的ESP头/IP头和验证尾,从而能够隐藏受保护站点的拓扑结构IP: IPsec BEET modeIPsec BEET模式INET: socket monitoring interfacesocket监视接口,一些Linux本地工具(如:包含ss的iproute2)需要使用它TCP: advanced congestio n control高级拥塞控制,如果没有特殊需求(比如无线网络)就别选了,内核会自动将默认的拥塞控制设为"Cubic"并将"Reno"作为候补IP: Virtual Server ConfigurationIP虚拟服务器允许你基于多台物理机器构建一台高性能的虚拟服务器,不玩集群就别选了The IPv6 protocol你要是需要IPv6就选吧NetLabel subsystem supportNetLabel子系统为诸如CIPSO与RIPSO之类能够在分组信息上添加标签的协议提供支持,如果你看不懂就别选了Security Marking对网络包进行安全标记,类似于nfmark,但主要是为安全目的而设计,如果你不明白的话就别选Network packet filtering (replaces ipchains)Netfilter可以对数据包进行过滤和修改,可以作为防火墙("packet filter"或"proxy-based")或网关(NAT)或代理(proxy)或网桥使用.选中此选项后必须将"Fast switching"关闭,否则将前功尽弃Network packet filtering debugging仅供开发者调试Netfilter使用Bridged IP/ARP packets filtering如果你希望使用一个针对桥接的防火墙就打开它Core Netfilter Configuration核心Netfilter配置(当包流过Chain时如果match某个规则那么将由该规则的target来处理,否则将由同一个Chain中的下一个规则进行匹配,若不match所有规则那么最终将由该Chain的policy进行处理)Netfilter netlink interface允许Netfilter在与用户空间通信时使用新的netlink接口.netlink Socket是Linux用户态与内核态交流的主要方法之一,且越来越被重视.Netfilter NFQUEUE over NFNETLINK interface通过NFNETLINK接口对包进行排队Netfilter LOG over NFNETLINK interface通过NFNETLINK接口对包记录.该选项废弃了ipt_ULOG和ebg_ulog机制,并打算在将来废弃基于syslog的ipt_LOG和ip6t_LOG模块Layer 3 Independent Connection tracking独立于第三层的链接跟踪,通过广义化的ip_conntrack支持其它非IP协议的第三层协议Netfilter Xtables support如果你打算使用ip_tables,ip6_tables,arp_tables之一就必须选上"CLASSIFY" target support允许为包设置优先级,一些排队规则(atm,cbq,dsmark,pfifo_fast,htb,prio)需要使用它"CONNMARK" target support类似于"MARK",但影响的是连接标记的值"DSCP" target support允许对ip包头部的DSCP(Differentiated Services Codepoint)字段进行修改,该字段常用于Qos"MARK" target support允许对包进行标记(通常配合ip命令使用),这样就可以改变路由策略或者被其它子系统用来改变其行为"NFQUEUE" target Support用于替代老旧的QUEUE(iptables内建的target之一),因为NFQUEUE能支持最多65535个队列,而QUEUE只能支持一个"NOTRACK" target support允许规则指定哪些包不进入链接跟踪/NAT子系统"SECMARK" target support允许对包进行安全标记,用于安全子系统"CONNSECMARK" target support针对链接进行安全标记,同时还会将连接上的标记还原到包上(如果链接中的包尚未进行安全标记),通常与SECMARK target联合使用"comment" match support允许你在iptables规则集中加入注释"connbytes" per-connection counter match support允许针对单个连接内部每个方向(进/出)匹配已经传送的字节数/包数"connmark" connection mark match support允许针对每个会话匹配先前由"CONNMARK"设置的标记值"conntrack" connection tracking match support连接跟踪匹配,是"state"的超集,它允许额外的链接跟踪信息,在需要设置一些复杂的规则(比如网关)时很有用"DCCP" protocol match supportDCCP是打算取代UDP的新传输协议,它在UDP的基础上增加了流控和拥塞控制机制,面向实时业务"DSCP" match support允许对IP包头的DSCP字段进行匹配"ESP" match support允许对IPSec包中的ESP头进行匹配,使用IPsec的话就选上吧"helper" match support加载特定协议的连接跟踪辅助模块,由该模块过滤所跟踪的连接类型的包,比如ip_conntrack_ftp模块"length" match support允许对包的长度进行匹配"limit" match support允许根据包的进出速率进行规则匹配,常和"LOG target"配合使用以抵抗某些Dos攻击"mac" address match support允许根据以太网的MAC进行匹配,常用于无线网络环境"mark" match support允许对先前由"MARK"标记的特定标记值进行匹配IPsec "policy" match support使用IPsec就选上吧Multiple port match support允许对TCP或UDP包同时匹配多个端口(通常情况下只能匹配一个端口)"physdev" match support允许对到达的或将要离开的物理桥端口进行匹配"pkttype" packet type match support允许对封包目的地址类别(广播/群播/直播)进行匹配"quota" match support允许对总字节数的限额值进行匹配"realm" match support允许对iptables中的路由子系统中的realm值进行匹配"sctp" protocol match support流控制传输协议(SCTP),十年以后也许能够普及的东西"state" match support这是对包进行分类的有力工具,它允许利用连接跟踪信息对连接中处于特定状态的包进行匹配"statistic" match support允许根据一个给定的百分率对包进行周期性的或随机性的匹配"string" match support允许根据包所承载的数据中包含的特定字符串进行匹配"tcpmss" match support允许根据TCP SYN包头中的MSS(最大分段长度)选项的值进行匹配IP: Netfilter Configuration针对IPv4的Netfilter配置Connection tracking (required for masq/NAT)链接跟踪.可用于报文伪装或地址转换,也可用于增强包过滤能力Connection tracking flow accounting允许针对每个连接记录已经传送的字节/包数,常用于connbytes matchConnection mark tracking support允许对连接进行标记,与针对单独的包进行标记的不同之处在于它是针对连接流的.CONNMARK target和connmark match需要它的支持Connection tracking security mark support允许对连接进行安全标记,通常这些标记包(SECMARK)复制到其所属连接(CONNSECMARK),再从连接复制到其关联的包(SECMARK)Connection tracking events连接跟踪事件支持.如果启用这个选项,连接跟踪代码将提供一个notifier链,它可以被其它内核代码用来获知连接跟踪状态的改变Connection tracking netlink interface支持基于netlink的用户空间接口SCTP protocol connection tracking supportSCTP是IP网面向多媒体通信的新一代的流控制传输协议FTP protocol supportFTP协议IRC protocol supportIRC协议是一种用来实时聊天协议,用过mIRC的人应当不陌生NetBIOS name service protocol supportNetBIOS名字服务协议TFTP protocol supportTFTP是基于UDP的比FTP简单的文件传输协议Amanda backup protocol supportAmanda备份协议PPTP protocol support点对点隧道协议(PPTP)是一种支持多协议虚拟专用网络的网络技术,ADSL用户对它应该很熟悉H.323 protocol supportITU-T提出的用于IP电话的协议SIP protocol supportIETE提出的用于IP电话的协议IP Userspace queueing via NETLINK已废弃IP tables support (required for filtering/masq/NAT)要用iptables就肯定要选上IP range match support允许对ip地址的范围进行匹配TOS match support允许对ip包头的TOS(Type Of Service)字段进行匹配recent match support可以创建一个或多个刚刚使用过的ip地址列表,然后根据这些列表进行匹配ECN match support允许对TCP/IP包头的ECN(Explicit Congestion Notification)字段进行匹配.ECN是一种显式拥塞通知技术,它不但要求路由器支持而且要求端到端主机的支持,其基本思想是当路由器发生早期拥塞时不是丢弃包而是尽量对包进行标记,接收方接到带有ECN提示的包时,通知发送方网络即将发生拥塞,也就是它通过对包的标记提示TCP源即将发生拥塞,从而引发拥塞避免算法AH match support允许对IPSec包头的AH字段进行匹配TTL match support允许对ip包头的TTL(生存期)字段进行匹配Owner match support允许对本地生成的包按照其宿主(user,group,process,session)进行匹配address type match support允许对地址类型(单播,本地,广播)进行匹配hashlimit match support是limit的升级,它基于你选择的ip地址与/或端口动态的创建以limit为桶(bucket)的哈希表.它可以创建诸如"为每个特定的目标IP分配10kpps"或"允许每个特定的源IP分配500pps"之类的规则Packet filtering定义filter表以允许对包进行过滤REJECT target support允许返回一个ICMP错误而不是简单的丢弃包LOG target support允许将符合条件的包头信息通过syslog进行记录ULOG target support透过netlink socket将符合条件的封包交给用户空间的ulogd守护进程.反对使用该选项,因为它已经被NETFILTER_NETLINK_LOG代替TCPMSS target support允许修改TCP包头中的MSS(最大分段长度)选项值Full NAT允许进行伪装/端口转发以及其它的NAT功能,仅在你需要使用iptables中的nat 表时才需要选择Packet mangling在iptables中启用mangle表以便对包进行各种修改,常用于改变包的路由raw table support (required for NOTRACK/TRACE)在iptables中添加一个'raw'表,该表在netfilter框架中非常靠前,并在PREROUTING和OUTPUT链上有钩子,从而可以对收到的数据包在连接跟踪前进行处理ARP tables supportARP表支持.只有在局域网中才有ARP欺骗问题,另外路由器也会遭到ARP欺骗ARP packet filteringARP包过滤.对于进入和离开本地的ARP包定义一个filter表,在桥接的情况下还可以应用于被转发ARP包ARP payload mangling允许对ARP包的荷载部分进行修改,比如修改源和目标物理地址IPv6: Netfilter Configuration针对IPv6的Netfilter配置,需要的话可以参考前面IPv4的Netfilter配置进行选择DECnet: Netfilter Configuratio n针对DECnet的Netfilter配置Bridge: Netfilter Configuration针对桥接的Netfilter配置DCCP Configuratio n数据报拥塞控制协议在UDP的基础上增加了流控和拥塞控制机制,使数据报协议能够更好地用于流媒体业务的传输SCTP Configuration流控制传输协议是一种新兴的传输层协议.TCP协议一次只能连接一个IP地址而在SCTP协议一次可以连接多个IP地址且可以自动平衡网络负载,一旦某一个IP 地址失效会自动将网络负载转移到其他IP地址上TIPC Configuration透明内部进程间通信协议,以共享内存为基础实现任务和资源的调度,专门用于内部集群通信Asynchronous Transfer Mode (ATM)异步传输模式(ATM)支持802.1d Ethernet Bridging802.1d以太网桥802.1Q VLAN Support802.1Q虚拟局域网DECnet SupportDECnet是一种很生僻的协议ANSI/IEEE 802.2 LLC type 2 Support看不懂可以不选The IPX protocolIPX协议Appletalk protocol support与Mac机器通信的协议CCITT X.25 Packet Layer大约没人需要这东西LAPB Data Link Driver大约没人需要这东西。
LINUX内核模块编译步骤编译Linux内核模块主要包括以下步骤:1.获取源代码2.配置内核进入源代码目录并运行make menuconfig命令来配置内核。
该命令会打开一个文本菜单,其中包含许多内核选项。
在这里,你可以配置内核以适应特定的硬件要求和预期的功能。
你可以选择启用或禁用各种功能、设备驱动程序和文件系统等。
配置完成后,保存并退出。
3. 编译内核(make)运行make命令开始编译内核。
这将根据你在上一步中进行的配置生成相应的Makefile,然后开始编译内核。
编译的过程可能需要一些时间,请耐心等待。
4.安装模块编译完成后,运行make modules_install命令将编译好的模块安装到系统中。
这些模块被安装在/lib/modules/<kernel-version>/目录下。
5.安装内核运行make install命令来安装编译好的内核。
该命令会将内核映像文件(通常位于/arch/<architecture>/boot/目录下)复制到/boot目录,并更新系统引导加载程序(如GRUB)的配置文件。
6.更新GRUB配置文件运行update-grub命令来更新GRUB引导加载程序的配置文件。
这将确保新安装的内核在下次启动时可用。
7.重启系统安装完成后,通过重启系统来加载新的内核和模块。
在系统启动时,GRUB将显示一个菜单,你可以选择要启动的内核版本。
8.加载和卸载内核模块现在,你可以使用insmod命令来加载内核模块。
例如,运行insmod hello.ko命令来加载名为hello.ko的模块。
加载的模块位于/lib/modules/<kernel-version>/目录下。
如果你想卸载一个已加载的内核模块,可以使用rmmod命令。
例如,运行rmmod hello命令来卸载已加载的hello模块。
9.编写和编译模块代码要编写一个内核模块,你需要创建一个C文件,包含必要的模块代码。
linux内核编译步骤对于linux新手来说,编译内核相对有一些难度,甚至不知道如何入手,现在我归纳了一下,写出这一篇还算比较详细的步骤,希望能对各位新手有一些帮助。
1、安装内核如果内核已经安装(/usr/src/目录有linux子目录),跳过如果没有安装,在光驱中放入linux安装光盘,找到kernel-source-2.xx.xx.rpm文件(xx代表数字,表示内核的版本号),比如RedHat linux的RPMS目录是/RedHat/RPMS/目录,然后使用命令rpm -ivh kernel-source-2.xx.xx.rpm安装内核如果没有安装盘,可以去各linux厂家站点或者下载。
2、清除从前编译内核时残留的.o 文件和不必要的关联cd /usr/src/linuxmake mrproper3、配置内核,修改相关参数,请参考其他资料在图形界面下,make xconfig;字符界面下,make menuconfig在内核配置菜单中正确设置个内核选项,保存退出4、正确设置关联文件make dep5、编译内核对于大内核(比如需要SCSI支持),make bzImage对于小内核,make zImage6、编译模块make modules7、安装模块make modules_install8、使用新内核把/usr/src/linux/arch/i386/boot/目录内新生成的内核文件bzImage/zImage拷贝到/boot目录,然后修改/etc/lilo.conf文件,加一个启动选项,使用新内核bzImage/zImage启动。
格式如下:boot=/dev/hdamap=/boot/mapinstall=/boot/boot.bprompttimeout=50lineardefault=linux-new ### 告诉lilo缺省使用新内核启动linux ###append="mem=256M"image=/boot/vmlinuz-2.2.14-5.0label=linuxread-onlyroot=/dev/hda5image=/boot/bzImage(zImage)label=linux-newread-onlyroot=/dev/hda5保留旧有的启动选项可以保证新内核不能引导的情况,还可以进入linux进行其他操作。
linux内核编译流程Linux内核编译流程一、概述Linux内核是操作系统的核心组件,负责管理计算机的硬件和软件资源,提供各种系统服务。
编译Linux内核是将源代码转换为可执行文件的过程,是定制和优化内核的重要手段。
本文将介绍Linux 内核的编译流程,帮助读者了解内核编译的基本步骤和注意事项。
二、准备工作在编译Linux内核之前,需要进行一些准备工作。
首先,确保系统中已经安装了必要的开发工具,如编译器、链接器等。
其次,获取Linux内核的源代码,可以从官方网站或镜像站点下载最新版本的源代码包。
解压源代码包后,进入源代码目录,即可开始编译。
三、配置内核在进行内核编译之前,需要对内核进行配置。
配置内核的目的是选择需要编译进内核的功能和驱动程序,以及设置相应的参数。
Linux 内核提供了多种配置工具,如make menuconfig、make xconfig 等。
这些工具提供了图形化或文本界面,方便用户进行配置。
通过这些工具,可以选择需要的功能和驱动,也可以设置调试选项和优化参数。
四、编译内核配置完成后,即可开始编译内核。
编译内核的过程是将源代码转换为可执行文件的过程,包括预处理、编译、汇编和链接等步骤。
在Linux内核中,使用make命令进行编译。
make命令会读取Makefile文件,根据其中的规则和依赖关系,自动执行相应的编译命令。
五、安装内核编译完成后,即可安装内核。
安装内核的目的是将编译生成的可执行文件和相关文件复制到系统的相应位置,使系统能够加载和运行新内核。
在Linux内核中,使用make install命令进行安装。
make install命令会将内核文件复制到/boot目录,并更新引导程序的配置文件,以使系统能够启动新内核。
六、配置引导程序安装完成后,需要配置引导程序,使系统能够加载和启动新内核。
引导程序是在计算机启动时运行的程序,负责加载操作系统内核并启动系统。
在Linux系统中,常用的引导程序有GRUB、LILO等。
内核编译的步骤内核编译是指将Linux内核源代码转换为可执行的二进制文件的过程。
本文将介绍内核编译的详细步骤,以帮助读者了解并掌握这一过程。
第一步:获取内核源代码要进行内核编译,首先需要获取Linux内核的源代码。
可以通过官方网站或开源社区下载最新版本的内核源代码,也可以从版本控制系统中获取。
第二步:配置内核在进行内核编译之前,需要对内核进行配置。
配置内核的目的是根据具体需求选择合适的功能和选项。
可以使用make menuconfig、make xconfig或make config等命令进行配置。
第三步:编译内核配置完成后,就可以开始编译内核了。
在终端中切换到内核源代码目录,并执行make命令。
编译过程可能需要一段时间,取决于计算机性能和内核源代码的大小。
第四步:安装内核编译完成后,可以将生成的内核安装到系统中。
可以使用make install命令或手动将编译生成的内核文件复制到/boot目录,并修改引导加载程序的配置文件。
第五步:更新引导加载程序安装完内核后,需要更新引导加载程序,使其能够启动新安装的内核。
可以使用grub2-mkconfig、grub-mkconfig、update-grub 等命令更新引导加载程序的配置文件。
第六步:重启系统完成内核编译和引导加载程序的配置后,需要重启系统以使新内核生效。
在重启过程中,选择新安装的内核并等待系统启动。
第七步:验证新内核系统重启后,可以通过执行uname -r命令来验证新内核是否成功安装。
如果显示的内核版本是刚刚安装的新内核版本,则说明内核编译成功。
第八步:配置内核模块除了编译内核本身,还可以编译和加载内核模块。
内核模块是一种动态加载的代码,可以在运行时添加或删除。
可以使用make modules和make modules_install命令编译和安装内核模块。
第九步:定制内核在掌握了基本的内核编译步骤后,还可以根据具体需求进行内核定制。
可以通过配置内核选项和功能来满足特定的需求,例如优化性能、减小内核体积等。
linux0.11汇编格式-回复Linux0.11汇编格式在计算机科学领域,汇编语言被用来与计算机硬件进行交互,并控制计算机的操作。
在Linux操作系统中,汇编语言是非常重要的一部分,特别是在早期的版本中,如Linux0.11。
本文将围绕Linux0.11的汇编格式展开,一步一步回答各种问题,并深入探讨该主题。
首先,我们需要了解Linux0.11是什么。
计算机科学家Linus Torvalds创造了Linux操作系统,并于1991年释放第一个版本。
这个版本被称为Linux0.01。
在其后的几年里,Torvalds继续开发Linux,维护其核心部分,并解决已知的问题和漏洞。
Linux0.11是在1991年10月份的版本,也是其中一个重要的更新版。
其次,Linux0.11的汇编格式是如何工作的?在Linux0.11中,主要的汇编语言使用了AT&T语法。
这是一种常用于UNIX和Linux系统的汇编格式。
AT&T语法与其他汇编格式的一个主要区别是,它将源操作数和目的操作数的位置颠倒了。
在AT&T语法中,汇编指令通常具有如下格式:指令目的操作数, 源操作数其中,“指令”是要执行的汇编指令的名称,“目的操作数”是指令的结果存储位置,“源操作数”是指定操作数的位置或值。
接下来,让我们深入探讨一些常用的汇编指令。
在Linux0.11中,有许多常用的汇编指令可以执行各种操作。
例如,`mov`指令用于将数据从一个位置复制到另一个位置。
`add`指令用于将两个操作数相加,并将结果存储到目标操作数中。
还有一些其他的指令,如`sub`、`mul`、`div`等,也在Linux0.11的汇编格式中得到广泛使用。
此外,了解内存寻址方式也是非常重要的。
在Linux0.11中,有多种内存寻址方式可供选择,包括直接寻址、寄存器间接寻址、寄存器相对寻址等。
这些寻址方式允许程序员直接访问内存中的数据,并进行相应的操作。
发布我的Linux 0.11实验室(带有gcc4下可编译的源码)/下载简介我发布的这个东东主要包含一个可以在gcc 4.1下可编译的linux-0.11的修改版的源码。
当前的Linux发型版大部分已经采用gcc 4.0以上的版本和linux 2.6的内核,而赵博士 ()提供的可以在RH9下面编译的源码只能工作于gcc版本3.x。
我在我的Debian Sid系统上对这个东东做了基本的测试,gcc 4.1是我系统的默认编译器。
任何一个比较新的Linux发型版,包括Fedora,Unbuntu等,应该都没有问题。
如果你的系统上安装的是其他版本的gcc,可以参考下面“使用其他gcc编译”小节。
如果你的Linux提供的默认编译器的仍然是gcc 3.x,或者你打算另外安装一个gcc 3.x仅仅为了满足能编译源码的要求,你可能就用不到这个东东了。
但是,除了内核源码之外,我还提供了一整套linux-0.11的实验环境,用于在linux环境下学习并且实验linux0.11的源代码。
因为我认为要想真正的学习Linux内核的精髓,还是得老老实实在Linux环境中进行学习。
而且在Windows下面,几乎就不可能编译Linux内核的源码。
如果你真的很想在Windows平台学习Linux也没有关系。
我还做了另外一个类似的东东可以在Windows平台直接学习Linux 0.11的源码。
只需要下载下面的链接并且解压到系统的某个地方就可以用:/upload/linux-0.11-lab_060616_004102.exe无论是Linux用户也好,Windows用户也好,如果你也是新学Linux,不太清楚怎么样修改并且编译内核源码,然后重启进入你修改后的内核这些基本操作,可以看看我做的一个Flash教程:/upload/linux-0.11.swf这个东东很大部门都是直接用了提供的资源做成的。
我只是根据自己的需求,综合了一些资源,做了个简单的定制。
非常感谢赵博士共享这些资料,并且希望我的东东能对大家有点用处。
谢谢支持。
你可以访问这个链接报bug和给这个东东提一些建议。
我其实也是刚学Linux内核的菜鸟。
运行前提你的系统中需要预先安装mtools和bochs。
如果你用基于Debian的发型版,可以运行:apt-get install bochs bochs-x mtools如果你的系统是基于RPM的,可以试试:yum install bochs mtools或者直接运行bochs和mdir这两个命令,如果都有就说明你的系统中已经安装了这两款软件。
为了编译内核源码,当然你的系统中还必须装有gcc和make等基本软件,如果是Debian,可以运行: apt-get install build-essentials bin86安装解压这个文件都可以了:tar xjf linux-0.11-lab_060616_005627.tar.bz2然后在本目录下应该会出现一个名为 linux-0.11 的新目录。
工作流程使用这个东东的工作过程很简单,首先编译内核,然后安装内核,最后在bochs中运行内核。
假设你已经进入linux-0.11这个目录,首先运行:cd source/linuxmake cleanmakecd ../../将在source/linux目录下生成新的内核文件Image。
然后运行:./mcopy_kernel source/linux/Image bootimage-new可以将Image文件拷贝到一个装了grub的启动软盘上。
这个命令将在磁盘的/boot目录下建立bootimage-new这个文件,值得指出的是,如果用这个命令,所有的都会被拷贝到软盘的/boot目录下。
然后你可以运行./edit_menu.lst来编辑grub的配置文件,这样启动是就可以在grub菜单中显示新内核的启动项。
配置文件语法很简单。
比如说你可以在menu.lst最后加上以下四行:title Linux 0.11 compiled by gcc 4.1root (fd0)kernel /boot/bootimage-newboot最后可以运行:./linux-0.11来启动bochs虚拟机。
如果没有别的问题,你应该可以看到grub启动菜单,这时候选择你刚刚创建的菜单项就可以进入新的内核。
另外,如果你不想在自身的Linux环境下编译源码也可以,因为你可以在虚拟机中的linux-0.11环境中编译linux-0.11的源码。
如果你决定这样做,可以看我的作的flash教程。
目录结构source/linux/这个目录下有我修改的源码linux-0.11-040327-rh9.tar.gz这个是提供的在RH9下编译的原始代码linux-0.11-040327-rh9.diff.gz这是提供的为了能在RH9下编译提供的差异文件linux-0.11-060617-gcc4-diff.gz这是我基于rh9版本作出的修改,基本上都是为了编译通过作出的很简单的修改。
但是有一处修改并不那么直观,可以参考我写的这篇文章conf/这个目录下有配置文件images/这个目录下包含虚拟机需要的软盘和硬盘镜像文件。
硬盘镜像文件是提供的包含完整Linux开发环境的硬盘镜像。
还有一张grub启动软盘,你可以将新的内核文件拷贝到这张软盘中。
bak/每次运行 ./edit_menu.lst 和 ./mcopy_kernel 都会备份当前的grub启动盘到 bak 目录中。
必要的时候可以从这个目录下恢复。
使用其他版本的gcc编译使用其他版本的gcc来编译也是可以的,gcc-4.0应该可以编译。
而且如果你用的系统非常非常老,还在使用gcc-2.95,经过我的测试,也可以支持。
但如果你的默认版本的gcc是3.x,其实你不需要使用我修改的版本,使用最初赵炯博士提供的rh9版本就可以。
这个包里也包含了这个文件如果你实在是想用gcc-3.3编译我的版本,也行,只不过需要首先将源码目录中的`mm/Makefile’替换为`mm/Makefile-gcc3.x’。
原始的`mm/Makefile’也有其备份`mm/Makefile-gcc-4.1′,必要时可以恢复。
一定记得覆盖,不然在编译的时候不会出现任何问题,但是编译出来的内核镜像将无法启动。
已知问题1. 我的内核无法挂接软盘上的rootdisk是的,如果你和我一样,使用当前的2.2.6版本的bochs,而且是直接把编译出来的Image文件做为a盘启动,就有可能出现问题。
如果你肯定的确在b盘放入了rootimage文件的话,我也不知道为什么会这样。
但是如果使用grub来引导信的Image文件,就完全不会出现这个问题。
我的猜测是grub在引导Image之前对软驱做了一些必要的初始化操作,而Linux0.11没有做。
2. 我的内核启动是只能用软盘b做为根分区是的,这是默认的启动设备。
你可以使用rdev命令改变一个磁盘镜像的启动设备(必须su到root来执行这个操作)rdev source/linux/Image /dev/hda1修改完之后使用 ./mcopy_kernel 将新的镜像复制到grub盘上。
(令我非常惊奇的是rdev竟然可以修改linux 0.11这么古老的版本。
这兼容性太好了) 3. 我的内核镜像虽然已经启动了,但是好多命令不能正确执行,总是出错说`not owner`是的。
如果你已经改用硬盘root image,可以简单解决这个文件,首先备份一下 /bin/sh,然后将/bin/sh0覆盖/bin/sh,重启系统之后就应该正常了。
至于为什么,可以进一步参考一下论坛上的这篇文章Technorati Tags: linux, 内核, kernel, 开发Add comment Jun 18, '06, 04:00am quinn.liqinRelease My Linux 0.11 Lab with modified gcc4 compatible source codedownload itIntroductionThis package contains a modified version of linux-0.11 to be compiledunder modern linux distribution with gcc-4.1 and linux kernel 2.6.Because original modified version provided by Dr. Zhao from will only work under gcc-3.xIt is tested in my Debian Sid box with gcc-4.1 as the default gcccompiler. Any other up-to-date distributions like FC, Ubuntu should alsowork. Other gcc version should also work, please see section `use otherversion of gcc’But if your default compiler is gcc-3.x or you choose to install gcc-3.xonly to satisfy the code, you might not need this package. But otherthan the source code, I also provide a complete linux-0.11 laboratary tobe used under linux, NOT windows. Because I believe no one can actuallylearn any thing about linux without really work with linux. And it’snearly impossible to compile linux source code under windows.If you use windows and really want to learn linux-0.11 under windows.That’s ok too, I provided another package for windows users, all youhave to do is to download and extract the files into you system and run.Here:/upload/linux-0.11-lab_060616_004102.exeFor both linux and windows users, if you are new to linux, and don’tknow how to actually changed the source code of linux-0.11 and reboot tosee the new feature, I’ve made a flash tutorial to demonstrate someessential operations:/upload/linux-0.11.swfMy work is heavily based on many materials provided by .What I have done for this package is only some customization to meetmy own requirement to learn linux. Many many thanks Dr. Zhao for hisdedicated work, and hope mine would be useful to you too. Thanks.You can go to this page to report bugs andcomments on this package. I’m a linux kernel rookie . PrerequistionYou have to install bochs and mtools in you linux system first. For Debian based distributions:apt-get install bochs bochs-x mtoolsis enough, for RPM based distributions, try:yum install bochs mtoolsIn order to build linux kernel code, you must have gcc and makeinstalled in your system. For Debian, you can run:apt-get install build-essentials bin86InstallationJust untar the package:tar xjf linux-0.11-lab_060618_005627.tar.bz2then you will see new linux-0.11 directory under current working directory.Working FlowThe working flow is really simple, build the kernel, install the kernel, and then run the kernel in bochs.Assumes you are in linux-0.11 directory,cd source/linuxmake cleanmakecd ../../will create a new file `Image’ in source/linux directory, then./mcopy_kernel source/linux/Image bootimage-newwill copy Image file into a bootable floppy disk with grub installed.you can find a new image file named /boot/bootimage-new in that disk. Note that all image will be copied to /boot directory if you use this command.Then you can run./edit_menu.lstto edit the configuration of grub to add new item for you kernel in grub menu. The grammer it’s really simple.You can add following 4 lines at the end of menu.lst:title Linux 0.11 compiled by gcc 4.1root (fd0)kernel /boot/bootimage-newbootAt last you can run./linux-0.11to start bochs virtual machine, If no problem occurs, you will see the grub menu. Choose the newly created item to test your modification.If you don’t want to build linux-0.11 code in your system, you can still build linux-0.11 inside bochs vm. If you choose to work this way, myflash is recommended./upload/linux-0.11.swfDirectoriessource/linux/this is my modified versionlinux-0.11-040327-rh9.tar.gzthis is original code provided by Dr. Zhaolinux-0.11-040327-rh9.diff.gzthis is original diff file to compile under RH9linux-0.11-060617-gcc4-diff.gzthis is my modification, most of them are trivial ones justto please gcc, except for one. Please refer to: (in chinese)/blog/archives/50conf/configuration filesimages/floppy disk and hard disk images to be used in bochs. The hard diskis provided by with full linux develop envirment.One of the floppy disks is a grub disk, you can copy your new kernel Image into this floppy disk.bak/Your grub disk image is backuped here every time you use./edit_menu.lst or ./mcopy_kernel incase you want to restore it some times.Use other versions of gccVersions other than gcc-4.1 are also supported, gcc-4.0 should works without problem, and if you have an old enough distribution withgcc-2.95, congratulations to you, it is also supported.But if you have gcc-3.x as your default gcc version, you don’t have to use my modification at all, just use the original one provided by Dr. Zhao. I also included his version in the package for convenience.If you really want to use my modification to compile under gcc-3.x,that’s ok too, just overwrite `mm/Makefile’ with `mm/Makefile-gcc3.x’. The original `mm/Makefile’ have a backup `mm/Makefile-gcc-4.1′. Do REMEMDER this because you won’t face any error if you compile the code without overwrite `mm/Makefile’, but you won’t be able to boot your system with your newly compiled Image.Known Problems1. My kernel Image won’t mount floppy rootdisk.Yes, if you use current version(2.2.6) of bochs and mount you newImage as floppy disk a directly, this problem may occur, and I don’t know why if you are sure you’v inserted the rootimage in bochs floppy B.But if you use grub to load your kernel Image as shown in this file,you may not face this problem at all. I don’t know why but my guesss is that grub did some thing to configure the floppy drive which linux 0.11 did not do.2. My kernel image will only mount floppy b.Yes, it’s the default root device. You can use rdev (must be root user to execute rdev) to change the root device for a image.rdev source/linux/Image /dev/hda1And then use ./mcopy_kernel to overwrite the original ones.(It’s amazing rdev can still work with linux 0.11. Really goodbackward compatibility!)3. My kernel image is booted, but a lot of command won’t work, and the error is `not owner`Yes. If you use hard disk root image, you have a simple solution tothis problem. Backup /bin/sh first, and overwrite it with /bin/sh0.It should be ok after reboot.If you want to understand why, please see hereTechnorati Tags: linux, kernelAdd comment Jun 18, '06, 03:44am quinn.liqin尝试用高版本 gcc 编译 0.11 源码出问题用的代码是 Oldlinux 论坛上发布的可以在 Redhat 9 下面编译通过的源码。