Aros/平台/在 *nix 上安装
Icaros 桌面发行版现在可以选择像其他应用程序一样在 Linux 上安装。
AxRuntime 论坛 在 Linux 上以原生方式运行 AROS 应用程序]
The information here maybe old and out of date. Please update with any new findings or discoveries
要遵循
最新的 Ubuntu、OpenSUSE 和 CentOS 似乎是最受欢迎的受支持发行版 (distros),可以用于 AROS 开发,并且可以在其上编译托管 AROS。
- Debian 9
- Debian 8
- Debian 7
- Debian 6 GimmeAROS 在安装完依赖项后可以完美运行。
- Ubuntu 11.10 -
- Ubuntu 12.04 -
- OpenSUSE 11.2 - 默认安装的编译器在原生 AROS 中表现不佳(之前是 gcc-4.4.1,现在是 6.3)。英特尔 GMA 的整个 AROS 开发和测试版本是在 Suse 上完成的。
- CentOS/RedHat Enterprise 可能没有从其包安装程序中获取的最新版本的 gnu autoconf,因此您需要手动安装它,以便 AROS/configure 脚本能够正常工作。
- FreeBSD 8 目前无法构建,它可以通过对源代码树进行一些修改来工作。
- FreeBSD 7 作为主机平台从未完成,openbsd 和 netbsd 也一样。
在 *BSD 中,系统经常包含与 AROS 包含文件冲突,有时 gcc 配置中存在 varargs 差异也会导致构建失败。请在 aros-exec 上搜索 netbsd,查看相关说明 [1] [2] [3].
Linux 上的当前源代码树需要任何 GCC 6.x 版本,但之前是 4.x 版本。AROS 源代码树已经很久不能在 Linux 上使用非常老的 GCC 3.x 版本进行正确构建了。
许多开发者使用 Linux 托管版本进行开发工作。
请执行以下操作
- 下载 ISO
- 提取 ISO 以获取文件
- 下载 http://download.aros3d.org/software/linux.tar.gz
- 将内容提取到 /Arch,您应该会得到 Arch/linux 目录
- $ ./Arch/linux/AROSBoostrap
现在您已将 pc-i386 ISO 转换为 linux-i386 安装程序。
AROS linux 托管是否可以在 64 位 Linux 上编译?可以,但 64 位 Linux 托管不起作用 - mmap() 会分配超过 2GB 空间的内存。而且没有 MAP_32BIT。64 位 x86 版本的托管 AROS 通常是在 64 位 Linux 上构建和运行的。它不会运行“常规”i386 32 位 AROS 程序二进制文件。您甚至可以在 64 位 Linux 上编译和运行 32 位托管 AROS。不过,这可能取决于发行版,在 Ubuntu 上很容易获得所有需要的 32 位版本库。
FreeBSD 也不支持这种结构。事实上,看起来 mmap() 默认情况下会映射到超过 4GB 范围的末尾。*BSD 开发人员如何处理这个问题?或者我们唯一能做的就是更改 AROS 64 位代码模型?至少对于某些版本来说。无论如何都会发生一些事情,因为 AROS 是一个单地址空间操作系统。也许最好的选择是使用小型或中等 PIC 模型实现所有内容(至少对于用户代码而言)。
手动说明是制作一个原生 AROS,该 AROS 部分构建托管环境。这在 OSX 下尚未尝试构建,因此不确定效果如何。Linux 是最常用的环境。只需运行 configure 脚本,无需目标指令,它应该会检测到底层操作系统并设置构建托管 AROS 的环境。
建议新开发者下载 gimmearos.sh 脚本(在 aros-archives 上?),通过下载必要的包并运行配置脚本和 make 来设置开发环境,然后下载 bootaros.sh 脚本,以帮助设置 linux tap 设备网络,以便运行具有功能性网络的 linux 托管 AROS。
对于匿名下载,repo.or.cz 的 git 服务器存储库中有 AROS.git、AROS-Contrib.git 和 AROS-Ports.git。您可以手动下载这些文件作为...
git clone git://repo.or.cz/AROS.git git clone git://repo.or.cz/AROS-Contrib.git git clone git://repo.or.cz/AROS-Ports.git
如果您不介意等待 metamake 尝试构建所有配置的项目(并且并非所有项目都配置为构建,例如,必须手动调用 make aros-tcpip-apps-owb 来构建 owb),您只需将 contrib 和 ports 目录移动到 AROS 中,然后
mkdir pc-i386 cd pc-i386 ../AROS/configure --target=pc-i386 make
然后手动制作您想要包含在启动镜像中但未预先配置为构建的任何其他项目,最后通过以下命令制作一个可启动的 iso 镜像。
make bootiso-pc-i386
我的脚本用于构建不同的 GCC 版本,而不是使用托管版本
build_dir="/home/ubuntu/aros_tools" mkdir -p $build_dir cd $build_dir wget -nc ftp://ftp.gwdg.de/pub/misc/gcc/releases/gcc-$1/gcc-$1.tar.bz2 tar xvjf gcc-$1.tar.bz2 if [ -d "$build_dir" ]; then rm -rf $build_dir/build fi mkdir -p $build_dir/build cd build ../gcc-$1/configure --prefix=/usr/bin/gcc-$1 --program-suffix=-$1 --enable-languages=c,c++ --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions make sudo make install cd /usr/bin/gcc-$1/bin sudo ln -s gcc-$1 gcc sudo ln -s g++-$1 g++
以下是实际构建 Aros(i386 ABI_V0)的脚本
build_dir="/home/ubuntu/aros_svn/branches/ABI_V0/aros_builds" if [ -d "$build_dir" ]; then rm -rf $build_dir fi mkdir $build_dir cd $build_dir export PATH=/usr/bin/gcc-4.1.2/bin:$PATH /home/ubuntu/aros_svn/branches/ABI_V0/AROS/configure --target=pc-i386 --with-serial-debug=1 --enable-usb30-code --with-portssources=/home/ubuntu/aros_cache make
ABIv0 x86_64 is essentially unmaintained. Use ABIv1 or i386.
使用 --target=linux-i386 编译。您在尝试使用不指定目标(例如 --target=linux-x86_64)进行编译后,是否删除了构建树?
在 Ubuntu 11.10 x86_64 上安装:g++、libpng12-dev、gcc-multilib、libx11-dev、ia32-libs、libgl1-mesa-dev
在最新的 Lubuntu 中,要满足所有依赖项才能完成编译:g++ libpng12-dev gcc-multilib libx11-dev ia32-libs libgl1-mesa-dev g++-multilib libX11-dev:i386 这些是适用于 Ubuntu 版本的包名。最后一个包特别难找,但我最终借助谷歌找到了它。现在编译成功完成,我可以在 x86_64 发行版上进行跨编译,生成 x86 版本。
新安装的(可能缺少的)软件包:libpng12-dev、ia32-libs、g++-multilib,编译大约需要 5 分钟 50 秒。
make clean ./configure --target=pc-i386 time make -j 12 bootiso-pc-i386
错误
构建树中可能存在一些 64 位代码,导致最后出现错误。
由于 AROS/i386-linux 和 AROS/i386-freebsd 是 AROS 在 aros.org 上提供的托管版本,因此安装非常简单。只需从下载页面获取适合您的平台(Linux/BSD)的相应存档文件,并将其解压缩到您想要的位置。
> tar -vxjf AROS-<version>-i386-<platform>-system.tar.bz2
如果您下载了 contrib 存档文件,您可能也想解压缩它。
> tar -vxjf AROS-<version>-i386-all-contrib.tar.bz2
Ubuntu 构建
通用的 Debian 部分几乎一样
- 调用 debootstrap
- 将此或类似内容提供给 debian-set-selection(默认情况下,debootstrap 只提供 POSIX 本地化)
locales locales/locales_to_be_generated multiselect en_GB.UTF-8 UTF-8 locales locales/default_environment_locale select en_GB.UTF-8
- apt-get install locales build-essential subversion automake autoconf bison flex netpbm python
可能还有其他有用的软件包,但以上内容足以构建 AROS,包括必要的 contrib。我计划将我的脚本打包,这样可以将我的当前开发环境保存在一台虚拟机中,并在每晚为额外测试准备一台新的虚拟机。
这样做的好处是,现在 PARANOIA_CFLAGS 不再存在。如果您想启用 '-Wall -Werror' 构建,只需在配置命令中添加 '--with-paranoia=yes',整个构建树将进行构建,只要出现编译警告就会停止构建。
./configure
make
./configure --enable-debug=all --enable-crosstools
make
我们的构建依赖于从互联网下载的软件包,一直都是这样。当只构建核心 AROS 时,最小的要求是 binutils 和 gcc。如果您还构建了 contrib,则需要下载更多软件包。但这并不妨碍这是一个构建过程中的非常奇特的步骤。
我们没有在存储库中托管整个 binutils 和其他类似软件包,我们只托管对主线的补丁(对于 binutils,没有补丁)。您会看到构建过程从 gnu 存储库中获取 binutils。如果构建失败,它必须在稍后的某个时间发生,除非您没有连接到互联网。:-) 这里有一个配置开关可能会有所帮助。如果在配置命令行中指定 --with-portssources=/somedir/someotherdir/aros_sources,则获取的软件包将被放置到指定的目录中。后面的构建(即使是从头开始的构建)也会先查看此位置,然后再下载任何内容。您也可以在开始 make 之前复制所需的内容。
CC="gcc-4.3 -m32" ./configure—target=linux-i386—enable-debug=all—with-portssources=/home/mazze/projects/ports-src/ --enable-crosstools
export CC=/usr/bin/gcc46 export PYTHON=/usr/bin/python2.7 /mnt/NAS/PC/AROS/trunk/configure --target=pc-i386 --with-serial-debug --enable-ccache --with-bootloader=grub2 --with-theme=Xstream --with-portssources=/mnt/NAS/PC/portssources
我们需要预先安装构建工具。只有在 AROS 上运行的软件才会被获取和构建,除了面向 AROS 的 GCC 和 binutils(因为它们通常无法以二进制文件形式获得)。
There is a script called GimmeAROS somewhere that downloads the necessary host packages for certain Linux flavours.
--with-crosstools 用于指定 AROS 跨编译工具的来源和目标,而现在它只是内核工具的来源,并且对于某些架构,如果选择 --disable-crosstools,则需要隐含 --disable-crosstools --with-kernel-tool-prefix=...。./configure 应该会告诉您。
如果托管的架构是交叉编译的(例如,在 x86 上的 linux-arm),即使在构建跨编译工具时,也需要 --with-kernel-tool-prefix=,因为它需要知道在何处找到用于构建 AROSBootstrap 的 Linux ARM 工具链。目前,./configure 中的这个错误非常糟糕(无法找到 dlopen)。
我将添加类似于 '--with-target-tool-path=' 的选项,用于指定构建目标跨编译工具的位置(例如,用于 SDK 构建),但我希望确保非 SDK 构建能够正常工作。
- Linux 32 位(如果要使用 Icaros 或 AspireOS 设置,则最佳选择)linux-i386-system 或 64 位 linux-x86_64-system
- 虚拟机是另一种选择,但速度较慢。
将其视为任何存档文件,并将其解压缩到您的用户区域或 /usr/local,具体取决于您使用的 Linux GNU 发行版。
Recent Distros (2011+) have dispensed with the backingstore option and we are looking at alternatives at the moment.
一个已配置并正常工作的 X 服务器(例如 XFree86 或 X.org),带有 backingstore。如果您运行的是 XFree86 4.0 或更高版本,您可能会注意到,包含 AROS 屏幕的窗口没有正常刷新(例如,当其他窗口经过时)。这是因为 AROS 使用了 X 的“backingstore”功能,该功能在 XFree86 4.0 及更高版本中默认关闭。如果您使用 startx 命令启动 X,可以通过传递 +bs 选项来重新启用它。
> startx -- +bs
如果您通过其他方式启动 X(例如,使用 XDM),则可以将以下行添加到 X 配置文件(通常名为 /etc/X11/XF86Config 或 /etc/X11/XF86Config-4)中图形卡的设备部分。
Option "backingstore"
然后,一个完整的设备部分可能如下所示:
Section "Device"
Identifier "Matrox G450"
Driver "mga"
BusID "PCI:1:0:0"
Option "backingstore"
EndSection
一些较新的发行版允许为托管的 AROS 启用 Xorg 的 backingstore,方法是在 /usr/lib/X11/xorg.conf.d 目录中创建一个名为 05-backingstore 的小配置文件,内容如下:
Section "Device"
Identifier "Default device"
Option "Backingstore"
EndSection
Raspbian(Debian Wheezy 的 ARMv6 armhf 构建和其他版本?)
sudo leafpad /etc/x11/xinit/xserverrc
在 usr/bin/X 后添加 +bs,然后保存。
exit
要启动 AROS
> cd AROS
> boot/AROSBootstrap --fullscreen -m 256
-h -m <size> -M -t <value> --help --memsize <size> --mapsysbase
还存在以下文件:
- aros-base - 基础启动模块(与架构无关的库)。
- aros-strap-hosted - 引导代码(bootloader.resource 和 dosboot.resource)。
- aros-bsp-linux - 板级支持包(与架构相关的部分)。
前两个部分可以在 Windows 托管端口之间互换。将来,基础启动模块将可以在所有端口之间互换。
--hostmem 参数已移除。将来,这将通过其他方式实现。Michal Schulz 正在开发新的内存管理器。如果有人非常想念它,我可以把它恢复回来。
--tickrate 参数也已移除。取而代之的是,您有两个新的参数:
vblank=xx - 将 VBlank 频率设置为 xx Hz。默认值为 50。
eclock=xx - 将主计时器频率设置为 xx Hz。如果您指定 eclock=100,您将获得与以前相同的频率。
在不久的将来,将能够在 AROSBootstrap.conf 文件中指定参数,因此将不再需要包装脚本。托管串行端口和并行端口已缺失。它们将在一段时间后恢复。
如果进展不顺利
- 确保日志最终会出现在发送到 AROS 邮件列表的电子邮件中。
- 将您的 ./configure 行、./configure 的输出以及 config.log 文件(如果失败)发送到邮件列表。
- make -s 查询您是否可以绕过配置。
如果您有网络访问权限,匿名 git 仓库是更好的选择。它消除了所有日期编码目录,任何未来的更新都只需一个“git pull”命令即可完成。您可以根据需要在本地分支,并创建差异以提交给其他人查看。
确定您要在本地构建的位置(可能是一个名为 src 的目录),在那里 cd,然后
git clone git://repo.or.cz/AROS.git cd AROS git clone git://repo.or.cz/AROS-Contrib.git ./configure make
[免责声明:这只是**我的构建方式**,并非完美或防弹指南,因此:不提供任何保证 ;) ]
1. 安装 subversion
在终端窗口中输入
> sudo apt-get install subversion
2. 获取 AROS 和 Contrib 源代码:(这里我使用 SVN,但您也可以从 www.aros.org 下载源代码)
在终端中,从您的 home path 中输入
> svn checkout https://svn.aros.org/svn/aros/trunk/AROS > cd AROS > svn checkout https://svn.aros.org/svn/aros/trunk/contrib
3. 安装 GCC 4.xx(示例使用 4.2)
在终端窗口中输入
> sudo apt-get install gcc-4.2
4. 安装 Automake1.9、Bison、Flex、netpbm、patch
> sudo apt-get install automake1.9 > sudo apt-get install bison > sudo apt-get install flex > sudo apt-get install netpbm > sudo apt-get install patch
5. 使用 GCC-4.2 设置编译器
> export CC="gcc-4.2"
6. 使用 --target=pc-i386 参数启动配置
> ./configure—target=pc-i386
或者,您可以使用一些优化进行编译
> ./configure --target=pc-i686 > AROS_TARGET_ARCH=pc > AROS_TARGET_CPU=i686
7. 启动 make 进行编译
> make
8. 使用以下命令创建 .ISO 文件
> make bootiso-pc-i386
.iso 文件将被创建在 "~/AROS/distfiles/" 目录中
如果您仍然需要创建 kernel-kernel,因为编译失败,则在 bucomm.c 处
Clean the build Go to workbench/libs/mesa/src/mesa Edit mmakefile.src Find the line #MM- workbench-libs : workbench-libs-mesa Put # before the whole line (it disables the dependency) configure make ... you will get fail make kernel-kernel ... you will get fail make ... now it should compile till the end
注意:您应该拥有以下来源:来自主 aros 源代码包 - 目录 AROS 中的所有源代码来自 contrib aros 源代码包 - 目录 AROS/contrib/necessary 中只有 contrib/necessary(复制而不是链接!)
您可能对编译器感兴趣。您可以在 bin/linux-i386/tool/i386-linux-aros-gcc 中找到它
过去只有 OSS 被支持,但现在有 一个 ALSA 音频驱动程序
OSS 似乎也不适用于 Ubuntu 11.04。OSS 在 10.4(和更早版本)中受支持。
- apt-get install alsa-oss
- modprobe snd_pcm_oss
- modprobe snd_mixer_oss
另一种选择是使用替代内核 - Liqourix、Debian testing/unstable、AVLinux、Aptosid(不确定 Aptosid 是否支持 oss)
Debian 和 Ubuntu 上的 Liquorix,其存储库还提供 wine 1.5、一些库和固件/驱动程序(wifi、以太网)
# LIQUORIX HOW-TO: sudo nano /etc/apt/sources.list # ADD LINE: deb http://liquorix.net/debian sid main # CTRL+O, ENTER, CTRL+X (save,exit) sudo apt-get update sudo apt-get install '^liquorix-([^-]+-)?keyring.?' sudo apt-get update sudo apt-get install linux-image-3.7.0-8.dmz.1-liquorix-686 # REBOOT # I have intel 2200 wireless card so: sudo apt-get install firmware-ipw2x00
Liquorix 内核可以通过元包安装。这将确保在每次升级时都安装最新的内核。
liquorix 存储库中的所有软件包都已签署。运行以下命令以安装 liquorix.net 的密钥环软件包。
apt-get install liquorix-keyring
32 位无 PAE(HIGHMEM4G)
apt-get install linux-image-liquorix-686 linux-headers-liquorix-686
32 位带 PAE(HIGHMEM64G)
apt-get install linux-image-liquorix-686-pae linux-headers-liquorix-686-pae
64 位
apt-get install linux-image-liquorix-amd64 linux-headers-liquorix-amd64
#!/bin/sh NETON=`ifconfig | grep aros0` if [ "$NETON" = "" ]; then echo "Installing bridge network... (sudo access required)" sudo tunctl -b -u "$USER" -t aros0 sudo ifconfig aros0 192.168.166.1 sudo iptables -t nat -A POSTROUTING -o eth0 -s 192.168.166.0/2 -j MASQUERADE sudo iptables -t nat -A POSTROUTING -o wlan0 -s 192.168.166.0/2 -j MASQUERADE sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward" fi echo "Set your AROS config to:" echo " device : tap.device" echo " IP : 192.168.166.2" echo " Mask : 255.255.255.0" echo " Gateway : 192.168.166.1" echo " Primary DNS : 8.8.4.4" echo " Secondary DNS : 208.67.222.222"
Arch 上的网络配置与其他发行版不同,特别是缺少通常用于创建 TAP/TUN 设备的 UML 工具。
#!/bin/bash # tap unit number. This should match the UNIT= parameter in # AROSTCP/db/interfaces # IP address for the tap interface. Inside AROS, this will be your default gateway. # NOTE: Make sure it is in a different network than your Linux host. tap_ip=192.168.254.254 # create the interface #iface=$(sudo ip tuntap add name aros$tap_unit mode tap) iface="aros0" masq_iface="enp2s0" sudo ip tuntap add name $iface mode tap echo "Created tap device: $iface" # bring it up echo "Setting $iface to IP adress $tap_ip and bringing it UP" sudo ifconfig $iface $tap_ip up sudo chmod 666 /dev/net/tun # turn on NAT # (NOTE: make sure that the network interface you are using is named "eth0". # Otherwise adjust the following line to your needs.) echo "Configuring NAT routing from interface $masq_iface" sudo iptables -t nat -A POSTROUTING -o $masq_iface -j MASQUERADE # Turn on IP forwarding sudo sysctl net.ipv4.ip_forward=1 # start AROS cd ~/AROS ./Arch/linux/AROSBootstrap # aros has finished, so kill the interface sudo ip link delete $iface # maybe turning off routing is a good idea as well sudo sysctl net.ipv4.ip_forward=0
将此添加到 Devs/Mountlist
WORK: FileSystem = emul.handler Device = WORK:/home/mazze/arosdev LowCyl = 0 HighCyl = 0 Surfaces = 1 BlocksPerTrack = 1 DOSType = 0x454D5500 Activate = 1
并将例如 mount work: 添加到 s:user-startup
HOST: FileSystem = emul-handler Device = Host:/ LowCyl = 0 HighCyl = 0 Surfaces = 1 BlocksPerTrack = 1 DOSType = 0x454D5500 Activate = 1 HOME: FileSystem = emul-handler Device = Home:~ LowCyl = 0 HighCyl = 0 Surfaces = 1 BlocksPerTrack = 1 DOSType = 0x454D5500 Activate = 1 CD2: FileSystem = emul-handler Device = CD2:/media/label_of_drive/some_directory/Some_subdirectory LowCyl = 0 HighCyl = 0 Surfaces = 1 BlocksPerTrack = 1 DOSType = 0x454D5500 Activate = 1
通常,如果插入了 CD 或 DVD,Linux 将在 /dev/cdrom 下看到它们。您将无法直接从该位置查看内容,例如通过执行 cd /dev/cdrom 或 ls .
您可以通过创建挂载点或使用现有的挂载点(例如 /media)来挂载此 CD
运行以下命令
sudo mount /dev/cdrom /media #you can use your custom mount point as well if this is on your desktop or somewhere else e.e. /media/cdrom
一个 更新的 Icaros 1.26(在 Debian/Ubuntu 上)指南
将 keycode2rawkey.table 放入 Devs/Keymaps/X11
- 在主机上安装 tunctl 命令
sudo apt-get install uml-utilities
- 将 Icaros CD 复制到您主目录中的名为“AROS”的文件夹中
- 从 Linux 托管的每日构建存档中复制以下文件
AROS.boot boot/* Devs/AHI/aros.audio Devs/AudioModes/AROS Devs/Drivers/unixio.hidd Devs/keymaps/X11 Devs/Monitors/X11 Devs/Networks/tap.device Libs/oss.library Devs/timer.device
- 删除 Devs/Monitors/Nvidia
- 编辑 boot/AROSBootstrap.conf 以满足您的需求(例如,添加“memory 256”以将 256 MB RAM 分配给 AROS)
- 在 S/icaros-sequence 中,删除行“assign system: sys:”
- 在 AROS 文件夹中创建脚本 bootaros.sh,确保您阅读了注释。必要时调整
#!/bin/bash # tap unit number. This should match the UNIT= parameter in # AROSTCP/db/interfaces tap_unit=0 # IP address for the tap interface. Inside AROS, this will be your default gateway. # NOTE: Make sure it is in a different network than your Linux host. tap_ip=192.168.254.254 # create the interface iface=$(sudo tunctl -b -u `whoami` -t aros$tap_unit) # bring it up sudo ifconfig $iface $tap_ip up sudo chmod 666 /dev/net/tun # turn on NAT # (NOTE: make sure that the network interface you are using is named "eth0". # Otherwise adjust the following line to your needs.) sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # Turn on IP forwarding sudo sysctl -w net.ipv4.ip_forward=1 # start AROS cd ~/AROS ./boot/AROSBootstrap # aros has finished, so kill the interface sudo tunctl -d $iface &> /dev/null # maybe turning off routing is a good idea aswell sudo sysctl -w net.ipv4.ip_forward=0
- 使脚本可执行
chmod u+x bootaros.sh
- 从 shell 启动脚本
cd ~/AROS ./bootaros.sh
- 在 AROS 内部,网络设置必须这样配置
Device: tap.device IP address: 192.168.254.1 Gateway: 192.168.254.254 DNS1: The IP of the name server that is also used by your Linux host DNS2: The IP of the name server that is also used by your Linux host
事实上,变体的使用是 Michal Schulz 对 Efika 端口使用的延续。变体是一个“子架构”。arch-cpu 中的东西可以被 arch-cpu-variant 覆盖。这样,就有通用的 ppc-chrp 代码和 ppc-chrp-efika 代码。这就是 Android 和 iOS 端口使用的方式。甚至可以确定 Michal 是为了这个目的引入变体的。一段时间以前,需要对某些组件进行版本控制,以便能够验证它们是否匹配。例如,基于磁盘的 tap.device 需要知道它确实运行在它构建的系统上。这种需求源于许多东西在不同 Unix 上源代码兼容但二进制不兼容。例如,相同的 tap.device 代码可以为 Linux 和 Darwin 构建。它们将使用相同的宿主操作系统调用,但传递给它们的参数在二进制上不兼容。Darwin 版本的 tap.device 不会在 Linux 托管的 AROS 上运行,反之亦然。为了防止难以解释的崩溃,引入了这些组件的运行时版本控制。
以下模块参与其中
- kernel.resource,作为主要的架构相关部分,以 arch-cpu 的形式携带架构名称。例如“linux-i386”。可以使用 KrnGetSystemAttr() 函数查询它。
- Bootstrap。它在其 HostInterface 中提供相同的字符串。这些字符串必须匹配,否则内核将拒绝启动。您不能错误地将 Linux 内核启动在 Darwin 系统上。
- unixio.hidd 在其内部携带相同的字符串。启动时,它会自行验证与 kernel.resource,确保匹配。当某些外部模块打开 unixio.hidd 时,它可以提供 Architecture 属性。unixio.hidd 将比较给定的字符串与其自己的此类字符串。如果出现不匹配,Intuition 请求器将弹出,HIDD 将拒绝实例化其对象。
现在,在引入 Android 构建后,很明显 Android 不是 Linux。Android 的 libc 与 glibc 并不真正二进制兼容。为了区分它们,引入了一条规则:具有变体的系统与没有变体的系统不同。如果指定了变体,arch-cpu 将被替换为 variant-cpu。唯一的例外是出于传统原因的“pc”架构。引入 AROS_TARGET_PLATFORM 制作变量,该变量携带此名称。它也被包含在所有架构特定模块的版本字符串中,以便用户可以使用 Version FULL 命令轻松确定他们拥有的版本。这实际上使得变体不适合仅指定一些描述性构建名称。例如,如果您构建 Linux 托管发行版,并将变体用作发行版名称,那么您的模块将仅与其他模块兼容。您的发行版用户将无法升级,例如 oss.library,从主干。它将不起作用,并会显示“不兼容的架构”。
目前,这对原生系统没有影响,但是...谁知道将来会发生什么。以这种方式使用变体作为发行版名称会导致歧义。发行版的模块将被版本化为“arosmax-i386”(例如),而主干模块将被版本化为“pc-i386”。
我不知道变体最初并非用于我使用它的目的。在这里很好地描述了用法。可以重新实现 AROS_TARGET_PLATFORM 的定义,这样变体名称不会始终用于平台指定,而是平台名称将由配置脚本显式设置。但是,enable-target-variant 仍然将用于选择 Android、iOS 和 Efika 目标。您将无法使用它,您将希望构建 Android 托管发行版。
去年引入了 ELF 包装器。当针对 AROS 的 gcc 用于 AROS 时,它被使用。这是在 Windows 和 MacOS 上构建的默认情况(因为本机主机编译器无法生成 ELF 文件)。此包装器执行与 AROS 包装器对 Linux gcc 所做的事情类似,只是以相反的方式。AROS 包装器使 Linux gcc 生成可重定位二进制文件,而 ELF 包装器使 AROS gcc 生成静态二进制文件。目的是摆脱另一个 ELF 针对的工具链,将其用作 $KERNEL_CC。
ELF 标头以宏大的方式开始,带有 x7f 魔数和 16 个字节,包括以 null 结尾的“ELF”标记。从那里,它似乎在恶化,因为 ELF 标头缺少程序标头,该程序标头指示模块是“可重定位的”并且需要链接编辑,然后“加载”。忽略这一点,查找节标头,我们使用 shoffset 条目,它指向 0x36bd4(偏移行 0x0020),但是,在对 aros-bsp-darwin 模块执行(OS X)“hexdump -C”之后,此文件中的搜索偏移似乎不遵循预期的 ELF 节标头格式。
- AROS 启动模块是可重定位的。没有 boot.img。
- MorphOS 启动模块加载到某个特定地址。您无法在托管环境中执行此操作,并且在本地环境中也无需执行此操作。
- 重定位由引导程序执行。查看其 ELF 加载程序代码。它与 InternalLoadSeg_ELF() 相同。ELF 具有 ET_REL 类型,这足以看出它是可重定位的。
SC_ENABLE/SC_DISABLE 用于确保新任务在禁用或启用状态下继续运行,具体取决于它上次切换时的状态。例如,在内部,Wait() 会在禁用状态下导致任务切换,当任务再次运行时,它必须处于禁用状态。
SC_DISABLE 和 SC_ENABLE 会戳一下内核使用的 Unix 信号处理程序(上下文)的“旧信号掩码”。因此,当 Unix 信号处理程序“返回”时,被阻塞的 Unix 信号将被设置为该值。
arch/all-unix/exec/switch.c 中的旧代码会手动确保 SIGUSR1 没有被阻塞。
sigset_t temp_sig_int_mask; sigemptyset(&temp_sig_int_mask); sigaddset( &temp_sig_int_mask, SIGUSR1); sigprocmask(SIG_UNBLOCK, &temp_sig_int_mask, NULL); SysBase->AttnResched |= 0x8000; kill(getpid(), SIGUSR1); sigprocmask(SIG_BLOCK, &temp_sig_int_mask, NULL);
如果真的需要,可能有一些方法可以避免这种情况。
一个小的测试,它会玩弄信号的启用和禁用,并打印出 oldmask 的内容。其中一个发现是它在 PPC 上没有使用。我研究了 Linux 的 include 文件,注意到 ucontext 结构中还有一个 sigset_t。事实上,它与 x86-64 类似(我在 sigcore.h.x86_64.src 中找到了它)。应该使用它而不是 oldmask。
所以,实际上 PPC Linux 移植是有问题的。我修复了它。修复后,我遇到了类似的冻结!我将 SC_DISABLE() 宏从
sigfillset(&uc->uc_sigmask) to: uc->uc_sigmask = PD(KernelBase).sig_int.mask
一切都正常了!
PD(KernelBase).sig_int_mask 包含实际应该被 KrnCli() 禁用的信号集。它们不包括 SIGUSRs、SIGINT 和陷阱。因此,我只禁用了真正应该禁用的内容。现在一切都好了。
另一个很好的测试用例是冷重启函数。execvp()'ed 程序继承了当前的信号掩码,所以如果某些 SIGUSRs 被禁用,另一个 AROS 副本就会冻结。这在与 stackcheck 测试结合使用时尤其有效。stackcheck 测试用例会导致堆栈检查失败,最终导致 supervisor-mode Alert(),最终导致 ShutdownA(SD_ACTION_COLDREBOOT)。如果出现问题,AROS 将在重启时冻结。
如果我们想省略这些大型依赖项集,我们有 -quick 目标。例如,你可以使用“make kernel-dos-kobj-quick”来重建 just dos。然后,“make kernel-link-base-quick” 只会重新链接内核包(这是我为新式打包实现的,目前只有 Windows 主机使用它)。
如果主机内核现在也使用 SIGUSR2,请告诉 gdb 像 SIGUSR1 一样忽略它。在 .gdbinit 文件中或在 gdb 提示符下手动操作。
handle SIGUSR2 pass noprint nostop
Hostlib_init 在 UNIX 上是空的,因为目前 UNIX 主机是模块化的,没有 HostInterface。
如果它不使用 libstdc++,那么 .cpp 文件可以通过标准 gcc 编译,因为它识别 C++ 文件扩展名。……呃,它当然需要新 delete 函数……我做了一个小库来编译 TeXlive,而无需使用单独的 g++ 编译器。
根据 rom/kernel 重构 sams 内核代码,即会有像 createcontext.c 这样的文件。如果可能的话,将使用 rom/kernel 中的代码。rom/kernel 中的代码被设计为尽可能可重用。也请扔掉 arch/ppc-sam440/dos 目录。InternalLoadSeg_ELF() 和 InternalUnloadSeg() 的自定义版本只存在是因为 KrnRegisterModule() 和 KrnUnregisterModule() 有旧的定义,与它们的最终版本不同。自定义 runprocess.c 非常旧,需要删除,这个工作应该由通用 runprocess.c 来完成,它依赖于 exec.library/NewStackSwap()。我只是没有做,因为我无法在 PPC 上测试 NewStackSwap(它基于 runprocess.c 代码,所以应该可以正常工作)。通用 runprocess.c 已知是有效的,因为它在所有 i386 移植和其他 UNIX 主机移植中都工作。
在 pci.hidd 中添加了一些调试输出。现在它将报告 CreatePool() 的结果。还更改了实现中的某些内容。也许新的构建甚至会工作。事实上,它的行为非常接近原始版本。你能告诉我发生了什么 GURU 吗?如果你能在 createpool.c 和 memory.c 中启用调试并向我发送崩溃日志,那就太好了。只是为了确定。你能进入引导菜单吗?你能在没有启动序列的情况下启动吗?你能在 VGA/VESA 模式下启动吗?我提交了视频驱动程序自动选择(在我的上网本上运行正常)。回答,忘了本机移植使用自己的 exec_init.c,并且 PageSize 在那里是未初始化的。
所有主机移植。在非 Linux 操作系统上,根本无法获取地址 4。在遇到入口点问题后,我引入了一个新的宏 AROS_ENTRY 来缓解这个问题。
有 40KB 的最小堆栈空间!!!这在 aros/<cpu>/cpu.h(AROS_STACKSIZE)中定义。任务创建例程确保任务的堆栈大小不小于此值。这么大的数字来自主机 AROS。UNIX 信号处理程序和 X11 非常依赖于堆栈。但是,此参数似乎是硬编码的。也许应该根据系统调整这个参数?我建议添加一个内核属性(用于 KrnGetSystemAttr(),它将返回此值)。因此,对于本机操作系统来说,它不会那么大。在某些方面,它可以专门针对 m68k 的需求进行调整。考虑到我们的大部分软件来自 unix 世界,40KB 堆栈实际上太小了。据我所知,本机 g++ 需要*至少* 256 KB 堆栈,任何 3D 游戏都需要*至少* 512 KB 堆栈。
AROS 共享 Linux 和 BSD 的通用硬件和驱动程序支持。
不再有 boot/aros-unix 文件。有 boot/AROSBootstrap 文件,你应该运行它。
键盘/鼠标
目前,驱动程序实例化是在 x11gfx.hidd 初始化期间完成的,这发生在 dosboot 进行分配之前,因此 DEVS: 根本不存在(甚至 SYS: 也不存在)。基于磁盘的部分是为 DEVS:Monitors 创建的,类似于 GDI 驱动程序。它现在负责加载 X11 键映射。改进:现在你可以在图标工具提示中指定任何键映射文件名。当然,如果你没有指定任何内容,它将默认查找 DEVS:Keymaps/X11/keycode2rawkey.table。基本思路是将键映射缓冲区和存在标志移到 librarybase 中。基于磁盘的部分只打开驱动程序库并将键映射文件直接加载到它的基础中。基于磁盘的部分还包含创建其他显示器的代码,但预计它无法工作,因为驱动程序设计不佳。该调用被注释掉了,并带有一些注释。
GFX 芯片组
- x11.hidd
- x11 加速图形驱动程序。
音频芯片组
- oss.audio
- 通过主机 OSS 驱动程序播放音频。
理论上,oss.library 的 funcs.c 需要以一种方式编译,即 O_WRONLY、O_NONBLOCK 等是从主机(Unix)include 文件中获取的,而不是从 AROS include 文件中获取的。否则,它取决于运气(O_ 定义在 AROS 和所讨论的 Unix 操作系统上是否具有相同的值)它是否可以工作。恕我直言,这应该只通过 configure/mmakefile 传递必要的信息来完成。
VERTB 中断现在以什么速率发生?
50 或 60 Hz。用户指定(通过 vblank=NN 命令行参数)。事实上,你可以指定任何值。
它曾经是怎么样的
VERTB:始终为 50 Hz TIMERTICK:100 Hz(默认值,可以在启动 AROS 时使用“-t”参数更改)
如果它只以 50 Hz 的速率发生,一些类似于 AHI 驱动程序的东西将无法正常工作。此外,50 Hz 的通用计时器精度很差。这就是 TIMERTICK 补丁修复的内容。
- 现在有了 kernel.resource API,而不是 TIMERTICK 补丁。计时器仍然可以设置为 100 Hz。只需使用“eclock=100”命令行参数运行 AROS 即可。
- 此解决方案不具有前瞻性。事实上,timer.device 需要重写以测量实际间隔,类似于本机驱动程序。在这种情况下,计时器中断将根本没有稳定的频率。为了具有前瞻性,我将进一步重写驱动程序。它需要自己的 timerequest,例如设置为 1/1000 秒。这将导致当前的 timer.device 以最小间隔(由 eclock 参数指定)进行响应,而未来的 timer.device 将真正以 1/1000 秒进行响应。
在 bootstrap 的配置文件中实现“arguments”关键字是有意义的。现在,如果你需要,可以编写一个小脚本,在使用 eclock=100 参数运行 AROS 时运行它。我建议更简洁的解决方案。修改 configure.in 以使用 $(KERNEL_INCLUDES) 提供 -nostdinc(在检测到编译器的 include 路径后)。无论如何,$(KERNEL_INCLUDES) 都与 -nostdinc 一起使用,这样你就可以一石二鸟。如果 $(KERNEL_INCLUDES) 为空,则也不会提供 -nostdinc。
网络芯片组
- tap.device
- 通过 tap 进行网络。
似乎 pci.hidd 不再存在于 linux-i386 中。以下代码大约 4 个月前还能工作
if (!OOPBase_DRM) { if ((OOPBase_DRM = OpenLibrary("oop.library", 0)) == NULL) { /* Failure */ return -1; } } HiddPCIDeviceAttrBase = OOP_ObtainAttrBase(IID_Hidd_PCIDevice); if (!pciBus) { pciBus = OOP_NewObject(NULL, CLID_Hidd_PCI, NULL); if (!pciBus) return -1; }
现在,对 OOP_NewObject(NULL, CLID_Hidd_PCI, NULL) 的调用返回 NULL。liblist 命令也不再列出 pci.hidd。现在它们是基于磁盘的模块。你可以使用 LoadResource 命令手动加载它们,或者将它们添加到 AROSBootstrap.conf 中的 kickstart 列表中。
请记住,你不仅需要基本 pci.hidd,还需要 pcilinux.hidd,它是驱动程序本身。我默认不包含它们,因为 Linux PCI 驱动程序本质上是一个 hack,很容易使用它搞砸系统(通过尝试使用 Linux 正在使用的硬件)。
所有主机移植。在非 Linux 操作系统上,根本无法获取地址 4。在遇到入口点问题后,我引入了一个新的宏 AROS_ENTRY 来缓解这个问题。
这是日志
[Bootstrap] entering kernel@0x7f6.... Segmentation fault
调试器没有提供太多信息,但像 0x00007ffff76c509f 这样的地址很奇怪,因为我只有 4GB 内存。
gdb) run [Bootstrap] entering kernel@0x7ffff76c5000... Program received signal SIGSEGV, Segmentation fault. 0x00007ffff76c509f in ?? () (gdb) findaddr 0x00007ffff76c509f Searching in the loaded modules... Searching in the resident list... No struct type named Resident. #0 0x00007ffff76c509f in ?? () #1 0x00007fffffffdfc0 in ?? () #2 0x0000000000000000 in ?? ()
虚拟地址与物理内存的实际大小无关!
问题是,AROS x86_64 内核是在没有设置 -mcmodel 标志的情况下编译的,因此它默认为 -mcmodel=small。这意味着所有代码和数据都必须驻留在地址空间的前 2GB 内。这里并非如此,因此它会崩溃/出现分段错误或做一些其他奇怪的事情。
有两个解决方案 - 或者,使用 -mcmodel=large 编译整个 x86_64 aros 并忍受速度上的轻微损失。大型模型允许代码和数据驻留在地址空间中的*任何位置*,在这种情况下,一些 PC 相对寻址将无法使用。Gcc 会将所有分支设为 64 位大,因此速度会慢一些。
Tried (gcc-4.3 -m64 -mcmodel=large). No change.
mcmodel=large 会在 CPU 的总线线上产生更多流量,并消耗更多缓存。
每次加载数据 (mov %reg,addr) 都被替换为 movabs %reg,addr,这会使指令大小增加四个字节。对当前部分之外的部分的 PC 相对访问不再存在,并被绝对 movabs 指令替换。对任何子程序的每次调用(call function)都被替换为一对 movabsq %reg,function; call *%reg。但是,正如您提到的,cpu 从其缓存中获取大多数内容 - 因此,我认为我们使用它会“遭受损失”的暗示,充其量是误导,而且有点危言耸听(当然,从速度上来说 - 显然二进制文件大小会增加)。
总的来说,我不反对用 mcmodel=large 编译整个 AROS,这无论如何是 64 位系统唯一的明智做法,因为所有进程都使用单个地址空间。我只是提醒一下后果:)
另一种解决方案是在地址空间的前 2GB 内分配 AROS 的内存。可以使用匿名 mmap 和标志 MAP_32BIT 来完成。请检查,我已经添加了标志。抱歉遗漏了它,我不知道它为什么在那里。附言:gdb 支持修复正在进行中。基础设施已准备就绪,只需更新 _gdbinit 脚本即可。
因为新的 genmodule 内联不知道如何处理 64 位参数的 RA/RB 习惯用法。实际上,很久以前(在你进行 m68k QUAD 修复之前)在邮件列表上的讨论后,我实施了这个补丁,以解决两件事
- 在库调用期间的编译警告/错误中,没有出现明确的函数名称,因此程序员很难找出问题所在。
- 在 i386 上,libbase 被作为第一个参数传递,导致编译警告和错误中的参数数量减少一个,使程序员更加困惑。
通过修改 Exec/Init 以将其绑定到为其堆栈分配的 AllocMem()ed 区域来修复它们,但 sonic 删除了该通用代码。UNIX 主机内核现在应该将它的堆栈区域添加到内存列表中。
如果对 linux-i386 进行干净构建,仍然会得到相同的断言
/data/deadwood/tAROS/AROS/rom/oop/./setattrs.c, 71: bad pointer: attrList = $bface5fc /data/deadwood/tAROS/AROS/compiler/alib/./coercemethod.c, 59: bad pointer: message = $bface6a8 /data/deadwood/tAROS/AROS/rom/oop/./setattrs.c, 71: bad pointer: attrList = $bface600 /data/deadwood/tAROS/AROS/compiler/alib/./domethod.c, 60: bad pointer: message = $bface6a8 /data/deadwood/tAROS/AROS/compiler/alib/./coercemethod.c, 59: bad pointer: message = $bface658 /data/deadwood/tAROS/AROS/compiler/alib/./coercemethod.c, 59: bad pointer: message = $bface658 /data/deadwood/tAROS/AROS/rom/exec/./doio.c, 54: bad pointer: iORequest = $bface64c /data/deadwood/tAROS/AROS/rom/exec/./putmsg.c, 56: bad pointer: message = $bface64c /data/deadwood/tAROS/AROS/rom/exec/./getmsg.c:65: bad pointer: msg = $bface64c /data/deadwood/tAROS/AROS/rom/exec/./doio.c, 54: bad pointer: iORequest = $bface64c /data/deadwood/tAROS/AROS/rom/exec/./putmsg.c, 56: bad pointer: message = $bface64c /data/deadwood/tAROS/AROS/rom/exec/./getmsg.c:65: bad pointer: msg = $bface64c
您使用—enable-debug=messages 配置了 AROS。这就是您收到这些额外断言的原因。您能运行 ShowConfig 并告诉我它的输出(以及来自同一运行的一些断言)吗?也许 3K 还不够。
其他
[edit | edit source]这意味着我需要在所有 AROS 模块中取消与 UNIX 库的静态链接。
目前,除了 exec.library 和 kernel.resource 之外,我已经在所有 AROS 核心模块中完成了这项工作(它们将是最后两个,因为这样做实际上意味着切换到模块化 kickstart)。我已经重写了 emul.handler 和 oss.library,我还会对 tap.device 做同样的事情。
但是,我没有太多时间,我计划暂时省略以下内容:
1. uxser.hidd(UNIX 主机串行端口 HIDD) 2. uxpar.hidd(UNIX 主机并行端口 HIDD) 3. lxpci.hidd(PCI 总线驱动程序) 4. linuxfb.hidd - Linux 帧缓冲区驱动程序。5. unixio.hidd - 用于处理异步 I/O 的组件。
首先,我认为 unixio.hidd 应该被弃用。Kernel.resource 有 IRQ API,它允许以非常干净的方式处理 SIGIO。这使 unixio.hidd 变得多余。emul.handler SIGIO 代码可以作为示例。我不喜欢 unixio.hidd,因为它通过将所有请求集中在一个地方来降低性能,并在 Linux 上引入了基于计时器的轮询循环(我认为并非所有设备都实际发出 SIGIO)。
我思考了很久,但没有找到任何理由保留 unixio.hidd。起初我认为它可以是一个很好的抽象层,但这是一个错误的建议。在比较了几个类似 UNIX 的操作系统之后,我得出一个结论,即这不会提供任何抽象。这是因为所有需要提供给像 ioctl 这样的操作的结构值,甚至主机错误代码,都严格依赖于当前主机。不同的 UNIX 并非二进制兼容,因此我们仍然需要为运行的所有主机提供个人版本的驱动程序(例如 oss.library)。无法互换它们。
因此,我建议直接删除 unixio.hidd。有没有人反对?
其他提到的组件至少需要重新设计。linuxfb hidd 在我的系统上不起作用(只是崩溃),看起来没有人测试过它,所以我认为它已经成为弃件。当然,我不会从树中删除它,只是有人需要接手并照顾它。PCI 驱动程序很快就会修复,这非常容易。我只是认为目前没有人积极使用它,所以可以等待。串行和并行驱动程序也不会被删除。我会重写它们,只是我认为这是一项低优先级任务。所以这就是我为什么问这个问题的原因 - 有人积极使用这些驱动程序吗?如果它们在一段时间内停止工作,会有人受到影响吗?
“错误指针”地址是由于 ASSERT_VALID_PTR() 宏中的 TypeOfMem(ptr) 返回 0。TypeOfMem() 返回 0 是因为该内存从未从已知内存区域中分配过。该内存从未分配过,因为它位于 AROS Bootstrap 的 main() 的堆栈上。解决方法是让维护 AROS Bootstrap 的人将 strap 堆栈的 MemHeader 添加到内核中,作为不可分配的内存段。
只是运行 linux-i386 的 ./boot/AROSBootstrap。这些断言出现在
[DOS] DosInit: InitCode(RTF_AFTERDOS)
也许您启用了某些调试选项。好吧,没关系,这个问题现在应该消失了。我将添加引导堆栈区域到内存列表的补丁移植回去了。
我认为新的 linux-i386 中的 gdb 支持仍然存在一些问题。在某些应用程序(例如 ScreenMode 首选项)中,如果我在代码中添加 asm("int3") 并尝试 loadseg 符号,gdb 不会有任何抱怨,但符号不会被解析(我只是看到没有行号的函数名称)。另一方面,其他东西,如 muimaster 或 intuition,它们的符号已正确加载。使用 objdump 检查内核模块,也许在重新链接期间,dwarf2 信息会被剥离。模块是否在 modlist 输出中正确列出(带有路径)?
在 Linux 主机上切换桌面时,键盘映射会发生变化,在 Ubuntu 上运行 Linux 主机,我的笔记本电脑与默认键盘映射不兼容(例如,光标键不起作用),因此我制作了一个自定义的 keycode2rawkey.table 文件,效果很好。直到我切换桌面,再切换回 AROS。当我切换回来时,使用的是默认键盘映射,而不是我复制到 Devs/Keymaps/X11/keycode2rawkey.table 的键盘映射。
但是,loadseg 无法加载信息。“modlist”列出了迄今为止加载的基于 DISK 的模块。据我所知,ROM 模块始终“开箱即用”地提供调试信息。有什么变化吗?现在,它们也由引导程序从磁盘加载。它们不再静态链接。但现在有两个列表,而不是一个。
据我所知,要使模拟工作,您的驱动程序需要是帧缓冲区驱动程序(aHidd_Gfx_NoFrameBuffer = FALSE),并且您需要实现 Show 方法来调用 super 方法。
此信息已过时。该限制已在当时被移除,现在模拟也适用于 NoFrameBuffer 驱动程序(VESA 需要这样做)。
我感到困惑,因为我正在使用 AROS SDK 中的 Linux 交叉编译器为 AROS 编译,我的应用程序大量使用多线程,并从许多不同的线程调用 malloc() 和 free() 等函数。但是,一切运行良好...... 如果 C 运行时不是线程安全的,它不应该很快崩溃吗!?在 Linux 中,如果您使用 -pthread 编译,那么将使用线程安全的 malloc() 版本来代替标准版本(它不是线程安全的)。我不知道这是否也适用于 AROS...... AROS 没有 PThread 库。但是,C 运行时库的一部分位于共享库中,本质上是可重入代码。只有静态链接的 C 运行时部分才能是线程不安全的,如果我没记错的话。
每次我检出 AROS svn 时,它都会要求我输入登录名和密码。此外,它还警告我凭据将以未加密方式存储。AROS 每晚构建机器如何自动工作?我们在 SVN 中是否有预定义的只读帐户?某些 svn 客户端会记住用户名和密码。我认为旧的 svn 客户端会存储未加密的凭据。Mac OS X 上的 SVN 将使用 Keychain,它可以通过图形界面自动工作。如果您想从 ssh 使用 Keychain,那么您需要先解锁 Keychain,使用以下命令:security unlock-keychain ~/Library/Keychains/login.keychain
我的机器将如何上传二进制文件?我相信我需要一些 ssh 证书?您需要在您的机器上创建一个 ssh 密钥对,并将您的公钥输入您的 sourceforge 用户帐户中。您可能需要在 sf.net 上搜索一下,以找到有关这一切工作原理的更多详细信息。您还需要在每晚构建配置文件中提供您的 sourceforge 用户名。IRC 您还需要在 sourceforge 服务器上的主目录中创建一个这样的链接
aros -> /home/groups/a/ar/aros
UNIX 主机内核现在应该将它的堆栈区域添加到内存列表中。
有人知道问题出在哪里吗?我刚刚添加了 i386-darwin 构建到 download-descriptions 中。我看到二进制文件上传正常。更奇怪的是,例如德语页面也失败了,但我没有更改它。有人能帮忙吗?我不熟悉我们网站的工作原理。该页面已修复。每次您添加一个新包时,都需要重建页面。我正在进行重建,因为自动重建已经很久没有使用了。如果您添加了一个新包,请给我发邮件,确保我重建网页。
我遇到了与 64 位 Linux 主机相同的问题 - mmap() 分配了超出 2GB 空间的内存。而且 - 没有 MAP_32BIT。有人知道该怎么做吗?在 Darwin 和 BSD 上,MAP_32BIT 有什么解决方法/替代方法吗?我研究了 Darwin 文档,他们使用小型 PIC 代码模型来构建 x86-64 二进制文件。看起来这可以让他们免受这个问题的困扰,他们不需要显式使用低内存?*BSD 人员对此做了什么?或者我们唯一能做的事情是更改 AROS 64 位代码模型?至少对于某些版本来说是这样。我知道,这不是很好,但也许别无选择。
内存池
[edit | edit source]对于这种架构,您可以指定小型虚拟页面大小。也许它们还可以使用内核分配器的另一种实现(类似于当前的 AllocMem()/FreeMem())。当前的实现将使用小型页面来增加内存使用量(它使用每个页面一个 UBYTE 来进行内存映射)。另一种实现可以在管理的内存本身中存储管理信息。在我的实现中,我没有这样做,因为它允许完全禁用对所有未分配页面的访问。
如果内核返回页面大小为 0,则假定 MMU 缺失。然后,exec 回退到 MEMCHUNK_TOTAL 块。我希望这是可以接受的。使用此设置,新的内存池实现的行为与旧的实现完全相同,其中 threshSize == puddleSize。我希望这不是一个很大的损失。我可以进一步调整它来处理 threshSize,但我认为这实际上并不需要。
我还期望 FreePooled() 的性能得到提升。您能对此进行基准测试吗?
剩余部分将在 kernel.resource 中完成。它将有两个版本的内存管理器:支持 MMU 的版本和不支持 MMU 的版本。不支持 MMU 的版本将是 exec 中的旧 AllocMem()/FreeMem() 实现。现在不用担心,我已经有了一个想法,我会自己做。
我建议您在 m68k 端口中保留这两个版本(除非您真的想节省 ROM 空间)。Amiga 可以使用 68030 或更好的处理器,在这种情况下,AROS 能够检测到它并利用它。
这仍然是一个开放的讨论话题。我故意只提交了池。如果您仔细查看,您会发现它们仍然在 AllocMem()/FreeMem() 之上工作。内核的分配器已经准备好了,而且可以工作,但是我想逐步地将它们全部合并。我同意,在如此低的级别上,很容易破坏某些东西。
新系统背后的理念:水坑大小始终是页面大小的整数倍。代码中解释了其余的更改,我已经仔细地注释了它。我希望您会喜欢其中的一些想法。它应该比旧的实现更快。
这样做是因为此后我们可以为池分配保护属性。例如,可以有可执行池和不可执行池。
水坑大小是页面大小的整数倍。新的 kernel.resource 分配器是基于页面的。
至于行为不端的软件,也许可以在早期启动控制中以某种方式处理它。是的,这可能很困难。仍然可以进行实验。MMU 很好,直接丢弃它不是一个好主意。
缺少 Zune 类 Application.mui,但它在我们的 muimaster.library 中。检查 workbench/libs/muimaster/classes/application.c。它是一个内置类。
/master-linux-i386/bin/linux-i386/AROS/Development/include/sys/socket.h:288: 错误:预期在‘u_short’之前出现说明符限定符列表
我担心所有网络软件都会发生同样的情况。我们可以重新考虑这个更改吗?我更希望默认情况下只有 POSIX,而其他旧版 UNIX 需要通过定义来启用。我同意,如果未使用任何遗留功能,网络代码应该能够在不定义 __BSD_VISIBLE 的情况下进行编译。但这应该通过使我们的网络包含文件符合 POSIX 标准来完成。
我使用的软件代码实际上使用了 u_char/u_short 类型。如果我们完全删除它们,代码将无法编译。使用 u_char/u_short 的代码需要 __BSD_VISIBLE 定义才能使其工作,以表明它需要进行现代化。但应该在某些移植 HOWTO 中进行适当的记录。
我认为,对于第三方开发人员来说,他们的软件无需修改即可编译,而不是必须浏览我们的头文件来学习如何使网络工作,这将是有益的。
在我进行拆分时,我进行了更多分离,因此如果您能等到它移植过来,将会有所帮助。不过,我还没有在网络包含文件方面做太多工作。这被列入 TODO 列表,因为我认为它不会对 ABI 产生影响;只有编译影响。顺便说一下:测试/cplusplus/headertest.cpp(可以使用 make test-cxx 进行构建)中剩余编译错误的一半来自网络头文件或 sys/types。
在您的工作被整合到主分支之前,我们可以暂时重新启用定义 __BSD_VISIBLE 吗?我至少会投票支持 V0 分支,因为它永远不会被您的 ABI 工作“修复”。我可以在 V0 上再次启用它。
我认为它通常应该由“编译”环境提供,而不是在某种头文件中提供。这是我想坚持使用 -D__BSD_VISIBLE 的原因之一。您可以尝试 sys/types.h
抱怨视频并抛出错误。
[Bootstrap] entering kernel at 0xf73e6000... DisplayPlanes = 24 DefaultDepth = 24 BITS PER PIXEL = 24 [I2C] Init [ATI] Init [drm(INFO)] Failed detecting card for VendorID: 0x10de [KRN] Trap signal 11, SysBase f43e71f0, KernelBase f43e7f18 SP=f4cfe4ac FP=f4cfe4f8 PC=00000000 R0=f43e71f0 R1=00000000 R2=00000000 R3=00000006 R4=f460e720 R5=f4d14f20 FELSunxi DoMethodA ConfigChangedEvent bash-4.2$
要删除本机驱动程序,正在逐渐接近,从 nightly 版本复制驱动程序使其看起来更正常,但现在我在 X11 中遇到软件故障。
Icaros 桌面基于 ABI-v0-on-trunk,但它需要托管 abi v0。
我只测试了 modList 命令,它似乎工作正常。请检查并修复(如果需要)其余部分。我希望代码足够清晰。使用 ROM 和 DISK 模块进行测试。modlist 列出了它们,代码行已解析,全局和局部变量已解析。
如果您谈论 PIC 和 GOT,这是否也意味着我们可以拥有共享对象?
我们也许可以,但请不要这样做。不要复制 OS4 中的糟糕设计决策。使用共享对象的 OS4 程序与其他操作系统(Linux、Windows 等)上的启动速度一样慢。
+1,我真的很想避免将 .so 概念与本机 AROS .library 概念混合在一起。
是的,小模型假定代码和数据都在最低的 2GB 区域内。在这种情况下,内存加载和跳转以 PC 相对方式执行,相对于当前指令指针偏移 +-2GB。
是的,其他模型是
- 中等 - 代码和数据驻留在最低内存区域,大型数据可以驻留在地址空间的*任何位置*
- 大型 - 代码和数据可以驻留在地址空间的任何位置
- 内核 - 代码和数据驻留在地址空间的最高 2GB 区域
请注意,代码和数据位置指的是 ELF 文件的节。代码本身进行的所有分配,以及堆栈指针,可以驻留在所有模型的地址空间的任何位置。
我也想知道不同代码模型对代码大小、堆栈使用、速度等的影响。
此外,我可以使用 ELFOSABI_AROS 定义(为 AROS 保留的 ELF ABI 编号)。但是,这将要求使用 AROS 版本的 binutils 进行链接,Linux ld 将不再使用。
我一直想让 AROS 程序成为真正的 ELF 程序(尽管仍然保留重定位信息),但我认为这也应该是 ABI V1 的一部分。
啊,来吧!我们可以轻松地扩展 internalloadseg_elf :-D
+1 支持真正的可执行文件 :)
当然可以!这是我在 ABI_V1 分支中完成的重大工作之一。数据存储在 AVL 树中。这是“每个调用方任务存储中的共享模块处理”。如果是这样,你能告诉我 SVN 中的代码吗?
它在 genmodule 中完成。您可以为库选择不同的选项。如果您没有指定,则只生成一个 libbase 并将其返回给每个 OpenLibrary 调用。如果您指定 peropenerbase,则为每个 OpenLibrary 调用获得一个基地址。如果您指定 peridbase,则为每个任务获得一个单独的基地址。它将 Task 指针与返回地址一起作为 ID,以决定是否需要生成新的 libbase(类似于 arosc.library 在之前的做法)。之所以称为 peridbase,是因为您可以重载返回 ID 的宏。当我将其合并到主分支时,我可能会删除此功能,并将选项名称更改为 pertaskbase。
当我单击 Scout 中的“居民”时,它会崩溃。不幸的是,add-symbol-file 不起作用,所以我无法提供回溯。(在 linux-i386 上测试)。Scout 使用 build_program 宏构建,正如我之前提到的,它在提供调试符号方面存在问题。
您可以执行以下操作
- 在 build_program 宏行之前放置 TARGET_STRIP := $(STRIP)
- 在 gdb 中,首先对堆栈底部的地址执行 loadseg,这将加载内核的调试符号,然后执行 bt,然后再次尝试加载堆栈顶部的调试符号。我注意到,此过程有时对于可执行文件是必需的(而我以前从未像这样对库执行此操作,例如)
尝试更改第 95 行 -
extraoptions="--bindir=$(CROSSTOOLSDIR)"
为
extraoptions="--bindir=$(CROSSTOOLSDIR) --with-gmp=$(CROSSTOOLSDIR)"
在与 Plesk suexec 和 apache 搏斗之后,我现在有了 Trac 的第一个设置。您可以在此处找到它:http trac stafverhaegen be/trac。您可以四处看看。实际上,我想将其提供为 http trac aros org/trac,如果您将 IP 放在您的 /etc/hosts 文件中,您现在就可以这样做(Windows 用户需要自己找出如何操作)。
83.169.4.30 trac aros org
安装了最新的 Trac 版本,因为默认的 0.10.something 版本不喜欢。目前无法登录,但您已经可以查看 Subversion 源代码浏览器。这是一个静态镜像,它不是主干的同步镜像,目前没有保持同步。(将来创建一个新的镜像,并同步 Trac)。
接下来要解决的事情
- 登录管理器设置,以便人们可以使用登录管理器 Trac 插件进行注册。由于 Trac 和 SVN 似乎都使用普通的 Apache 密码文件,因此可以使用其他管理器。有人有好的建议吗?
- 设置 SVN 服务器,以便人们可以访问它。
CD2: FileSystem = cdrom-handler Device = Home:~ LowCyl = 0 HighCyl = 0 Surfaces = 1 BlocksPerTrack = 1 DOSType = 0x454D5500 Activate = 1 CD0: FileSystem = L:cdrom-handler Stacksize = 10000 Priority = 5 GlobVec = -1 Mount = 1 BufMemType = 0 Device = scsi.device Unit = 1 LowCyl = 0 HighCyl = 0 Surfaces = 1 BlocksPerTrack = 1 DosType = 0x43444653 Control = "ROCKRIDGE LOWERCASE" /* see below */