« September 2006 |
(回到Blog入口)
| November 2006 »
October 2006 歸檔
#2: 今天 Jollen 要介紹的題目是 "Mesh Router",實作平臺是 Kendin KS8695P 與 embedded Linux 系統。我們在 Kendin KS8695P (ARM9) 的平臺上嵌入 embedded Linux 系統,透過此平臺與 mesh wireless 的 embedded Linux 系統,將能實作出 mesh networking 的系統。
今天我們的重點 (Lecture 8) 是介紹 open source 解決方案與 mesh networking;同時我們也會做一個簡單的 demo。
簡報下載
#3: mesh networking 可以取代 Wi-Fi "hot spots" 的架構,並且簡省無線網路的佈署成本,由於我們以現有的 802.11a+g 的無線網卡來實作,因此可以使用許多現成的 open source 軟體來配合。以藉此達成單點對多點 (point to multipoint)、多點對多點 (multipoint to multipoint) 或是單點對單點 (point-to-point) 的架構實作。
#6: 這是我們所期望做到的規格 (specification),很有趣的是,開放源碼套件居然能滿足我們所開出的所有規格,這意謂我們的 project 需要自己開發軟體的機會幾乎是 0%;事實上,我們 90% 以上的工作都是在做系統整合 (Linux administration) 和 UI (web-based) 的開發。
#7: 這是一個實際 (real-world) 的案例,讓我們來說明我們倒底在 root filesystem 裡放了哪些東西,以及「如何加入」這些東西。
#8: 要 build 一個基本的 wireless 嵌入式 Linux 系統 (root filesystem),我們會需要這些基本的開放源碼套件,另外由於 zeroconf 遭遇到專利問題,因此我們並沒有在這份簡單裡展示 zeroconf IP 的功能。
#9: 再來是 Linux 的無線網路解決方案,在驅動程式方面,我們使用的 Atheros 與 Prism 晶片都有支援。在 user application 方面,wireless routing protocol 的解決方案是 quagga,這是一個相當知名的 open source 專案。另外,wireless tools 是必備的,因此我們要透過它來設定無線網路。
#16: 這是我們利用 iwconfig 在 Kendin 平臺上啟動無線網路的畫面,ath0 介面是 Atheros 網卡 (802.11g),eth2 是 Intersil 網路 (802.11b/g)。
#17: 我們把 ath0 設定成 "ad-hoc" 模式。
#18: 利用 'iwlist' 指令偵測 channel。
#19: 利用 'iwlist' 掃描 eth2 介面。
ps. 不知道大家還想要哪一頁的詳細講稿 @@"
在建立 embedded Linux 系統 (root filesystem) 時,程式庫相依 (library dependencies) 的議題是相當重要的一個題目。
當 root filesystem 缺少必要的 library 時,程式當然是無法執行的,甚致系統也會無法順利啟動。依據 Jollen 在「Embedded Linux / ARM9 開發實戰」的課程所提的幾個觀念,我們可以了解到在建構 embedded Linux 系統時,應具備的正確觀念與基本能力。
我們把「如何找出所需的 library」方法整理出 3 項的基本要點,依照這 3 種基本款來加入 library 將能解決幾乎所有的 library dependency 問題,這 3 種項基本要點為:
(1) 先利用 cross toolchain 的 objdump 觀察「NEEDED」的項目,加入 library。
(2) 再檢查這些 library 是否相依其它 library。
(3) 最後要檢視應用程式是否使用到需要特定 library 的「service」。
要點 1. 跟 2. 對大家來說沒有什麼問題,要點 3. 在我們的 training 課程裡,我們以建構 thttpd (embedded Web server) 的實際案例來做講解。
關於建構 thttpd 的案例
thttpd 使用到 NSS (Name Service Switch),因此若沒有將 libnss_SERVICE.so 加到 root filesystem,thttpd 在執行時可能會遇到一些奇怪的問題。舉個例子,當 thttpd 透過 /etc/passwd 去尋找 (查詢) UNIX user 時,會用到 libnss_files.so (不讀 /etc/shadow),因此會看到以下的錯誤訊息:
unknown user - root
出現這個錯誤的原因是 thttpd 讀不到 'root' 使用者,要深入探討這個問題的原理,必須從以下的程式碼片斷開始探討:
403 /* If we're root and we're going to become another user, get the uid /gid
404 ** now.
405 */
406 if ( getuid() == 0 )
407 {
408 pwd = getpwnam( user );
409 if ( pwd == (struct passwd*) 0 )
410 {
411 syslog( LOG_CRIT, "unknown user - '%.80s'", user );
412 (void) fprintf( stderr, "%s: unknown user - '%s'\n", argv0, user );
413 exit( 1 );
414 }
415 uid = pwd->pw_uid;
416 gid = pwd->pw_gid;
417 }
這段程式碼是 thttpd 2.25b 的程式片斷,位於 thttpd.c 的 main() 函數裡。關於 libnss_SERVICE.so 的議題,Jollen 打算另外再做討論,因為還會與 libc 有關係。
在這裡我們由系統建構的角度來看這個問題。因為我們已經習慣用 objdump 來觀察程式的相依 library,所以當 objdump 的畫面跟我們預期的不同時,經常一時無法反應過來。例如,以下的訊息是我們所「預期」的:
# /opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-objdump -x thttpd|more
...
Dynamic Section:
NEEDED libcrypt.so.1
NEEDED libnss_files.so.2
NEEDED libc.so.6
...
但是實際的訊息卻是像這樣的:
# /opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-objdump -x thttpd|more
...
Dynamic Section:
NEEDED libcrypt.so.1
NEEDED libc.so.6
...
我們可以用一知半解的思考邏輯來解決問題:thttpd 呼叫到 getpwnam() 函數,此函數由 libnss_compat 提供,因此解決方案是把 libnss_files.so 加到 root filesystem 裡即可。
且慢!前面才講到 libnss_compat,怎麼後面是把 libnss_files 加到 root filesystem?是這樣的,libnss_compat 用來讀 /etc/shadow,但是現在我們只需要由 /etc/passwd 讀 Unix user,所以使用 libnss_files.so 就行了。
執行 thttpd 的話,再加上指定 username 的參數來執行:
# thttpd -p 80 -d /var/www -u root
libnss_SERVICE.so 是包含在 glibc 裡的程式庫,因此可以直接由 cross toolchain 裡取得,不必再另行建置。
有關 NSS (Name Service Switch) 可參考以下網頁:
Linux / Unix Command: nsswitch.conf - http://linux.about.com/od/commands/l/blcmdl5_nsswitc.htm
其它網路資源:
http://www.gnu.org/software/libc/manual/html_node/Name-Service-Switch.html
http://mirrors.usc.edu/pub/gnu/Manuals/glibc-2.2.3/html_chapter/libc_28.html
此處我們以「service」的角度來探討這個問題:因為 thttpd 使用到 Name Service Switch,所以需要加入 libnss_SERVICE.so。另外一種探討的角度是:由 programming 的角度來思考,大家可以試著去研究這個問題,還挺好玩的!
附帶一提,如果要讀 shadow passwd 的話,是使用 libnss_compat.so。
有些 C 函數的運作會依據 localhost 的設定而有不同行為,而這些設定的做法是透過「設定檔」(eg. /etc/services) 來實現。目前在 GNU/Linux 系統底下,可以看到許多這樣的設定檔,我們把這些設定檔稱為 system database,這些資料庫主要是以文字檔方式儲存重要的系統資訊,例如: /etc/passwd 存放使用者名稱、/etc/services 存放網路服務的通訊埠 (port) 設定等等。
GNU C library 實作的 "Name Service Switch" 函數群便是用來讀取所有 system database 內容的介面!
System Database
NSS 支援 11 種資料庫名稱:aliases、ethers、group、hosts、netgroup、networks、protocols、passwd、rpc、services 與 shadow。分別說明如下。
aliases: Mail 別名
ethers: Ethernet 號碼
group: 使用者群組資料庫,即 /etc/group
hosts: Host names 與 IP 對應資料庫,即 /etc/hosts 或是利用 name server 轉換
netgroup: "hostname username domainname" 的組合稱為 netgroup
networks: 即 /etc/networks
protocols: 通訊協定資料庫,即 /etc/protocols
passwd: 使用者名稱資料庫,即 /etc/passwd
rpc: Remote procedure call 資料庫
services: 即 /etc/services 資料庫
shadow: 即 /etc/shadow 檔
NSS Service 與 Lookup
NSS 支援 7 種服務類型,說明如下。
1. nisplus (or nis+): 使用 NIS+ (NIS version 3) 服務
2, nis (or yp): 使用 NIS (NIS version 2) 服務 (也叫 YP, YellowPage)
3. dns: 使用 DNS (Domain Name Service) 服務
4. files: 使用一般的檔案讀取服務
5. db: 使用 database (.db) 檔案讀取服務
6. compat: 使用 NIS compat mode 服務
7. hesiod: 使用 Hesiod 服務做 user lookups
GNU 的實作是把每一個服務 (service) 實作成不同的 module (shared library),因此可以在 GNU/Linux 系統底下找到這些相對應的 shared libraries:
libnss_nisplus.so.2
libnss_nis.so.2
libnss_dns.so.2
libnss_files.so.2
libnss_compat.so.2
libnss_hesiod.so.2
不過其實還有下面 3 個:
/lib/libnss_ldap.so.2
/lib/libnss_winbind.so.2
/lib/libnss_wins.so.2
GNU 的 NSS module 是以 libnss_SERVICE.so.2 來命名。
在這些 module (library) 裡的函數,是無法讓程式直接使用的,因此了解這些 module 裡的函數如何被使用 (呼叫) 是一個重要且有趣的題目。
查詢前面所提 11 種資料庫資訊的動作稱為 lookup,lookup 的方法便是 NSS 的服務類型 (NSS service),也就是我們可以利用以上共 7 種方式來查詢 system database;不過,以 files、db、nis 與 nisplus 這 4 種方式是比較常用的。
由此可知,不同的 system database 可以用不同的服務來做查詢。因此,系統管理員必須告訴 NSS,我們想要他利用哪一種服務類型,來查詢 (lookup) 指定的 system database。這個動作的管理方式便是透過 /etc/nsswitch.conf 設定檔來完成。
/etc/nsswitch.conf
看一下 glibc-2.3.3 預設定 nsswitch.conf 設定檔內容如下:
# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
#
passwd: db files
group: db files
shadow: db files
hosts: files dns
networks: files dns
protocols: db files
services: db files
ethers: db files
rpc: db files
netgroup: db files
這樣其實就很清楚了,例如:passwd 資料庫 (/etc/passwd) 的讀取方式 (lookup service) 有 db/files 二種。以 embedded Linux 系統來說,我們會這樣設定:
passwd: files
也就是說,直接以檔案讀取方式來查詢 /etc/passwd。那麼,之前提過的 embedded Linux 系統建置之 thttpd 個案分析,為何需要 libnss_files.so.2 檔案,觀念就很清楚了。
此外,大家也可以了解一下 red hat linux 或其它 Linux distribution 的 nsswitch.conf 設定佈署方式。
這個部份的文件主要是 glibc 的手冊,大家可參考 http://www.gnu.org/software/libc/manual/html_node/Name-Service-Switch.html#Name-Service-Switch
-- jollen
作者/陳俊宏
http://www.jollen.org
我們以一個 'gethostbyname' 的例子來說明 NSS 的運作原理
假設我們想要查詢網路上某台 host 的 IP 位址,那麼 GNU C Library 手冊告訴我們說,有一個 gethostbyname() 的函數可以使用。
不過,在真正寫 code 時,其實並不建議呼叫此函數,在說明原因前,有一句必名言是大家一定要銘記在心的:
Multi-threaded safe code must be reentrant.
由於 gethostbyname() 並非 reentrant 的版本;所以,呼叫 gethostbyname() 並不是正確寫法,我們必須改成呼叫 reentrant 的版本:gethostbyname_r()。
NSS module 裡 non-reentrant 的函數,是不能使用在 multi-threaded applications 的設計上的,但是根據 NSS manual 的解釋,其實 gethostbyename() 與 gethostbyname_r() 都會呼叫到 NSS module 裡相同的函數,原因是 NSS module 只提供 reentrant 版本的 gethostbyname() 服務。
接下來讓我們來討論,gethostbyname() 與 gethostbyname_r() 倒底會呼叫到 NSS module 裡的哪一個函數。
_nss_service_function
當我們呼叫 gethostbyname_r() 函數時 (或 gethostbyname),假設我們在 /etc/nsswitch.conf 裡有一行這樣的設定:
hosts: files
那麼根據之前 Jollen 在 Blog 裡的說明,此時會使用到的 NSS module 會是 libnss_files.so.2,並且以下的 routine 會被呼叫:
_nss_files_gethostbyname_r
查看一下:
# nm /lib/libnss_files.so.2 |egrep "gethostbyname"
00004320 T _nss_files_gethostbyname2_r
00003ba0 T _nss_files_gethostbyname_r
現在我們終於知道了,當我們呼叫查詢的函數 'function' 時,在 libnss_SERVICE.so.2 裡的相對應函數便會被呼叫,此函數的 naming 方式為:
_nss_service_function
另外,NSS module 僅包含 reentrant 的版本。
最後我們要講的是,gethostbyename() 與 gethostbyname_r(),或是之前提到的 getpwnam() 都是實作在 libc.so.6 裡的。For example:
# nm /lib/libc.so.6 |egrep "T.gethostbyname"
000f72b0 T gethostbyname
000f7480 T gethostbyname2
000f78c0 T gethostbyname2_r@GLIBC_2.0
000f7660 T gethostbyname2_r@@GLIBC_2.1.2
000f7b80 T gethostbyname_r@GLIBC_2.0
000f7930 T gethostbyname_r@@GLIBC_2.1.2
# nm /lib/libc.so.6 |egrep "T.getpwnam"
000acf50 T getpwnam
000ad5c0 T getpwnam_r@GLIBC_2.0
000ad440 T getpwnam_r@@GLIBC_2.1.2
這就是為什麼我們在 ldd (or objdump) 時,都看不到 libnss_SERVICE.so.6 的道理.當我們做查詢時,NSS 才去載入對應的 service module。
以下是 Linux 2.4.29 的 system call 整理表格,提供給「Embedded Linux 嵌入式系統實作演練」的讀者您做參考。這是一張很方便的表格,可以取代 unistd.h 與 "man"。
這張工具表格可以幫助我們:
1. 最主要的目的:當然是研究作業系統,了解 Linux 提供的 sytsem call service。
2. Trace kernel.
3. Writing shellcode.
供您參考 :)
Linux (kernel 2.4.29) System Call Table
1. sys_ni_syscall 為保留號碼
2. 更新日期: 2006/10/07
3. 其實與 linux 2.4.22 是相同的,因此亦可參考我們之前 (3 年前) 整理的 LSCT。
| no |
Syscall |
Prototype decl. |
| 0 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 1 |
sys_exit |
long sys_exit(int error_code) |
| 2 |
sys_fork |
int sys_fork(struct pt_regs regs) |
| 3 |
sys_read |
ssize_t sys_read(unsigned int fd, char *buf, size_t count) |
| 4 |
sys_write |
ssize_t sys_write(unsigned int fd, const char *buf, size_t count) |
| 5 |
sys_open |
long sys_open(const char *filename, int flags, int mode) |
| 6 |
sys_close |
long sys_close(unsigned int fd) |
| 7 |
sys_waitpid |
long sys_waitpid(pid_t pid, unsigned int *stat_addr, int options) |
| 8 |
sys_creat |
long sys_creat(const char *pathname, int mode) |
| 9 |
sys_link |
long sys_link(const char *oldname, const char *newname) |
| 10 |
sys_unlink |
long sys_unlink(const char *pathname) |
| 11 |
sys_execve |
int sys_execve(struct pt_regs regs) |
| 12 |
sys_chdir |
long sys_chdir(const char *filename) |
| 13 |
sys_time |
long sys_time(int *tloc) |
| 14 |
sys_mknod |
long sys_mknod(const char *filename, int mode, dev_t dev) |
| 15 |
sys_chmod |
long sys_chmod(const char *filename, mode_t mode) |
| 16 |
sys_lchown16 |
long sys_lchown16(const char *filename, old_uid_t user, old_gid_t group) |
| 17 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 18 |
sys_stat |
long sys_stat(char *filename, struct __old_kernel_stat *statbuf) |
| 19 |
sys_lseek |
off_t sys_lseek(unsigned int fd, off_t offset, unsigned int origin) |
| 20 |
sys_getpid |
long sys_getpid(void) |
| 21 |
sys_mount |
long sys_mount(char *dev_name, char *dir_name, char *type, unsigned long flags, void *data) |
| 22 |
sys_oldumount |
long sys_oldumount(char *name) |
| 23 |
sys_setuid16 |
long sys_setuid16(old_uid_t uid) |
| 24 |
sys_getuid16 |
long sys_getuid16(void) |
| 25 |
sys_stime |
long sys_stime(int *tptr) |
| 26 |
sys_ptrace |
int sys_ptrace(long request, long pid, long addr, long data) |
| 27 |
sys_alarm |
unsigned long sys_alarm(unsigned int seconds) |
| 28 |
sys_fstat |
long sys_fstat(unsigned int fd, struct __old_kernel_stat *statbuf) |
| 29 |
sys_pause |
int sys_pause(void) |
| 30 |
sys_utime |
long sys_utime(char *filename, struct utimbuf *times) |
| 31 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 32 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 33 |
sys_access |
long sys_access(const char *filename, int mode) |
| 34 |
sys_nice |
long sys_nice(int increment) |
| 35 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 36 |
sys_sync |
long sys_sync(void) |
| 37 |
sys_kill |
long sys_kill(int pid, int sig) |
| 38 |
sys_rename |
long sys_rename(const char *oldname, const char *newname) |
| 39 |
sys_mkdir |
long sys_mkdir(const char *pathname, int mode) |
| 40 |
sys_rmdir |
long sys_rmdir(const char *pathname) |
| 41 |
sys_dup |
long sys_dup(unsigned int fildes) |
| 42 |
sys_pipe |
int sys_pipe(unsigned long *fildes) |
| 43 |
sys_times |
long sys_times(struct tms *tbuf) |
| 44 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 45 |
sys_brk |
unsigned long sys_brk(unsigned long brk) |
| 46 |
sys_setgid16 |
long sys_setgid16(old_gid_t gid) |
| 47 |
sys_getgid16 |
long sys_getgid16(void) |
| 48 |
sys_signal |
unsigned long sys_signal(int sig, __sighandler_t handler) |
| 49 |
sys_geteuid16 |
long sys_geteuid16(void) |
| 50 |
sys_getegid16 |
long sys_getegid16(void) |
| 51 |
sys_acct |
long sys_acct(const char *name) |
| 52 |
sys_umount |
long sys_umount(char *name, int flags) |
| 53 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 54 |
sys_ioctl |
long sys_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg) |
| 55 |
sys_fcntl |
long sys_fcntl(unsigned int fd, unsigned int cmd, unsigned long arg) |
| 56 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 57 |
sys_setpgid |
long sys_setpgid(pid_t pid, pid_t pgid) |
| 58 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 59 |
sys_olduname |
int sys_olduname(struct oldold_utsname *name) |
| 60 |
sys_umask |
long sys_umask(int mask) |
| 61 |
sys_chroot |
long sys_chroot(const char *filename) |
| 62 |
sys_ustat |
long sys_ustat(dev_t dev, struct ustat *ubuf) |
| 63 |
sys_dup2 |
long sys_dup2(unsigned int oldfd, unsigned int newfd) |
| 64 |
sys_getppid |
long sys_getppid(void) |
| 65 |
sys_getpgrp |
long sys_getpgrp(void) |
| 66 |
sys_setsid |
long sys_setsid(void) |
| 67 |
sys_sigaction |
int sys_sigaction(int sig, const struct old_sigaction *act, struct old_sigaction *oact) |
| 68 |
sys_sgetmask |
long sys_sgetmask(void) |
| 69 |
sys_ssetmask |
long sys_ssetmask(int newmask) |
| 70 |
sys_setreuid16 |
long sys_setreuid16(old_uid_t ruid, old_uid_t euid) |
| 71 |
sys_setregid16 |
long sys_setregid16(old_gid_t rgid, old_gid_t egid) |
| 72 |
sys_sigsuspend |
int sys_sigsuspend(int history0, int history1, old_sigset_t mask) |
| 73 |
sys_sigpending |
long sys_sigpending(old_sigset_t * set) |
| 74 |
sys_sethostname |
long sys_sethostname(char *name, int len) |
| 75 |
sys_setrlimit |
long sys_setrlimit(unsigned int resource, struct rlimit *rlim) |
| 76 |
sys_old_getrlimit |
long sys_old_getrlimit(unsigned int resource, struct rlimit *rlim) |
| 77 |
sys_getrusage |
long sys_getrusage(int who, struct rusage *ru) |
| 78 |
sys_gettimeofday |
long sys_gettimeofday(struct timeval *tv, struct timezone *tz) |
| 79 |
sys_settimeofday |
long sys_settimeofday(struct timeval *tv, struct timezone *tz) |
| 80 |
sys_getgroups16 |
long sys_getgroups16(int gidsetsize, old_gid_t * grouplist) |
| 81 |
sys_setgroups16 |
long sys_setgroups16(int gidsetsize, old_gid_t * grouplist) |
| 82 |
old_select |
int old_select(struct sel_arg_struct *arg) |
| 83 |
sys_symlink |
long sys_symlink(const char *oldname, const char *newname) |
| 84 |
sys_lstat |
long sys_lstat(char *filename, struct __old_kernel_stat *statbuf) |
| 85 |
sys_readlink |
long sys_readlink(const char *path, char *buf, int bufsiz) |
| 86 |
sys_uselib |
long sys_uselib(const char *library) |
| 87 |
sys_swapon |
long sys_swapon(const char *specialfile, int swap_flags) |
| 88 |
sys_reboot |
long sys_reboot(int magic1, int magic2, unsigned int cmd, void *arg) |
| 89 |
old_readdir |
int old_readdir(unsigned int fd, void *dirent, unsigned int count) |
| 90 |
old_mmap |
int old_mmap(struct mmap_arg_struct *arg) |
| 91 |
sys_munmap |
long sys_munmap(unsigned long addr, size_t len) |
| 92 |
sys_truncate |
long sys_truncate(const char *path, unsigned long length) |
| 93 |
sys_ftruncate |
long sys_ftruncate(unsigned int fd, unsigned long length) |
| 94 |
sys_fchmod |
long sys_fchmod(unsigned int fd, mode_t mode) |
| 95 |
sys_fchown16 |
long sys_fchown16(unsigned int fd, old_uid_t user, old_gid_t group) |
| 96 |
sys_getpriority |
long sys_getpriority(int which, int who) |
| 97 |
sys_setpriority |
long sys_setpriority(int which, int who, int niceval) |
| 98 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 99 |
sys_statfs |
long sys_statfs(const char *path, struct statfs *buf) |
| 100 |
sys_fstatfs |
long sys_fstatfs(unsigned int fd, struct statfs *buf) |
| 101 |
sys_ioperm |
int sys_ioperm(unsigned long from, unsigned long num, int turn_on) |
| 102 |
sys_socketcall |
long sys_socketcall(int call, unsigned long *args) |
| 103 |
sys_syslog |
long sys_syslog(int type, char *buf, int len) |
| 104 |
sys_setitimer |
long sys_setitimer(int which, struct itimerval *value, struct itimerval *ovalue) |
| 105 |
sys_getitimer |
long sys_getitimer(int which, struct itimerval *value) |
| 106 |
sys_newstat |
long sys_newstat(char *filename, struct stat *statbuf) |
| 107 |
sys_newlstat |
long sys_newlstat(char *filename, struct stat *statbuf) |
| 108 |
sys_newfstat |
long sys_newfstat(unsigned int fd, struct stat *statbuf) |
| 109 |
sys_uname |
int sys_uname(struct old_utsname *name) |
| 110 |
sys_iopl |
int sys_iopl(unsigned long unused) |
| 111 |
sys_vhangup |
long sys_vhangup(void) |
| 112 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 113 |
sys_vm86old |
int sys_vm86old(struct vm86_struct *v86) |
| 114 |
sys_wait4 |
long sys_wait4(pid_t pid, unsigned int *stat_addr, int options, struct rusage *ru) |
| 115 |
sys_swapoff |
long sys_swapoff(const char *specialfile) |
| 116 |
sys_sysinfo |
long sys_sysinfo(struct sysinfo *info) |
| 117 |
sys_ipc |
int sys_ipc(uint call, int first, int second, int third, void *ptr, long fifth) |
| 118 |
sys_fsync |
long sys_fsync(unsigned int fd) |
| 119 |
sys_sigreturn |
int sys_sigreturn(unsigned long __unused) |
| 120 |
sys_clone |
int sys_clone(struct pt_regs regs) |
| 121 |
sys_setdomainname |
long sys_setdomainname(char *name, int len) |
| 122 |
sys_newuname |
long sys_newuname(struct new_utsname *name) |
| 123 |
sys_modify_ldt |
int sys_modify_ldt(int func, void *ptr, unsigned long bytecount) |
| 124 |
sys_adjtimex |
long sys_adjtimex(struct timex *txc_p) |
| 125 |
sys_mprotect |
long sys_mprotect(unsigned long start, size_t len, unsigned long prot) |
| 126 |
sys_sigprocmask |
long sys_sigprocmask(int how, old_sigset_t * set, old_sigset_t * oset) |
| 127 |
sys_create_module |
unsigned long sys_create_module(const char *name_user, size_t size) |
| 128 |
sys_init_module |
long sys_init_module(const char *name_user, struct module *mod_user) |
| 129 |
sys_delete_module |
long sys_delete_module(const char *name_user) |
| 130 |
sys_get_kernel_syms |
long sys_get_kernel_syms(struct kernel_sym *table) |
| 131 |
sys_quotactl |
long sys_quotactl(unsigned int cmd, const char *special, qid_t id, caddr_t addr) |
| 132 |
sys_getpgid |
long sys_getpgid(pid_t pid) |
| 133 |
sys_fchdir |
long sys_fchdir(unsigned int fd) |
| 134 |
sys_bdflush |
long sys_bdflush(int func, long data) |
| 135 |
sys_sysfs |
long sys_sysfs(int option, unsigned long arg1, unsigned long arg2) |
| 136 |
sys_personality |
long sys_personality(u_long personality) |
| 137 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 138 |
sys_setfsuid16 |
long sys_setfsuid16(old_uid_t uid) |
| 139 |
sys_setfsgid16 |
long sys_setfsgid16(old_gid_t gid) |
| 140 |
sys_llseek |
long sys_llseek(unsigned int fd, unsigned long offset_high, unsigned long offset_low, loff_t * result, unsigned int origin) |
| 141 |
sys_getdents |
long sys_getdents(unsigned int fd, void *dirent, unsigned int count) |
| 142 |
sys_select |
long sys_select(int n, fd_set * inp, fd_set * outp, fd_set * exp, struct timeval *tvp) |
| 143 |
sys_flock |
long sys_flock(unsigned int fd, unsigned int cmd) |
| 144 |
sys_msync |
long sys_msync(unsigned long start, size_t len, int flags) |
| 145 |
sys_readv |
ssize_t sys_readv(unsigned long fd, const struct iovec * vector, unsigned long count) |
| 146 |
sys_writev |
ssize_t sys_writev(unsigned long fd, const struct iovec * vector, unsigned long count) |
| 147 |
sys_getsid |
long sys_getsid(pid_t pid) |
| 148 |
sys_fdatasync |
long sys_fdatasync(unsigned int fd) |
| 149 |
sys_sysctl |
long sys_sysctl(struct __sysctl_args *args) |
| 150 |
sys_mlock |
long sys_mlock(unsigned long start, size_t len) |
| 151 |
sys_munlock |
long sys_munlock(unsigned long start, size_t len) |
| 152 |
sys_mlockall |
long sys_mlockall(int flags) |
| 153 |
sys_munlockall |
long sys_munlockall(void) |
| 154 |
sys_sched_setparam |
long sys_sched_setparam(pid_t pid, struct sched_param *param) |
| 155 |
sys_sched_getparam |
long sys_sched_getparam(pid_t pid, struct sched_param *param) |
| 156 |
sys_sched_setscheduler |
long sys_sched_setscheduler(pid_t pid, int policy, struct sched_param *param) |
| 157 |
sys_sched_getscheduler |
long sys_sched_getscheduler(pid_t pid) |
| 158 |
sys_sched_yield |
long sys_sched_yield(void) |
| 159 |
sys_sched_get_priority_max |
long sys_sched_get_priority_max(int policy) |
| 160 |
sys_sched_get_priority_min |
long sys_sched_get_priority_min(int policy) |
| 161 |
sys_sched_rr_get_interval |
long sys_sched_rr_get_interval(pid_t pid, struct timespec *interval) |
| 162 |
sys_nanosleep |
long sys_nanosleep(struct timespec *rqtp, struct timespec *rmtp) |
| 163 |
sys_mremap |
unsigned long sys_mremap(unsigned long addr, unsigned long old_len, unsigned long new_len, unsigned long flags, unsigned long new_addr) |
| 164 |
sys_setresuid16 |
long sys_setresuid16(old_uid_t ruid, old_uid_t euid, old_uid_t suid) |
| 165 |
sys_getresuid16 |
long sys_getresuid16(old_uid_t * ruid, old_uid_t * euid, old_uid_t * suid) |
| 166 |
sys_vm86 |
int sys_vm86(unsigned long subfunction, struct vm86plus_struct *v86) |
| 167 |
sys_query_module |
long sys_query_module(const char *name_user, int which, char *buf, size_t bufsize, size_t * ret) |
| 168 |
sys_poll |
long sys_poll(struct pollfd *ufds, unsigned int nfds, long timeout) |
| 169 |
sys_nfsservctl |
|
| 170 |
sys_setresgid16 |
long sys_setresgid16(old_gid_t rgid, old_gid_t egid, old_gid_t sgid) |
| 171 |
sys_getresgid16 |
long sys_getresgid16(old_gid_t * rgid, old_gid_t * egid, old_gid_t * sgid) |
| 172 |
sys_prctl |
long sys_prctl(int option, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5) |
| 173 |
sys_rt_sigreturn |
int sys_rt_sigreturn(unsigned long __unused) |
| 174 |
sys_rt_sigaction |
long sys_rt_sigaction(int sig, const struct sigaction *act, struct sigaction *oact, size_t sigsetsize) |
| 175 |
sys_rt_sigprocmask |
long sys_rt_sigprocmask(int how, sigset_t * set, sigset_t * oset, size_t sigsetsize) |
| 176 |
sys_rt_sigpending |
long sys_rt_sigpending(sigset_t * set, size_t sigsetsize) |
| 177 |
sys_rt_sigtimedwait |
long sys_rt_sigtimedwait(const sigset_t * uthese, siginfo_t * uinfo, const struct timespec *uts, size_t sigsetsize) |
| 178 |
sys_rt_sigqueueinfo |
long sys_rt_sigqueueinfo(int pid, int sig, siginfo_t * uinfo) |
| 179 |
sys_rt_sigsuspend |
int sys_rt_sigsuspend(sigset_t * unewset, size_t sigsetsize) |
| 180 |
sys_pread |
ssize_t sys_pread(unsigned int fd, char *buf, size_t count, loff_t pos) |
| 181 |
sys_pwrite |
ssize_t sys_pwrite(unsigned int fd, const char *buf, size_t count, loff_t pos) |
| 182 |
sys_chown16 |
long sys_chown16(const char *filename, old_uid_t user, old_gid_t group) |
| 183 |
sys_getcwd |
long sys_getcwd(char *buf, unsigned long size) |
| 184 |
sys_capget |
long sys_capget(cap_user_header_t header, cap_user_data_t dataptr) |
| 185 |
sys_capset |
long sys_capset(cap_user_header_t header, const cap_user_data_t data) |
| 186 |
sys_sigaltstack |
int sys_sigaltstack(const stack_t * uss, stack_t * uoss) |
| 187 |
sys_sendfile |
ssize_t sys_sendfile(int out_fd, int in_fd, off_t * offset, size_t count) |
| 188 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 189 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 190 |
sys_vfork |
int sys_vfork(struct pt_regs regs) |
| 191 |
sys_getrlimit |
long sys_getrlimit(unsigned int resource, struct rlimit *rlim) |
| 192 |
sys_mmap2 |
long sys_mmap2(unsigned long addr, unsigned long len, unsigned long prot, unsigned long flags, unsigned long fd, unsigned long pgoff) |
| 193 |
sys_truncate64 |
long sys_truncate64(const char *path, loff_t length) |
| 194 |
sys_ftruncate64 |
long sys_ftruncate64(unsigned int fd, loff_t length) |
| 195 |
sys_stat64 |
long sys_stat64(char *filename, struct stat64 *statbuf, long flags) |
| 196 |
sys_lstat64 |
long sys_lstat64(char *filename, struct stat64 *statbuf, long flags) |
| 197 |
sys_fstat64 |
long sys_fstat64(unsigned long fd, struct stat64 *statbuf, long flags) |
| 198 |
sys_lchown |
long sys_lchown(const char *filename, uid_t user, gid_t group) |
| 199 |
sys_getuid |
long sys_getuid(void) |
| 200 |
sys_getgid |
long sys_getgid(void) |
| 201 |
sys_geteuid |
long sys_geteuid(void) |
| 202 |
sys_getegid |
long sys_getegid(void) |
| 203 |
sys_setreuid |
long sys_setreuid(uid_t ruid, uid_t euid) |
| 204 |
sys_setregid |
long sys_setregid(gid_t rgid, gid_t egid) |
| 205 |
sys_getgroups |
long sys_getgroups(int gidsetsize, gid_t * grouplist) |
| 206 |
sys_setgroups |
long sys_setgroups(int gidsetsize, gid_t * grouplist) |
| 207 |
sys_fchown |
long sys_fchown(unsigned int fd, uid_t user, gid_t group) |
| 208 |
sys_setresuid |
long sys_setresuid(uid_t ruid, uid_t euid, uid_t suid) |
| 209 |
sys_getresuid |
long sys_getresuid(uid_t * ruid, uid_t * euid, uid_t * suid) |
| 210 |
sys_setresgid |
long sys_setresgid(gid_t rgid, gid_t egid, gid_t sgid) |
| 211 |
sys_getresgid |
long sys_getresgid(gid_t * rgid, gid_t * egid, gid_t * sgid) |
| 212 |
sys_chown |
long sys_chown(const char *filename, uid_t user, gid_t group) |
| 213 |
sys_setuid |
long sys_setuid(uid_t uid) |
| 214 |
sys_setgid |
long sys_setgid(gid_t gid) |
| 215 |
sys_setfsuid |
long sys_setfsuid(uid_t uid) |
| 216 |
sys_setfsgid |
long sys_setfsgid(gid_t gid) |
| 217 |
sys_pivot_root |
long sys_pivot_root(const char *new_root, const char *put_old) |
| 218 |
sys_mincore |
long sys_mincore(unsigned long start, size_t len, unsigned char *vec) |
| 219 |
sys_madvise |
long sys_madvise(unsigned long start, size_t len, int behavior) |
| 220 |
sys_getdents64 |
long sys_getdents64(unsigned int fd, void *dirent, unsigned int count) |
| 221 |
sys_fcntl64 |
long sys_fcntl64(unsigned int fd, unsigned int cmd, unsigned long arg) |
| 222 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 223 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 224 |
sys_gettid |
long sys_gettid(void) |
| 225 |
sys_readahead |
ssize_t sys_readahead(int fd, loff_t offset, size_t count) |
| 226 |
sys_setxattr |
long sys_setxattr(char *path, char *name, void *value, size_t size, int flags) |
| 227 |
sys_lsetxattr |
long sys_lsetxattr(char *path, char *name, void *value, size_t size, int flags) |
| 228 |
sys_fsetxattr |
long sys_fsetxattr(int fd, char *name, void *value, size_t size, int flags) |
| 229 |
sys_getxattr |
ssize_t sys_getxattr(char *path, char *name, void *value, size_t size) |
| 230 |
sys_lgetxattr |
ssize_t sys_lgetxattr(char *path, char *name, void *value, size_t size) |
| 231 |
sys_fgetxattr |
ssize_t sys_fgetxattr(int fd, char *name, void *value, size_t size) |
| 232 |
sys_listxattr |
ssize_t sys_listxattr(char *path, char *list, size_t size) |
| 233 |
sys_llistxattr |
ssize_t sys_llistxattr(char *path, char *list, size_t size) |
| 234 |
sys_flistxattr |
ssize_t sys_flistxattr(int fd, char *list, size_t size) |
| 235 |
sys_removexattr |
long sys_removexattr(char *path, char *name) |
| 236 |
sys_lremovexattr |
long sys_lremovexattr(char *path, char *name) |
| 237 |
sys_fremovexattr |
long sys_fremovexattr(int fd, char *name) |
| 238 |
sys_tkill |
long sys_tkill(int pid, int sig) |
| 239 |
sys_sendfile64 |
ssize_t sys_sendfile64(int out_fd, int in_fd, loff_t * offset, size_t count) |
| 240 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 241 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 242 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 243 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 244 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 245 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 246 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 247 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 248 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 249 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 250 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 251 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 252 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 253 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 254 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 255 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 256 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 257 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 258 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 259 |
sys_ni_syscall |
long sys_ni_syscall(void) |
以下是 Linux 2.6.11 的 system call 整理表格,提供給「Embedded Linux 嵌入式系統實作演練」的讀者您做參考。這是一張很方便的表格,可以取代 unistd.h 與 "man"。
這張工具表格可以幫助我們:
1. 最主要的目的:當然是研究作業系統,了解 Linux 提供的 sytsem call service。
2. Trace kernel.
3. Writing shellcode.
供您參考 :)
Linux (kernel 2.6.11) System Call Table
1. sys_ni_syscall 為保留號碼
2. 更新日期: 2006/10/07
3. 第一次發佈 2.6 kernel 的 LSCT
| no |
Syscall |
Prototype decl. |
| 0 |
sys_restart_syscall |
long sys_restart_syscall(void) |
| 1 |
sys_exit |
long sys_exit(int error_code) |
| 2 |
sys_fork |
int sys_fork(struct pt_regs regs) |
| 3 |
sys_read |
ssize_t sys_read(unsigned int fd, char __user * buf, size_t count) |
| 4 |
sys_write |
ssize_t sys_write(unsigned int fd, const char __user * buf, size_t count) |
| 5 |
sys_open |
long sys_open(const char __user * filename, int flags, int mode) |
| 6 |
sys_close |
long sys_close(unsigned int fd) |
| 7 |
sys_waitpid |
long sys_waitpid(pid_t pid, int __user * stat_addr, int options) |
| 8 |
sys_creat |
long sys_creat(const char __user * pathname, int mode) |
| 9 |
sys_link |
long sys_link(const char __user * oldname, const char __user * newname) |
| 10 |
sys_unlink |
long sys_unlink(const char __user * pathname) |
| 11 |
sys_execve |
int sys_execve(struct pt_regs regs) |
| 12 |
sys_chdir |
long sys_chdir(const char __user * filename) |
| 13 |
sys_time |
long sys_time(time_t __user * tloc) |
| 14 |
sys_mknod |
long sys_mknod(const char __user * filename, int mode, unsigned dev) |
| 15 |
sys_chmod |
long sys_chmod(const char __user * filename, mode_t mode) |
| 16 |
sys_lchown16 |
long sys_lchown16(const char __user * filename, old_uid_t user, old_gid_t group) |
| 17 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 18 |
sys_stat |
long sys_stat(char __user * filename, struct __old_kernel_stat __user * statbuf) |
| 19 |
sys_lseek |
off_t sys_lseek(unsigned int fd, off_t offset, unsigned int origin) |
| 20 |
sys_getpid |
long sys_getpid(void) |
| 21 |
sys_mount |
long sys_mount(char __user * dev_name, char __user * dir_name, char __user * type, unsigned long flags, void __user * data) |
| 22 |
sys_oldumount |
long sys_oldumount(char __user * name) |
| 23 |
sys_setuid16 |
long sys_setuid16(old_uid_t uid) |
| 24 |
sys_getuid16 |
long sys_getuid16(void) |
| 25 |
sys_stime |
long sys_stime(time_t __user * tptr) |
| 26 |
sys_ptrace |
int sys_ptrace(long request, long pid, long addr, long data) |
| 27 |
sys_alarm |
unsigned long sys_alarm(unsigned int seconds) |
| 28 |
sys_fstat |
long sys_fstat(unsigned int fd, struct __old_kernel_stat __user * statbuf) |
| 29 |
sys_pause |
long sys_pause(void) |
| 30 |
sys_utime |
long sys_utime(char __user * filename, struct utimbuf __user * times) |
| 31 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 32 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 33 |
sys_access |
long sys_access(const char __user * filename, int mode) |
| 34 |
sys_nice |
long sys_nice(int increment) |
| 35 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 36 |
sys_sync |
long sys_sync(void) |
| 37 |
sys_kill |
long sys_kill(int pid, int sig) |
| 38 |
sys_rename |
long sys_rename(const char __user * oldname, const char __user * newname) |
| 39 |
sys_mkdir |
long sys_mkdir(const char __user * pathname, int mode) |
| 40 |
sys_rmdir |
long sys_rmdir(const char __user * pathname) |
| 41 |
sys_dup |
long sys_dup(unsigned int fildes) |
| 42 |
sys_pipe |
int sys_pipe(unsigned long __user * fildes) |
| 43 |
sys_times |
long sys_times(struct tms __user * tbuf) |
| 44 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 45 |
sys_brk |
unsigned long sys_brk(unsigned long brk) |
| 46 |
sys_setgid16 |
long sys_setgid16(old_gid_t gid) |
| 47 |
sys_getgid16 |
long sys_getgid16(void) |
| 48 |
sys_signal |
unsigned long sys_signal(int sig, __sighandler_t handler) |
| 49 |
sys_geteuid16 |
long sys_geteuid16(void) |
| 50 |
sys_getegid16 |
long sys_getegid16(void) |
| 51 |
sys_acct |
long sys_acct(const char __user * name) |
| 52 |
sys_umount |
long sys_umount(char __user * name, int flags) |
| 53 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 54 |
sys_ioctl |
long sys_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg) |
| 55 |
sys_fcntl |
long sys_fcntl(unsigned int fd, unsigned int cmd, unsigned long arg) |
| 56 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 57 |
sys_setpgid |
long sys_setpgid(pid_t pid, pid_t pgid) |
| 58 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 59 |
sys_olduname |
int sys_olduname(struct oldold_utsname __user * name) |
| 60 |
sys_umask |
long sys_umask(int mask) |
| 61 |
sys_chroot |
long sys_chroot(const char __user * filename) |
| 62 |
sys_ustat |
long sys_ustat(unsigned dev, struct ustat __user * ubuf) |
| 63 |
sys_dup2 |
long sys_dup2(unsigned int oldfd, unsigned int newfd) |
| 64 |
sys_getppid |
long sys_getppid(void) |
| 65 |
sys_getpgrp |
long sys_getpgrp(void) |
| 66 |
sys_setsid |
long sys_setsid(void) |
| 67 |
sys_sigaction |
int sys_sigaction(int sig, const struct old_sigaction __user * act, struct old_sigaction __user * oact) |
| 68 |
sys_sgetmask |
long sys_sgetmask(void) |
| 69 |
sys_ssetmask |
long sys_ssetmask(int newmask) |
| 70 |
sys_setreuid16 |
long sys_setreuid16(old_uid_t ruid, old_uid_t euid) |
| 71 |
sys_setregid16 |
long sys_setregid16(old_gid_t rgid, old_gid_t egid) |
| 72 |
sys_sigsuspend |
int sys_sigsuspend(int history0, int history1, old_sigset_t mask) |
| 73 |
sys_sigpending |
long sys_sigpending(old_sigset_t __user * set) |
| 74 |
sys_sethostname |
long sys_sethostname(char __user * name, int len) |
| 75 |
sys_setrlimit |
long sys_setrlimit(unsigned int resource, struct rlimit __user * rlim) |
| 76 |
sys_old_getrlimit |
long sys_old_getrlimit(unsigned int resource, struct rlimit __user * rlim) |
| 77 |
sys_getrusage |
long sys_getrusage(int who, struct rusage __user * ru) |
| 78 |
sys_gettimeofday |
long sys_gettimeofday(struct timeval __user * tv, struct timezone __user * tz) |
| 79 |
sys_settimeofday |
long sys_settimeofday(struct timeval __user * tv, struct timezone __user * tz) |
| 80 |
sys_getgroups16 |
long sys_getgroups16(int gidsetsize, old_gid_t __user * grouplist) |
| 81 |
sys_setgroups16 |
long sys_setgroups16(int gidsetsize, old_gid_t __user * grouplist) |
| 82 |
old_select |
int old_select(struct sel_arg_struct __user * arg) |
| 83 |
sys_symlink |
long sys_symlink(const char __user * oldname, const char __user * newname) |
| 84 |
sys_lstat |
long sys_lstat(char __user * filename, struct __old_kernel_stat __user * statbuf) |
| 85 |
sys_readlink |
long sys_readlink(const char __user * path, char __user * buf, int bufsiz) |
| 86 |
sys_uselib |
long sys_uselib(const char __user * library) |
| 87 |
sys_swapon |
long sys_swapon(const char __user * specialfile, int swap_flags) |
| 88 |
sys_reboot |
long sys_reboot(int magic1, int magic2, unsigned int cmd, void __user * arg) |
| 89 |
old_readdir |
long old_readdir(unsigned int fd, struct old_linux_dirent __user * dirent, unsigned int count) |
| 90 |
old_mmap |
int old_mmap(struct mmap_arg_struct __user * arg) |
| 91 |
sys_munmap |
long sys_munmap(unsigned long addr, size_t len) |
| 92 |
sys_truncate |
long sys_truncate(const char __user * path, unsigned long length) |
| 93 |
sys_ftruncate |
long sys_ftruncate(unsigned int fd, unsigned long length) |
| 94 |
sys_fchmod |
long sys_fchmod(unsigned int fd, mode_t mode) |
| 95 |
sys_fchown16 |
long sys_fchown16(unsigned int fd, old_uid_t user, old_gid_t group) |
| 96 |
sys_getpriority |
long sys_getpriority(int which, int who) |
| 97 |
sys_setpriority |
long sys_setpriority(int which, int who, int niceval) |
| 98 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 99 |
sys_statfs |
long sys_statfs(const char __user * path, struct statfs __user * buf) |
| 100 |
sys_fstatfs |
long sys_fstatfs(unsigned int fd, struct statfs __user * buf) |
| 101 |
sys_ioperm |
long sys_ioperm(unsigned long from, unsigned long num, int turn_on) |
| 102 |
sys_socketcall |
long sys_socketcall(int call, unsigned long __user * args) |
| 103 |
sys_syslog |
long sys_syslog(int type, char __user * buf, int len) |
| 104 |
sys_setitimer |
long sys_setitimer(int which, struct itimerval __user * value, struct itimerval __user * ovalue) |
| 105 |
sys_getitimer |
long sys_getitimer(int which, struct itimerval __user * value) |
| 106 |
sys_newstat |
long sys_newstat(char __user * filename, struct stat __user * statbuf) |
| 107 |
sys_newlstat |
long sys_newlstat(char __user * filename, struct stat __user * statbuf) |
| 108 |
sys_newfstat |
long sys_newfstat(unsigned int fd, struct stat __user * statbuf) |
| 109 |
sys_uname |
int sys_uname(struct old_utsname __user * name) |
| 110 |
sys_iopl |
long sys_iopl(unsigned long unused) |
| 111 |
sys_vhangup |
long sys_vhangup(void) |
| 112 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 113 |
sys_vm86old |
int sys_vm86old(struct pt_regs regs) |
| 114 |
sys_wait4 |
long sys_wait4(pid_t pid, int __user * stat_addr, int options, struct rusage __user * ru) |
| 115 |
sys_swapoff |
long sys_swapoff(const char __user * specialfile) |
| 116 |
sys_sysinfo |
long sys_sysinfo(struct sysinfo __user * info) |
| 117 |
sys_ipc |
int sys_ipc(uint call, int first, int second, int third, void __user * ptr, long fifth) |
| 118 |
sys_fsync |
long sys_fsync(unsigned int fd) |
| 119 |
sys_sigreturn |
int sys_sigreturn(unsigned long __unused) |
| 120 |
sys_clone |
int sys_clone(struct pt_regs regs) |
| 121 |
sys_setdomainname |
long sys_setdomainname(char __user * name, int len) |
| 122 |
sys_newuname |
long sys_newuname(struct new_utsname __user * name) |
| 123 |
sys_modify_ldt |
int sys_modify_ldt(int func, void __user * ptr, unsigned long bytecount) |
| 124 |
sys_adjtimex |
long sys_adjtimex(struct timex __user * txc_p) |
| 125 |
sys_mprotect |
long sys_mprotect(unsigned long start, size_t len, unsigned long prot) |
| 126 |
sys_sigprocmask |
long sys_sigprocmask(int how, old_sigset_t __user * set, old_sigset_t __user * oset) |
| 127 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 128 |
sys_init_module |
long sys_init_module(void __user * umod, unsigned long len, const char __user * uargs) |
| 129 |
sys_delete_module |
long sys_delete_module(const char __user * name_user, unsigned int flags) |
| 130 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 131 |
sys_quotactl |
long sys_quotactl(unsigned int cmd, const char __user * special, qid_t id, void __user * addr) |
| 132 |
sys_getpgid |
long sys_getpgid(pid_t pid) |
| 133 |
sys_fchdir |
long sys_fchdir(unsigned int fd) |
| 134 |
sys_bdflush |
long sys_bdflush(int func, long data) |
| 135 |
sys_sysfs |
long sys_sysfs(int option, unsigned long arg1, unsigned long arg2) |
| 136 |
sys_personality |
long sys_personality(u_long personality) |
| 137 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 138 |
sys_setfsuid16 |
long sys_setfsuid16(old_uid_t uid) |
| 139 |
sys_setfsgid16 |
long sys_setfsgid16(old_gid_t gid) |
| 140 |
sys_llseek |
long sys_llseek(unsigned int fd, unsigned long offset_high, unsigned long offset_low, loff_t __user * result, unsigned int origin) |
| 141 |
sys_getdents |
long sys_getdents(unsigned int fd, struct linux_dirent __user * dirent, unsigned int count) |
| 142 |
sys_select |
long sys_select(int n, fd_set __user * inp, fd_set __user * outp, fd_set __user * exp, struct timeval __user * tvp) |
| 143 |
sys_flock |
long sys_flock(unsigned int fd, unsigned int cmd) |
| 144 |
sys_msync |
long sys_msync(unsigned long start, size_t len, int flags) |
| 145 |
sys_readv |
ssize_t sys_readv(unsigned long fd, const struct iovec __user * vec, unsigned long vlen) |
| 146 |
sys_writev |
ssize_t sys_writev(unsigned long fd, const struct iovec __user * vec, unsigned long vlen) |
| 147 |
sys_getsid |
long sys_getsid(pid_t pid) |
| 148 |
sys_fdatasync |
long sys_fdatasync(unsigned int fd) |
| 149 |
sys_sysctl |
long sys_sysctl(struct __sysctl_args __user * args) |
| 150 |
sys_mlock |
long sys_mlock(unsigned long start, size_t len) |
| 151 |
sys_munlock |
long sys_munlock(unsigned long start, size_t len) |
| 152 |
sys_mlockall |
long sys_mlockall(int flags) |
| 153 |
sys_munlockall |
long sys_munlockall(void) |
| 154 |
sys_sched_setparam |
long sys_sched_setparam(pid_t pid, struct sched_param __user * param) |
| 155 |
sys_sched_getparam |
long sys_sched_getparam(pid_t pid, struct sched_param __user * param) |
| 156 |
sys_sched_setscheduler |
long sys_sched_setscheduler(pid_t pid, int policy, struct sched_param __user * param) |
| 157 |
sys_sched_getscheduler |
long sys_sched_getscheduler(pid_t pid) |
| 158 |
sys_sched_yield |
long sys_sched_yield(void) |
| 159 |
sys_sched_get_priority_max |
long sys_sched_get_priority_max(int policy) |
| 160 |
sys_sched_get_priority_min |
long sys_sched_get_priority_min(int policy) |
| 161 |
sys_sched_rr_get_interval |
long sys_sched_rr_get_interval(pid_t pid, struct timespec __user * interval) |
| 162 |
sys_nanosleep |
long sys_nanosleep(struct timespec __user * rqtp, struct timespec __user * rmtp) |
| 163 |
sys_mremap |
unsigned long sys_mremap(unsigned long addr, unsigned long old_len, unsigned long new_len, unsigned long flags, unsigned long new_addr) |
| 164 |
sys_setresuid16 |
long sys_setresuid16(old_uid_t ruid, old_uid_t euid, old_uid_t suid) |
| 165 |
sys_getresuid16 |
long sys_getresuid16(old_uid_t __user * ruid, old_uid_t __user * euid, old_uid_t __user * suid) |
| 166 |
sys_vm86 |
int sys_vm86(struct pt_regs regs) |
| 167 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 168 |
sys_poll |
long sys_poll(struct pollfd __user * ufds, unsigned int nfds, long timeout) |
| 169 |
sys_nfsservctl |
|
| 170 |
sys_setresgid16 |
long sys_setresgid16(old_gid_t rgid, old_gid_t egid, old_gid_t sgid) |
| 171 |
sys_getresgid16 |
long sys_getresgid16(old_gid_t __user * rgid, old_gid_t __user * egid, old_gid_t __user * sgid) |
| 172 |
sys_prctl |
long sys_prctl(int option, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5) |
| 173 |
sys_rt_sigreturn |
int sys_rt_sigreturn(unsigned long __unused) |
| 174 |
sys_rt_sigaction |
long sys_rt_sigaction(int sig, const struct sigaction __user * act, struct sigaction __user * oact, size_t sigsetsize) |
| 175 |
sys_rt_sigprocmask |
long sys_rt_sigprocmask(int how, sigset_t __user * set, sigset_t __user * oset, size_t sigsetsize) |
| 176 |
sys_rt_sigpending |
long sys_rt_sigpending(sigset_t __user * set, size_t sigsetsize) |
| 177 |
sys_rt_sigtimedwait |
long sys_rt_sigtimedwait(const sigset_t __user * uthese, siginfo_t __user * uinfo, const struct timespec __user * uts, size_t sigsetsize) |
| 178 |
sys_rt_sigqueueinfo |
long sys_rt_sigqueueinfo(int pid, int sig, siginfo_t __user * uinfo) |
| 179 |
sys_rt_sigsuspend |
int sys_rt_sigsuspend(struct pt_regs regs) |
| 180 |
sys_pread64 |
ssize_t sys_pread64(unsigned int fd, char __user * buf, size_t count, loff_t pos) |
| 181 |
sys_pwrite64 |
ssize_t sys_pwrite64(unsigned int fd, const char __user * buf, size_t count, loff_t pos) |
| 182 |
sys_chown16 |
long sys_chown16(const char __user * filename, old_uid_t user, old_gid_t group) |
| 183 |
sys_getcwd |
long sys_getcwd(char __user * buf, unsigned long size) |
| 184 |
sys_capget |
long sys_capget(cap_user_header_t header, cap_user_data_t dataptr) |
| 185 |
sys_capset |
long sys_capset(cap_user_header_t header, const cap_user_data_t data) |
| 186 |
sys_sigaltstack |
int sys_sigaltstack(unsigned long ebx) |
| 187 |
sys_sendfile |
ssize_t sys_sendfile(int out_fd, int in_fd, off_t __user * offset, size_t count) |
| 188 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 189 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 190 |
sys_vfork |
int sys_vfork(struct pt_regs regs) |
| 191 |
sys_getrlimit |
long sys_getrlimit(unsigned int resource, struct rlimit __user * rlim) |
| 192 |
sys_mmap2 |
long sys_mmap2(unsigned long addr, unsigned long len, unsigned long prot, unsigned long flags, unsigned long fd, unsigned long pgoff) |
| 193 |
sys_truncate64 |
long sys_truncate64(const char __user * path, loff_t length) |
| 194 |
sys_ftruncate64 |
long sys_ftruncate64(unsigned int fd, loff_t length) |
| 195 |
sys_stat64 |
long sys_stat64(char __user * filename, struct stat64 __user * statbuf) |
| 196 |
sys_lstat64 |
long sys_lstat64(char __user * filename, struct stat64 __user * statbuf) |
| 197 |
sys_fstat64 |
long sys_fstat64(unsigned long fd, struct stat64 __user * statbuf) |
| 198 |
sys_lchown |
long sys_lchown(const char __user * filename, uid_t user, gid_t group) |
| 199 |
sys_getuid |
long sys_getuid(void) |
| 200 |
sys_getgid |
long sys_getgid(void) |
| 201 |
sys_geteuid |
long sys_geteuid(void) |
| 202 |
sys_getegid |
long sys_getegid(void) |
| 203 |
sys_setreuid |
long sys_setreuid(uid_t ruid, uid_t euid) |
| 204 |
sys_setregid |
long sys_setregid(gid_t rgid, gid_t egid) |
| 205 |
sys_getgroups |
long sys_getgroups(int gidsetsize, gid_t __user * grouplist) |
| 206 |
sys_setgroups |
long sys_setgroups(int gidsetsize, gid_t __user * grouplist) |
| 207 |
sys_fchown |
long sys_fchown(unsigned int fd, uid_t user, gid_t group) |
| 208 |
sys_setresuid |
long sys_setresuid(uid_t ruid, uid_t euid, uid_t suid) |
| 209 |
sys_getresuid |
long sys_getresuid(uid_t __user * ruid, uid_t __user * euid, uid_t __user * suid) |
| 210 |
sys_setresgid |
long sys_setresgid(gid_t rgid, gid_t egid, gid_t sgid) |
| 211 |
sys_getresgid |
long sys_getresgid(gid_t __user * rgid, gid_t __user * egid, gid_t __user * sgid) |
| 212 |
sys_chown |
long sys_chown(const char __user * filename, uid_t user, gid_t group) |
| 213 |
sys_setuid |
long sys_setuid(uid_t uid) |
| 214 |
sys_setgid |
long sys_setgid(gid_t gid) |
| 215 |
sys_setfsuid |
long sys_setfsuid(uid_t uid) |
| 216 |
sys_setfsgid |
long sys_setfsgid(gid_t gid) |
| 217 |
sys_pivot_root |
long sys_pivot_root(const char __user * new_root, const char __user * put_old) |
| 218 |
sys_mincore |
long sys_mincore(unsigned long start, size_t len, unsigned char __user * vec) |
| 219 |
sys_madvise |
long sys_madvise(unsigned long start, size_t len_in, int behavior) |
| 220 |
sys_getdents64 |
long sys_getdents64(unsigned int fd, struct linux_dirent64 __user * dirent, unsigned int count) |
| 221 |
sys_fcntl64 |
long sys_fcntl64(unsigned int fd, unsigned int cmd, unsigned long arg) |
| 222 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 223 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 224 |
sys_gettid |
long sys_gettid(void) |
| 225 |
sys_readahead |
ssize_t sys_readahead(int fd, loff_t offset, size_t count) |
| 226 |
sys_setxattr |
long sys_setxattr(char __user * path, char __user * name, void __user * value, size_t size, int flags) |
| 227 |
sys_lsetxattr |
long sys_lsetxattr(char __user * path, char __user * name, void __user * value, size_t size, int flags) |
| 228 |
sys_fsetxattr |
long sys_fsetxattr(int fd, char __user * name, void __user * value, size_t size, int flags) |
| 229 |
sys_getxattr |
ssize_t sys_getxattr(char __user * path, char __user * name, void __user * value, size_t size) |
| 230 |
sys_lgetxattr |
ssize_t sys_lgetxattr(char __user * path, char __user * name, void __user * value, size_t size) |
| 231 |
sys_fgetxattr |
ssize_t sys_fgetxattr(int fd, char __user * name, void __user * value, size_t size) |
| 232 |
sys_listxattr |
ssize_t sys_listxattr(char __user * path, char __user * list, size_t size) |
| 233 |
sys_llistxattr |
ssize_t sys_llistxattr(char __user * path, char __user * list, size_t size) |
| 234 |
sys_flistxattr |
ssize_t sys_flistxattr(int fd, char __user * list, size_t size) |
| 235 |
sys_removexattr |
long sys_removexattr(char __user * path, char __user * name) |
| 236 |
sys_lremovexattr |
long sys_lremovexattr(char __user * path, char __user * name) |
| 237 |
sys_fremovexattr |
long sys_fremovexattr(int fd, char __user * name) |
| 238 |
sys_tkill |
long sys_tkill(int pid, int sig) |
| 239 |
sys_sendfile64 |
ssize_t sys_sendfile64(int out_fd, int in_fd, loff_t __user * offset, size_t count) |
| 240 |
sys_futex |
long sys_futex(u32 __user * uaddr, int op, int val, struct timespec __user * utime, u32 __user * uaddr2, int val3) |
| 241 |
sys_sched_setaffinity |
long sys_sched_setaffinity(pid_t pid, unsigned int len, unsigned long __user * user_mask_ptr) |
| 242 |
sys_sched_getaffinity |
long sys_sched_getaffinity(pid_t pid, unsigned int len, unsigned long __user * user_mask_ptr) |
| 243 |
sys_set_thread_area |
int sys_set_thread_area(struct user_desc __user * u_info) |
| 244 |
sys_get_thread_area |
int sys_get_thread_area(struct user_desc __user * u_info) |
| 245 |
sys_io_setup |
long sys_io_setup(unsigned nr_events, aio_context_t __user * ctxp) |
| 246 |
sys_io_destroy |
long sys_io_destroy(aio_context_t ctx) |
| 247 |
sys_io_getevents |
long sys_io_getevents(aio_context_t ctx_id, long min_nr, long nr, struct io_event __user * events, struct timespec __user * timeout) |
| 248 |
sys_io_submit |
long sys_io_submit(aio_context_t ctx_id, long nr, struct iocb __user * __user * iocbpp) |
| 249 |
sys_io_cancel |
long sys_io_cancel(aio_context_t ctx_id, struct iocb __user * iocb, struct io_event __user * result) |
| 250 |
sys_fadvise64 |
long sys_fadvise64(int fd, loff_t offset, size_t len, int advice) |
| 251 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 252 |
sys_exit_group |
void sys_exit_group(int error_code) |
| 253 |
sys_lookup_dcookie |
long sys_lookup_dcookie(u64 cookie64, char __user * buf, size_t len) |
| 254 |
sys_epoll_create |
long sys_epoll_create(int size) |
| 255 |
sys_epoll_ctl |
long sys_epoll_ctl(int epfd, int op, int fd, struct epoll_event __user * event) |
| 256 |
sys_epoll_wait |
long sys_epoll_wait(int epfd, struct epoll_event __user * events, int maxevents, int timeout) |
| 257 |
sys_remap_file_pages |
long sys_remap_file_pages(unsigned long start, unsigned long size, unsigned long __prot, unsigned long pgoff, unsigned long flags) |
| 258 |
sys_set_tid_address |
long sys_set_tid_address(int __user * tidptr) |
| 259 |
sys_timer_create |
long sys_timer_create(clockid_t which_clock, struct sigevent __user * timer_event_spec, timer_t __user * created_timer_id) |
| 260 |
sys_timer_settime |
long sys_timer_settime(timer_t timer_id, int flags, const struct itimerspec __user * new_setting, struct itimerspec __user * old_setting) |
| 261 |
sys_timer_gettime |
long sys_timer_gettime(timer_t timer_id, struct itimerspec __user * setting) |
| 262 |
sys_timer_getoverrun |
long sys_timer_getoverrun(timer_t timer_id) |
| 263 |
sys_timer_delete |
long sys_timer_delete(timer_t timer_id) |
| 264 |
sys_clock_settime |
long sys_clock_settime(clockid_t which_clock, const struct timespec __user * tp) |
| 265 |
sys_clock_gettime |
long sys_clock_gettime(clockid_t which_clock, struct timespec __user * tp) |
| 266 |
sys_clock_getres |
long sys_clock_getres(clockid_t which_clock, struct timespec __user * tp) |
| 267 |
sys_clock_nanosleep |
long sys_clock_nanosleep(clockid_t which_clock, int flags, const struct timespec __user * rqtp, struct timespec __user * rmtp) |
| 268 |
sys_statfs64 |
long sys_statfs64(const char __user * path, size_t sz, struct statfs64 __user * buf) |
| 269 |
sys_fstatfs64 |
long sys_fstatfs64(unsigned int fd, size_t sz, struct statfs64 __user * buf) |
| 270 |
sys_tgkill |
long sys_tgkill(int tgid, int pid, int sig) |
| 271 |
sys_utimes |
long sys_utimes(char __user * filename, struct timeval __user * utimes) |
| 272 |
sys_fadvise64_64 |
long sys_fadvise64_64(int fd, loff_t offset, loff_t len, int advice) |
| 273 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 274 |
sys_mbind |
long sys_mbind(unsigned long start, unsigned long len, unsigned long mode, unsigned long __user * nmask, unsigned long maxnode, unsigned flags) |
| 275 |
sys_get_mempolicy |
long sys_get_mempolicy(int __user * policy, unsigned long __user * nmask, unsigned long maxnode, unsigned long addr, unsigned long flags) |
| 276 |
sys_set_mempolicy |
long sys_set_mempolicy(int mode, unsigned long __user * nmask, unsigned long maxnode) |
| 277 |
sys_mq_open |
long sys_mq_open(const char __user * u_name, int oflag, mode_t mode, struct mq_attr __user * u_attr) |
| 278 |
sys_mq_unlink |
long sys_mq_unlink(const char __user * u_name) |
| 279 |
sys_mq_timedsend |
long sys_mq_timedsend(mqd_t mqdes, const char __user * u_msg_ptr, size_t msg_len, unsigned int msg_prio, const struct timespec __user * u_abs_timeout) |
| 280 |
sys_mq_timedreceive |
ssize_t sys_mq_timedreceive(mqd_t mqdes, char __user * u_msg_ptr, size_t msg_len, unsigned int __user * u_msg_prio, const struct timespec __user * u_abs_timeout) |
| 281 |
sys_mq_notify |
long sys_mq_notify(mqd_t mqdes, const struct sigevent __user * u_notification) |
| 282 |
sys_mq_getsetattr |
long sys_mq_getsetattr(mqd_t mqdes, const struct mq_attr __user * u_mqstat, struct mq_attr __user * u_omqstat) |
| 283 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 284 |
sys_waitid |
long sys_waitid(int which, pid_t pid, struct siginfo __user * infop, int options, struct rusage __user * ru) |
| 285 |
sys_ni_syscall |
long sys_ni_syscall(void) |
| 286 |
sys_add_key |
long sys_add_key(const char __user * _type, const char __user * _description, const void __user * _payload, size_t plen, key_serial_t ringid) |
| 287 |
sys_request_key |
long sys_request_key(const char __user * _type, const char __user * _description, const char __user * _callout_info, key_serial_t destringid) |
| 288 |
sys_keyctl |
long sys_keyctl(int option, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5) |
把 Linux 提供的 sytsem call service 依分類做整理,並提供實作檔案。本表使用於 Jollen 的「2. GNU Toolchains 與 Embedded Linux Programming」課程中,在此提供給大家做參考。目前依據 Linux 2.6.11 原始碼製成,請搭配 2.6.11 以上的版本做研究。
| no |
Syscall name |
Implementation file
in Linux 2.6.11 (or above) |
|
目前大致把 Linux 2.6.11 的 system call 分成 | |