รวบรวมเคอร์เนล 32 บิตบนเครื่อง 64 บิต


23

ฉันพยายามรวบรวมเคอร์เนลสำหรับเครื่อง Intel Atom แบบ single-core 32 บิต การคอมไพล์กำลังใช้เวลาไม่มาก มันใช้เวลาประมาณ 2 ชั่วโมงและยังผ่านโมดูลไดรเวอร์ได้เพียงครึ่งเดียวเท่านั้น

การคอมไพล์เคอร์เนลบนเดสก์ท็อปหลักของฉันใช้เวลาเพียง 15 นาที แต่มันเป็นเครื่อง 64 บิต ฉันสามารถคอมไพล์คอมไพล์เพื่อสร้างแพ็คเกจเคอร์เนล 32 บิตจากเครื่องที่ดีกว่าได้หรือไม่?


เครื่องเสมือนสามารถทำได้ แต่จะช้าลง
Tachyons

1
ใช่และฉันสามารถบูตดูอัล แต่ฉันแน่ใจว่ามันเป็นไปได้ที่จะรวบรวมสิ่งต่าง ๆ สำหรับแพลตฟอร์มอื่น ๆ โดยไม่ต้องออกจากสภาพแวดล้อมปัจจุบัน
Oli

นั่นเป็นสิ่งที่น่าสนใจ +1 ed
Tachyons

คำตอบ:


27

ในขณะที่เคอร์เนลสามารถถูกคอมไพล์ข้ามวิธีที่ง่ายที่สุดคือการสร้าง chroot 32 บิต (i386) และสร้างในนั้น

ติดตั้งubuntu-dev-tools:

$ sudo apt-get install ubuntu-dev-tools

สร้าง i386 chroot:

$ mk-sbuild --arch=i386 precise

(คุณอาจต้องเรียกใช้สองครั้งครั้งแรกติดตั้งschrootฯลฯ และตั้งค่าmk-sbuild)

จากนั้นป้อน chroot:

$ schroot -c precise-i386

และสร้างเคอร์เนลตามปกติ


11
สิ่งปลูกสร้างใน chroot เป็นวิธีการที่ถูกต้องตามที่นักพัฒนาในทีมเคอร์เนลของ Ubuntu ใช้
โคลินเอียนคิง

เหล่านี้เป็นเครื่องมือที่ดูสวยแฟนซี พรุ่งนี้ฉันจะให้มันยิง ขอบคุณ
Oli

โปรดขยายใน "ตามปกติ" ปกติแล้วฉันจะทำตามคำแนะนำที่help.ubuntu.com/community/Kernel/Compileแต่พวกเขาไม่ทำงานภายใน chroot - build ตายด้วย 'ข้อผิดพลาดร้ายแรง: linux / compiler.h: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว'
Alistair Buxton

การติดตั้งโฮมโฟลเดอร์ของคุณใน chroots ดูเหมือนจะเป็นการเพิ่มที่ดี: wiki.ubuntu.com/SimpleSbuild#Mount_your_home_dir
int_ua

5

ตอนนี้, ใน gcc, คุณสามารถตั้งค่า-m32สถานะเพื่อให้คอมไพล์แหล่งที่มาของ linux เป็น 32 บิต ฉันไม่มีความรู้ที่กว้างขวางเกี่ยวกับ Makefiles แต่คุณสามารถปรับแต่งได้

แก้ไข: ฉันต้องการเพิ่มคำถามจาก stackoverflowที่นี่ซึ่งได้รับคำสั่งให้ตั้งค่า cflags:

export CFLAGS=-m32

และจากที่เก็บ linux ในบัญชี Github ของTorvaldsฉันพบส่วนต่อไปนี้ใน makefile หลักที่คุณอาจพบว่ามีประโยชน์เพราะมันบอกว่าคุณสามารถตั้งค่าสถาปัตยกรรมเป้าหมายโดยการตั้งค่าตัวแปรสภาพแวดล้อม อ่านความคิดเห็นปัจจุบันบรรทัดเหล่านี้มาจากไฟล์นี้ระหว่างบรรทัด174-196 :

# Cross compiling and selecting different set of gcc/bin-utils
# ---------------------------------------------------------------------------
#
# When performing cross compilation for other architectures ARCH shall be set
# to the target architecture. (See arch/* for the possibilities).
# ARCH can be set during invocation of make:
# make ARCH=ia64
# Another way is to have ARCH set in the environment.
# The default ARCH is the host where make is executed.

# CROSS_COMPILE specify the prefix used for all executables used
# during compilation. Only gcc and related bin-utils executables
# are prefixed with $(CROSS_COMPILE).
# CROSS_COMPILE can be set on the command line
# make CROSS_COMPILE=ia64-linux-
# Alternatively CROSS_COMPILE can be set in the environment.
# A third alternative is to store a setting in .config so that plain
# "make" in the configured kernel build directory always uses that.
# Default value for CROSS_COMPILE is not to prefix executables
# Note: Some architectures assign CROSS_COMPILE in their arch/*/Makefile
export KBUILD_BUILDHOST := $(SUBARCH)
ARCH        ?= $(SUBARCH)
CROSS_COMPILE   ?= $(CONFIG_CROSS_COMPILE:"%"=%)

# ...
# There are more architecture related stuff beyond this line
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.