找回密码
 骑士注册

QQ登录

微博登录

搜索
❏ 站外平台:

查看: 358|回复: 12
收起左侧

[求助] 实模式的引导启动的编译问题

[复制链接]
shanling2019 发表于 2019-03-03 09:21:19 | 显示全部楼层 |阅读模式
最近在学习linux0.12内核,就是赵炯先生作讲解的那本书。书挺好的,就是啊,里面的引导启动代码用的是as86汇编语法,这个编译器我找不到了,所以没法儿用它来编程。后来看到书上面说,从2.4版本之后,就全都用了AT&T汇编了。我就去找了一下子2.4版本的内核代码。然后就想要仿照上面的代码,自己写一个书来。结果嘛,弄出来的代码,编译的部分能通过,但是链接的阶段,总是提示着说截断重寻址至相符,这个,我就不知道怎么弄了,像请大神们来帮忙看一看

 楼主| shanling2019 发表于 2019-03-03 09:33:14 | 显示全部楼层
下面一楼层,我来贴出我写的代码。

 楼主| shanling2019 发表于 2019-03-03 09:33:37 | 显示全部楼层
.code16
.section .text
.globl _start
_start:
                ljmp $0x07c0, $go
  go:
                movw %cs, %ax
                movw %ax, %ds
                movw %ax, %es
                movw $20, %cx
                movw $0x1004, %dx
                movw $0x0c, %bx
                movw $msg1, %bp
                movw $0x1301, %ax

  s0:
                jmp s0

        msg1:
                .ascii "I like to study C language and assembly language program design..."
                .byte 13, 10
        .org 510
                .word 0xAA55

 楼主| shanling2019 发表于 2019-03-03 09:36:00 | 显示全部楼层
接下来呢,我来贴出我的编译命令和编译的结果。编译的过程,它是分为编译和链接两个阶段。在这里,编译阶段没有问题,能通过。但是,链接阶段就提示出错了。下面一楼是我的编译命令。

 楼主| shanling2019 发表于 2019-03-03 09:36:32 | 显示全部楼层
shuilingling@Linux:~/E盘/linux内核实验/study01$ as bootsect01.S -o bootsect01.o
shuilingling@Linux:~/E盘/linux内核实验/study01$ ld bootsect01.o -o bootsect01

 楼主| shanling2019 发表于 2019-03-03 09:38:40 | 显示全部楼层
接下来嘛,就是出错的提示了。这个东西,我可是完全搞不懂啊,不知道里面是少了什么参数。下面的楼层给出出错提示。

 楼主| shanling2019 发表于 2019-03-03 09:39:13 | 显示全部楼层
bootsect01.o:在函数‘_start’中:
(.text+0x1): 截断重寻址至相符: R_X86_64_16 针对 .text
bootsect01.o:在函数‘go’中:
(.text+0x15): 截断重寻址至相符: R_X86_64_16 针对 .text

 楼主| shanling2019 发表于 2019-03-03 09:41:42 | 显示全部楼层
这是这样的一种情况了。然后呢,有一点也很奇怪,那就是,当我删除了其中两行代码,就是带有ljmp的一行和movw $msg, %bp 的一行之后,程序就能够顺利编译。下面,我把删除了其中两行代码的新代码给贴出来。

 楼主| shanling2019 发表于 2019-03-03 09:42:42 | 显示全部楼层
.code16
.section .text
.globl _start
_start:

                movw %cs, %ax
                movw %ax, %ds
                movw %ax, %es
                movw $20, %cx
                movw $0x1004, %dx
                movw $0x0c, %bx
                movw $0x1301, %ax

  s0:
                jmp s0

        msg1:
                .ascii "I like to study C language and assembly language program design..."
                .byte 13, 10
        .org 510
                .word 0xAA55

 楼主| shanling2019 发表于 2019-03-03 09:43:34 | 显示全部楼层
shuilingling@Linux:~/E盘/linux内核实验/study01$ as bootsect01.S -o bootsect01.o
shuilingling@Linux:~/E盘/linux内核实验/study01$ ld bootsect01.o -o bootsect01

 楼主| shanling2019 发表于 2019-03-03 09:47:33 | 显示全部楼层
编译命令和之前的一样,但是呢,这回就是,啥问题都没有了,顺利地通过了。这里面就不涉及内存寻址,不涉及远眺转的代码了,可是这样一来,似乎数据段,也就用不了了啊。所以,想清大神帮忙诊断一下。

 楼主| shanling2019 发表于 2019-03-03 09:54:21 | 显示全部楼层
当前,我的编译的平台是,乌班图18.10 64位系统。编译器,就是直接sudo apt安装上的,哪个版本,我也不知道。直接地,就是那种自动化的安装的。

 楼主| shanling2019 发表于 2019-03-03 09:56:01 | 显示全部楼层
我的另一台电脑,windows主机,里面安装了乌班图优麒麟18.04 LTS  32位的系统,在那里去编译的时候,也是提示着截断重寻址的问题。清大神帮忙诊断一下了

您需要登录后才可以回帖 登录

本版积分规则

快速回复 返回顶部 返回列表

分享到微信

打开微信,点击顶部的“╋”,
使用“扫一扫”将网页分享至微信。