タグ

x86とlinuxに関するTAKESAKOのブックマーク (20)

  • 【コラム】Hello Worldコレクション (5) アセンブラ編 - OSごとに微妙に異なるスタイルを使い分ける | エンタープライズ | マイコミジャーナル

    writeシステムコールを直接呼び出し 今回第5回は、アセンブラに挑戦してみましょう。アセンブラでは、必然的にOSやCPUに依存したプログラムとなりますが、これは仕方ないところでしょう。 リスト1は、Linux(CPUはx86)版のアセンブラのHello Worldです。このプログラムは、C言語での「write(1, "Hello World\n", 12); _exit(0);」に相当します。アセンブラでは、ソフトウェア割り込み(int $0x80)でwriteシステムコールを直接呼び出してメッセージを表示しています。その後、プログラムを正常に終了するため、_exitシステムコールを呼び出して終了です。このように、Linuxのシステムコールでは、システムコール番号(eax)やその引数の値(ebx、ecx、edxなど)を、CPUレジスタに代入して渡します。 このプログラムは、実はもう少しコ

  • 50行straceもどき - memologue

    すこし前に、straceコマンドもどきを50行くらいで書いてみたことがあるので、それを貼ってみまーす。いきなりコード。あ、C99です。 // strace_modoki.c: Linux/x86専用です。x86_64カーネルでは-m32でコンパイルしても動きません。 #include <stdio.h> #include <unistd.h> #include <sys/ptrace.h> #include <sys/types.h> #include <sys/wait.h> #include <asm/user.h> #include <asm/ptrace.h> int main() { int i; static const char* syscallstr[1000] = {0}; for(i = 0; i < 1000; ++i) syscallstr[i] = "???";

    50行straceもどき - memologue
  • IBM Developer

    IBM Developer is your one-stop location for getting hands-on training and learning in-demand skills on relevant technologies such as generative AI, data science, AI, and open source.

    IBM Developer
  • 第92回カーネル読書会行ってきました - fslashtのサアラたん日記

    第92回カーネル読書会に参加してきました。 今日のお題は「ブートローダとOSの親密な関係」(講師:OKUJIさん) GRUB開発者自らの発表でしたので、とても面白かったですよ。 BIOSの挙動の違いや明文化されていない慣習もあってブートローダーの開発はとっても大変そう(いつもGRUBは便利に使わせていただいています。ありがとうございます) でもこういう話って興味深いですよね。オフレコの話もおおかったな(笑 今回は大変なボリュームで大変楽しめました。 (立ち見の出る盛況ぶりでした) 以下、メモ(正確性は期待しないでくだちい) ・冒頭の質問タイムで聴講者のレベル確認 アセンブラのサンプルコードの結果、システムコール int 13の意味、/dev/hd*とはなに? ・コンピューターが起動するまで MBRをまずよむ / RealModeから起動する。恐るべし互換性 / セグメントについて A20

    第92回カーネル読書会行ってきました - fslashtのサアラたん日記
    TAKESAKO
    TAKESAKO 2008/11/11
    【今日のお題は「ブートローダとOSの親密な関係」(講師:OKUJIさん)】
  • 革命の日々! [kernel watch没ネタ集] long nop バトル

    x86には様々なNOPがあり、Intel® 64 and IA-32 Architectures Software Developer’s Manual に記載のあるものだけでも1byte長から9byte長までの種類がある。 これにprefix等の選択肢を考えると、まさに無限に広がる大宇宙。といった感じの可能性の広さである。 で、LKML内ではNOPの種類によって速度が変わることが広く知られていて、時折どのNOPを使うのがよいかが熱い議論になる。 特に近年は自己書き換えコードの都合で最速5byte NOP議論が熱い(long jumpが5byteだからね)。 まあ、5byte NOPと3byte NOP + 2byte NOP(とprefix NOP)のどれが速いか、なんて議論は、自転車置き場理論によって無駄にスレッドがのびていくので見ていて楽しい(ほんとか?) で、最近話題になったのはl

  • Assembly Programming Linux

    Linux でアセンブリプログラミング copyright (C) 2000-2003 Jun Mizutani (mizutani.jun@nifty.ne.jp) はじめに. アセンブラを使って Linux のプログラミングで遊んでみます.アセンブラには NASM を使用して,カーネルを直接利用することにします. いまさらアセンブラでプログラムを作成することは,時代錯誤と感じる人も 多いかもしれません.「アセンブラでプログラミングなんて職人芸でしょう」 と思うかもしれません. 20年前では趣味のプログラミングは BASIC か アセンブラしか選択肢がありません でしたが,今ではPerl, Ruby からアセンブラまでの間に非常に多くの言語があって, アセンブラは普通では不要な最下層の知識となっていると思います. 10BaseT のツイストペアケーブルのインピーダンス

  • 革命の日々! なんで、pthread_once()なんて存在するの?

    http://d.hatena.ne.jp/amachang/20080612/1213244820 お気に入りなサイトのIT戦記より // ここを volatile にする // (この変数の値はアトミック(つまり、レジスタにだけあってメモリにないということがない変数に)になる) volatile char* p = NULL; pthread_mutex_t m; void* f(void* _p) { // ロックかからない if (p == NULL) { pthread_mutex_lock(&m); // ここからはクリティカルセクション // 一個目の初期化時にここでブロックしたスレッドのために // もう一回 NULL チェック if (p == NULL) { // ここではまだ p に代入しない // 代入したら別スレッドで初期化されていない p が返ってしまう cha

  • 64ビットCPU(AMD64+EM64T)でアセンブラ

    【カーネルモードへ移行する方法】 WindowsNT/2000 int 2E(割込みゲート) WindowsXP/2003(x86版) sysenter WindowsXP/2003(x64版) syscall Windows95/98/Me call(コールゲート) int 2E(割込みゲート)とcall(コールゲート)は32ビット世代の最初のCPUである386から利用可能な方法です。(正確にはプロテクトモードが導入された286(16ビットCPU)からですが。) これに対し、sysenterはインテルがPentiumIIで導入した命令、 syscallはAMDが(たしか)K6で導入した命令です。 なおsyscallはEM64Tでも利用可能です。 速度比較 これらの方法で速度にどの程度の差があるのかをテストしてみます。 以下のプログラムを使います。 【syscall.c】 // カーネ

    TAKESAKO
    TAKESAKO 2008/04/05
    sysenter/syscallの概要
  • 6月版 怒りのLinus、「カーネル開発者のふりはやめろ」(2/2) - @IT

    6月版 怒りのLinus、「カーネル開発者のふりはやめろ」 上川純一 日ヒューレット・パッカード株式会社 コンサルティング・インテグレーション統括部 2006/6/28 カーネルメモリリーク検出パッチは有用? Catalin Marinasは、Linuxカーネル内部でのメモリリークを検出するデバッグオプションを追加するパッチを提案しました。このパッチは、ガベージコレクションの仕組みを利用して、メモリリークを検出します。valgrindのmemcheck --leak-checkツールと同様の機能を提供することを目標としているようです。 しかし、Andi Kleenはこのパッチの有用性に疑問を呈しました。これに対してIngo Molnarは、「簡単に見つかる問題は、すでに非公開のツール(Coverity)によって発見されて修正済みなので、Catalin Marinasのパッチの有用性が必

    TAKESAKO
    TAKESAKO 2008/04/05
    注:従来はglibcがint $80を発行していましたが、Pentium 4ではint $80よりもsysenterを使う方法が高速でした。ただし、ほかのCPUでは逆に遅かったり、実装されていなかったりします。
  • マルチスレッドのコンテキスト切り替えに伴うコスト - naoyaのはてなダイアリー

    また Linux カーネルの話です。 Linux では fork によるマルチプロセスと、pthread によるマルチスレッドでの並行処理を比較した場合、後者の方がコストが低く高速と言われます。「スレッドはメモリ空間を共有するので、マルチプロセスとは異なりコンテキストスイッチ時にメモリ空間の切り替えを省略できる。切り替えに伴うオーバーヘッドが少ない。」というのが FAQ の答えかと思います。 が「オーバーヘッドが少ない」と一言にいわれても具体的にどういうことなのかがイメージできません。そこで Linux のスレッド周りの実装を見て見ようじゃないか、というのが今回のテーマです。 3分でわかる(?) マルチプロセスとマルチスレッド まずはうんちく。マルチプロセスとマルチスレッドの違いの図。以前に社内で勉強会をしたときに作った資料にちょうど良いのがあったので掲載します。Pthreadsプログラミ

    マルチスレッドのコンテキスト切り替えに伴うコスト - naoyaのはてなダイアリー
  • x86 Linux のメモリモデル、プロセス空間切り替え、カーネルスタック - naoyaのはてなダイアリー

    ひとつ前のエントリ id:naoya:20070924:1190653790 では Linux のコンテキストスイッチにおける、主にハードウェアコンテキストの退避/復帰の処理を追ってみました。その中で カーネルスタック (switch_to() 内で pushl %ebp とかして値が積まれるスタック)とはそのときの実行コンテキストに紐づくカーネルプロセススタックという理解でよいか。 という疑問がもやもや湧いて出てきました。ここ数日 はじめて読む486―32ビットコンピュータをやさしく語る を読んでいたのですが、その中にこの疑問への答えへの入り口が載っていまして、そこを糸口に調べてみました。で、結果としては 答え: 良い でした。 x86 は特権レベルの移行と連動してスタックポインタを切り替える仕組みを持っています。Linux の場合モードはカーネルモード(特権レベル0) とユーザーモード

    x86 Linux のメモリモデル、プロセス空間切り替え、カーネルスタック - naoyaのはてなダイアリー
  • ブートコードの実行

    ここでは、CPUによって最初の制御が開始されるところから、 ブートコードがシステムに取り込まれ実行されるまでを説明する。 ここで説明される事項は、Linuxに限らずどのOSの起動時にもあてはまる。 制御の開始 給電が正常に行われ、初期化の済んだバスが問題なく利用できるようになると、 CPU は制御を開始する。 CPU のモードが強制的にリアルモードへ変更される。 CPUの制御は、物理アドレス0xfffffff0(4GB-16B目)へのジャンプによって強制的に開始される。この状態は、リアルモードにもかかわらずコードセグメントのベースアドレスが1MBの範囲を超えている値に設定されている点で、特殊である。この特殊な状況は、やがてCSレジスタが更新され新しいベースアドレスがコードセグメントに設定されるまでの間続く。 ただしPC/AT互換機の場合、CPUの制御開始と同時に、後述する「A20マスク」と

  • http://ja.doukaku.org/comment/3178/

    TAKESAKO
    TAKESAKO 2007/09/27
    【プログラムというのは、マシン語を出力して初めて「生成できる」と言うのです。】
  • Linux カーネルのコンテキストスイッチ処理を読み解く - naoyaのはてなダイアリー

    Linux カーネルのプロセススケジューラの核である kernel/sched.c の schedule() を読み進めていくと、タスク切り替え(実行コンテキスト切り替え)はその名も context_switch() という関数に集約されていることが分かります。2.6.20 の kernel/sched.c だと以下のコードです。 1839 static inline struct task_struct * 1840 context_switch(struct rq *rq, struct task_struct *prev, 1841 struct task_struct *next) 1842 { 1843 struct mm_struct *mm = next->mm; 1844 struct mm_struct *oldmm = prev->active_mm; 1845 184

    Linux カーネルのコンテキストスイッチ処理を読み解く - naoyaのはてなダイアリー
  • 2006-11-11

    BITS 32 ORG 0 DB 0x7F entry: inc ebp dec esp inc esi mov dl, 14 mov cl, hello xor dword [ecx], 0x6C4D6549 inc ebx push dword 0x00030002 mov al, 4 int 0x80 add [eax], eax add [eax], al sbb [eax], al add [eax], al sbb [eax], al add [eax], al xchg eax, esi dec ebx int 0x80 DD 0x00210000-0x18 hello: DD 0x00210001 DB 'o, world!', 10To compile this program, you need nasm. nasm -f bin -o tiny-hello.bin t

    2006-11-11
    TAKESAKO
    TAKESAKO 2007/05/14
    世界最小の ELF x86 バイナリ (Hello world!)
  • はじめてのにき(2006-11-09)

    _ hello76 NASMも触れんとなぁ、ということで Hello world! 76B を移植。 さらにゴルフしよう ; hello76.asm BITS 32 org 0x00000000 db 0x7F, "ELF" ; e_ident db "Hello world!" dw 2 ; e_type dw 3 ; e_machine _start: mov byte [EDI+0x10], 0xa ; e_version ; set "\n" dd _start ; e_entry ; fall through! dd phdr - $$ ; e_phoff lea EDX, [ECX+0xd] ; e_shoff lea EAX, [ECX+0x4] ; e_flags mov ECX, EAX jmp short label1 ; e_ehsize dw 32 ; e_phen

    TAKESAKO
    TAKESAKO 2007/05/14
    ELF Golfで参考になるコード(わかりやすい)
  • The Teensy Files

    This page is a complete guide to everything I've written about creating teensy ELF executable for Linux. Take a look at your /bin directory: how big is the smallest ELF executable in there? Try writing the smallest hello-world program you can. Can you get it under, say, 1K? This is precisely what I set out to do one day, and I ended up with a minor obsession over creating the smallest possible exe

    TAKESAKO
    TAKESAKO 2007/05/14
    これは芸術
  • mizzy.org : FizzBuzz アセンブラ版 for x86/Linux

    竹迫さん、Yappo さん に触発されて、FizzBuzz アセンブラ版 for x86/Linux をつくってみた。 20年ほど前に Z80 でアセンブラをちょっとかじった程度の知識しかないので、ベストには程遠いコードだと思います。だれかもっといいコードを教えてください。 最初竹迫さんのコードと同じように書けるかな、と思ったのですが、Windows とちがって、画面に表示するだけで EAX, EBX, ECX, EDX レジスタ使うので、竹迫さんのように BX レジスタを見張り役に、CX レジスタをカウンタに、ってことができませんでした。 また、とりあえず書いただけで疲れたので、コードゴルフにチャレンジする気力はありません。 global _start _start: mov si, 0 mawasu: call space inc si mov ax, si mov di, 3 xo

    TAKESAKO
    TAKESAKO 2007/05/14
    さすがmizzyさん!
  • Re: wait for vsync as linux user

    TAKESAKO
    TAKESAKO 2007/05/11
    putc
  • Wataru's memo(2007-04-11)

    ● [Linux][Writing] 世界一単純な実行ファイルフォーマット binfmt_flat Computer Architecture Series 第二作のために、日々素材作りを進めているのですが、この作業の間に "binfmt_flat" というオタッキーなモジュールが誕生しました。今日は、このモジュールを使った "Hello golf" をご紹介しましょう(注: 昨年一世を風靡した ELF golf ではありませんので、あしからず)。 初学者の理解を阻む複雑な ELF 皆さんご存じの通り、PC-UNIX 上における標準のオブジェクトファイルフォーマットは ELF (Executable and Linking Format) ですが、このフォーマットは高機能を追求しているため、内部はかなり複雑な作りになっています。 実は、当初 Computer Architecture Se

  • 1
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy