㈠ linux 32位和64位的區別
第一、設計初衷不同
64位是為視頻、繪畫、高性能應用程序所設計開發的;32位是為普通用戶開發的。
第二、配置要求不同
64位操作系統只能安裝在64位電腦上,32位操作系統可以安裝在64位電腦上。
32位操作系統安裝在64位電腦上,其硬體恰似大車拉小車,這樣64位硬體性能會大打折扣。
第三、運算速度不同
64位CPU的數據寬度為64位,64位指令集可以運行64位數據指令,也就是說處理器一次可提取64位數據。比32位提高了一倍,理論上性能會相應提升1倍。
第四、定址能力不同
在Linux下32位系統不打開PAE的情況下,只能支持4G內存。
32位系統最大隻能支持3.2g左右內存,而64位系統支持高達128g的物理內存和多達16TB的虛擬內存。
第五、軟體普及不同
64位軟體相較32位軟體少。
㈡ 如何在linux內核中添加系統調用
一、Linux0.11下添加系統調用:
我在bochs2.2.1中對linux0.11內核添加了一個新的系統調用,步驟如下:
1./usr/src/linux/include/unistd.h中添加:#define __NR_mytest 87
然後在下面聲明函數原型:int mytest();
2./usr/src/linux/include/linux/sys.h中添加:extern int sys_mytest();
然後在sys_call_table中最後加上sys_mytest;
3.在/usr/src/linux/kernel/sys.c中添加函數實現如下:
int sys_mytest(){
printk("This is a test!");
return 123;
}
4.在/usr/src/linux/kernel/system_call.s中對系統調用號加1(原來是86改成了87)
5.然後到/usr/src/linux目錄下編譯內核make clean; make Image
6. cp /usr/src/linux/include/unistd.h /usr/include/unistd.h
7. reset bochs
8. 在/usr/root中生成test.c文件如下:
#define __LIBRARY__
#include <unistd.h>
_syscall0(int,mytest)
int main(){
int a;
a = mytest();
printf("%d", a);
return 0;
}
9.然後gcc test.c編譯之後運行a.out,前面所有步驟都通過,但是每次調用都是返回-1,然後我查過errno為1(表示操作不允許),就不知道為什麼了?
系統知道的高手們能夠告知一下,不勝感激!這個問題困擾我很久了!
二、新Linux內核添加系統調用
如何在Linux系統中添加新的系統調用
系統調用是應用程序和操作系統內核之間的功能介面。其主要目的是使得用戶可以使用操作系統提供的有關設備管理、輸入/輸入系統、文件系統和進程式控制制、通信以及存儲管理等方面的功能,而不必了解系統程序的內部結構和有關硬體細節,從而起到減輕用戶負擔和保護系統以及提高資源利用率的作用。
Linux操作系統作為自由軟體的代表,它優良的性能使得它的應用日益廣泛,不僅得到專業人士的肯定,而且商業化的應用也是如火如荼。在Linux中,大部分的系統調用包含在Linux的libc庫中,通過標準的C函數調用方法可以調用這些系統調用。那麼,對Linux的發燒友來說,如何在Linux中增加新的系統調用呢?
1 Linux系統調用機制
在Linux系統中,系統調用是作為一種異常類型實現的。它將執行相應的機器代碼指令來產生異常信號。產生中斷或異常的重要效果是系統自動將用戶態切換為核心態來對它進行處理。這就是說,執行系統調用異常指令時,自動地將系統切換為核心態,並安排異常處理程序的執行。Linux用來實現系統調用異常的實際指令是:
Int $0x80
這一指令使用中斷/異常向量號128(即16進制的80)將控制權轉移給內核。為達到在使用系統調用時不必用機器指令編程,在標準的C語言庫中為每一系統調用提供了一段短的子程序,完成機器代碼的編程工作。事實上,機器代碼段非常簡短。它所要做的工作只是將送給系統調用的參數載入到CPU寄存器中,接著執行int $0x80指令。然後運行系統調用,系統調用的返回值將送入CPU的一個寄存器中,標準的庫子程序取得這一返回值,並將它送回用戶程序。
為使系統調用的執行成為一項簡單的任務,Linux提供了一組預處理宏指令。它們可以用在程序中。這些宏指令取一定的參數,然後擴展為調用指定的系統調用的函數。
這些宏指令具有類似下面的名稱格式:
_syscallN(parameters)
其中N是系統調用所需的參數數目,而parameters則用一組參數代替。這些參數使宏指令完成適合於特定的系統調用的擴展。例如,為了建立調用setuid()系統調用的函數,應該使用:
_syscall1( int, setuid, uid_t, uid )
syscallN( )宏指令的第1個參數int說明產生的函數的返回值的類型是整型,第2個參數setuid說明產生的函數的名稱。後面是系統調用所需要的每個參數。這一宏指令後面還有兩個參數uid_t和uid分別用來指定參數的類型和名稱。
另外,用作系統調用的參數的數據類型有一個限制,它們的容量不能超過四個位元組。這是因為執行int $0x80指令進行系統調用時,所有的參數值都存在32位的CPU寄存器中。使用CPU寄存器傳遞參數帶來的另一個限制是可以傳送給系統調用的參數的數目。這個限制是最多可以傳遞5個參數。所以Linux一共定義了6個不同的_syscallN()宏指令,從_syscall0()、_syscall1()直到_syscall5()。
一旦_syscallN()宏指令用特定系統調用的相應參數進行了擴展,得到的結果是一個與系統調用同名的函數,它可以在用戶程序中執行這一系統調用。
2 添加新的系統調用
如果用戶在Linux中添加新的系統調用,應該遵循幾個步驟才能添加成功,下面幾個步驟詳細說明了添加系統調用的相關內容。
(1) 添加源代碼
第一個任務是編寫加到內核中的源程序,即將要加到一個內核文件中去的一個函數,該函數的名稱應該是新的系統調用名稱前面加上sys_標志。假設新加的系統調用為mycall(int number),在/usr/src/linux/kernel/sys.c文件中添加源代碼,如下所示:
asmlinkage int sys_mycall(int number)
{
return number;
}
作為一個最簡單的例子,我們新加的系統調用僅僅返回一個整型值。
(2) 連接新的系統調用
添加新的系統調用後,下一個任務是使Linux內核的其餘部分知道該程序的存在。為了從已有的內核程序中增加到新的函數的連接,需要編輯兩個文件。
在我們所用的Linux內核版本(RedHat 6.0,內核為2.2.5-15)中,第一個要修改的文件是:
/usr/src/linux/include/asm-i386/unistd.h
該文件中包含了系統調用清單,用來給每個系統調用分配一個唯一的號碼。文件中每一行的格式如下:
#define __NR_name NNN
其中,name用系統調用名稱代替,而NNN則是該系統調用對應的號碼。應該將新的系統調用名稱加到清單的最後,並給它分配號碼序列中下一個可用的系統調用號。我們的系統調用如下:
#define __NR_mycall 191
系統調用號為191,之所以系統調用號是191,是因為Linux-2.2內核自身的系統調用號碼已經用到190。
第二個要修改的文件是:
/usr/src/linux/arch/i386/kernel/entry.S
該文件中有類似如下的清單:
.long SYMBOL_NAME()
該清單用來對sys_call_table[]數組進行初始化。該數組包含指向內核中每個系統調用的指針。這樣就在數組中增加了新的內核函數的指針。我們在清單最後添加一行:
.long SYMBOL_NAME(sys_mycall)
(3) 重建新的Linux內核
為使新的系統調用生效,需要重建Linux的內核。這需要以超級用戶身份登錄。
#pwd
/usr/src/linux
#
超級用戶在當前工作目錄(/usr/src/linux)下,才可以重建內核。
#make config
#make dep
#make clearn
#make bzImage
編譯完畢後,系統生成一可用於安裝的、壓縮的內核映象文件:
/usr/src/linux/arch/i386/boot/bzImage
(4) 用新的內核啟動系統
要使用新的系統調用,需要用重建的新內核重新引導系統。為此,需要修改/etc/lilo.conf文件,在我們的系統中,該文件內容如下:
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
image=/boot/vmlinuz-2.2.5-15
label=linux
root=/dev/hdb1
read-only
other=/dev/hda1
label=dos
table=/dev/had
首先編輯該文件,添加新的引導內核:
image=/boot/bzImage-new
label=linux-new
root=/dev/hdb1
read-only
添加完畢,該文件內容如下所示:
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
image=/boot/bzImage-new
label=linux-new
root=/dev/hdb1
read-only
image=/boot/vmlinuz-2.2.5-15
label=linux
root=/dev/hdb1
read-only
other=/dev/hda1
label=dos
table=/dev/hda
這樣,新的內核映象bzImage-new成為預設的引導內核。為了使用新的lilo.conf配置文件,還應執行下面的命令:
#cp /usr/src/linux/arch/i386/boot/zImage /boot/bzImage-new
其次配置lilo:
# /sbin/lilo
現在,當重新引導系統時,在boot:提示符後面有三種選擇:linux-new 、linux、dos,新內核成為預設的引導內核。
至此,新的Linux內核已經建立,新添加的系統調用已成為操作系統的一部分,重新啟動Linux,用戶就可以在應用程序中使用該系統調用了。
(5)使用新的系統調用
在應用程序中使用新添加的系統調用mycall。同樣為實驗目的,我們寫了一個簡單的例子xtdy.c。
/* xtdy.c */
#include
_syscall1(int,mycall,int,ret)
main()
{
printf("%d \n",mycall(100));
}
編譯該程序:
# cc -o xtdy xtdy.c
執行:
# xtdy
結果:
# 100
注意,由於使用了系統調用,編譯和執行程序時,用戶都應該是超級用戶身份。
㈢ 64位linux和32位linux的區別是什麼
64位linux和32位linux使用是一樣的,但是唯一不一樣的就是64位linux的速度更快點。如果是你個人使用的話我可以這樣說你感覺不出來。而且64位的linux更占內存(如果你內存足夠大的話就另當別論),我想現在的個人的電腦估計也就是2G左右吧。
至於說的32位的資源多,我感覺這句話應該用在windows下吧。因為linux是開源的,所以它裡面的軟體也大部分是開源的。所以也就沒有32位資源更多之說。
我個人建議使用32位的,建議使用centos linux。
謝謝。
㈣ linux系統分32位和64位嗎
當然,Linux系統是有32位和64位之分的!
它們之間有何不同:
第一、設計初衷不同
64位是為視頻、繪畫、高性能應用程序所設計開發的;32位是為普通用戶開發的。
第二、配置要求不同
64位操作系統只能安裝在64位電腦上,32位操作系統可以安裝在64位電腦上。
32位操作系統安裝在64位電腦上,其硬體恰似大車拉小車,這樣64位硬體性能會大打折扣。
第三、運算速度不同
64位CPU的數據寬度為64位,64位指令集可以運行64位數據指令,也就是說處理器一次可提取64位數據。比32位提高了一倍,理論上性能會相應提升1倍。
第四、定址能力不同
在Linux下32位系統不打開PAE的情況下,只能支持4G內存。
32位系統最大隻能支持3.2g左右內存,而64位系統支持高達128g的物理內存和多達16TB的虛擬內存。
第五、軟體普及不同
64位軟體相較32位軟體少。
㈤ 什麼是Linux系統調用,包括哪些內容
linux操作系統裡面的「系統調用」這一概念相當於windows上面的api,這樣你就明白了吧,懂編程的應該都知道windows
api是個什麼東東。所不同的是linux系統調用的需要包含頭文件比較分散,這一點在使用時需要注意,不同的系統調用記得要#include對應的頭文件。
㈥ 怎樣查詢linux系統調用函數
以下是Linux系統調用的一個列表,包含了大部分常用系統調用和由系統調用派生出的的函數。這可能是你在互聯網上所能看到的唯一一篇中文注釋的Linux系統調用列表,即使是簡單的字母序英文列表,能做到這么完全也是很罕見的。
按照慣例,這個列表以man pages第2節,即系統調用節為藍本。按照筆者的理解,對其作了大致的分類,同時也作了一些小小的修改,刪去了幾個僅供內核使用,不允許用戶調用的系統調用,對個別本人稍覺不妥的地方作了一些小的修改,並對所有列出的系統調用附上簡要注釋。
其中有一些函數的作用完全相同,只是參數不同。(可能很多熟悉C++朋友馬上就能聯想起函數重載,但是別忘了Linux核心是用C語言寫的,所以只能取成不同的函數名)。還有一些函數已經過時,被新的更好的函數所代替了(gcc在鏈接這些函數時會發出警告),但因為兼容的原因還保留著,這些函數我會在前面標上「*」號以示區別。
一、進程式控制制:
fork 創建一個新進程
clone 按指定條件創建子進程
execve 運行可執行文件
exit 中止進程
_exit 立即中止當前進程
getdtablesize 進程所能打開的最大文件數
getpgid 獲取指定進程組標識號
setpgid 設置指定進程組標志號
getpgrp 獲取當前進程組標識號
setpgrp 設置當前進程組標志號
getpid 獲取進程標識號
getppid 獲取父進程標識號
getpriority 獲取調度優先順序
setpriority 設置調度優先順序
modify_ldt 讀寫進程的本地描述表
nanosleep 使進程睡眠指定的時間
nice 改變分時進程的優先順序
pause 掛起進程,等待信號
personality 設置進程運行域
prctl 對進程進行特定操作
ptrace 進程跟蹤
sched_get_priority_max 取得靜態優先順序的上限
sched_get_priority_min 取得靜態優先順序的下限
sched_getparam 取得進程的調度參數
sched_getscheler 取得指定進程的調度策略
sched_rr_get_interval 取得按RR演算法調度的實時進程的時間片長度
sched_setparam 設置進程的調度參數
sched_setscheler 設置指定進程的調度策略和參數
sched_yield 進程主動讓出處理器,並將自己等候調度隊列隊尾
vfork 創建一個子進程,以供執行新程序,常與execve等同時使用
wait 等待子進程終止
wait3 參見wait
waitpid 等待指定子進程終止
wait4 參見waitpid
capget 獲取進程許可權
capset 設置進程許可權
getsid 獲取會晤標識號
setsid 設置會晤標識號
二、文件系統控制
1、文件讀寫操作
fcntl 文件控制
open 打開文件
creat 創建新文件
close 關閉文件描述字
read 讀文件
write 寫文件
readv 從文件讀入數據到緩沖數組中
writev 將緩沖數組里的數據寫入文件
pread 對文件隨機讀
pwrite 對文件隨機寫
lseek 移動文件指針
_llseek 在64位地址空間里移動文件指針
p 復制已打開的文件描述字
p2 按指定條件復制文件描述字
flock 文件加/解鎖
poll I/O多路轉換
truncate 截斷文件
ftruncate 參見truncate
umask 設置文件許可權掩碼
fsync 把文件在內存中的部分寫回磁碟
2、文件系統操作
access 確定文件的可存取性
chdir 改變當前工作目錄
fchdir 參見chdir
chmod 改變文件方式
fchmod 參見chmod
chown 改變文件的屬主或用戶組
fchown 參見chown
lchown 參見chown
chroot 改變根目錄
stat 取文件狀態信息
lstat 參見stat
fstat 參見stat
statfs 取文件系統信息
fstatfs 參見statfs
readdir 讀取目錄項
getdents 讀取目錄項
mkdir 創建目錄
mknod 創建索引節點
rmdir 刪除目錄
rename 文件改名
link 創建鏈接
symlink 創建符號鏈接
unlink 刪除鏈接
readlink 讀符號鏈接的值
mount 安裝文件系統
umount 卸下文件系統
ustat 取文件系統信息
utime 改變文件的訪問修改時間
utimes 參見utime
quotactl 控制磁碟配額
三、系統控制
ioctl I/O總控制函數
_sysctl 讀/寫系統參數
acct 啟用或禁止進程記賬
getrlimit 獲取系統資源上限
setrlimit 設置系統資源上限
getrusage 獲取系統資源使用情況
uselib 選擇要使用的二進制函數庫
ioperm 設置埠I/O許可權
iopl 改變進程I/O許可權級別
outb 低級埠操作
reboot 重新啟動
swapon 打開交換文件和設備
swapoff 關閉交換文件和設備
bdflush 控制bdflush守護進程
sysfs 取核心支持的文件系統類型
sysinfo 取得系統信息
adjtimex 調整系統時鍾
alarm 設置進程的鬧鍾
getitimer 獲取計時器值
setitimer 設置計時器值
gettimeofday 取時間和時區
settimeofday 設置時間和時區
stime 設置系統日期和時間
time 取得系統時間
times 取進程運行時間
uname 獲取當前UNIX系統的名稱、版本和主機等信息
vhangup 掛起當前終端
nfsservctl 對NFS守護進程進行控制
vm86 進入模擬8086模式
create_mole 創建可裝載的模塊項
delete_mole 刪除可裝載的模塊項
init_mole 初始化模塊
query_mole 查詢模塊信息
*get_kernel_syms 取得核心符號,已被query_mole代替
四、內存管理
brk 改變數據段空間的分配
sbrk 參見brk
mlock 內存頁面加鎖
munlock 內存頁面解鎖
mlockall 調用進程所有內存頁面加鎖
munlockall 調用進程所有內存頁面解鎖
mmap 映射虛擬內存頁
munmap 去除內存頁映射
mremap 重新映射虛擬內存地址
msync 將映射內存中的數據寫回磁碟
mprotect 設置內存映像保護
getpagesize 獲取頁面大小
sync 將內存緩沖區數據寫回硬碟
cacheflush 將指定緩沖區中的內容寫回磁碟
五、網路管理
getdomainname 取域名
setdomainname 設置域名
gethostid 獲取主機標識號
sethostid 設置主機標識號
gethostname 獲取本主機名稱
sethostname 設置主機名稱
六、socket控制
socketcall socket系統調用
socket 建立socket
bind 綁定socket到埠
connect 連接遠程主機
accept 響應socket連接請求
send 通過socket發送信息
sendto 發送UDP信息
sendmsg 參見send
recv 通過socket接收信息
recvfrom 接收UDP信息
recvmsg 參見recv
listen 監聽socket埠
select 對多路同步I/O進行輪詢
shutdown 關閉socket上的連接
getsockname 取得本地socket名字
getpeername 獲取通信對方的socket名字
getsockopt 取埠設置
setsockopt 設置埠參數
sendfile 在文件或埠間傳輸數據
socketpair 創建一對已聯接的無名socket
七、用戶管理
getuid 獲取用戶標識號
setuid 設置用戶標志號
getgid 獲取組標識號
setgid 設置組標志號
getegid 獲取有效組標識號
setegid 設置有效組標識號
geteuid 獲取有效用戶標識號
seteuid 設置有效用戶標識號
setregid 分別設置真實和有效的的組標識號
setreuid 分別設置真實和有效的用戶標識號
getresgid 分別獲取真實的,有效的和保存過的組標識號
setresgid 分別設置真實的,有效的和保存過的組標識號
getresuid 分別獲取真實的,有效的和保存過的用戶標識號
setresuid 分別設置真實的,有效的和保存過的用戶標識號
setfsgid 設置文件系統檢查時使用的組標識號
setfsuid 設置文件系統檢查時使用的用戶標識號
getgroups 獲取後補組標志清單
setgroups 設置後補組標志清單
八、進程間通信
ipc 進程間通信總控制調用
1、信號
sigaction 設置對指定信號的處理方法
sigprocmask 根據參數對信號集中的信號執行阻塞/解除阻塞等操作
sigpending 為指定的被阻塞信號設置隊列
sigsuspend 掛起進程等待特定信號
signal 參見signal
kill 向進程或進程組發信號
*sigblock 向被阻塞信號掩碼中添加信號,已被sigprocmask代替
*siggetmask 取得現有阻塞信號掩碼,已被sigprocmask代替
*sigsetmask 用給定信號掩碼替換現有阻塞信號掩碼,已被sigprocmask代替
*sigmask 將給定的信號轉化為掩碼,已被sigprocmask代替
*sigpause 作用同sigsuspend,已被sigsuspend代替
sigvec 為兼容BSD而設的信號處理函數,作用類似sigaction
ssetmask ANSI C的信號處理函數,作用類似sigaction
2、消息
msgctl 消息控制操作
msgget 獲取消息隊列
msgsnd 發消息
msgrcv 取消息
3、管道
pipe 創建管道
4、信號量
semctl 信號量控制
semget 獲取一組信號量
semop 信號量操作
5、共享內存
shmctl 控制共享內存
shmget 獲取共享內存
shmat 連接共享內存
shmdt 拆卸共享內存
㈦ 如何在64位的linux系統上使用匯編和C語言混合編程
C51與匯編語言混合編程(1).C51語言中調用匯編語言程序1、在文件中選中FILEGROUP和C51程序原文件,在配置文件選項中激活「i」產生匯編(SRC)文件,「編譯(SRC)文件」和「創建工程(目標)時包含「三個選項。2、根據選擇的編譯模式,把相應的庫文件(如SMALL模式,庫文件為KEIL\C51\LIB\C51S.LIB)加入到工程中。3、在C51語言中必須聲明需要調用的函數為外部函數。externvoidDELAY(void);4、在匯編語言程序中必須聲明被調用子程序為公共子程序,在被調用的文件中還需要聲明此文件是新定位的。PUBLICDELAY,實例如下:#include"reg51.h"externvoidDELAY(void);externvoidDEL(void);voidmain(void){P1=0x00;DELAY();DEL();P!=0xff;}匯編語言文件:PUBLICDELAY,DELAY:MOVR2,#3HDJNZR2,$RETDEL:MOVR3,#3HDJNZR3,$RETEND(2)、C51語言中嵌入匯編程序:在C51語言中嵌套使用匯編語言程序要注意以下幾個問題:1、在文件中選中FILEGROUP和C51程序原文件,在配置文件選項中激活「i」產生匯編(SRC)文件,「編譯(SRC)文件」和「創建工程(目標)時包含「三個選項。2、根據選擇的編譯模式,把相應的庫文件(如SMALL模式,庫文件為KEIL\C51\LIB\C51S.LIB)加入到工程中。3、用#pragmaasm.和#pragmaendasm語句包含嵌入的匯編語言程序。實例如下:#include"reg51.h"voiddelay(void);voidmain(void){voiddelay(void);P1=0x00;#pragmaasmMOVR3,#08HDINZR3,$#pragmaendasmP1=0xff;}voiddelay(void){#pragmaasmMOVR4,#08HDJNZR4,$#pragmaendasm}