C语言 为什么Linux内核包含重复的代码?



所以我在Linux内核(v 2.6.9)周围寻找,我发现i386和x86_64体系结构的引导扇区代码具有相同的代码。但是编程的黄金法则不就是让你的代码DRY(不要写重复的代码)吗?那么,为什么Linux维护者不直接重用这个文件,而是复制粘贴它呢?我试图学习好的和干净的代码,这让我困惑。我的意思是,如果两个体系结构共享相同的引导代码-只是重用它?

在Linux源代码中,这两个文件完全相同。

/arch/i386/boot/bootsect.S/arch/x86_64/boot/bootsect.S

/*
*  bootsect.S      Copyright (C) 1991, 1992 Linus Torvalds
*
*  modified by Drew Eckhardt
*  modified by Bruce Evans (bde)
*  modified by Chris Noe (May 1999) (as86 -> gas)
*  gutted by H. Peter Anvin (Jan 2003)
*
* BIG FAT NOTE: We're in real mode using 64k segments.  Therefore segment
* addresses must be multiplied by 16 to obtain their respective linear
* addresses. To avoid confusion, linear addresses are written using leading
* hex while segment addresses are written as segment:offset.
*
*/
#include <asm/boot.h>
SETUPSECTS  = 4         /* default nr of setup-sectors */
BOOTSEG     = 0x07C0        /* original address of boot-sector */
INITSEG     = DEF_INITSEG       /* we move boot here - out of the way */
SETUPSEG    = DEF_SETUPSEG      /* setup starts here */
SYSSEG      = DEF_SYSSEG        /* system loaded at 0x10000 (65536) */
SYSSIZE     = DEF_SYSSIZE       /* system size: # of 16-byte clicks */
/* to be loaded */
ROOT_DEV    = 0             /* ROOT_DEV is now written by "build" */
SWAP_DEV    = 0         /* SWAP_DEV is now written by "build" */
#ifndef SVGA_MODE
#define SVGA_MODE ASK_VGA
#endif
#ifndef RAMDISK
#define RAMDISK 0
#endif
#ifndef ROOT_RDONLY
#define ROOT_RDONLY 1
#endif
.code16
.text
.global _start
_start:
# Normalize the start address
jmpl    $BOOTSEG, $start2
start2:
movw    %cs, %ax
movw    %ax, %ds
movw    %ax, %es
movw    %ax, %ss
movw    $0x7c00, %sp
sti
cld
movw    $bugger_off_msg, %si
msg_loop:
lodsb
andb    %al, %al
jz  die
movb    $0xe, %ah
movw    $7, %bx
int $0x10
jmp msg_loop
die:
# Allow the user to press a key, then reboot
xorw    %ax, %ax
int $0x16
int $0x19

# int 0x19 should never return.  In case it does anyway,
# invoke the BIOS reset code...
ljmp    $0xf000,$0xfff0

bugger_off_msg:
.ascii  "Direct booting from floppy is no longer supported.rn"
.ascii  "Please use a boot loader program instead.rn"
.ascii  "n"
.ascii  "Remove disk and press any key to reboot . . .rn"
.byte   0

# Kernel attributes; used by setup
.org 497
setup_sects:    .byte SETUPSECTS
root_flags: .word ROOT_RDONLY
syssize:    .word SYSSIZE
swap_dev:   .word SWAP_DEV
ram_size:   .word RAMDISK
vid_mode:   .word SVGA_MODE
root_dev:   .word ROOT_DEV
boot_flag:  .word 0xAA55

32位x86 (i386)和64位x86 (x86-64)确实有一些共性,例如引导到完全相同的环境,并且x86处理器在传统的16位实模式下。

内核开发人员也没有注意到这两者之间的重复,例如,请参阅LWN的这篇文章(来自2007年):i386和x86_64: back together?(2.6.9似乎是从2004年左右开始的,所以现在已经超过16岁了。)

@IanAbbott在评论中提到,这两个加入/arch/x86最终发生在2.6.24(发布于2008年1月,大约13年前)。

最新更新