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 */