Linuxカーネルのソースコードを眺めているをよく出てくる書き方があります
1, これは・・・名前にシャープを付けているんでしょうか?
関数の方にも使用できるんですか?
C
1#define SYS_ify(syscall_name) __NR_##syscall_name 2 3LOAD_ARGS_TYPES_##nr (args)
2, プリプロセッサの[!]はC言語の[!]と同じ意味です??
C
1#if !defined __NR_pread && defined __NR_pread64
**3, **インラインアセンブリではなく、アセンブリ言語をC言語と混合して使用している?
そんなこと可能なんですか?
後ろのバックスラッシュが気になりますね。
# define PSEUDO(name, syscall_name, args) \ .text; \ ENTRY (name) \ DO_CALL (syscall_name, args); \ cmpq $-4095, %rax; \ jae SYSCALL_ERROR_LABEL
4, 中括弧を大括弧で囲んでいる?
これは・・・関数の定義ですか?それともマクロですか? 融合しているような・・・
よく見ると可変長関数ですかね? 関数内部では可変長用の処理が行われていないような・・・
# define INLINE_SYSCALL_TYPES(name, nr, args...) \ ({ \ unsigned long int resultvar = INTERNAL_SYSCALL_TYPES (name, , nr, args); \ if (__glibc_unlikely (INTERNAL_SYSCALL_ERROR_P (resultvar, ))) \ { \ __set_errno (INTERNAL_SYSCALL_ERRNO (resultvar, )); \ resultvar = (unsigned long int) -1; \ } \ (long int) resultvar; })
5, 関数の中に関数を定義 & 呼び出しているんでしょうか??
list_for_each_entry()の箇所ですね。
(ちょっと長いので省略しています。)
int search_binary_handler(struct linux_binprm *bprm) { bool need_retry = IS_ENABLED(CONFIG_MODULES); struct linux_binfmt *fmt; int retval; /* This allows 4 levels of binfmt rewrites before failing hard. */ if (bprm->recursion_depth > 5) return -ELOOP; retval = security_bprm_check(bprm); if (retval) return retval; retval = -ENOENT; retry: read_lock(&binfmt_lock); list_for_each_entry(fmt, &formats, lh) { if (!try_module_get(fmt->module)) continue; read_unlock(&binfmt_lock); bprm->recursion_depth++; retval = fmt->load_binary(bprm); read_lock(&binfmt_lock); put_binfmt(fmt); bprm->recursion_depth--; if (retval < 0 && !bprm->mm) { ・・・
どれも標準のC言語では、出てこないような・・・・
見たことのない記述の仕方です。
ちなみに拡張子にcppと付いていないので、C++ではない・・・かな?
と思うのですが・・・
わかる方いましたら教えてください。
[追記]
3番について補足です。
# ifdef PIC # define SYSCALL_ERROR_LABEL 0f # else # define SYSCALL_ERROR_LABEL syscall_error # endif # undef PSEUDO # define PSEUDO(name, syscall_name, args) \ .text; \ ENTRY (name) \ DO_CALL (syscall_name, args); \ cmpq $-4095, %rax; \ jae SYSCALL_ERROR_LABEL # undef PSEUDO_END # define PSEUDO_END(name) \ SYSCALL_ERROR_HANDLER \ END (name)
となっていまいました。
ENTRY()とEND()に挟まれている部分にアセンブリ言語が記述されています。
回答2件
あなたの回答
tips
プレビュー