mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-08 18:26:48 +00:00
build: Remove DragonOS_GCC And make CI use docker image (#954)
* build: 不再需要x86_64-elf-gcc的支持 * ci: 添加ci用的docker镜像 * 切换workflow到构建用的容器上 --------- Signed-off-by: longjin <longjin@DragonOS.org>
This commit is contained in:
parent
1bd12bc2ff
commit
415e46ea47
36
.github/actions/import-toolchain/action.yml
vendored
36
.github/actions/import-toolchain/action.yml
vendored
@ -1,36 +0,0 @@
|
|||||||
name: import-toolchain
|
|
||||||
|
|
||||||
runs:
|
|
||||||
using: composite
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
with:
|
|
||||||
submodules: 'recursive'
|
|
||||||
|
|
||||||
- name: Cache DragonOS GCC
|
|
||||||
id: cache-dragonos-gcc
|
|
||||||
uses: actions/cache@v3
|
|
||||||
env:
|
|
||||||
cache-name: cache-dragonos-gcc
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
~/opt
|
|
||||||
~/.bashrc
|
|
||||||
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('tools/build_gcc_toolchain.sh') }}
|
|
||||||
|
|
||||||
- name: Cache build tools
|
|
||||||
id: cache-build-tools
|
|
||||||
uses: actions/cache@v3
|
|
||||||
env:
|
|
||||||
cache-name: cache-build-tools
|
|
||||||
dadk_version: 0.1.11
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
~/.cargo
|
|
||||||
~/.rustup
|
|
||||||
~/.bashrc
|
|
||||||
~/opt
|
|
||||||
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ env.dadk_version }}-${{ hashFiles('.github/workflows/cache-toolchain.yml') }}-${{ hashFiles('tools/install_musl_gcc.sh') }}
|
|
||||||
|
|
||||||
- uses: ./.github/actions/install-apt-packages
|
|
||||||
|
|
16
.github/actions/install-apt-packages/action.yml
vendored
16
.github/actions/install-apt-packages/action.yml
vendored
@ -1,16 +0,0 @@
|
|||||||
name: install-apt-packages
|
|
||||||
|
|
||||||
runs:
|
|
||||||
using: composite
|
|
||||||
steps:
|
|
||||||
|
|
||||||
- uses: awalsh128/cache-apt-pkgs-action@latest
|
|
||||||
with:
|
|
||||||
packages: llvm-dev libclang-dev clang gcc-multilib libssl-dev pkg-config
|
|
||||||
version: ${{ hashFiles('.github/actions/install-apt-packages/action.yml') }}
|
|
||||||
|
|
||||||
- uses: awalsh128/cache-apt-pkgs-action@latest
|
|
||||||
with:
|
|
||||||
packages: gcc-riscv64-unknown-elf gcc-riscv64-linux-gnu gdb-multiarch
|
|
||||||
version: ${{ hashFiles('.github/actions/install-apt-packages/action.yml') }}
|
|
||||||
|
|
94
.github/workflows/cache-toolchain.yml
vendored
94
.github/workflows/cache-toolchain.yml
vendored
@ -1,94 +0,0 @@
|
|||||||
name: Cache toolchain
|
|
||||||
|
|
||||||
on: workflow_call
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Cache DragonOS GCC
|
|
||||||
id: cache-dragonos-gcc
|
|
||||||
uses: actions/cache@v3
|
|
||||||
env:
|
|
||||||
cache-name: cache-dragonos-gcc
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
~/opt
|
|
||||||
~/.bashrc
|
|
||||||
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('tools/build_gcc_toolchain.sh') }}
|
|
||||||
|
|
||||||
- if: ${{ steps.cache-dragonos-gcc.outputs.cache-hit != 'true' }}
|
|
||||||
name: build dragonos-gcc
|
|
||||||
continue-on-error: true
|
|
||||||
run: |
|
|
||||||
bash tools/build_gcc_toolchain.sh -f
|
|
||||||
|
|
||||||
- uses: ./.github/actions/install-apt-packages
|
|
||||||
|
|
||||||
- name: Cache build tools
|
|
||||||
id: cache-build-tools
|
|
||||||
uses: actions/cache@v3
|
|
||||||
env:
|
|
||||||
cache-name: cache-build-tools
|
|
||||||
dadk_version: 0.1.11
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
~/.cargo
|
|
||||||
~/.rustup
|
|
||||||
~/.bashrc
|
|
||||||
~/opt
|
|
||||||
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ env.dadk_version }}-${{ hashFiles('.github/workflows/cache-toolchain.yml') }}-${{ hashFiles('tools/install_musl_gcc.sh') }}
|
|
||||||
|
|
||||||
- if: ${{ steps.cache-build-tools.outputs.cache-hit != 'true' }}
|
|
||||||
name: Install toolchain
|
|
||||||
continue-on-error: false
|
|
||||||
run: |
|
|
||||||
USE_GITHUB=1 bash tools/install_musl_gcc.sh
|
|
||||||
|
|
||||||
cargo install cargo-binutils
|
|
||||||
rustup toolchain install nightly-x86_64-unknown-linux-gnu
|
|
||||||
rustup toolchain install nightly-2024-07-23-x86_64-unknown-linux-gnu
|
|
||||||
rustup toolchain install nightly-2023-08-15-x86_64-unknown-linux-gnu
|
|
||||||
rustup component add rust-src --toolchain nightly-2024-07-23-x86_64-unknown-linux-gnu
|
|
||||||
rustup component add rust-src --toolchain nightly-2023-08-15-x86_64-unknown-linux-gnu
|
|
||||||
rustup target add x86_64-unknown-none --toolchain nightly-2024-07-23-x86_64-unknown-linux-gnu
|
|
||||||
rustup target add x86_64-unknown-none --toolchain nightly-2023-08-15-x86_64-unknown-linux-gnu
|
|
||||||
|
|
||||||
rustup toolchain install nightly-2024-07-23-riscv64gc-unknown-linux-gnu --force-non-host
|
|
||||||
rustup toolchain install nightly-2023-08-15-riscv64gc-unknown-linux-gnu --force-non-host
|
|
||||||
rustup target add riscv64gc-unknown-none-elf --toolchain nightly-2024-07-23-riscv64gc-unknown-linux-gnu
|
|
||||||
rustup target add riscv64imac-unknown-none-elf --toolchain nightly-2024-07-23-riscv64gc-unknown-linux-gnu
|
|
||||||
rustup target add riscv64gc-unknown-none-elf --toolchain nightly-2023-08-15-riscv64gc-unknown-linux-gnu
|
|
||||||
rustup target add riscv64imac-unknown-none-elf --toolchain nightly-2023-08-15-riscv64gc-unknown-linux-gnu
|
|
||||||
|
|
||||||
rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu
|
|
||||||
rustup component add rust-src
|
|
||||||
rustup component add llvm-tools-preview
|
|
||||||
|
|
||||||
rustup component add rustfmt
|
|
||||||
rustup component add rustfmt --toolchain nightly-x86_64-unknown-linux-gnu
|
|
||||||
rustup component add rustfmt --toolchain nightly-2024-07-23-x86_64-unknown-linux-gnu
|
|
||||||
rustup component add rustfmt --toolchain nightly-2023-08-15-x86_64-unknown-linux-gnu
|
|
||||||
rustup component add rustfmt --toolchain nightly-2024-07-23-riscv64gc-unknown-linux-gnu
|
|
||||||
rustup component add rustfmt --toolchain nightly-2023-08-15-riscv64gc-unknown-linux-gnu
|
|
||||||
|
|
||||||
rustup default nightly-2024-07-23
|
|
||||||
|
|
||||||
cargo install dadk --version 0.1.11
|
|
||||||
|
|
||||||
|
|
||||||
userapp_musl_toolchain="nightly-2023-08-15-x86_64-unknown-linux-gnu"
|
|
||||||
|
|
||||||
rustup toolchain install ${userapp_musl_toolchain}
|
|
||||||
rustup component add --toolchain ${userapp_musl_toolchain} rust-src
|
|
||||||
rustup target add --toolchain ${userapp_musl_toolchain} x86_64-unknown-linux-musl
|
|
||||||
|
|
||||||
rustup target add x86_64-unknown-linux-musl --toolchain nightly-2024-07-23-x86_64-unknown-linux-gnu
|
|
||||||
rustup component add rust-src --toolchain nightly-2024-07-23-x86_64-unknown-linux-gnu
|
|
||||||
|
|
||||||
|
|
||||||
|
|
36
.github/workflows/makefile.yml
vendored
36
.github/workflows/makefile.yml
vendored
@ -7,28 +7,26 @@ on:
|
|||||||
branches: [ "master", "feat-*", "fix-*"]
|
branches: [ "master", "feat-*", "fix-*"]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
# ensure the toolchain is cached
|
|
||||||
ensure-toolchain:
|
|
||||||
uses: ./.github/workflows/cache-toolchain.yml
|
|
||||||
|
|
||||||
format-check:
|
format-check:
|
||||||
name: Format check ${{ matrix.arch }}
|
name: Format check ${{ matrix.arch }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: [ensure-toolchain]
|
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
|
container: dragonos/dragonos-dev:v1.3
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
arch: [x86_64, riscv64]
|
arch: [x86_64, riscv64]
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
- run: echo "Running in dragonos/dragonos-dev:v1.3"
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- uses: ./.github/actions/import-toolchain
|
|
||||||
|
|
||||||
- name: Format check
|
- name: Format check
|
||||||
env:
|
env:
|
||||||
ARCH: ${{ matrix.arch }}
|
ARCH: ${{ matrix.arch }}
|
||||||
|
HOME: /root
|
||||||
|
shell: bash -ileo pipefail {0}
|
||||||
run: |
|
run: |
|
||||||
printf "\n" >> kernel/src/include/bindings/bindings.rs
|
printf "\n" >> kernel/src/include/bindings/bindings.rs
|
||||||
FMT_CHECK=1 make fmt
|
FMT_CHECK=1 make fmt
|
||||||
@ -36,38 +34,38 @@ jobs:
|
|||||||
kernel-static-test:
|
kernel-static-test:
|
||||||
name: Kernel static test ${{ matrix.arch }}
|
name: Kernel static test ${{ matrix.arch }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: [ensure-toolchain]
|
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
|
container: dragonos/dragonos-dev:v1.3
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
arch: [x86_64, riscv64]
|
arch: [x86_64, riscv64]
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- run: echo "Running in dragonos/dragonos-dev:v1.3"
|
||||||
|
|
||||||
- uses: ./.github/actions/import-toolchain
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- name: Run kernel static test
|
- name: Run kernel static test
|
||||||
shell: bash -ileo pipefail {0}
|
shell: bash -ileo pipefail {0}
|
||||||
env:
|
env:
|
||||||
ARCH: ${{ matrix.arch }}
|
ARCH: ${{ matrix.arch }}
|
||||||
run: bash -c "source ~/.cargo/env && cd kernel && make test"
|
HOME: /root
|
||||||
|
run: bash -c "source /root/.cargo/env && cd kernel && make test"
|
||||||
|
|
||||||
build-x86_64:
|
build-x86_64:
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: [ensure-toolchain]
|
container: dragonos/dragonos-dev:v1.3
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
- run: echo "Running in dragonos/dragonos-dev:v1.3"
|
||||||
|
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
- uses: ./.github/actions/import-toolchain
|
|
||||||
|
|
||||||
|
|
||||||
- name: build the DragonOS
|
- name: build the DragonOS
|
||||||
env:
|
env:
|
||||||
ARCH: x86_64
|
ARCH: x86_64
|
||||||
|
HOME: /root
|
||||||
shell: bash -ileo pipefail {0}
|
shell: bash -ileo pipefail {0}
|
||||||
|
|
||||||
run: |
|
run: |
|
||||||
@ -77,23 +75,23 @@ jobs:
|
|||||||
|
|
||||||
make -j $(nproc)
|
make -j $(nproc)
|
||||||
|
|
||||||
|
|
||||||
build-riscv64:
|
build-riscv64:
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: [ensure-toolchain]
|
container: dragonos/dragonos-dev:v1.3
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
- run: echo "Running in dragonos/dragonos-dev:v1.3"
|
||||||
|
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
submodules: 'recursive'
|
submodules: 'recursive'
|
||||||
|
|
||||||
- uses: ./.github/actions/import-toolchain
|
|
||||||
|
|
||||||
- name: build the DragonOS
|
- name: build the DragonOS
|
||||||
shell: bash -ileo pipefail {0}
|
shell: bash -ileo pipefail {0}
|
||||||
env:
|
env:
|
||||||
ARCH: riscv64
|
ARCH: riscv64
|
||||||
|
HOME: /root
|
||||||
|
|
||||||
run: source ~/.bashrc && source ~/.cargo/env && make kernel -j $(nproc)
|
run: source ~/.bashrc && source ~/.cargo/env && make kernel -j $(nproc)
|
||||||
|
|
||||||
|
37
.github/workflows/publish-dragonos-docker-image.yml
vendored
Normal file
37
.github/workflows/publish-dragonos-docker-image.yml
vendored
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
name: Publish Docker images
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- tools/BUILD_CONTAINER_VERSION
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
docker:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v2
|
||||||
|
|
||||||
|
- name: Login to Docker Hub
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Fetch versions in the repo
|
||||||
|
id: fetch-versions
|
||||||
|
run: |
|
||||||
|
BUILD_CONTAINER_VERSION=$(cat tools/BUILD_CONTAINER_VERSION)
|
||||||
|
echo "build_container_version=$BUILD_CONTAINER_VERSION" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
|
- name: Build and push docker image
|
||||||
|
uses: docker/build-push-action@v4
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
file: ./tools/Dockerfile
|
||||||
|
platforms: linux/amd64
|
||||||
|
push: true
|
||||||
|
tags: dragonos/dragonos-dev:${{ steps.fetch-versions.outputs.build_container_version }}
|
4
.vscode/settings.json
vendored
4
.vscode/settings.json
vendored
@ -9,7 +9,6 @@
|
|||||||
"glib.h": "c",
|
"glib.h": "c",
|
||||||
"asm.h": "c",
|
"asm.h": "c",
|
||||||
"memory.h": "c",
|
"memory.h": "c",
|
||||||
"multiboot2.h": "c",
|
|
||||||
"kprint.h": "c",
|
"kprint.h": "c",
|
||||||
"ptrace.h": "c",
|
"ptrace.h": "c",
|
||||||
"mouse.h": "c",
|
"mouse.h": "c",
|
||||||
@ -77,7 +76,6 @@
|
|||||||
"cstdbool": "c",
|
"cstdbool": "c",
|
||||||
"typeinfo": "c",
|
"typeinfo": "c",
|
||||||
"unistd.h": "c",
|
"unistd.h": "c",
|
||||||
"syscall_num.h": "c",
|
|
||||||
"stdint.h": "c",
|
"stdint.h": "c",
|
||||||
"syscall.h": "c",
|
"syscall.h": "c",
|
||||||
"fcntl.h": "c",
|
"fcntl.h": "c",
|
||||||
@ -121,9 +119,7 @@
|
|||||||
"dirent.h": "c",
|
"dirent.h": "c",
|
||||||
"cmd_help.h": "c",
|
"cmd_help.h": "c",
|
||||||
"wait.h": "c",
|
"wait.h": "c",
|
||||||
"__libc__.h": "c",
|
|
||||||
"ctype.h": "c",
|
"ctype.h": "c",
|
||||||
"mmio.h": "c",
|
|
||||||
"stdint-gcc.h": "c",
|
"stdint-gcc.h": "c",
|
||||||
"acpi.h": "c",
|
"acpi.h": "c",
|
||||||
"assert.h": "c",
|
"assert.h": "c",
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
use std::path::PathBuf;
|
use std::{collections::HashSet, path::PathBuf};
|
||||||
|
|
||||||
use cc::Build;
|
use cc::Build;
|
||||||
|
|
||||||
@ -13,9 +13,9 @@ pub(super) trait CFilesArch {
|
|||||||
/// 设置架构相关的宏定义
|
/// 设置架构相关的宏定义
|
||||||
fn setup_defines(&self, c: &mut Build);
|
fn setup_defines(&self, c: &mut Build);
|
||||||
/// 设置架构相关的全局包含目录
|
/// 设置架构相关的全局包含目录
|
||||||
fn setup_global_include_dir(&self, c: &mut Build);
|
fn setup_global_include_dir(&self, c: &mut HashSet<PathBuf>);
|
||||||
/// 设置需要编译的架构相关的文件
|
/// 设置需要编译的架构相关的文件
|
||||||
fn setup_files(&self, c: &mut Build, files: &mut Vec<PathBuf>);
|
fn setup_files(&self, c: &mut Build, files: &mut HashSet<PathBuf>);
|
||||||
|
|
||||||
/// 设置架构相关的全局编译标志
|
/// 设置架构相关的全局编译标志
|
||||||
fn setup_global_flags(&self, c: &mut Build);
|
fn setup_global_flags(&self, c: &mut Build);
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
use std::path::PathBuf;
|
use std::{collections::HashSet, path::PathBuf};
|
||||||
|
|
||||||
use crate::{constant::ARCH_DIR_RISCV64, utils::FileUtils};
|
use crate::{constant::ARCH_DIR_RISCV64, utils::FileUtils};
|
||||||
|
|
||||||
@ -12,17 +12,18 @@ impl CFilesArch for RiscV64CFilesArch {
|
|||||||
c.define("__riscv", None);
|
c.define("__riscv", None);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn setup_global_include_dir(&self, c: &mut cc::Build) {
|
fn setup_global_include_dir(&self, include_dirs: &mut HashSet<PathBuf>) {
|
||||||
c.include("src/arch/riscv64/include");
|
include_dirs.insert("src/arch/riscv64/include".into());
|
||||||
}
|
}
|
||||||
|
|
||||||
fn setup_files(&self, _c: &mut cc::Build, files: &mut Vec<std::path::PathBuf>) {
|
fn setup_files(&self, _c: &mut cc::Build, files: &mut HashSet<PathBuf>) {
|
||||||
files.push(PathBuf::from("src/arch/riscv64/asm/head.S"));
|
files.insert(PathBuf::from("src/arch/riscv64/asm/head.S"));
|
||||||
files.append(&mut FileUtils::list_all_files(
|
|
||||||
&arch_path("asm"),
|
FileUtils::list_all_files(&arch_path("asm"), Some("c"), true)
|
||||||
Some("c"),
|
.into_iter()
|
||||||
true,
|
.for_each(|f| {
|
||||||
));
|
files.insert(f);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
fn setup_global_flags(&self, c: &mut cc::Build) {
|
fn setup_global_flags(&self, c: &mut cc::Build) {
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
use std::path::PathBuf;
|
use std::{collections::HashSet, path::PathBuf};
|
||||||
|
|
||||||
use cc::Build;
|
use cc::Build;
|
||||||
|
|
||||||
@ -13,38 +13,24 @@ impl CFilesArch for X86_64CFilesArch {
|
|||||||
c.define("__x86_64__", None);
|
c.define("__x86_64__", None);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn setup_global_include_dir(&self, c: &mut cc::Build) {
|
fn setup_global_include_dir(&self, include_dirs: &mut HashSet<PathBuf>) {
|
||||||
c.include("src/arch/x86_64/include");
|
include_dirs.insert("src/arch/x86_64/include".into());
|
||||||
}
|
}
|
||||||
|
|
||||||
fn setup_files(&self, _c: &mut Build, files: &mut Vec<PathBuf>) {
|
fn setup_files(&self, _c: &mut Build, files: &mut HashSet<PathBuf>) {
|
||||||
// 获取`kernel/src/arch/x86_64/driver/apic`下的所有C文件
|
const DIRS: [&str; 4] = ["driver/apic", "init", "asm", "interrupt"];
|
||||||
files.append(&mut FileUtils::list_all_files(
|
DIRS.iter().for_each(|dir| {
|
||||||
&arch_path("driver/apic"),
|
FileUtils::list_all_files(&arch_path(dir), Some("c"), true)
|
||||||
Some("c"),
|
.into_iter()
|
||||||
true,
|
.for_each(|f| {
|
||||||
));
|
files.insert(f);
|
||||||
|
});
|
||||||
files.append(&mut FileUtils::list_all_files(
|
});
|
||||||
&arch_path("init"),
|
|
||||||
Some("c"),
|
|
||||||
true,
|
|
||||||
));
|
|
||||||
files.append(&mut FileUtils::list_all_files(
|
|
||||||
&arch_path("asm"),
|
|
||||||
Some("c"),
|
|
||||||
true,
|
|
||||||
));
|
|
||||||
files.append(&mut FileUtils::list_all_files(
|
|
||||||
&arch_path("interrupt"),
|
|
||||||
Some("c"),
|
|
||||||
true,
|
|
||||||
));
|
|
||||||
|
|
||||||
// setup asm files
|
// setup asm files
|
||||||
files.push(PathBuf::from("src/arch/x86_64/asm/head.S"));
|
files.insert(PathBuf::from("src/arch/x86_64/asm/head.S"));
|
||||||
files.push(PathBuf::from("src/arch/x86_64/asm/entry.S"));
|
files.insert(PathBuf::from("src/arch/x86_64/asm/entry.S"));
|
||||||
files.push(PathBuf::from("src/arch/x86_64/asm/apu_boot.S"));
|
files.insert(PathBuf::from("src/arch/x86_64/asm/apu_boot.S"));
|
||||||
}
|
}
|
||||||
|
|
||||||
fn setup_global_flags(&self, c: &mut Build) {
|
fn setup_global_flags(&self, c: &mut Build) {
|
||||||
|
21
build-scripts/kernel_build/src/cfiles/common.rs
Normal file
21
build-scripts/kernel_build/src/cfiles/common.rs
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
use std::{collections::HashSet, path::PathBuf};
|
||||||
|
|
||||||
|
use crate::utils::FileUtils;
|
||||||
|
|
||||||
|
pub(super) fn setup_common_files(files: &mut HashSet<PathBuf>) {
|
||||||
|
const DIRS: [&str; 3] = ["src/common", "src/debug/traceback", "src/libs"];
|
||||||
|
DIRS.iter().for_each(|dir| {
|
||||||
|
FileUtils::list_all_files(&dir.into(), Some("c"), true)
|
||||||
|
.into_iter()
|
||||||
|
.for_each(|f| {
|
||||||
|
files.insert(f);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(super) fn setup_common_include_dir(include_dirs: &mut HashSet<PathBuf>) {
|
||||||
|
const DIRS: [&str; 3] = ["src/include", "src/common", "src"];
|
||||||
|
DIRS.iter().for_each(|dir| {
|
||||||
|
include_dirs.insert(dir.into());
|
||||||
|
});
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
use std::path::PathBuf;
|
use std::{collections::HashSet, path::PathBuf};
|
||||||
|
|
||||||
use cc::Build;
|
use cc::Build;
|
||||||
|
|
||||||
@ -7,6 +7,7 @@ use crate::utils::cargo_handler::CargoHandler;
|
|||||||
use self::arch::current_cfiles_arch;
|
use self::arch::current_cfiles_arch;
|
||||||
|
|
||||||
mod arch;
|
mod arch;
|
||||||
|
mod common;
|
||||||
|
|
||||||
/// 构建项目的c文件
|
/// 构建项目的c文件
|
||||||
pub struct CFilesBuilder;
|
pub struct CFilesBuilder;
|
||||||
@ -46,19 +47,29 @@ impl CFilesBuilder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn setup_global_include_dir(c: &mut Build) {
|
fn setup_global_include_dir(c: &mut Build) {
|
||||||
c.include("src/include");
|
let mut include_dirs = HashSet::new();
|
||||||
c.include("src");
|
|
||||||
c.include(".");
|
c.include(".");
|
||||||
|
|
||||||
current_cfiles_arch().setup_global_include_dir(c);
|
common::setup_common_include_dir(&mut include_dirs);
|
||||||
|
|
||||||
|
current_cfiles_arch().setup_global_include_dir(&mut include_dirs);
|
||||||
|
|
||||||
|
let include_dirs: Vec<PathBuf> = include_dirs.into_iter().collect();
|
||||||
|
Self::set_rerun_if_files_changed(&include_dirs);
|
||||||
|
|
||||||
|
include_dirs.into_iter().for_each(|dir| {
|
||||||
|
c.include(dir);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/// 设置需要编译的文件
|
/// 设置需要编译的文件
|
||||||
fn setup_files(c: &mut Build) {
|
fn setup_files(c: &mut Build) {
|
||||||
let mut files: Vec<PathBuf> = Vec::new();
|
let mut files: HashSet<PathBuf> = HashSet::new();
|
||||||
|
|
||||||
current_cfiles_arch().setup_files(c, &mut files);
|
current_cfiles_arch().setup_files(c, &mut files);
|
||||||
|
common::setup_common_files(&mut files);
|
||||||
|
// 去重
|
||||||
|
let files: Vec<PathBuf> = files.into_iter().collect();
|
||||||
Self::set_rerun_if_files_changed(&files);
|
Self::set_rerun_if_files_changed(&files);
|
||||||
c.files(files.as_slice());
|
c.files(files.as_slice());
|
||||||
}
|
}
|
||||||
|
@ -2,30 +2,17 @@ include ../env.mk
|
|||||||
|
|
||||||
# 设置编译器
|
# 设置编译器
|
||||||
ifeq ($(ARCH), x86_64)
|
ifeq ($(ARCH), x86_64)
|
||||||
|
CCPREFIX=x86_64-linux-gnu-
|
||||||
# 如果 x86_64时,DragonOS_GCC 为空,那么设置为默认值
|
|
||||||
export DragonOS_GCC?=$(HOME)/opt/dragonos-gcc/gcc-x86_64-unknown-none/bin
|
|
||||||
|
|
||||||
export CC=$(DragonOS_GCC)/x86_64-elf-gcc
|
|
||||||
export LD=ld
|
|
||||||
export AS=$(DragonOS_GCC)/x86_64-elf-as
|
|
||||||
export NM=$(DragonOS_GCC)/x86_64-elf-nm
|
|
||||||
export AR=$(DragonOS_GCC)/x86_64-elf-ar
|
|
||||||
export OBJCOPY=$(DragonOS_GCC)/x86_64-elf-objcopy
|
|
||||||
|
|
||||||
else ifeq ($(ARCH), riscv64)
|
else ifeq ($(ARCH), riscv64)
|
||||||
|
CCPREFIX=riscv64-linux-gnu-
|
||||||
export CC=riscv64-unknown-elf-gcc
|
|
||||||
# binutils版本需要>=2.38
|
|
||||||
# 而ubuntu的unknown-elf的版本比较旧,所以使用了riscv64-linux-gnu-ld
|
|
||||||
export LD=riscv64-linux-gnu-ld
|
|
||||||
export AS=riscv64-unknown-elf-as
|
|
||||||
export NM=riscv64-unknown-elf-nm
|
|
||||||
export AR=riscv64-unknown-elf-ar
|
|
||||||
export OBJCOPY=riscv64-unknown-elf-objcopy
|
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
export CC=$(CCPREFIX)gcc
|
||||||
|
export LD=$(CCPREFIX)ld
|
||||||
|
export AS=$(CCPREFIX)as
|
||||||
|
export NM=$(CCPREFIX)nm
|
||||||
|
export AR=$(CCPREFIX)ar
|
||||||
|
export OBJCOPY=$(CCPREFIX)objcopy
|
||||||
|
|
||||||
export DEBUG=DEBUG
|
export DEBUG=DEBUG
|
||||||
|
|
||||||
|
@ -36,7 +36,7 @@ export ASFLAGS := --64
|
|||||||
LD_LIST := ""
|
LD_LIST := ""
|
||||||
|
|
||||||
|
|
||||||
kernel_subdirs := common driver debug syscall libs
|
kernel_subdirs := debug
|
||||||
|
|
||||||
|
|
||||||
kernel_rust:
|
kernel_rust:
|
||||||
|
@ -4,17 +4,6 @@ use crate::{exception::InterruptArch, sched::SchedArch, smp::core::smp_get_proce
|
|||||||
|
|
||||||
use super::{driver::apic::apic_timer::apic_timer_init, CurrentIrqArch};
|
use super::{driver::apic::apic_timer::apic_timer_init, CurrentIrqArch};
|
||||||
|
|
||||||
// /// @brief 若内核代码不处在中断上下文中,那么将可以使用本函数,发起一个sys_sched系统调用,然后运行调度器。
|
|
||||||
// /// 由于只能在中断上下文中进行进程切换,因此需要发起一个系统调用SYS_SCHED。
|
|
||||||
// #[no_mangle]
|
|
||||||
// pub extern "C" fn sched() {
|
|
||||||
// let _guard = unsafe { CurrentIrqArch::save_and_disable_irq() };
|
|
||||||
// __schedule(SchedMode::SM_NONE);
|
|
||||||
// // unsafe {
|
|
||||||
// // enter_syscall_int(SYS_SCHED as u64, 0, 0, 0, 0, 0, 0);
|
|
||||||
// // }
|
|
||||||
// }
|
|
||||||
|
|
||||||
static mut BSP_INIT_OK: bool = false;
|
static mut BSP_INIT_OK: bool = false;
|
||||||
|
|
||||||
pub struct X86_64SchedArch;
|
pub struct X86_64SchedArch;
|
||||||
|
@ -1,14 +0,0 @@
|
|||||||
|
|
||||||
CFLAGS += -I .
|
|
||||||
|
|
||||||
kernel_common_subdirs:= math
|
|
||||||
|
|
||||||
ECHO:
|
|
||||||
@echo "$@"
|
|
||||||
|
|
||||||
$(kernel_common_subdirs): ECHO
|
|
||||||
|
|
||||||
$(MAKE) -C $@ all CFLAGS="$(CFLAGS)" ASFLAGS="$(ASFLAGS)"
|
|
||||||
|
|
||||||
all: $(kernel_common_subdirs)
|
|
||||||
|
|
@ -1,23 +0,0 @@
|
|||||||
|
|
||||||
/**
|
|
||||||
* @file boot_info.h
|
|
||||||
* @brief 启动信息接口
|
|
||||||
*/
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
#include "glib.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 启动信息接口
|
|
||||||
* 由引导传递的机器信息处理
|
|
||||||
* 如 grub2 传递的 multiboot2 结构
|
|
||||||
* 注意这部分是通过内存传递的,在重新保存之前不能被覆盖
|
|
||||||
* 架构专有的数据在 dtb.h 或 multiboot2.h
|
|
||||||
* 实现在 dtb.cpp 或 multiboot2.cpp
|
|
||||||
*/
|
|
||||||
/// 声明,定义在具体的实现中
|
|
||||||
/// 地址
|
|
||||||
extern uintptr_t boot_info_addr;
|
|
||||||
/// 长度
|
|
||||||
extern unsigned int boot_info_size;
|
|
||||||
|
|
@ -6,11 +6,11 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
// 引入对bool类型的支持
|
// 引入对bool类型的支持
|
||||||
#include <stdbool.h>
|
|
||||||
#include <DragonOS/stdint.h>
|
#include <DragonOS/stdint.h>
|
||||||
#include <common/stddef.h>
|
|
||||||
#include <arch/arch.h>
|
#include <arch/arch.h>
|
||||||
#include <common/compiler.h>
|
#include <common/compiler.h>
|
||||||
|
#include <common/stddef.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
#include <asm/asm.h>
|
#include <asm/asm.h>
|
||||||
|
|
||||||
@ -28,8 +28,6 @@
|
|||||||
(type *)((unsigned long)p - (unsigned long)&(((type *)0)->member)); \
|
(type *)((unsigned long)p - (unsigned long)&(((type *)0)->member)); \
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define ABS(x) ((x) > 0 ? (x) : -(x)) // 绝对值
|
#define ABS(x) ((x) > 0 ? (x) : -(x)) // 绝对值
|
||||||
// 最大最小值
|
// 最大最小值
|
||||||
#define max(x, y) ((x > y) ? (x) : (y))
|
#define max(x, y) ((x > y) ? (x) : (y))
|
||||||
@ -39,10 +37,7 @@
|
|||||||
#define MASK_HIGH_32bit(x) (x & (0x00000000ffffffffUL))
|
#define MASK_HIGH_32bit(x) (x & (0x00000000ffffffffUL))
|
||||||
|
|
||||||
// 四舍五入成整数
|
// 四舍五入成整数
|
||||||
ul round(double x)
|
ul round(double x) { return (ul)(x + 0.5); }
|
||||||
{
|
|
||||||
return (ul)(x + 0.5);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 地址按照align进行对齐
|
* @brief 地址按照align进行对齐
|
||||||
@ -51,18 +46,6 @@ ul round(double x)
|
|||||||
* @param _align
|
* @param _align
|
||||||
* @return ul 对齐后的地址
|
* @return ul 对齐后的地址
|
||||||
*/
|
*/
|
||||||
static __always_inline ul ALIGN(const ul addr, const ul _align)
|
static __always_inline ul ALIGN(const ul addr, const ul _align) {
|
||||||
{
|
|
||||||
return (ul)((addr + _align - 1) & (~(_align - 1)));
|
return (ul)((addr + _align - 1) & (~(_align - 1)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 将数据从src搬运到dst,并能正确处理地址重叠的问题
|
|
||||||
*
|
|
||||||
* @param dst 目标地址指针
|
|
||||||
* @param src 源地址指针
|
|
||||||
* @param size 大小
|
|
||||||
* @return void* 指向目标地址的指针
|
|
||||||
*/
|
|
||||||
void *c_memmove(void *dst, const void *src, uint64_t size);
|
|
@ -1,10 +0,0 @@
|
|||||||
SRC = $(wildcard *.c)
|
|
||||||
OBJ = $(SRC:.c=.o)
|
|
||||||
CFLAGS += -I .
|
|
||||||
|
|
||||||
.PHONY: all
|
|
||||||
|
|
||||||
all: $(OBJ)
|
|
||||||
|
|
||||||
%.o: %.c
|
|
||||||
$(CC) $(CFLAGS) -c $< -o $@
|
|
@ -1,62 +1,13 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "glib.h"
|
#include "glib.h"
|
||||||
/**
|
|
||||||
* @brief 拷贝整个字符串
|
|
||||||
*
|
|
||||||
* @param dst 目标地址
|
|
||||||
* @param src 源地址
|
|
||||||
* @return char* 目标字符串
|
|
||||||
*/
|
|
||||||
char *strcpy(char *dst, const char *src);
|
|
||||||
|
|
||||||
// 计算字符串的长度(经过测试,该版本比采用repne/scasb汇编的运行速度快16.8%左右)
|
// 计算字符串的长度(经过测试,该版本比采用repne/scasb汇编的运行速度快16.8%左右)
|
||||||
static inline int strlen(const char *s)
|
static inline int strlen(const char *s) {
|
||||||
{
|
|
||||||
if (s == NULL)
|
if (s == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
register int __res = 0;
|
register int __res = 0;
|
||||||
while (s[__res] != '\0')
|
while (s[__res] != '\0') {
|
||||||
{
|
|
||||||
++__res;
|
++__res;
|
||||||
}
|
}
|
||||||
return __res;
|
return __res;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 测量字符串的长度
|
|
||||||
*
|
|
||||||
* @param src 字符串
|
|
||||||
* @param maxlen 最大长度
|
|
||||||
* @return long
|
|
||||||
*/
|
|
||||||
long strnlen(const char *src, unsigned long maxlen);
|
|
||||||
|
|
||||||
/*
|
|
||||||
比较字符串 FirstPart and SecondPart
|
|
||||||
FirstPart = SecondPart => 0
|
|
||||||
FirstPart > SecondPart => 1
|
|
||||||
FirstPart < SecondPart => -1
|
|
||||||
*/
|
|
||||||
|
|
||||||
int strcmp(const char *FirstPart, const char *SecondPart);
|
|
||||||
|
|
||||||
char *strncpy(char *restrict d, const char *restrict s, size_t n);
|
|
||||||
|
|
||||||
long strncpy_from_user(char *dst, const char *src, unsigned long size);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 测量来自用户空间的字符串的长度,会检验地址空间是否属于用户空间
|
|
||||||
* @param src
|
|
||||||
* @param maxlen
|
|
||||||
* @return long
|
|
||||||
*/
|
|
||||||
long strnlen_user(const char *src, unsigned long maxlen);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 拼接两个字符串(将src接到dest末尾)
|
|
||||||
*
|
|
||||||
* @param dest 目标串
|
|
||||||
* @param src 源串
|
|
||||||
* @return char*
|
|
||||||
*/
|
|
||||||
char *strcat(char *dest, const char *src);
|
|
@ -1,22 +0,0 @@
|
|||||||
/**
|
|
||||||
* @file unistd.h
|
|
||||||
* @author fslongjin (longjin@RinGoTek.cn)
|
|
||||||
* @brief
|
|
||||||
* @version 0.1
|
|
||||||
* @date 2022-04-22
|
|
||||||
*
|
|
||||||
* @copyright Copyright (c) 2022
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <syscall/syscall.h>
|
|
||||||
#include <syscall/syscall_num.h>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 交换n字节
|
|
||||||
* @param src 源地址
|
|
||||||
* @param dest 目的地址
|
|
||||||
* @param nbytes 交换字节数
|
|
||||||
*/
|
|
||||||
void swab(void *restrict src, void *restrict dest, ssize_t nbytes);
|
|
@ -1,5 +1,6 @@
|
|||||||
|
|
||||||
all: traceback.o
|
all:
|
||||||
|
@echo ""
|
||||||
|
|
||||||
CFLAGS += -I .
|
CFLAGS += -I .
|
||||||
|
|
||||||
|
@ -1,17 +0,0 @@
|
|||||||
|
|
||||||
CFLAGS += -I .
|
|
||||||
|
|
||||||
kernel_driver_subdirs:=
|
|
||||||
|
|
||||||
ECHO:
|
|
||||||
@echo "$@"
|
|
||||||
|
|
||||||
$(kernel_driver_subdirs): ECHO
|
|
||||||
|
|
||||||
$(MAKE) -C $@ all CFLAGS="$(CFLAGS)" ASFLAGS="$(ASFLAGS)"
|
|
||||||
|
|
||||||
all: $(kernel_driver_subdirs)
|
|
||||||
|
|
||||||
|
|
||||||
clean:
|
|
||||||
echo "Done."
|
|
@ -1,19 +0,0 @@
|
|||||||
|
|
||||||
CFLAGS += -I .
|
|
||||||
|
|
||||||
kernel_lib_subdirs:=
|
|
||||||
|
|
||||||
kernel_lib_objs:= $(shell find ./*.c)
|
|
||||||
|
|
||||||
ECHO:
|
|
||||||
@echo "$@"
|
|
||||||
|
|
||||||
$(kernel_lib_subdirs): ECHO
|
|
||||||
$(MAKE) -C $@ all CFLAGS="$(CFLAGS)" ASFLAGS="$(ASFLAGS)"
|
|
||||||
|
|
||||||
$(kernel_lib_objs): ECHO
|
|
||||||
$(CC) $(CFLAGS) -c $@ -o $@.o
|
|
||||||
|
|
||||||
all: $(kernel_lib_objs) $(kernel_lib_subdirs)
|
|
||||||
@echo $(kernel_lib_objs)
|
|
||||||
|
|
@ -1,34 +0,0 @@
|
|||||||
#include <common/glib.h>
|
|
||||||
#include <common/string.h>
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 将数据从src搬运到dst,并能正确处理地址重叠的问题
|
|
||||||
*
|
|
||||||
* @param dst 目标地址指针
|
|
||||||
* @param src 源地址指针
|
|
||||||
* @param size 大小
|
|
||||||
* @return void* 指向目标地址的指针
|
|
||||||
*/
|
|
||||||
void *c_memmove(void *dst, const void *src, uint64_t size)
|
|
||||||
{
|
|
||||||
const char *_src = src;
|
|
||||||
char *_dst = dst;
|
|
||||||
|
|
||||||
if (!size)
|
|
||||||
return dst;
|
|
||||||
|
|
||||||
// 当源地址大于目标地址时,使用memcpy来完成
|
|
||||||
if (dst <= src)
|
|
||||||
return memcpy(dst, src, size);
|
|
||||||
|
|
||||||
// 当源地址小于目标地址时,为防止重叠覆盖,因此从后往前拷贝
|
|
||||||
_src += size;
|
|
||||||
_dst += size;
|
|
||||||
|
|
||||||
// 逐字节拷贝
|
|
||||||
while (size--)
|
|
||||||
*--_dst = *--_src;
|
|
||||||
|
|
||||||
return dst;
|
|
||||||
}
|
|
@ -1,101 +0,0 @@
|
|||||||
#include <common/string.h>
|
|
||||||
#include <common/glib.h>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 拷贝整个字符串
|
|
||||||
*
|
|
||||||
* @param dst 目标地址
|
|
||||||
* @param src 源地址
|
|
||||||
* @return char* 目标字符串
|
|
||||||
*/
|
|
||||||
char *strcpy(char *dst, const char *src)
|
|
||||||
{
|
|
||||||
while (*src)
|
|
||||||
{
|
|
||||||
*(dst++) = *(src++);
|
|
||||||
}
|
|
||||||
*dst = 0;
|
|
||||||
|
|
||||||
return dst;
|
|
||||||
}
|
|
||||||
|
|
||||||
long strnlen(const char *src, unsigned long maxlen)
|
|
||||||
{
|
|
||||||
|
|
||||||
if (src == NULL)
|
|
||||||
return 0;
|
|
||||||
register int __res = 0;
|
|
||||||
while (src[__res] != '\0' && __res < maxlen)
|
|
||||||
{
|
|
||||||
++__res;
|
|
||||||
}
|
|
||||||
return __res;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
比较字符串 FirstPart and SecondPart
|
|
||||||
FirstPart = SecondPart => 0
|
|
||||||
FirstPart > SecondPart => 1
|
|
||||||
FirstPart < SecondPart => -1
|
|
||||||
*/
|
|
||||||
int strcmp(const char *l, const char *r)
|
|
||||||
{
|
|
||||||
for (; *l == *r && *l; l++, r++)
|
|
||||||
;
|
|
||||||
return *(unsigned char *)l - *(unsigned char *)r;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *__stpncpy(char *restrict d, const char *restrict s, size_t n)
|
|
||||||
{
|
|
||||||
|
|
||||||
for (; n && (*d = *s); n--, s++, d++)
|
|
||||||
;
|
|
||||||
tail:
|
|
||||||
memset(d, 0, n);
|
|
||||||
return d;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *strncpy(char *restrict d, const char *restrict s, size_t n)
|
|
||||||
{
|
|
||||||
__stpncpy(d, s, n);
|
|
||||||
return d;
|
|
||||||
}
|
|
||||||
|
|
||||||
long strncpy_from_user(char *dst, const char *src, unsigned long size)
|
|
||||||
{
|
|
||||||
if (!verify_area((uint64_t)src, size))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
strncpy(dst, src, size);
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 测量来自用户空间的字符串的长度,会检验地址空间是否属于用户空间
|
|
||||||
* @param src
|
|
||||||
* @param maxlen
|
|
||||||
* @return long
|
|
||||||
*/
|
|
||||||
long strnlen_user(const char *src, unsigned long maxlen)
|
|
||||||
{
|
|
||||||
|
|
||||||
unsigned long size = strlen(src);
|
|
||||||
// 地址不合法
|
|
||||||
if (!verify_area((uint64_t)src, size))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return size <= maxlen ? size : maxlen;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 拼接两个字符串(将src接到dest末尾)
|
|
||||||
*
|
|
||||||
* @param dest 目标串
|
|
||||||
* @param src 源串
|
|
||||||
* @return char*
|
|
||||||
*/
|
|
||||||
char *strcat(char *dest, const char *src)
|
|
||||||
{
|
|
||||||
strcpy(dest + strlen(dest), src);
|
|
||||||
return dest;
|
|
||||||
}
|
|
@ -1,20 +0,0 @@
|
|||||||
#include <common/unistd.h>
|
|
||||||
#include <common/glib.h>
|
|
||||||
|
|
||||||
|
|
||||||
void swab(void *restrict src, void *restrict dest, ssize_t nbytes)
|
|
||||||
{
|
|
||||||
unsigned char buf[32];
|
|
||||||
char *_src = src;
|
|
||||||
char *_dest = dest;
|
|
||||||
uint32_t transfer;
|
|
||||||
for (; nbytes > 0; nbytes -= transfer)
|
|
||||||
{
|
|
||||||
transfer = (nbytes > 32) ? 32 : nbytes;
|
|
||||||
memcpy(buf, _src, transfer);
|
|
||||||
memcpy(_src, _dest, transfer);
|
|
||||||
memcpy(_dest, buf, transfer);
|
|
||||||
_src += transfer;
|
|
||||||
_dest += transfer;
|
|
||||||
}
|
|
||||||
}
|
|
@ -12,7 +12,6 @@
|
|||||||
#include "ptrace.h"
|
#include "ptrace.h"
|
||||||
#include <common/errno.h>
|
#include <common/errno.h>
|
||||||
#include <common/glib.h>
|
#include <common/glib.h>
|
||||||
#include <syscall/syscall.h>
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 进程退出时执行的函数
|
* @brief 进程退出时执行的函数
|
||||||
@ -32,6 +31,6 @@ extern uint32_t rs_current_pcb_cpuid();
|
|||||||
extern uint32_t rs_current_pcb_pid();
|
extern uint32_t rs_current_pcb_pid();
|
||||||
extern uint32_t rs_current_pcb_preempt_count();
|
extern uint32_t rs_current_pcb_preempt_count();
|
||||||
extern uint32_t rs_current_pcb_flags();
|
extern uint32_t rs_current_pcb_flags();
|
||||||
extern int64_t rs_current_pcb_thread_rbp();
|
extern uint64_t rs_current_pcb_thread_rbp();
|
||||||
|
|
||||||
#define PF_NEED_SCHED (1UL << 1)
|
#define PF_NEED_SCHED (1UL << 1)
|
||||||
|
@ -1,10 +0,0 @@
|
|||||||
SRC = $(wildcard *.c)
|
|
||||||
OBJ = $(SRC:.c=.o)
|
|
||||||
CFLAGS += -I .
|
|
||||||
|
|
||||||
.PHONY: all
|
|
||||||
|
|
||||||
all: $(OBJ)
|
|
||||||
|
|
||||||
%.o: %.c
|
|
||||||
$(CC) $(CFLAGS) -c $< -o $@
|
|
@ -1,54 +0,0 @@
|
|||||||
#include "syscall.h"
|
|
||||||
#include <arch/arch.h>
|
|
||||||
#include <common/errno.h>
|
|
||||||
#include <common/fcntl.h>
|
|
||||||
#include <common/string.h>
|
|
||||||
#include <mm/slab.h>
|
|
||||||
#include <process/process.h>
|
|
||||||
|
|
||||||
#if ARCH(I386) || ARCH(X86_64)
|
|
||||||
// 导出系统调用入口函数,定义在entry.S中
|
|
||||||
extern void syscall_int(void);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 通过中断进入系统调用
|
|
||||||
*
|
|
||||||
* @param syscall_id
|
|
||||||
* @param arg0
|
|
||||||
* @param arg1
|
|
||||||
* @param arg2
|
|
||||||
* @param arg3
|
|
||||||
* @param arg4
|
|
||||||
* @param arg5
|
|
||||||
* @param arg6
|
|
||||||
* @param arg7
|
|
||||||
* @return long
|
|
||||||
*/
|
|
||||||
|
|
||||||
long enter_syscall_int(ul syscall_id, ul arg0, ul arg1, ul arg2, ul arg3,
|
|
||||||
ul arg4, ul arg5) {
|
|
||||||
long err_code;
|
|
||||||
__asm__ __volatile__("movq %2, %%rdi \n\t"
|
|
||||||
"movq %3, %%rsi \n\t"
|
|
||||||
"movq %4, %%rdx \n\t"
|
|
||||||
"movq %5, %%r10 \n\t"
|
|
||||||
"movq %6, %%r8 \n\t"
|
|
||||||
"movq %7, %%r9 \n\t"
|
|
||||||
"int $0x80 \n\t"
|
|
||||||
: "=a"(err_code)
|
|
||||||
: "a"(syscall_id), "m"(arg0), "m"(arg1), "m"(arg2),
|
|
||||||
"m"(arg3), "m"(arg4), "m"(arg5)
|
|
||||||
: "memory", "r8", "r9", "r10", "rdi", "rsi", "rdx");
|
|
||||||
|
|
||||||
return err_code;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else
|
|
||||||
long enter_syscall_int(ul syscall_id, ul arg0, ul arg1, ul arg2, ul arg3,
|
|
||||||
ul arg4, ul arg5) {
|
|
||||||
while (1) {
|
|
||||||
/* code */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
@ -1,21 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <common/glib.h>
|
|
||||||
#include <common/kprint.h>
|
|
||||||
#include <common/unistd.h>
|
|
||||||
#include <process/ptrace.h>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 初始化系统调用模块
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
extern int syscall_init();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief 用户态系统调用入口函数
|
|
||||||
* 从用户态进入系统调用
|
|
||||||
* @param syscall_id 系统调用id
|
|
||||||
* @return long 错误码
|
|
||||||
*/
|
|
||||||
long enter_syscall_int(ul syscall_id, ul arg0, ul arg1, ul arg2, ul arg3, ul arg4, ul arg5);
|
|
||||||
|
|
@ -1,102 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
/**
|
|
||||||
* 请注意!!!由于系统调用模块已经使用Rust重构,当修改系统调用号时,需要同时修改syscall_num.h和syscall/mod.rs中的系统调用号
|
|
||||||
* 并且以syscall/mod.rs中的为准!!!
|
|
||||||
*
|
|
||||||
* TODO:在完成系统的重构后,删除syscall_num.h
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
// 定义系统调用号
|
|
||||||
#define SYS_READ 0
|
|
||||||
#define SYS_WRITE 1
|
|
||||||
#define SYS_OPEN 2
|
|
||||||
#define SYS_CLOSE 3
|
|
||||||
|
|
||||||
#define SYS_FSTAT 5
|
|
||||||
#define SYS_LSEEK 8
|
|
||||||
#define SYS_MMAP 9
|
|
||||||
#define SYS_MPROTECT 10
|
|
||||||
#define SYS_MUNMAP 11
|
|
||||||
#define SYS_BRK 12
|
|
||||||
#define SYS_SIGACTION 13
|
|
||||||
|
|
||||||
#define SYS_RT_SIGRETURN 15
|
|
||||||
#define SYS_IOCTL 16
|
|
||||||
|
|
||||||
#define SYS_DUP 32
|
|
||||||
#define SYS_DUP2 33
|
|
||||||
|
|
||||||
#define SYS_NANOSLEEP 35
|
|
||||||
#define SYS_ALARM 37
|
|
||||||
#define SYS_GETPID 39
|
|
||||||
|
|
||||||
#define SYS_SOCKET 41
|
|
||||||
#define SYS_CONNECT 42
|
|
||||||
#define SYS_ACCEPT 43
|
|
||||||
#define SYS_SENDTO 44
|
|
||||||
#define SYS_RECVFROM 45
|
|
||||||
|
|
||||||
#define SYS_RECVMSG 47
|
|
||||||
#define SYS_SHUTDOWN 48
|
|
||||||
#define SYS_BIND 49
|
|
||||||
#define SYS_LISTEN 50
|
|
||||||
#define SYS_GETSOCKNAME 51
|
|
||||||
#define SYS_GETPEERNAME 52
|
|
||||||
|
|
||||||
#define SYS_SETSOCKOPT 54
|
|
||||||
#define SYS_GETSOCKOPT 55
|
|
||||||
#define SYS_CLONE 56
|
|
||||||
#define SYS_FORK 57
|
|
||||||
#define SYS_VFORK 58
|
|
||||||
#define SYS_EXECVE 59
|
|
||||||
#define SYS_EXIT 60
|
|
||||||
#define SYS_WAIT4 61
|
|
||||||
#define SYS_KILL 62
|
|
||||||
#define SYS_UNAME 63
|
|
||||||
|
|
||||||
#define SYS_FCNTL 72
|
|
||||||
|
|
||||||
#define SYS_FTRUNCATE 77
|
|
||||||
#define SYS_GET_DENTS 78
|
|
||||||
|
|
||||||
#define SYS_GETCWD 79
|
|
||||||
|
|
||||||
#define SYS_CHDIR 80
|
|
||||||
|
|
||||||
#define SYS_MKDIR 83
|
|
||||||
#define SYS_RMDIR 84
|
|
||||||
|
|
||||||
#define SYS_LINK 86
|
|
||||||
|
|
||||||
#define SYS_GETTIMEOFDAY 96
|
|
||||||
|
|
||||||
#define SYS_ARCH_PRCTL 158
|
|
||||||
|
|
||||||
#define SYS_MOUNT 165
|
|
||||||
#define SYS_REBOOT 169
|
|
||||||
|
|
||||||
#define SYS_GETPPID 110
|
|
||||||
#define SYS_GETPGID 121
|
|
||||||
|
|
||||||
#define SYS_MKNOD 133
|
|
||||||
|
|
||||||
#define SYS_FUTEX 202
|
|
||||||
|
|
||||||
#define SYS_SET_TID_ADDR 218
|
|
||||||
|
|
||||||
#define SYS_UNLINK_AT 263
|
|
||||||
|
|
||||||
#define SYS_LINKAT 265
|
|
||||||
|
|
||||||
#define SYS_PIPE 293
|
|
||||||
|
|
||||||
#define SYS_WRITEV 20
|
|
||||||
|
|
||||||
// 与linux不一致的调用,在linux基础上累加
|
|
||||||
#define SYS_PUT_STRING 100000
|
|
||||||
#define SYS_SBRK 100001
|
|
||||||
/// todo: 该系统调用与Linux不一致,将来需要删除该系统调用!!!
|
|
||||||
/// 删的时候记得改C版本的libc
|
|
||||||
#define SYS_CLOCK 100002
|
|
||||||
#define SYS_SCHED 100003
|
|
1
tools/BUILD_CONTAINER_VERSION
Normal file
1
tools/BUILD_CONTAINER_VERSION
Normal file
@ -0,0 +1 @@
|
|||||||
|
v1.3
|
@ -1,53 +1,27 @@
|
|||||||
FROM debian:bullseye
|
FROM ubuntu:jammy
|
||||||
|
|
||||||
|
# 设置环境变量
|
||||||
|
ENV TZ=Asia/Shanghai
|
||||||
|
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
|
||||||
|
|
||||||
# 设置工作目录
|
# 设置工作目录
|
||||||
WORKDIR /build-image
|
WORKDIR /tmp
|
||||||
|
|
||||||
# 将本地的脚本复制到工作目录
|
# 将本地的脚本复制到工作目录
|
||||||
COPY *.sh ./
|
COPY *.sh ./
|
||||||
|
|
||||||
# 设置用来存放rust缓存的卷
|
# 设置sudo免密码
|
||||||
VOLUME [ "/root/.cargo/registry" ]
|
RUN apt update && \
|
||||||
|
apt install -y ca-certificates curl gnupg wget sudo apt-utils && \
|
||||||
|
bash bootstrap.sh --default && \
|
||||||
|
sudo cp /tmp/docker-entrypoint.sh /root/entrypoint.sh && \
|
||||||
|
sudo chmod a+rwx /root/entrypoint.sh && \
|
||||||
|
sudo apt autoremove -q -y && \
|
||||||
|
sudo apt clean -q -y && \
|
||||||
|
sudo rm -rf /tmp/*
|
||||||
|
|
||||||
# 设置rust源的环境变量
|
WORKDIR /root
|
||||||
ENV RUSTUP_DIST_SERVER=https://mirrors.ustc.edu.cn/rust-static
|
|
||||||
ENV RUSTUP_UPDATE_ROOT=https://mirrors.ustc.edu.cn/rust-static/rustup
|
|
||||||
|
|
||||||
RUN sed -i "s@http://\(deb\|security\).debian.org@http://mirrors.ustc.edu.cn@g" /etc/apt/sources.list && apt update && apt install -y \
|
ENTRYPOINT [ "/root/entrypoint.sh" ]
|
||||||
ca-certificates \
|
|
||||||
curl \
|
|
||||||
gnupg \
|
|
||||||
lsb-release \
|
|
||||||
llvm-dev libclang-dev clang gcc-multilib \
|
|
||||||
gcc build-essential fdisk dosfstools qemu-kvm \
|
|
||||||
sudo wget
|
|
||||||
|
|
||||||
# 安装Rust
|
|
||||||
RUN curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain nightly -y && \
|
|
||||||
# You have to add the rustup variables to the $PATH
|
|
||||||
echo "export PATH=\"\$HOME/.cargo/bin:\$PATH\"" >> ~/.bashrc && \
|
|
||||||
bash -c "source $HOME/.cargo/env && \
|
|
||||||
# 更换cargo的索引源
|
|
||||||
touch $HOME/.cargo/config && \
|
|
||||||
bash change_rust_src.sh && \
|
|
||||||
# 安装rust的编译工具
|
|
||||||
echo "正在安装DragonOS所需的rust组件...首次安装需要一些时间来更新索引,请耐心等待..." && \
|
|
||||||
cargo install cargo-binutils && \
|
|
||||||
rustup toolchain install nightly && \
|
|
||||||
rustup default nightly && \
|
|
||||||
rustup component add rust-src && \
|
|
||||||
rustup component add llvm-tools-preview && \
|
|
||||||
rustup target add x86_64-unknown-none"
|
|
||||||
|
|
||||||
# 编译安装GCC交叉编译工具链
|
|
||||||
RUN bash build_gcc_toolchain.sh -f
|
|
||||||
|
|
||||||
# 清除缓存
|
|
||||||
WORKDIR /
|
|
||||||
RUN apt-get autoremove -q -y && \
|
|
||||||
apt-get clean -q -y && \
|
|
||||||
rm -rf /build-image
|
|
||||||
|
|
||||||
ENV DragonOS_GCC=/root/opt/dragonos-gcc/gcc-x86_64-unknown-none/bin/
|
|
||||||
# 设置容器启动后执行的命令
|
# 设置容器启动后执行的命令
|
||||||
CMD ["/bin/bash"]
|
CMD ["/bin/bash"]
|
||||||
|
@ -19,8 +19,11 @@ source "$HOME/.$CURRENT_SHELL"rc
|
|||||||
emulator="qemu"
|
emulator="qemu"
|
||||||
defpackman="apt-get"
|
defpackman="apt-get"
|
||||||
dockerInstall="true"
|
dockerInstall="true"
|
||||||
export RUSTUP_DIST_SERVER=https://mirrors.ustc.edu.cn/rust-static
|
DEFAULT_INSTALL="false"
|
||||||
export RUSTUP_UPDATE_ROOT=https://mirrors.ustc.edu.cn/rust-static/rustup
|
|
||||||
|
export RUSTUP_DIST_SERVER=${RUSTUP_DIST_SERVER:-https://rsproxy.cn}
|
||||||
|
export RUSTUP_UPDATE_ROOT=${RUSTUP_UPDATE_ROOT:-https://rsproxy.cn/rustup}
|
||||||
|
export RUST_VERSION="${RUST_VERSION:-nightly-2024-07-23}"
|
||||||
|
|
||||||
banner()
|
banner()
|
||||||
{
|
{
|
||||||
@ -62,7 +65,7 @@ install_ubuntu_debian_pkg()
|
|||||||
lsb-release \
|
lsb-release \
|
||||||
llvm-dev libclang-dev clang gcc-multilib \
|
llvm-dev libclang-dev clang gcc-multilib \
|
||||||
gcc build-essential fdisk dosfstools dnsmasq bridge-utils iptables libssl-dev pkg-config \
|
gcc build-essential fdisk dosfstools dnsmasq bridge-utils iptables libssl-dev pkg-config \
|
||||||
sphinx
|
sphinx make git
|
||||||
# 必须分开安装,否则会出现错误
|
# 必须分开安装,否则会出现错误
|
||||||
sudo "$1" install -y \
|
sudo "$1" install -y \
|
||||||
gcc-riscv64-unknown-elf gcc-riscv64-linux-gnu gdb-multiarch
|
gcc-riscv64-unknown-elf gcc-riscv64-linux-gnu gdb-multiarch
|
||||||
@ -73,7 +76,7 @@ install_ubuntu_debian_pkg()
|
|||||||
sudo apt install -y python3 python3-pip
|
sudo apt install -y python3 python3-pip
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -z "$(which docker)" ] && [ -n ${dockerInstall} ]; then
|
if [ -z "$(which docker)" ] && [ "${dockerInstall}" = "true" ]; then
|
||||||
echo "正在安装docker..."
|
echo "正在安装docker..."
|
||||||
sudo apt install -y docker.io docker-compose
|
sudo apt install -y docker.io docker-compose
|
||||||
sudo groupadd docker
|
sudo groupadd docker
|
||||||
@ -190,30 +193,26 @@ rustInstall() {
|
|||||||
fi
|
fi
|
||||||
# If rustup is not installed we should offer to install it for them
|
# If rustup is not installed we should offer to install it for them
|
||||||
if [ -z "$(which rustup)" ]; then
|
if [ -z "$(which rustup)" ]; then
|
||||||
echo "您没有安装rustup,"
|
echo "正在安装Rust..."
|
||||||
echo "我们强烈建议使用rustup, 是否要立即安装?"
|
|
||||||
echo "*WARNING* 这将会发起这样的一个命令 'curl | sh' "
|
|
||||||
printf "(y/N): "
|
|
||||||
read rustup
|
|
||||||
if echo "$rustup" | grep -iq "^y" ;then
|
|
||||||
#install rustup
|
#install rustup
|
||||||
curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain nightly
|
curl https://sh.rustup.rs -sSf --retry 5 --retry-delay 5 | sh -s -- --default-toolchain ${RUST_VERSION} -y
|
||||||
# You have to add the rustup variables to the $PATH
|
# You have to add the rustup variables to the $PATH
|
||||||
echo "export PATH=\"\$HOME/.cargo/bin:\$PATH\"" >> ~/.bashrc
|
echo "export PATH=\"\$HOME/.cargo/bin:\$PATH\"" >> ~/.bashrc
|
||||||
# source the variables so that we can execute rustup commands in the current shell
|
# source the variables so that we can execute rustup commands in the current shell
|
||||||
source ~/.cargo/env
|
source ~/.cargo/env
|
||||||
source "$HOME/.cargo/env"
|
source "$HOME/.cargo/env"
|
||||||
else
|
|
||||||
echo "Rustup will not be installed!"
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
#
|
#
|
||||||
if [ -z "$(which rustc)" ]; then
|
if [ -z "$(which rustc)" ]; then
|
||||||
echo "Rust 还未被安装"
|
echo "Rust 还未被安装"
|
||||||
echo "请再次运行脚本,接受rustup安装"
|
echo "请再次运行脚本,接受rustup安装"
|
||||||
echo "或通过以下方式手动安装rustc(不推荐):"
|
echo "或通过以下方式手动安装rustc(不推荐):"
|
||||||
echo "curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain nightly"
|
echo "curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain $RUST_VERSION -y"
|
||||||
exit
|
exit
|
||||||
|
else
|
||||||
|
local change_rust_src=""
|
||||||
|
if [ "$DEFAULT_INSTALL" = "true" ]; then
|
||||||
|
change_rust_src="true"
|
||||||
else
|
else
|
||||||
echo "是否为Rust换源为国内镜像源?(Tuna)"
|
echo "是否为Rust换源为国内镜像源?(Tuna)"
|
||||||
echo "如果您在国内,我们推荐您这样做,以提升网络速度。"
|
echo "如果您在国内,我们推荐您这样做,以提升网络速度。"
|
||||||
@ -221,66 +220,43 @@ rustInstall() {
|
|||||||
printf "(y/N): "
|
printf "(y/N): "
|
||||||
read change_src
|
read change_src
|
||||||
if echo "$change_src" | grep -iq "^y" ;then
|
if echo "$change_src" | grep -iq "^y" ;then
|
||||||
touch ~/.cargo/config
|
change_rust_src="true"
|
||||||
bash change_rust_src.sh
|
|
||||||
else
|
else
|
||||||
echo "取消换源,您原有的配置不会被改变。"
|
echo "取消换源,您原有的配置不会被改变。"
|
||||||
fi
|
fi
|
||||||
|
fi
|
||||||
|
if [ "$change_rust_src" = "true" ]; then
|
||||||
|
echo "正在为rust换源"
|
||||||
|
bash change_rust_src.sh --sparse
|
||||||
|
fi
|
||||||
|
|
||||||
echo "正在安装DragonOS所需的rust组件...首次安装需要一些时间来更新索引,请耐心等待..."
|
echo "正在安装DragonOS所需的rust组件...首次安装需要一些时间来更新索引,请耐心等待..."
|
||||||
cargo install cargo-binutils
|
cargo install cargo-binutils
|
||||||
rustup toolchain install nightly-2023-08-15-x86_64-unknown-linux-gnu
|
rustup toolchain install nightly-2023-08-15-x86_64-unknown-linux-gnu
|
||||||
rustup toolchain install nightly-2024-07-23-x86_64-unknown-linux-gnu
|
rustup toolchain install $RUST_VERSION-x86_64-unknown-linux-gnu
|
||||||
rustup component add rust-src --toolchain nightly-2024-07-23-x86_64-unknown-linux-gnu
|
rustup component add rust-src --toolchain $RUST_VERSION-x86_64-unknown-linux-gnu
|
||||||
rustup component add rust-src --toolchain nightly-2023-08-15-x86_64-unknown-linux-gnu
|
rustup component add rust-src --toolchain nightly-2023-08-15-x86_64-unknown-linux-gnu
|
||||||
rustup target add x86_64-unknown-none --toolchain nightly-2024-07-23-x86_64-unknown-linux-gnu
|
rustup target add x86_64-unknown-none --toolchain $RUST_VERSION-x86_64-unknown-linux-gnu
|
||||||
rustup target add x86_64-unknown-none --toolchain nightly-2023-08-15-x86_64-unknown-linux-gnu
|
rustup target add x86_64-unknown-none --toolchain nightly-2023-08-15-x86_64-unknown-linux-gnu
|
||||||
rustup target add x86_64-unknown-linux-musl --toolchain nightly-2023-08-15-x86_64-unknown-linux-gnu
|
rustup target add x86_64-unknown-linux-musl --toolchain nightly-2023-08-15-x86_64-unknown-linux-gnu
|
||||||
rustup target add x86_64-unknown-linux-musl --toolchain nightly-2024-07-23-x86_64-unknown-linux-gnu
|
rustup target add x86_64-unknown-linux-musl --toolchain $RUST_VERSION-x86_64-unknown-linux-gnu
|
||||||
|
|
||||||
rustup toolchain install nightly-2024-07-23-riscv64gc-unknown-linux-gnu --force-non-host
|
rustup toolchain install $RUST_VERSION-riscv64gc-unknown-linux-gnu --force-non-host
|
||||||
rustup toolchain install nightly-2023-08-15-riscv64gc-unknown-linux-gnu --force-non-host
|
rustup toolchain install nightly-2023-08-15-riscv64gc-unknown-linux-gnu --force-non-host
|
||||||
rustup target add riscv64gc-unknown-none-elf --toolchain nightly-2024-07-23-riscv64gc-unknown-linux-gnu
|
rustup target add riscv64gc-unknown-none-elf --toolchain $RUST_VERSION-riscv64gc-unknown-linux-gnu
|
||||||
rustup target add riscv64imac-unknown-none-elf --toolchain nightly-2024-07-23-riscv64gc-unknown-linux-gnu
|
rustup target add riscv64imac-unknown-none-elf --toolchain $RUST_VERSION-riscv64gc-unknown-linux-gnu
|
||||||
rustup target add riscv64gc-unknown-none-elf --toolchain nightly-2023-08-15-riscv64gc-unknown-linux-gnu
|
rustup target add riscv64gc-unknown-none-elf --toolchain nightly-2023-08-15-riscv64gc-unknown-linux-gnu
|
||||||
rustup target add riscv64imac-unknown-none-elf --toolchain nightly-2023-08-15-riscv64gc-unknown-linux-gnu
|
rustup target add riscv64imac-unknown-none-elf --toolchain nightly-2023-08-15-riscv64gc-unknown-linux-gnu
|
||||||
|
|
||||||
rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu
|
rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu
|
||||||
rustup component add rust-src
|
rustup component add rust-src
|
||||||
rustup component add llvm-tools-preview
|
rustup component add llvm-tools-preview
|
||||||
rustup default nightly-2024-07-23
|
rustup default $RUST_VERSION
|
||||||
|
|
||||||
echo "Rust已经成功的在您的计算机上安装!请运行 source ~/.cargo/env 以使rust在当前窗口生效!"
|
echo "Rust已经成功的在您的计算机上安装!请运行 source ~/.cargo/env 以使rust在当前窗口生效!"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
####################################################################################
|
|
||||||
# 初始化DragonOS的musl交叉编译工具链
|
|
||||||
# 主要是把musl交叉编译工具链的rcrt1.o替换为crt1.o (因为rust的rcrt1.o会使用动态链接的解释器,但是DragonOS目前尚未把它加载进来)
|
|
||||||
#
|
|
||||||
# 为DragonOS开发应用的时候,请使用 `cargo +nightly-2023-08-15-x86_64-unknown-linux-gnu build --target x86_64-unknown-linux-musl` 来编译
|
|
||||||
# 这样编译出来的应用将能二进制兼容DragonOS
|
|
||||||
####################################################################################
|
|
||||||
initialize_userland_musl_toolchain()
|
|
||||||
{
|
|
||||||
fork_toolchain_from="nightly-2023-08-15-x86_64-unknown-linux-gnu"
|
|
||||||
custom_toolchain="nightly-2023-08-15-x86_64-unknown-linux_dragonos-gnu"
|
|
||||||
custom_toolchain_dir="$(dirname $(rustc --print sysroot))/${custom_toolchain}"
|
|
||||||
# 如果目录为空
|
|
||||||
if [ ! -d "${custom_toolchain_dir}" ]; then
|
|
||||||
echo "Custom toolchain does not exist, creating..."
|
|
||||||
rustup toolchain install ${fork_toolchain_from}
|
|
||||||
rustup component add --toolchain ${fork_toolchain_from} rust-src
|
|
||||||
rustup target add --toolchain ${fork_toolchain_from} x86_64-unknown-linux-musl
|
|
||||||
cp -r $(dirname $(rustc --print sysroot))/${fork_toolchain_from} ${custom_toolchain_dir}
|
|
||||||
self_contained_dir=${custom_toolchain_dir}/lib/rustlib/x86_64-unknown-linux-musl/lib/self-contained
|
|
||||||
cp -f ${self_contained_dir}/crt1.o ${self_contained_dir}/rcrt1.o
|
|
||||||
else
|
|
||||||
echo "Custom toolchain already exists."
|
|
||||||
fi
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
install_python_pkg()
|
install_python_pkg()
|
||||||
{
|
{
|
||||||
echo "正在安装python依赖项..."
|
echo "正在安装python依赖项..."
|
||||||
@ -300,6 +276,10 @@ while true; do
|
|||||||
"--no-docker")
|
"--no-docker")
|
||||||
dockerInstall=""
|
dockerInstall=""
|
||||||
;;
|
;;
|
||||||
|
"--default")
|
||||||
|
DEFAULT_INSTALL="true"
|
||||||
|
dockerInstall=""
|
||||||
|
;;
|
||||||
"--help")
|
"--help")
|
||||||
echo "--no-docker(not install docker): 该参数表示执行该脚本的过程中不单独安装docker."
|
echo "--no-docker(not install docker): 该参数表示执行该脚本的过程中不单独安装docker."
|
||||||
exit 0
|
exit 0
|
||||||
@ -349,9 +329,6 @@ fi
|
|||||||
# 安装rust
|
# 安装rust
|
||||||
rustInstall
|
rustInstall
|
||||||
|
|
||||||
|
|
||||||
# 初始化DragonOS的musl交叉编译工具链
|
|
||||||
initialize_userland_musl_toolchain
|
|
||||||
install_python_pkg
|
install_python_pkg
|
||||||
|
|
||||||
# 安装dadk
|
# 安装dadk
|
||||||
@ -359,10 +336,6 @@ cargo install dadk || exit 1
|
|||||||
|
|
||||||
bashpath=$(cd `dirname $0`; pwd)
|
bashpath=$(cd `dirname $0`; pwd)
|
||||||
|
|
||||||
# 创建磁盘镜像
|
|
||||||
bash ${bashpath}/create_hdd_image.sh
|
|
||||||
# 编译安装GCC交叉编译工具链
|
|
||||||
bash ${bashpath}/build_gcc_toolchain.sh -cs -kb -kg || (echo "GCC交叉编译工具链安装失败" && exit 1)
|
|
||||||
# 编译安装musl交叉编译工具链
|
# 编译安装musl交叉编译工具链
|
||||||
bash ${bashpath}/install_musl_gcc.sh || (echo "musl交叉编译工具链安装失败" && exit 1)
|
bash ${bashpath}/install_musl_gcc.sh || (echo "musl交叉编译工具链安装失败" && exit 1)
|
||||||
# 编译安装grub
|
# 编译安装grub
|
||||||
@ -370,7 +343,8 @@ bash ${bashpath}/grub_auto_install.sh || (echo "grub安装失败" && exit 1)
|
|||||||
|
|
||||||
# 解决kvm权限问题
|
# 解决kvm权限问题
|
||||||
USR=$USER
|
USR=$USER
|
||||||
sudo adduser $USR kvm
|
sudo groupadd kvm || echo "kvm组已存在"
|
||||||
|
sudo usermod -aG kvm $USR
|
||||||
sudo chown $USR /dev/kvm
|
sudo chown $USR /dev/kvm
|
||||||
|
|
||||||
congratulations
|
congratulations
|
||||||
|
@ -1,6 +1,13 @@
|
|||||||
echo "正在为rust换源"
|
echo "正在为rust换源"
|
||||||
echo "bash change_rust_src.sh --sparse以使用稀疏索引"
|
|
||||||
sparse="false"
|
sparse="false"
|
||||||
|
|
||||||
|
CONFIG_FILE=~/.cargo/config.toml
|
||||||
|
# 创建父目录
|
||||||
|
if [ ! -d ~/.cargo ]; then
|
||||||
|
mkdir -p ~/.cargo
|
||||||
|
fi
|
||||||
|
|
||||||
while true; do
|
while true; do
|
||||||
if [ -z "$1" ]; then
|
if [ -z "$1" ]; then
|
||||||
break;
|
break;
|
||||||
@ -13,21 +20,32 @@ while true; do
|
|||||||
esac
|
esac
|
||||||
shift 1
|
shift 1
|
||||||
done
|
done
|
||||||
|
|
||||||
|
|
||||||
if [ -z ${sparse} ]; then
|
if [ -z ${sparse} ]; then
|
||||||
echo -e "[source.crates-io] \n \
|
echo -e "[source.crates-io] \n \
|
||||||
registry = \"https://github.com/rust-lang/crates.io-index\" \n \
|
replace-with = 'rsproxy-sparse' \n \
|
||||||
\n \
|
[source.rsproxy] \n \
|
||||||
replace-with = 'tuna' \n \
|
registry = \"https://rsproxy.cn/crates.io-index\" \n \
|
||||||
[source.tuna] \n \
|
[source.rsproxy-sparse] \n \
|
||||||
registry = \"sparse+https://mirrors.tuna.tsinghua.edu.cn/crates.io-index/\" \n \
|
registry = \"sparse+https://rsproxy.cn/index/\" \n \
|
||||||
" > ~/.cargo/config.toml
|
[registries.rsproxy] \n \
|
||||||
|
index = \"https://rsproxy.cn/crates.io-index\" \n \
|
||||||
|
[net] \n \
|
||||||
|
git-fetch-with-cli = true \n \
|
||||||
|
" > $CONFIG_FILE
|
||||||
else
|
else
|
||||||
echo -e "[source.crates-io] \n \
|
echo "TIPS: bash change_rust_src.sh --sparse以使用稀疏索引"
|
||||||
registry = \"https://github.com/rust-lang/crates.io-index\" \n \
|
|
||||||
\n \
|
|
||||||
replace-with = 'tuna' \n \
|
|
||||||
[source.tuna] \n \
|
|
||||||
registry = \"https://mirrors.tuna.tsinghua.edu.cn/git/crates.io-index.git\" \n \
|
|
||||||
" > ~/.cargo/config.toml
|
|
||||||
|
|
||||||
|
echo -e "[source.crates-io] \n \
|
||||||
|
replace-with = 'rsproxy' \n \
|
||||||
|
[source.rsproxy] \n \
|
||||||
|
registry = \"https://rsproxy.cn/crates.io-index\" \n \
|
||||||
|
[source.rsproxy-sparse] \n \
|
||||||
|
registry = \"sparse+https://rsproxy.cn/index/\" \n \
|
||||||
|
[registries.rsproxy] \n \
|
||||||
|
index = \"https://rsproxy.cn/crates.io-index\" \n \
|
||||||
|
[net] \n \
|
||||||
|
git-fetch-with-cli = true \n \
|
||||||
|
" > $CONFIG_FILE
|
||||||
fi
|
fi
|
||||||
|
3
tools/docker-entrypoint.sh
Normal file
3
tools/docker-entrypoint.sh
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
exec "$@"
|
@ -33,6 +33,8 @@ fi
|
|||||||
|
|
||||||
INSTALL_POS="$HOME/opt/"
|
INSTALL_POS="$HOME/opt/"
|
||||||
|
|
||||||
|
mkdir -p $INSTALL_POS
|
||||||
|
|
||||||
get_shell_rc_file()
|
get_shell_rc_file()
|
||||||
{
|
{
|
||||||
if [ -n "$ZSH_VERSION" ]; then
|
if [ -n "$ZSH_VERSION" ]; then
|
||||||
|
Loading…
x
Reference in New Issue
Block a user