導航:首頁 > 編程系統 > linux編譯v8

linux編譯v8

發布時間:2023-02-09 17:39:30

linux驅動模塊insmod時處理器類型錯誤

內核模塊有版本識別,必須用目標內核版本的源代碼編譯才可以。

Ⅱ 在ubuntu里怎樣運行編譯好的谷歌v8

大名頂頂的Chrome V8引擎大家應該都知道了,我就不廢話多說,不知道的可以去GOOGLE Code搜索。
不過不得不提的是Google Chrome V8引擎的開發者拉斯巴克(Lars Bak)。他是一個編程天才,卻遠離計算機世界的核心,在丹麥為Google工作,
這個工作地方是一個邊遠的農場,環境很優美。

在編譯之前先看一下我的機器環境:
1.Linux yuchao-Latitude-E5410 2.6.35-22-generic #33-Ubuntu SMP Sun Sep 19 20:34:50 UTC 2010 i686 GNU/Linux
2.gcc (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5
3.GNU Make 3.81 這個程序創建為 i686-pc-linux-gnu
4.GNU ld (GNU Binutils for Ubuntu) 2.20.51-system.20100908
5.svn,版本 1.6.12 (r955767)
編譯於 Mar 23 2011,12:56:23
6.Python 2.6.6
7.SCons by Steven Knight et al.:
script: v2.0.0.final.0.r5023, 2010/06/14 22:05:46, by scons on scons-dev
engine: v2.0.0.final.0.r5023, 2010/06/14 22:05:46, by scons on scons-dev
特別說明:SCons 是一個用 Python 語言編寫的類似於 make 工具的程序。與 make 工具相比較,SCons 的配置文件更加簡單清晰明了,
除此之外,它還有許多的優點。本文將簡單介紹如何在軟體開發項目中使用 SCons,通過本文,讀者可以學習到如何使用 SCons 來建造自己的程序項目。

Ⅲ ARMv8 Linux內核錯誤處理過程分析怎麼解決

1.1 Linux內核異常處理相關文件
Linux內核中,異常處理主要由兩個文件完成,entry.S和traps.c,當然還有一些其它異常處理函數分布於fault.c, memory.c等等。entry.S包含異常的入口、進入異常處理C函數前的壓棧、退出C函數前的出棧、一些fork函數相關的處理代碼(暫不分析)、任務切換匯編處理過程(cpu_switch_to函數,暫不分析)。traps.c主要包含異常處理C函數。
本文主要分析entry.S,對於traps.c作簡要介紹。
1.2 執行kernel_entry之前的棧

1.3 執行kernel_entry時的棧

1.4 執行kernel_exit 時的棧

1.5 entry.s代碼分析
/*
* Low-level exception handling code
*
* Copyright (C) 2012 ARM Ltd.
* Authors: Catalin Marinas <[email protected]>
* Will Deacon <[email protected]>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

#include <linux/init.h>
#include <linux/linkage.h>

#include <asm/assembler.h>
#include <asm/asm-offsets.h>
#include <asm/errno.h>
#include <asm/thread_info.h>
#include <asm/unistd.h>
#include <asm/unistd32.h>

/*
* Bad Abort numbers
*-----------------
*/
#define BAD_SYNC 0
#define BAD_IRQ 1
#define BAD_FIQ 2
#define BAD_ERROR 3

//根據該結構體內容
/*
struct pt_regs {
union {
struct user_pt_regs user_regs;//結構體user_pt_regs和結構體pt_regs內容一樣
struct { //共用體存儲31個通用寄存器,外加sp,pc,pstate三個特殊寄存器
//該結構體用於異常處理的壓棧彈棧操作
u64 regs[31];
u64 sp;
u64 pc;
u64 pstate;
};
};
u64 orig_x0;
u64 syscallno;
};
*/

//S_FRAME_SIZE定義在asm-offsets.c中,DEFINE(S_FRAME_SIZE,sizeof(struct pt_regs));
//即結構體pt_regs的大小,結構體pt_regs的定義見上面
//S_LR定義:DEFINE(S_LR,offsetof(struct pt_regs, regs[30]));
//即31號寄存器在結構體pt_regs中的偏移量
//閱讀以下內容請參考圖1 和圖2
.macro kernel_entry, el, regsize = 64
sub sp, sp, #S_FRAME_SIZE - S_LR // room for LR, SP, SPSR, ELR,見圖2中sp'指向的位置
.if \regsize == 32
mov w0, w0 // zero upper 32 bits of x0
.endif
/*
*.macro push, xreg1, xreg2 //壓棧兩個寄存器
*stp \xreg1, \xreg2, [sp, #-16]! //注意!!!push指令也改變sp的值!!!
*.endm
*/
push x28, x29 //進行壓棧操作,push也是一個宏定義,因為ARMv8沒有push指令,用stp代替
push x26, x27
push x24, x25
push x22, x23
push x20, x21
push x18, x19
push x16, x17
push x14, x15
push x12, x13
push x10, x11
push x8, x9
push x6, x7
push x4, x5
push x2, x3
push x0, x1 //此時sp指向位置見圖2中sp''
.if \el == 0 //如果異常級是el0,把el0的sp棧指針給x21寄存器
mrs x21, sp_el0
.else
add x21, sp, #S_FRAME_SIZE //如果異常級不是el0,把sp指針指向的地方加上pt_regs大小後的地址放入x21,
//即指向沒進入kernel_entry函數錢的sp指向的位置,見圖2中x21指向的地址
.endif
mrs x22, elr_el1 //把el1的lr寄存器給x22
mrs x23, spsr_el1 //把spsr給x23
stp lr, x21, [sp, #S_LR] //把lr,x21寄存器存入sp+S_LR指向的地方
stp x22, x23, [sp, #S_PC] //把lr,存入sp+s_PC指向的位置,用於異常返回

/*
* Set syscallno to -1 by default (overridden later if real syscall).
*/
.if \el == 0
mvn x21, xzr
str x21, [sp, #S_SYSCALLNO]
.endif
/*
* Registers that may be useful after this macro is invoked:
*
* x21 - aborted SP
* x22 - aborted PC
* x23 - aborted PSTATE
*/
.endm

.macro kernel_exit, el, ret = 0
//把此時sp(即圖2中sp'')+S_PC位置處開始的16位元組內容分別給x21,x22
//即把棧中存的x21和x22內容取出來
ldp x21, x22, [sp, #S_PC] // load ELR, SPSR
.if \el == 0
ldr x23, [sp, #S_SP] // load return stack pointer,取出
.endif
.if \ret
ldr x1, [sp, #S_X1] // preserve x0 (syscall return),如果ret=1,則保存x0,用於系統調用,暫不分析
add sp, sp, S_X2
.else
pop x0, x1 //如果ret=0,彈出x0,x1
.endif
pop x2, x3 // load the rest of the registers
pop x4, x5
pop x6, x7
pop x8, x9
msr elr_el1, x21 // set up the return data,把前面彈出的x21,x22分別賦值給elr_el1,spsr_el1
msr spsr_el1, x22
.if \el == 0
msr sp_el0, x23
.endif
pop x10, x11
pop x12, x13
pop x14, x15
pop x16, x17
pop x18, x19
pop x20, x21
pop x22, x23
pop x24, x25
pop x26, x27
pop x28, x29
ldr lr, [sp], #S_FRAME_SIZE - S_LR // load LR and restore SP,把lr彈出
eret // return to kernel,異常返回,該指令會把lr給pc,完成跳轉
.endm

.macro get_thread_info, rd
mov \rd, sp
and \rd, \rd, #~((1 << 13) - 1) // top of 8K stack
.endm

/*
* These are the registers used in the syscall handler, and allow us to
* have in theory up to 7 arguments to a function - x0 to x6.
*
* x7 is reserved for the system call number in 32-bit mode.
*/
sc_nr .req x25 // number of system calls
scno .req x26 // syscall number
stbl .req x27 // syscall table pointer
tsk .req x28 // current thread_info

/*
* Interrupt handling.
*/
.macro irq_handler
ldr x1, handle_arch_irq
mov x0, sp
blr x1
.endm

.text

/*
* Exception vectors.
*/
.macro ventry label //這里是2^7對齊,即對齊到內存地址的0x80
.align 7
b \label
.endm

.align 11

/* ENTRY也是一個宏,定義在include/linkage.h中
* #ifndef ENTRY
* #define ENTRY(name) \
* .globl name; \
* ALIGN; \
* name:
* #endif

Ⅳ ARMv8 Linux內核錯誤處理過程分析怎麼解決

你是安裝了什麼自己開發的驅動嗎?還是安裝了第三方程序出現的? 從貼出的信息可以看出,建議根據內核oops定位錯誤,從之前的經驗來看,很可能是使用了未定義的變數。

Ⅳ 安裝了VMwareWorkstation.v8並安裝了Red Hat Enterprise Linux 6,但是裡面沒有安裝g++編譯器,只有gcc

建議:
1. 打開終端,輸入命令「 rpm -qa |grep c++」查看C++編譯器是否存在,如果存在應該顯示如下:
[root@localhost ~]# rpm -qa |grep c++
gcc-c++-4.1.2-46.el5
libstdc++-devel-4.1.2-46.el5
compat-libstdc++-33-3.2.3-61
compat-gcc-34-c++-3.4.6-4
compat-libstdc++-296-2.96-138
libstdc++-4.1.2-46.el5
2. 如果沒有反饋,說明對應的RPM包沒有安裝;
3. 可以在系統光碟的「Server」文件夾下,找到對應的RPM安裝包;
4. 將對應的RPM包拷貝到你的RHEL6中,安裝方式如下:
4.1 在圖形界面,直接雙擊安裝即可,如果出現錯誤,檢查是否一些相關聯的軟體包沒有正確安裝,按照提示信息,順序安裝即可;
4.2 在命令行界面,使用命令「rpm -ivh 對應的軟體包全名.rpm"安裝即可;
4.3 安裝完成後使用命令「rpm -qa |grep c++」查詢即可知道是否安裝正確。
5. 如果你購買了Redhat的服務或者是在Redhat中注冊過了的話,也可以使用Yum功能實現在線安裝;
6. 其他可能的方法。

Ⅵ node.js安裝後自帶哪個工具

node.js安裝後自帶工具:已經在node的shell中了,直接輸入js代碼。

遇到問題就解決問題嘛,上StackOverflow一般都能找到先例的,如果是網路問題(npm默認倉庫在牆外)導致的包無法安裝,請採用cnpm,切換到國內的淘寶倉庫。 如果是因為windows的問題導致一些模塊無法正常編譯,建議學習一下linux系統。

主要功能:

V8引擎本身使用了一些最新的編譯技術。這使得用javascript這類腳本語言編寫出來的代碼運行速度獲得了極大提升,又節省了開發成本。對性能的苛求是Node的一個關鍵因素。 Javascript是一個事件驅動語言,Node利用了這個優點,編寫出可擴展性高的伺服器。

Node採用了一個稱為「事件循環(event loop)」的架構,使得編寫可擴展性高的伺服器變得既容易又安全。提高伺服器性能的技巧有多種多樣。Node選擇了一種既能提高性能,又能減低開發復雜度的架構。這是一個非常重要的特性。並發編程通常很復雜且布滿地雷。Node繞過了這些,但仍提供很好的性能。


Ⅶ ARMv8 Linux內核錯誤處理過程分析怎麼解決

使用 crash 的先決條件 1. kernel 映像文件 vmlinux 在編譯的時候必須指定了 -g 參數,即帶有調試信息。 2. 需要有一個內存崩潰轉儲文件(例如 vmcore),或者可以通過 /dev/mem 或 /dev/crash 訪問的實時系統內存。如果 crash 命令行沒有指定轉...

Ⅷ 操作系統內核為linuxarmv8i是什麼意思

Android是基於Linux內核的操作系統。

提到Linux內核的時候,應該把它從概念上和「Linux操作系統」分割看來,內核只包括最基本的抽象,內存模型、進程調度、中斷處理等等。而操作系統是一個更廣的概念,不光包括內核,還包括了設備驅動、應用程序框架以及一些關鍵的能夠讓這個操作系統能為人所用的軟體。所以Ubuntu, Fedora等等這些桌面發行版可以看做是包裝了Linux內核的、不同的Linux操作系統。

Ⅸ android jni程序(c++)如何編譯適用於arm-v8指令集的32位程序

可以看到Android上層的Application和ApplicationFramework都是使用編寫,

底層包括系統和使用眾多的LIiraries都是C/C++編寫的。

所以上層Java要調用底層的C/C++函數庫必須通過Java的JNI來實現。

下面將學習Android是如何通過Jni來實現Java對C/C++函數的調用。以HelloWorld程序為例:

第一步:

使用Java編寫HelloWorld 的Android應用程序:

package com.lucyfyr;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class HelloWorld extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.v("fresne", printJNI("I am HelloWorld Activity"));
}
static
{
//載入庫文件
System.loadLibrary("HelloWorldJni");
}
//聲明原生函數 參數為String類型 返回類型為String
private native String printJNI(String inputStr);
}

這一步我們可以使用eclipse來生成一個App;

因為eclipse會自動為我們編譯此Java文件,後面要是用到。

第二步:

生成共享庫的頭文件:

進入到eclipse生成的Android Project中 :/HelloWorld/bin/classes/com/lucyfyr/
下:

可以看到裡面後很多後綴為.class的文件,就是eclipse為我們自動編譯好了的java文件,其中就有:

HelloWorld.class文件。

退回到classes一級目錄:/HelloWorld/bin/classes/

執行如下命令:

javah com.lucyfyr.HelloWorld

生成文件:com_lucyfyr_HelloWorld.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_lucyfyr_HelloWorld */
#ifndef _Included_com_lucyfyr_HelloWorld
#define _Included_com_lucyfyr_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_lucyfyr_HelloWorld
* Method: printJNI
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_lucyfyr_HelloWorld_printJNI
(JNIEnv *, jobject, jstring);
#ifdef __cplusplus
}
#endif
#endif

可以看到自動生成對應的函數:Java_com_lucyfyr_HelloWorld_printJNI

Java_ + 包名(com.lucyfyr) + 類名(HelloWorld) + 介面名(printJNI):必須要按此JNI規范來操作;

java虛擬機就可以在com.simon.HelloWorld類調用printJNI介面的時候自動找到這個C實現的Native函數調用。

當然函數名太長,可以在.c文件中通過函數名映射表來實現簡化。

第三步:

實現JNI原生函數源文件:

新建com_lucyfyr_HelloWorld.c文件:

#include <jni.h>
#define LOG_TAG "HelloWorld"
#include <utils/Log.h>
/* Native interface, it will be call in java code */
JNIEXPORT jstring JNICALL Java_com_lucyfyr_HelloWorld_printJNI(JNIEnv *env, jobject obj,jstring inputStr)
{
LOGI("fresne Hello World From libhelloworld.so!");
// 從 instring 字元串取得指向字元串 UTF 編碼的指針
const char *str =
(const char *)(*env)->GetStringUTFChars( env,inputStr, JNI_FALSE );
LOGI("fresne--->%s",(const char *)str);
// 通知虛擬機本地代碼不再需要通過 str 訪問 Java 字元串。
(*env)->ReleaseStringUTFChars(env, inputStr, (const char *)str );
return (*env)->NewStringUTF(env, "Hello World! I am Native interface");
}
/* This function will be call when the library first be load.
* You can do some init in the libray. return which version jni it support.
*/
jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
void *venv;
LOGI("fresne----->JNI_OnLoad!");
if ((*vm)->GetEnv(vm, (void**)&venv, JNI_VERSION_1_4) != JNI_OK) {
LOGE("fresne--->ERROR: GetEnv failed");
return -1;
}
return JNI_VERSION_1_4;
}

OnLoadJava_com_lucyfyr_HelloWorld_printJNI

函數裡面做一些log輸出 注意JNI中的log輸出的不同。

JNI_OnLoad函數JNI規范定義的,當共享庫第一次被載入的時候會被回調,

這個函數裡面可以進行一些初始化工作,比如注冊函數映射表,緩存一些變數等,

最後返回當前環境所支持的JNI環境。本例只是簡單的返回當前JNI環境。

http://www.cnblogs.com/bastard/archive/2012/05/19/2508913.html

Ⅹ 如何使用QEMU來模擬ARMv8開發平台

使用Qemu模擬Cortex-A9運行U-boot和Linux 作者來源於網路
我的開發環境: Ubuntu-12.04 所有軟體包為最新

1. 安裝GNU工具鏈

sudo apt-get insatll gcc-arm-linux-gnueabi

sudo apt-get insatll g++-arm-linux-gnueabi
安裝完成後會在 /usr/arm-linux-gnueabi/ 目錄下生成庫文件、頭文件等。 我安裝的GCC版本為:
arm-linux-gnueabi-gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3

Copyright (C) 2011 Free Software Foundation, Inc.

2. 安裝Qemu模擬器
sudo apt-get install qemu qemu-system qemu-utils

這時應該已經可以運行qemu-system-arm命令了, 其版本為:
qemu-system-arm --version

QEMU emulator version 1.0.50 (Debian 1.0.50-2012.03-0ubuntu2), Copyright (c) 2003-2008 Fabrice Bellard

3. 編譯和運行U-boot:
到 ftp://ftp.denx.de/pub/u-boot/ 下載最新版本的U-Boot源代碼, 我用的目前最新版本 u-boot-2012.04.tar.bz2
解壓後進入源代碼目錄,在Makefile裡面增加兩行:

閱讀全文

與linux編譯v8相關的資料

熱點內容
有票APP客服在哪裡 瀏覽:692
國資委63號文件從哪裡查 瀏覽:37
哪個app能顯示lrc字幕 瀏覽:53
jsdate轉換數字 瀏覽:198
賣票的網站取什麼名字好 瀏覽:355
羅湖免費網站製作怎麼樣 瀏覽:274
蘋果6plus測速度 瀏覽:290
u盤的文件變成快捷方式 瀏覽:970
支付寶密碼演算法 瀏覽:315
手機管家私密空間密碼 瀏覽:691
投影儀什麼編程做出來的 瀏覽:405
programd文件夾在哪裡 瀏覽:282
數據科學考研的專業科目是什麼 瀏覽:850
編程怎麼做到場景移動 瀏覽:166
配音秀草稿箱文件夾 瀏覽:642
丟失隱私文件怎麼恢復 瀏覽:187
怎麼收集數據表格 瀏覽:199
java登錄校驗碼 瀏覽:967
ug星空自動編程字體怎麼改 瀏覽:544
桌面文件大文件刪除後可否恢復 瀏覽:153

友情鏈接