Linux1.0源代码编译过程

根据源代码包中的readme文件及http://chfj007.blog.163.com/blog/static/173145044201191195856806/?suggestedreading&wumii文章编译成功。

下面我们开始编译内核的工作,首先将从网上下载的内核放到CentOS 6.3的 /usr/src目录下,然后执行下面的操作:

cd /usr/src
tar xzvf linux-1.0.tar.gz

cd /usr/include
mv linux linux-CentOS
mv asm asm-CentOS
ln -s /usr/src/linux/include/linux .
ln -s /usr/src/linux/include/asm .

----------------------------------------------------------------------------------------------------------------------------------------------------

第一步
[root@localhost linux]# make config
/bin/sh Configure  < config.in
*
* General setup
*
Kernel math emulation (CONFIG_MATH_EMULATION) [y] 
Normal harddisk support (CONFIG_BLK_DEV_HD) [y] 
XT harddisk support (CONFIG_BLK_DEV_XD) [n] 
TCP/IP networking (CONFIG_INET) [y] 
Limit memory to low 16MB (CONFIG_MAX_16M) [n] 
System V IPC (CONFIG_SYSVIPC) [y] 
Use -m486 flag for 486-specific optimizations (CONFIG_M486) [y] 
*
* Program binary formats
*
Elf executables (CONFIG_BINFMT_ELF) [y] 
COFF executables (CONFIG_BINFMT_COFF) [y] 
*
* SCSI support
*
SCSI support? (CONFIG_SCSI) [n] 
:
: Skipping SCSI configuration options...
:
*
* Network device support
*
Network device support? (CONFIG_ETHERCARDS) [y] 
SLIP (serial line) support (CONFIG_SLIP) [n] 
PLIP (parallel port) support (CONFIG_PLIP) [n] 
NE2000/NE1000 support (CONFIG_NE2000) [n] 
WD80*3 support (CONFIG_WD80x3) [y] 
SMC Ultra support (CONFIG_ULTRA) [n] 
3c501 support (CONFIG_EL1) [n] 
3c503 support (CONFIG_EL2) [n] 
3c509/3c579 support (CONFIG_EL3) [n] 
HP PCLAN support (CONFIG_HPLAN) [n] 
AT1500 and NE2100 (LANCE and PCnet-ISA) support (CONFIG_LANCE) [n] 
AT1700 support (CONFIG_AT1700) [n] 
DEPCA support (CONFIG_DEPCA) [n] 
D-Link DE600 pocket adaptor support (CONFIG_DE600) [n] 
AT-LAN-TEC/RealTek pocket adaptor support (CONFIG_ATP) [n] y
*
Sony CDU31A CDROM driver support (CONFIG_CDU31A) [n] 
Mitsumi CDROM driver support (CONFIG_MCD) [n] 
Matsushita/Panasonic CDROM driver support (CONFIG_SBPCD) [n] 
*
* Filesystems
*
Standard (minix) fs support (CONFIG_MINIX_FS) [y] 
Extended fs support (CONFIG_EXT_FS) [y] 
Second extended fs support (CONFIG_EXT2_FS) [y] 
xiafs filesystem support (CONFIG_XIA_FS) [n] 
msdos fs support (CONFIG_MSDOS_FS) [y] 
/proc filesystem support (CONFIG_PROC_FS) [y] 
NFS filesystem support (CONFIG_NFS_FS) [y] 
ISO9660 cdrom filesystem support (CONFIG_ISO9660_FS) [n] 
OS/2 HPFS filesystem support (read only) (CONFIG_HPFS_FS) [n] 
System V and Coherent filesystem support (CONFIG_SYSV_FS) [n] 
*
*  character devices
*
Parallel printer support (CONFIG_PRINTER) [n] 
Logitech busmouse support (CONFIG_BUSMOUSE) [n] 
PS/2 mouse (aka "auxiliary device") support (CONFIG_PSMOUSE) [y] 
C&T 82C710 mouse port support (as on TI Travelmate) (CONFIG_82C710_MOUSE) [y] 
Microsoft busmouse support (CONFIG_MS_BUSMOUSE) [n] 
ATIXL busmouse support (CONFIG_ATIXL_BUSMOUSE) [n] 
Selection (cut and paste for virtual consoles) (CONFIG_SELECTION) [n] 
QIC-02 tape support (CONFIG_TAPE_QIC02) [n] 
QIC-117 tape support (CONFIG_FTAPE) [n] 
*
* Sound
*
Sound card support (CONFIG_SOUND) [n] 
*
* Kernel hacking
*
Kernel profiling support (CONFIG_PROFILE) [n]

The linux kernel is now hopefully configured for your setup.
Check the top-level Makefile for additional configuration,
and do a ‘make dep ; make clean‘ if you want to be sure all
the files are correctly re-made

mv .tmpconfig .config

----------------------------------------------------------------------------------------------------------------------------------------------------

第二步
[root@localhost linux]# make dep
gcc -D__KERNEL__ -E -M tty_io.c console.c keyboard.c serial.c tty_ioctl.c pty.c vt.c mem.c defkeymap.c psaux.c mouse.c > .depend
serial.c:538:8: 错误:宏名必须是标识符

解决办法:
cd /usr/src/linux/drivers/char
vi serial.c
第538行,修改为这样
//#ifdef 0
#if 0

[root@localhost linux]# make dep
make[2]: 进入目录“/usr/src/linux/drivers/net”
gcc -D__KERNEL__ -E -I../../net/inet -M *.c > .depend
/usr/include/bits/socket.h:381:24: 致命错误:asm/socket.h:没有那个文件或目录
编译中断。

解决办法:
cd /usr/src/linux/include/asm
ls
可以看到此目录下没有socket.h文件

cd /usr/include/bits
cp socket.h socket.h.bak-fedor15
vi socket.h 
第381行,注释掉
//#include <asm/socket.h>

 

[root@localhost linux]# make dep
make[1]: 进入目录“/usr/src/linux/fs”
gcc -D__KERNEL__ -E -M *.c > .depend
buffer.c:108:8: 错误:宏名必须是标识符

解决办法:
cd /usr/src/linux/fs
vi buffer.c
第108行,修改
//#ifdef 0 /* Disable bad-block debugging code */
#if 0 /* Disable bad-block debugging code */

 

[root@localhost linux]# make dep
......
gcc -D__KERNEL__ -E -M *.c > .depend
make[1]: 离开目录“/usr/src/linux/lib”
rm -f tools/version.h
mv .tmpdepend .depend

这步执行成功!

 

------------------------------------------------------------------------------------------------------------------
第三步
[root@localhost linux]# make zImage
gcc -D__KERNEL__ -E -traditional -DSVGA_MODE=NORMAL_VGA  boot/bootsect.S -o boot/bootsect.s
as86 -0 -a -o boot/bootsect.o boot/bootsect.s
make: as86:命令未找到
make: *** [boot/bootsect.o] 错误 127

解决办法:
yum install dev86* (请确定网络是通的)

 

[root@localhost linux]# make zImage
gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -m486  -c -o init/main.o init/main.c
cc1: 错误:unrecognized command line option ‘-m486’
make: *** [init/main.o] 错误 1

解决办法:
cd /usr/src/linux
vi Makefile 
注释掉
#ifdef CONFIG_M486
#CFLAGS := $(CFLAGS) -m486
#else
#CFLAGS := $(CFLAGS) -m386
#endif
或者修改为
ifdef CONFIG_M486
CFLAGS := $(CFLAGS) -march=i486
else
CFLAGS := $(CFLAGS) -march=i386
endif

 

[root@localhost linux]# make zImage
gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe  -c -o init/main.o init/main.c
init/main.c: 在函数‘get_options’中:
/usr/include/linux/string.h:130:1: 错误:can’t find a register in class ‘SIREG’ while reloading ‘asm’
/usr/include/linux/string.h:130:1: 错误:‘asm’操作数中有不可能的约束
make: *** [init/main.o] 错误 1

解决办法:
vi /usr/include/linux/string.h
第130行的 strchr函数,修改为这样
extern inline char * strchr(const char * s,char c)
{
register char * __res __asm__("ax");
__asm__("cld\n\t"
        "movb %%al,%%ah\n"
        "1:\tlodsb\n\t"
        "cmpb %%ah,%%al\n\t"
        "je 2f\n\t"
        "testb %%al,%%al\n\t"
        "jne 1b\n\t"
        "movl $1,%1\n"
        "2:\tmovl %1,%0\n\t"
        "decl %0"
        :"=a" (__res):"S" (s),"0" (c));
        //:"=a" (__res):"S" (s),"0" (c):"si");
return __res;
}

这类错误是由于gcc的进化,导致现在版本的gcc已经不需要指定如最后一个:"si" 这样的寄存器了.

[root@localhost linux]# make zImage
gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe  -c -o init/main.o init/main.c
init/main.c: 在函数‘checksetup’中:
/usr/include/linux/string.h:266:1: 错误:can’t find a register in class ‘DIREG’ while reloading ‘asm’
/usr/include/linux/string.h:109:1: 错误:can’t find a register in class ‘CREG’ while reloading ‘asm’
/usr/include/linux/string.h:266:1: 错误:‘asm’操作数中有不可能的约束
/usr/include/linux/string.h:109:1: 错误:‘asm’操作数中有不可能的约束
make: *** [init/main.o] 错误 1

解决办法:
vi /usr/include/linux/string.h
第109行的 strncmp; 第266行的strlen 

 

[root@localhost linux]# make zImage
gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe  -c -o init/main.o init/main.c
init/main.c:357:2: 错误:can’t find a register in class ‘AREG’ while reloading ‘asm’
/usr/include/linux/string.h:382:1: 错误:can’t find a register in class ‘CREG’ while reloading ‘asm’
/usr/include/linux/string.h:90:1: 错误:can’t find a register in class ‘SIREG’ while reloading ‘asm’
/usr/include/linux/delay.h:14:2: 错误:can’t find a register in class ‘AREG’ while reloading ‘asm’
init/main.c:238:4: 错误:can’t find a register in class ‘DREG’ while reloading ‘asm’
init/main.c:357:2: 错误:‘asm’操作数中有不可能的约束

解决办法:
vi /usr/include/linux/string.h
第90行的 strcmp,修改; 第382行的 memcmp,修改
vi /usr/include/linux/delay.h
第14行的 memcmp,修改

 

init/main.c:357:2: 错误:can’t find a register in class ‘AREG’ while reloading ‘asm’
init/main.c:238:4: 错误:can’t find a register in class ‘DREG’ while reloading ‘asm’
解决办法:
vi /usr/src/linux/init/main.c
第238行,修改         
vi /usr/src/linux/include/asm/system.h
第55行的_set_gate,修改

 

[root@localhost linux]# make zImage
make[1]: 进入目录“/usr/src/linux/kernel”
gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe  -fno-omit-frame-pointer -c sched.c
In file included from sched.c:35:0:
/usr/include/linux/timex.h:120:32: 错误:‘xtime’的类型限定冲突
/usr/include/linux/sched.h:308:23: 附注:‘xtime’的上一个声明在此
sched.c:41:25: 错误:‘xtime’的类型限定冲突
/usr/include/linux/sched.h:308:23: 附注:‘xtime’的上一个声明在此

gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe  -fno-omit-frame-pointer -c sched.c
In file included from sched.c:35:0:
/usr/include/linux/timex.h:120:32: error: conflicting type qualifiers for ‘xtime‘
/usr/include/linux/sched.h:308:23: note: previous declaration of ‘xtime‘ was here
sched.c:41:25: error: conflicting type qualifiers for ‘xtime‘
/usr/include/linux/sched.h:308:23: note: previous declaration of ‘xtime‘ was here

解决办法:
vi /usr/include/linux/sched.h
第308行的_set_gate,修改为这样
//extern struct timeval xtime;
extern volatile struct timeval xtime;
保持和/usr/include/linux/timex.h中的xtime声明一致

 

[root@localhost linux]# make zImage
make[1]: 进入目录“/usr/src/linux/kernel”
gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe  -fno-omit-frame-pointer -c sched.c
sched.c: 在函数‘schedule’中:
sched.c:285:2: 错误:can’t find a register in class ‘CREG’ while reloading ‘asm’
sched.c:285:2: 错误:‘asm’操作数中有不可能的约束
解决办法:
vi /usr/include/linux/sched.h
第357行的switch_to,修改

 

gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -c sys.c
sys.c: 在函数‘save_v86_state’中:
/usr/include/asm/segment.h:108:4: 错误:can’t find a register in class ‘CREG’ while reloading ‘asm’
/usr/include/asm/segment.h:108:4: 错误:‘asm’操作数中有不可能的约束
解决办法:
vi /usr/src/linux/include/asm/segment.h
第90行的COMMON,修改

 

gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -c sys.c
sys.c: 在函数‘sys_vm86’中:
/usr/include/asm/segment.h:169:4: 错误:can’t find a register in class ‘CREG’ while reloading ‘asm’
/usr/include/asm/segment.h:169:4: 错误:‘asm’操作数中有不可能的约束
解决办法:
vi /usr/src/linux/include/asm/segment.h
第158行的COMMON,修改

 

gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -c sys.c
sys.c: 在函数‘getrusage’中:
/usr/include/linux/string.h:422:1: 错误:can’t find a register in class ‘CREG’ while reloading ‘asm’
/usr/include/linux/string.h:422:1: 错误:‘asm’操作数中有不可能的约束

解决办法:
vi /usr/include/linux/string.h
第422行的memset

 

gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -c module.c
module.c: 在函数‘sys_get_kernel_syms’中:
/usr/include/linux/string.h:36:1: 错误:can’t find a register in class ‘CREG’ while reloading ‘asm’
/usr/include/asm/segment.h:109:4: 错误:‘asm’操作数中有不可能的约束
解决办法:
vi /usr/include/linux/string.h
第36行的strncpy

 

gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -c module.c
module.c: 在函数‘sys_init_module’中:
/usr/include/asm/segment.h:126:1: 错误:can’t find a register in class ‘CREG’ while reloading ‘asm’
解决办法:
vi /usr/src/linux/include/asm/segment.h
第126行的__generic_memcpy_fromfs

 

gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -c ldt.c
ldt.c: 在函数‘sys_modify_ldt’中:
/usr/include/asm/segment.h:57:1: 错误:can’t find a register in class ‘CREG’ while reloading ‘asm’
/usr/include/asm/segment.h:57:1: 错误:‘asm’操作数中有不可能的约束
解决办法:
vi /usr/src/linux/include/asm/segment.h
第57行的__generic_memcpy_tofs

 

make[1]: 进入目录“/usr/src/linux/kernel”
gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -c time.c
time.c:33:23: 错误:‘xtime’的类型限定冲突
/usr/include/linux/timex.h:120:32: 附注:‘xtime’的上一个声明在此
/usr/include/linux/timex.h:120:32: error: conflicting type qualifiers for ‘xtime‘
/usr/include/linux/sched.h:308:23: note: previous declaration of ‘xtime‘ was here
sched.c:41:25: error: conflicting type qualifiers for ‘xtime‘
解决办法:
vi /usr/src/linux/kernel/time.c
第33行,修改为这样
//extern struct timeval xtime;
extern volatile struct timeval xtime;
保持和/usr/include/linux/timex.h中的xtime声明一致

 

gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -c floppy.c
floppy.c: 在函数‘setup_DMA’中:
floppy.c:440:16: 警告:variable ‘dma_code’ set but not used [-Wunused-but-set-variable]
floppy.c:460:4: 错误:can’t find a register in class ‘CREG’ while reloading ‘asm’
floppy.c:460:4: 错误:‘asm’操作数中有不可能的约束
解决办法:
vi /usr/src/linux/drivers/block/floppy.c
第431行的copy_buffer


gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -c tty_io.c
tty_io.c: 在函数‘tty_open’中:
/usr/include/linux/mm.h:98:3: 错误:can’t find a register in class ‘CREG’ while reloading ‘asm’
/usr/include/linux/mm.h:98:3: 错误:can’t find a register in class ‘CREG’ while reloading ‘asm’
解决办法:
vi /usr/include/linux/mm.h
第98行的get_free_page


gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -c console.c
console.c:567:2: 错误:can’t find a register in class ‘CREG’ while reloading ‘asm’
console.c:567:2: 错误:‘asm’操作数中有不可能的约束
解决办法:
vi /usr/src/linux/drivers/char/console.c
第567行


gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -c console.c
console.c: 在函数‘scrdown.part.0’中:
console.c:479:2: 错误:can’t find a register in class ‘AREG’ while reloading ‘asm’
console.c:479:2: 错误:‘asm’操作数中有不可能的约束
解决办法:
vi /usr/src/linux/drivers/char/console.c
第479行scrdown


gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -c console.c
console.c: 在函数‘scrup.part.2’中:
console.c:460:3: 错误:can’t find a register in class ‘CREG’ while reloading ‘asm’
解决办法:
vi /usr/src/linux/drivers/char/console.c
第433,449,460行的scrup


gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -c console.c
console.c: 在函数‘blank_screen’中:
console.c:1340:1: 错误:can’t find a register in class ‘CREG’ while reloading ‘asm’
/usr/include/asm/io.h:82:387: 错误:‘asm’操作数中有不可能的约束
解决办法:
vi /usr/src/linux/drivers/char/console.c
第1340行memsetw

 

console.c: 在函数‘con_write’中:
console.c:603:2: 错误:can’t find a register in class ‘CREG’ while reloading ‘asm’
console.c:603:2: 错误:‘asm’操作数中有不可能的约束
解决办法:
vi /usr/src/linux/drivers/char/console.c
第603行

 

gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -c vt.c
vt.c: 在函数‘vt_ioctl’中:
/usr/include/linux/string.h:375:1: 错误:can’t find a register in class ‘CREG’ while reloading ‘asm’
/usr/include/linux/string.h:271:1: 错误:‘asm’操作数中有不可能的约束
解决办法:
vi /usr/include/linux/string.h
第375行

 

make[2]: 进入目录“/usr/src/linux/drivers/FPU-emu”
gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -DPARANOID  -fno-builtin  -c fpu_entry.c
In file included from fpu_entry.c:30:0:
fpu_proto.h:68:13: 附注:需要类型‘long unsigned int *’,但实参的类型为‘long int *’
fpu_entry.c:473:48: 错误:赋值运算的左操作数必须是左值
fpu_entry.c:473:48: error: lvalue required as left operand of assignment
解决办法:
vi /usr/src/linux/drivers/FPU-emu/fpu_system.h
第64行,修改为这样
//#define FPU_data_address        ((void *)(I387.soft.twd))
#define FPU_data_address        ((I387.soft.twd))
vi /usr/include/linux/sched.h
第375行的,修改为这样
struct i387_soft_struct {
        long    cwd;
        long    swd;
        //long  twd;
        void*   twd;
        long    fip;
        long    fcs;
        long    foo;
        long    fos;
        long    top;
        struct fpu_reg  regs[8];        /* 8*16 bytes for each FP-reg = 128 bytes */
        unsigned char   lookahead;
        struct info     *info;
        unsigned long   entry_eip;
};

 

fpu_trig.c: 在函数‘rem_kernel’中:
fpu_trig.c:748:3: 错误:缺少结尾的 " 字符
fpu_trig.c:749:18: 错误:expected string literal before ‘movl’
fpu_trig.c:750:18: 错误:缺少结尾的 " 字符
解决办法:
vi /usr/src/linux/drivers/FPU-emu/fpu_trig.c
第748行,
  /* Do the required multiplication and subtraction in the one operation */
  asm volatile ("movl %2,%%eax; mull %4; subl %%eax,%0; sbbl %%edx,%1;
                 movl %3,%%eax; mull %4; subl %%eax,%1;
                 movl %2,%%eax; mull %5; subl %%eax,%1;"
                :"=m" (x), "=m" (((unsigned *)&x)[1])
                :"m" (st1),"m" (((unsigned *)&st1)[1]),
                 "m" (q),"m" (((unsigned *)&q)[1])
                :"%ax","%dx");
  修改为这样             
  asm volatile ("movl %2,%%eax; mull %4; subl %%eax,%0; sbbl %%edx,%1;"
                "movl %3,%%eax; mull %4; subl %%eax,%1;"
                "movl %2,%%eax; mull %5; subl %%eax,%1;"
                :"=m" (x), "=m" (((unsigned *)&x)[1])
                :"m" (st1),"m" (((unsigned *)&st1)[1]),
                 "m" (q),"m" (((unsigned *)&q)[1])
                :"%ax","%dx");    


gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -march=i386 -c memory.c
memory.c: 在函数‘zeromap_page_range’中:
memory.c:967:2: 错误:can’t find a register in class ‘CREG’ while reloading ‘asm’
memory.c:967:2: 错误:‘asm’操作数中有不可能的约束
解决办法:
vi /usr/src/linux/mm/memory.c
第967行的__zero_page

 

gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -march=i386 -c memory.c
memory.c: 在函数‘put_page’中:
memory.c:955:2: 错误:can’t find a register in class ‘CREG’ while reloading ‘asm’
memory.c:955:2: 错误:‘asm’操作数中有不可能的约束
解决办法:
vi /usr/src/linux/mm/memory.c
第943行的__bad_pagetable; 第955行的__bad_page

 

gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -march=i386 -c memory.c
memory.c: 在函数‘do_wp_page’中:
memory.c:580:4: 错误:can’t find a register in class ‘CREG’ while reloading ‘asm’
memory.c:580:4: 错误:‘asm’操作数中有不可能的约束
解决办法:
vi /usr/src/linux/mm/memory.c
第63行的copy_page,修改为这样
#define copy_page(from,to) \
__asm__("cld ; rep ; movsl": :"S" (from),"D" (to),"c" (1024))
//__asm__("cld ; rep ; movsl": :"S" (from),"D" (to),"c" (1024):"cx","di","si")

 

gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -march=i386 -c buffer.c
buffer.c: 在函数‘bread_page’中:
buffer.c:854:5: 错误:can’t find a register in class ‘CREG’ while reloading ‘asm’
buffer.c:854:5: 错误:‘asm’操作数中有不可能的约束
解决办法:
vi /usr/src/linux/fs/buffer.c
第819行的COPYBLK,修改为这样
#define COPYBLK(size,from,to) \
__asm__ __volatile__("rep ; movsl": \
 :"c" (((unsigned long) size) >> 2),"S" (from),"D" (to) \
 )
 //:"cx","di","si")

 

make[1]: 进入目录“/usr/src/linux/fs”
gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -march=i386 -c exec.c
exec.c: 在函数‘copy_strings’中:
exec.c:380:57: 错误:赋值运算的左操作数必须是左值
解决办法:
vi /usr/src/linux/fs/exec.c
第380行,修改为这样
if (!(pag = (char *) page[p/PAGE_SIZE]) &&
    !(pag = (char *) (page[p/PAGE_SIZE] = (unsigned long *) get_free_page(GFP_USER))))
    //!(pag = (char *) page[p/PAGE_SIZE] = (unsigned long *) get_free_page(GFP_USER)))

 

make[1]: 进入目录“/usr/src/linux/fs”
gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -march=i386 -c exec.c
exec.c: 在函数‘flush_old_exec’中:
exec.c:528:2: 错误:can’t find a register in class ‘CREG’ while reloading ‘asm’
exec.c:528:2: 错误:‘asm’操作数中有不可能的约束
解决办法:
vi /usr/include/linux/types.h 
第113行的__FD_ZERO,修改为这样
#define __FD_ZERO(fdsetp) \
  __asm__ __volatile__("cld ; rep ; stosl" \
   :"=m" (*(fd_set *) (fdsetp)) \
   :"a" (0), "c" (__FDSET_LONGS), \
   "D" ((fd_set *) (fdsetp)) )
   //"D" ((fd_set *) (fdsetp)) :"cx","di")

 

make[2]: 进入目录“/usr/src/linux/fs/minix”
gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -march=i386 -c bitmap.c
bitmap.c: 在函数‘minix_new_block’中:
bitmap.c:113:25: 错误:can’t find a register in class ‘SIREG’ while reloading ‘asm’
bitmap.c:130:2: 错误:can’t find a register in class ‘CREG’ while reloading ‘asm’
bitmap.c:113:25: 错误:‘asm’操作数中有不可能的约束
解决办法:
vi /usr/src/linux/fs/minix/bitmap.c
第24行的find_first_zero; 第17行的clear_block

 

make[2]: 进入目录“/usr/src/linux/fs/minix”
gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -march=i386 -c namei.c
namei.c: 在函数‘minix_find_entry’中:
namei.c:28:3: 错误:can’t find a register in class ‘CREG’ while reloading ‘asm’
namei.c:28:3: 错误:‘asm’操作数中有不可能的约束
解决办法:
vi /usr/src/linux/fs/minix/namei.c
第25行,修改为这样
__asm__("repe ; cmpsb ; setz %0"
   :"=q" (same)
   :"S" ((long) name),"D" ((long) buffer),"c" (len)
   );
   //:"cx","di","si");

 

make[2]: 进入目录“/usr/src/linux/fs/ext”
gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -march=i386 -c freelists.c
freelists.c: 在函数‘ext_new_block’中:
freelists.c:136:2: 错误:can’t find a register in class ‘CREG’ while reloading ‘asm’
freelists.c:136:2: 错误:‘asm’操作数中有不可能的约束
解决办法:
vi /usr/src/linux/fs/ext/freelists.c
第40行的clear_block

 

make[2]: 进入目录“/usr/src/linux/fs/ext”
namei.c: 在函数‘ext_find_entry’中:
namei.c:67:2: 错误:can’t find a register in class ‘CREG’ while reloading ‘asm’
namei.c:67:2: 错误:‘asm’操作数中有不可能的约束
解决办法:
vi /usr/src/linux/fs/ext/namei.c
第67行,修改为这样
__asm__("cld\n\t"
  "repe ; cmpsb\n\t"
  "setz %%al"
  :"=a" (same)
  :"0" (0),"S" ((long) name),"D" ((long) de->name),"c" (len)
  );
  //:"cx","di","si");

 

make[2]: 进入目录“/usr/src/linux/fs/ext2”
gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -march=i386 -c balloc.c
balloc.c: 在函数‘find_first_zero_bit’中:
balloc.c:51:2: 错误:缺少结尾的 " 字符
balloc.c:52:3: 错误:expected string literal before ‘cld’
balloc.c:55:6: 错误:整数常量的“f”后缀无效
balloc.c:60:7: 错误:整数常量的“f”后缀无效
balloc.c:64:3: 错误:缺少结尾的 " 字符
balloc.c: 在函数‘find_next_zero_bit’中:
balloc.c:81:3: 错误:缺少结尾的 " 字符
balloc.c:82:4: 错误:expected string literal before ‘bsfl’
balloc.c:83:8: 错误:整数常量的“f”后缀无效
balloc.c:85:1: 错误:缺少结尾的 " 字符
balloc.c: 在函数‘find_first_zero_byte’中:
balloc.c:106:2: 错误:缺少结尾的 " 字符
balloc.c:107:3: 错误:expected string literal before ‘cld’
balloc.c:110:7: 错误:整数常量的“f”后缀无效
balloc.c:112:1: 错误:缺少结尾的 " 字符
balloc.c: 在函数‘ext2_check_blocks_bitmap’中:
balloc.c:595:19: 附注:需要类型‘unsigned char *’,但实参的类型为‘char *’
解决办法:
vi /usr/src/linux/fs/ext2/balloc.c
第51行,修改为这样
        __asm__("cld\n\t" \
                "movl $-1,%%eax\n\t" \
                "repe;\n\t" \
                "scasl\n\t" \
                "je 1f\n\t" \
                "subl $4,%%edi\n\t" \
                "movl (%%edi),%%eax\n\t" \
                "notl %%eax\n\t" \
                "bsfl %%eax,%%edx\n\t" \
                "jmp 2f\n\t" \
"1:             xorl %%edx,%%edx\n\t" \
"2:             subl %%ebx,%%edi\n\t" \
                "shll $3,%%edi\n\t" \
                "addl %%edi,%%edx" \
                :"=d" (res)
                :"c" ((size + 31) >> 5), "D" (addr), "b" (addr)
                );
                //:"ax", "bx", "cx", "di");
第81行,修改为这样
  __asm__("bsfl %1,%0\n\t" \
            "jne 1f\n\t" \
            "movl $32, %0\n\t" \
            "1:                     " \
            : "=r" (set)
            : "r" (~(*p >> bit)));  
第106行,修改为这样
        __asm__("cld\n\t" \
                "mov $0,%%eax\n\t" \
                "repnz; scasb\n\t" \
                "jnz 1f\n\t" \
                "dec %%edi\n\t" \
                "1:             " \
                : "=D" (res)
                : "0" (addr), "c" (size)
                );
                //: "ax");

 

gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -march=i386 -c balloc.c
balloc.c: 在函数‘ext2_new_block’中:
balloc.c:544:2: 错误:can’t find a register in class ‘CREG’ while reloading ‘asm’
/usr/include/asm/bitops.h:50:2: 错误:‘asm’操作数中有不可能的约束
解决办法:
vi /usr/src/linux/fs/ext2/balloc.c
第35行的clear_block,修改为这样
#define clear_block(addr,size) \
 __asm__("cld\n\t" \
  "rep\n\t" \
  "stosl" \
  : \
  :"a" (0), "c" (size / 4), "D" ((long) (addr)) \
  )
  //:"cx", "di")


gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -march=i386 -c ialloc.c
ialloc.c: 在函数‘find_first_zero_bit’中:
ialloc.c:42:10: 警告:缺少结尾的 " 字符 [enabled by default]
ialloc.c:42:2: 错误:缺少结尾的 " 字符
ialloc.c:43:3: 错误:expected string literal before ‘cld’
ialloc.c:46:6: 错误:整数常量的“f”后缀无效
ialloc.c:51:7: 错误:整数常量的“f”后缀无效
ialloc.c:55:3: 错误:缺少结尾的 " 字符
解决办法:
vi /usr/src/linux/fs/ext2/ialloc.c
第42行,修改为这样
 __asm__("cld\n\t" \
  "movl $-1,%%eax\n\t" \
  "repe; scasl\n\t" \
  "je 1f\n\t" \
  "subl $4,%%edi\n\t" \
  "movl (%%edi),%%eax\n\t" \
  "notl %%eax\n\t" \
  "bsfl %%eax,%%edx\n\t" \
  "jmp 2f\n\t" \
"1:  xorl %%edx,%%edx\n\t" \
"2:  subl %%ebx,%%edi\n\t" \
  "shll $3,%%edi\n\t" \
  "addl %%edi,%%edx" \
  : "=d" (res)
  : "c" ((size + 31) >> 5), "D" (addr), "b" (addr)
  );
  //: "ax", "bx", "cx", "di");


gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -march=i386 -c inode.c
inode.c: 在函数‘ext2_alloc_block’中:
inode.c:110:3: 错误:can’t find a register in class ‘CREG’ while reloading ‘asm’

解决办法:
vi /usr/src/linux/fs/ext2/inode.c
第28行

 

make[2]: 进入目录“/usr/src/linux/fs/ext2”
gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -march=i386 -c namei.c
namei.c: 在函数‘ext2_match’中:
namei.c:58:2: 错误:can’t find a register in class ‘CREG’ while reloading ‘asm’
namei.c:58:2: 错误:‘asm’操作数中有不可能的约束
解决办法:
vi /usr/src/linux/fs/ext2/namei.c
第58行,修改为这样
 __asm__("cld\n\t"
  "repe ; cmpsb\n\t"
  "setz %0"
  :"=q" (same)
  :"S" ((long) name), "D" ((long) de->name), "c" (len)
  );
  //:"cx", "di", "si");

 

make[2]: 进入目录“/usr/src/linux/fs/ext2”
gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -march=i386 -c truncate.c
truncate.c: 在函数‘trunc_indirect’中:
truncate.c:167:4: 错误:can’t find a register in class ‘CREG’ while reloading ‘asm’
truncate.c:167:4: 错误:‘asm’操作数中有不可能的约束
解决办法:
vi /usr/src/linux/fs/ext2/truncate.c
第28行

 

make[2]: 进入目录“/usr/src/linux/fs/proc”
gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -march=i386 -c base.c
base.c: 在函数‘proc_match’中:
base.c:82:2: 错误:can’t find a register in class ‘CREG’ while reloading ‘asm’
base.c:82:2: 错误:‘asm’操作数中有不可能的约束
解决办法:
vi /usr/src/linux/fs/proc/base.c
第82行,修改为这样
 __asm__("cld\n\t"
  "repe ; cmpsb\n\t"
  "setz %%al"
  :"=a" (same)
  :"0" (0),"S" ((long) name),"D" ((long) de->name),"c" (len)
  );
  //:"cx","di","si");

 

make[2]: 进入目录“/usr/src/linux/fs/proc”
gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -march=i386 -c array.c
array.c: 在函数‘array_read’中:
/usr/include/linux/string.h:24:1: 错误:can’t find a register in class ‘SIREG’ while reloading ‘asm’
/usr/include/linux/string.h:24:1: 错误:‘asm’操作数中有不可能的约束
/usr/include/asm/segment.h:57:1: 错误:‘asm’操作数中有不可能的约束
解决办法:
vi /usr/include/linux/string.h
第24行的strcpy

 

make[2]: 进入目录“/usr/src/linux/net/unix”
gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -march=i386 \
-c -o sock.o sock.c
sock.c: 在函数‘unix_proto_create’中:
sock.c:331:44: 错误:赋值运算的左操作数必须是左值
sock.c: 在函数‘unix_proto_release’中:
sock.c:363:44: 错误:赋值运算的左操作数必须是左值
解决办法:
vi /usr/src/linux/net/unix/sock.c
第331行,修改为这样
//UN_DATA(sock) = upd;
sock->data = upd;
第363行,修改为这样
//UN_DATA(sock) = NULL;
sock->data = NULL;

 

make[2]: 进入目录“/usr/src/linux/net/inet”
gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -march=i386 -c -o arp.o arp.c
arp.c:126:27: 错误:‘arp_q’的类型限定冲突
arp.h:48:24: 附注:‘arp_q’的上一个声明在此
解决办法:
vi /usr/src/linux/net/inet/arp.h
第48行,修改为这样
//extern struct sk_buff *arp_q;
extern struct sk_buff * volatile arp_q;
保持和arp.c中的定义一致

 

make[2]: 进入目录“/usr/src/linux/net/inet”
ip.c: 在函数‘ip_compute_csum’中:
ip.c:472:2: 错误:can’t find a register in class ‘CREG’ while reloading ‘asm’
ip.c:487:2: 错误:can’t find a register in class ‘BREG’ while reloading ‘asm’
ip.c:472:2: 错误:‘asm’操作数中有不可能的约束
解决办法:
vi /usr/src/linux/net/inet/ip.c
第472行, 第487行, 第495行

 

make[2]: 进入目录“/usr/src/linux/net/inet”
gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -march=i386 -c -o tcp.o tcp.c
tcp.c: 在函数‘tcp_check’中:
tcp.c:530:3: 错误:can’t find a register in class ‘DREG’ while reloading ‘asm’
tcp.c:538:2: 错误:can’t find a register in class ‘CREG’ while reloading ‘asm’
tcp.c:550:3: 错误:can’t find a register in class ‘BREG’ while reloading ‘asm’
tcp.c:530:3: 错误:‘asm’操作数中有不可能的约束
解决办法:
vi /usr/src/linux/net/inet/ip.c
第530行

 

make[2]: 进入目录“/usr/src/linux/net/inet”
gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -march=i386 -c -o udp.o udp.c
udp.c: 在函数‘udp_check’中:
udp.c:149:3: 错误:can’t find a register in class ‘DREG’ while reloading ‘asm’
udp.c:157:2: 错误:can’t find a register in class ‘CREG’ while reloading ‘asm’
udp.c:169:3: 错误:can’t find a register in class ‘BREG’ while reloading ‘asm’
udp.c:149:3: 错误:‘asm’操作数中有不可能的约束
解决办法:
vi /usr/src/linux/net/inet/udp.c
第149行

 

gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -march=i386 -c string.c
In file included from string.c:16:0:
/usr/include/linux/string.h: 在函数‘strcat’中:
/usr/include/linux/string.h:55:1: 错误:can’t find a register in class ‘AREG’ while reloading ‘asm’
/usr/include/linux/string.h:55:1: 错误:‘asm’操作数中有不可能的约束
解决办法:
vi /usr/include/linux/string.h
第55行strcat

 

make[1]: 进入目录“/usr/src/linux/lib”
gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -march=i386 -c string.c
In file included from string.c:16:0:
/usr/include/linux/string.h: 在函数‘strncat’中:
/usr/include/linux/string.h:71:1: 错误:can’t find a register in class ‘AREG’ while reloading ‘asm’
/usr/include/linux/string.h:71:1: 错误:‘asm’操作数中有不可能的约束
解决办法:
vi /usr/include/linux/string.h
第71行strncat

 

gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -march=i386 -c string.c
In file included from string.c:16:0:
/usr/include/linux/string.h: 在函数‘strrchr’中:
/usr/include/linux/string.h:154:1: 错误:can’t find a register in class ‘AREG’ while reloading ‘asm’
/usr/include/linux/string.h:154:1: 错误:‘asm’操作数中有不可能的约束
解决办法:
vi /usr/include/linux/string.h
第154行strrchr

 

gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -march=i386 -c string.c
In file included from string.c:16:0:
/usr/include/linux/string.h: 在函数‘strspn’中:
/usr/include/linux/string.h:171:1: 错误:can’t find a register in class ‘AREG’ while reloading ‘asm’
/usr/include/linux/string.h:171:1: 错误:‘asm’操作数中有不可能的约束
解决办法:
vi /usr/include/linux/string.h
第171行strspn

 

gcc -D__KERNEL__ -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -march=i386 -c string.c
In file included from string.c:16:0:
/usr/include/linux/string.h: 在函数‘strcspn’中:
/usr/include/linux/string.h:196:1: 错误:can’t find a register in class ‘AREG’ while reloading ‘asm’
/usr/include/linux/string.h:196:1: 错误:‘asm’操作数中有不可能的约束
解决办法:
vi /usr/include/linux/string.h
第196行strcspn

 

irq.c:(.text+0x1ddd): undefined reference to `_cache_21‘
irq.c:(.text+0x1de3): undefined reference to `_cache_21‘
irq.c:(.text+0x1deb): undefined reference to `_intr_count‘
kernel/kernel.o: In function `_fast_IRQ0_interrupt‘:
irq.c:(.text+0x1e0b): undefined reference to `_cache_21‘
... ...‘
kernel/kernel.o: In function `free_irq‘:
(.text+0x316b): undefined reference to `idt‘
kernel/kernel.o:(.text+0x3172): more undefined references to `idt‘ follow
......
kernel/kernel.o: In function `_symbol_table‘:
(.data+0xf00): undefined reference to `_wp_works_ok‘
make: *** [tools/zSystem] 错误 1
解决办法:

vi boot/head.S
.globl _idt,_gdt,
.globl _swapper_pg_dir,_pg0
.globl _empty_bad_page
.globl _empty_bad_page_table
.globl _empty_zero_page
.globl _tmp_floppy_area,_floppy_track_buffer
修改为
.globl idt,gdt,
.globl swapper_pg_dir,pg0
.globl empty_bad_page
.globl empty_bad_page_table
.globl empty_zero_page
.globl tmp_floppy_area,floppy_track_buffer

并且把标志为由"_"下划线开头的去掉下划线, 这是由as汇编器进化导致的问题.

vi kernel/sys_call.S
vi kernel/ksyms.S
vi kernel/ksyms.sh
vi drivers/FPU-emu/div_small.S
vi drivers/FPU-emu/polynomial.S
vi drivers/FPU-emu/poly_div.S
vi drivers/FPU-emu/poly_mul64.S 
vi drivers/FPU-emu/reg_div.S
vi drivers/FPU-emu/reg_norm.S
vi drivers/FPU-emu/reg_round.S
vi drivers/FPU-emu/reg_u_add.S
vi drivers/FPU-emu/reg_u_div.S
vi drivers/FPU-emu/reg_u_mul.S
vi drivers/FPU-emu/reg_u_sub.S
vi drivers/FPU-emu/wm_shrx.S
vi drivers/FPU-emu/wm_sqrt.S
vi net/inet/loopback.c loopback_xmit里相关__asm__的内容
vi drivers/char/keyboard.c  hard_reset_now里相关__asm__的内容
vi drivers/char/console.c  scrup里相关__asm__的内容; scrdown里相关__asm__的内容
vi usr/include/linux/sched.h switch_to里相关__asm__的内容_current修改为current
vi usr/src/linux/include/asm/irq.h 里相关__asm__的内容
vi drivers/FPU-emu/fpu_asm.h 
#define EXCEPTION _exception
修改为
#define EXCEPTION exception

 

make[1]: 离开目录“/usr/src/linux/lib”
ld  -Ttext 100000 boot/head.o init/main.o tools/version.o \
 kernel/kernel.o mm/mm.o fs/fs.o net/net.o ipc/ipc.o \
 fs/filesystems.a \
 drivers/block/block.a drivers/char/char.a drivers/net/net.a ibcs/ibcs.o drivers/FPU-emu/math.a \
 lib/lib.a \
 -o tools/zSystem
ld: warning: cannot find entry symbol _start; defaulting to 0000000000100000
kernel/kernel.o: In function `symbol_table‘:
(.data+0xef0): undefined reference to `verify_write‘
make: *** [tools/zSystem] 错误 1
解决办法:
vi usr/include/linux/mm.h
修改
//int __verify_write(unsigned long addr, unsigned long count);
extern int verify_write(unsigned long addr, unsigned long count);

extern inline int verify_area(int type, const void * addr, unsigned long size)
{
 if (TASK_SIZE <= (unsigned long) addr)
  return -EFAULT;
 if (size > TASK_SIZE - (unsigned long) addr)
  return -EFAULT;
 if (wp_works_ok || type == VERIFY_READ || !size)
  return 0;
 //return __verify_write((unsigned long) addr,size);
 return verify_write((unsigned long) addr,size);
}

vi /usr/src/linux/mm/memcpy.c
第654行,修改为这样
//int __verify_write(unsigned long start, unsigned long size)
int verify_write(unsigned long start, unsigned long size)
{
 size--;
 size += start & ~PAGE_MASK;
 size >>= PAGE_SHIFT;
 start &= PAGE_MASK;
 do {
  do_wp_page(1,start,current,0);
  start += PAGE_SIZE;
 } while (size--);
 return 0;
}

 

make[1]: 进入目录“/usr/src/linux/zBoot”
gcc -D__KERNEL__ -O2 -DSTDC_HEADERS  -c -o misc.o misc.c
misc.c:81:7: 错误:与‘malloc’类型冲突
misc.c:81:7: error: conflicting types for ‘malloc‘
解决办法:
vi /usr/src/linux/zBoot/misc.c
第81行,修改为这样
//void *malloc(int size)
void *malloc(size_t size)

 

make[1]: 进入目录“/usr/src/linux/zBoot”
gcc -D__KERNEL__ -O2 -DSTDC_HEADERS  -c -o misc.o misc.c
misc.o: In function `fill_inbuf‘:
misc.c:(.text+0x352): undefined reference to `input_len‘
misc.c:(.text+0x384): undefined reference to `input_data‘
解决办法:
vi /usr/src/linux/zBoot/misc.c
第53行,修改为这样 
//extern char input_data[];
char input_data[];
//extern int input_len;
int input_len;

 

make[1]: 离开目录“/usr/src/linux/zBoot”
tools/build boot/bootsect boot/setup zBoot/zSystem CURRENT > zImage
Root device is (-3, 1)
Boot sector 512 bytes.
Setup is 1980 bytes.
Non-GCC header of ‘system‘
make: *** [zImage] 错误 1
解决办法:
vi /usr/src/linux/tools/build.c
第191行,修改为这样
//if (N_MAGIC(*ex) != ZMAGIC)
//      die("Non-GCC header of ‘system‘");

vi /usr/src/linux/zBoot/xtract.c

//if (N_MAGIC(*ex) != ZMAGIC)
//      die("Non-GCC header of ‘system‘");

make[1]: Leaving directory `/usr/src/linux/zBoot‘
tools/build boot/bootsect boot/setup zBoot/zSystem CURRENT > zImage
Root device is (-3, 1)
Boot sector 512 bytes.
Setup is 1980 bytes.
System is 64 kB (64 kB code, 0 kB data and 0 kB bss)
Unexpected EOF
Can‘t read ‘system‘
make: *** [zImage] Error 1
解决办法:
vi /usr/src/linux/tools/build.c
第208行,修改为这样
n=read(id, buf, l);
if (n != l) {
        if( n < 0)
        {
                perror(argv[1]);
                fprintf(stderr, "Unexpected EOF\n");
                die("Can‘t read ‘system‘");
        }
        else if( n == 0)
                break;
}
if (write(1, buf, n) != n)
        die("Write failed");
sz -= n;

 

*******************************************************************************************************************
编译压缩内核镜象zImage成功
make[1]: Leaving directory `/usr/src/linux/zBoot‘
gcc -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -pipe -o tools/build tools/build.c
tools/build.c: In function ‘main‘:
tools/build.c:125:2: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
tools/build.c:154:2: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
tools/build boot/bootsect boot/setup zBoot/zSystem CURRENT > zImage
Root device is (-3, 1)
Boot sector 512 bytes.
Setup is 1980 bytes.
System is 64 kB (64 kB code, 0 kB data and 0 kB bss)
argv[3]zBoot/zSystem sz:68953
sync

 

[root@localhost linux]# ls
boot       config.old  CREDITS  ibcs     ipc     Makefile    net     zBoot
CHANGES    Configure   drivers  include  kernel  makever.sh  README  zImage
config.in  COPYING     fs       init     lib     mm          tools   zSystem.map

下一步完成内核运行。

Linux1.0源代码编译过程,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。